From 02e637d86f9ecb6d0e368438291bb6f6f8feb3ab Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 5 Sep 2017 10:12:27 +0200 Subject: Learn CFG cleanup to transform single case switches to gcond. 2017-09-05 Martin Liska PR tree-optimization/82032 * tree-cfg.c (generate_range_test): New function. * tree-cfg.h (generate_range_test): Declared here. * tree-cfgcleanup.c (convert_single_case_switch): New function. (cleanup_control_expr_graph): Use it. * tree-switch-conversion.c (try_switch_expansion): Remove assert. (emit_case_nodes): Use generate_range_test. 2017-09-05 Martin Liska PR tree-optimization/82032 * g++.dg/other/pr82032.C: New test. * gcc.dg/tree-ssa/pr68198.c: Update scanned pattern. * gcc.dg/tree-ssa/vrp34.c: Likewise. * gcc.dg/switch-10.c: Likewise. From-SVN: r251690 --- gcc/tree-cfg.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'gcc/tree-cfg.c') diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index b759306..b601012 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -8927,7 +8927,31 @@ extract_true_false_controlled_edges (basic_block dom, basic_block phiblock, return true; } +/* Generate a range test LHS CODE RHS that determines whether INDEX is in the + range [low, high]. Place associated stmts before *GSI. */ +void +generate_range_test (basic_block bb, tree index, tree low, tree high, + tree *lhs, tree *rhs) +{ + tree type = TREE_TYPE (index); + tree utype = unsigned_type_for (type); + + low = fold_convert (type, low); + high = fold_convert (type, high); + + tree tmp = make_ssa_name (type); + gassign *sub1 + = gimple_build_assign (tmp, MINUS_EXPR, index, low); + + *lhs = make_ssa_name (utype); + gassign *a = gimple_build_assign (*lhs, NOP_EXPR, tmp); + + *rhs = fold_build2 (MINUS_EXPR, utype, high, low); + gimple_stmt_iterator gsi = gsi_last_bb (bb); + gsi_insert_before (&gsi, sub1, GSI_SAME_STMT); + gsi_insert_before (&gsi, a, GSI_SAME_STMT); +} /* Emit return warnings. */ -- cgit v1.1