aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-switch-conversion.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2017-09-05 10:12:27 +0200
committerMartin Liska <marxin@gcc.gnu.org>2017-09-05 08:12:27 +0000
commit02e637d86f9ecb6d0e368438291bb6f6f8feb3ab (patch)
tree93af2d7dae66c7bb229217f75ae4b0d99853f7c7 /gcc/tree-switch-conversion.c
parentb471c5c6cf2bfe51699b7fcbcffc34024ff7bfce (diff)
downloadgcc-02e637d86f9ecb6d0e368438291bb6f6f8feb3ab.zip
gcc-02e637d86f9ecb6d0e368438291bb6f6f8feb3ab.tar.gz
gcc-02e637d86f9ecb6d0e368438291bb6f6f8feb3ab.tar.bz2
Learn CFG cleanup to transform single case switches to gcond.
2017-09-05 Martin Liska <mliska@suse.cz> 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 <mliska@suse.cz> 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
Diffstat (limited to 'gcc/tree-switch-conversion.c')
-rw-r--r--gcc/tree-switch-conversion.c27
1 files changed, 6 insertions, 21 deletions
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index d0d0897..6d7c2c4 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -2057,9 +2057,8 @@ try_switch_expansion (gswitch *stmt)
expressions being INTEGER_CST. */
gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
- /* Optimization of switch statements with only one label has already
- occurred, so we should never see them at this point. */
- gcc_assert (ncases > 1);
+ if (ncases == 1)
+ return false;
/* Find the default case target label. */
tree default_label = CASE_LABEL (gimple_switch_default_label (stmt));
@@ -2701,27 +2700,13 @@ emit_case_nodes (basic_block bb, tree index, case_node_ptr node,
}
else if (!low_bound && !high_bound)
{
- tree type = TREE_TYPE (index);
- tree utype = unsigned_type_for (type);
-
- tree lhs = make_ssa_name (type);
- gassign *sub1
- = gimple_build_assign (lhs, MINUS_EXPR, index, node->low);
-
- tree converted = make_ssa_name (utype);
- gassign *a = gimple_build_assign (converted, NOP_EXPR, lhs);
-
- tree rhs = fold_build2 (MINUS_EXPR, utype,
- fold_convert (type, node->high),
- fold_convert (type, node->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);
-
+ tree lhs, rhs;
+ generate_range_test (bb, index, node->low, node->high,
+ &lhs, &rhs);
probability
= conditional_probability (default_prob,
subtree_prob + default_prob);
- bb = emit_cmp_and_jump_insns (bb, converted, rhs, GT_EXPR,
+ bb = emit_cmp_and_jump_insns (bb, lhs, rhs, GT_EXPR,
default_bb, probability,
phi_mapping);
}