summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Bosscher <stevenb@suse.de>2004-05-31 10:18:36 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2004-05-31 10:18:36 +0000
commit1c052514f657db4f56b876814fee2ffd564fae59 (patch)
tree03546cea2e85d029b448847ecd142555b3ffec6e
parent58128b9da11df305d8e631bcbbaa6aad2ad970d6 (diff)
downloadgcc-1c052514f657db4f56b876814fee2ffd564fae59.tar.gz
tree-ssa-dom.c (record_equivalences_from_incoming_edge): Only look at case labels if the immediate dominator is also the only predecessor.
* tree-ssa-dom.c (record_equivalences_from_incoming_edge): Only look at case labels if the immediate dominator is also the only predecessor. Don't look for more case labels if the first seen is a case range. From-SVN: r82480
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-ssa-dom.c8
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 28c70ec38eb..ca109d99911 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-05-31 Steven Bosscher <stevenb@suse.de>
+
+ * tree-ssa-dom.c (record_equivalences_from_incoming_edge):
+ Only look at case labels if the immediate dominator is also
+ the only predecessor. Don't look for more case labels if the
+ first seen is a case range.
+
2004-05-31 Kazu Hirata <kazu@cs.umass.edu>
* builtins.c: Add a prototype for fold_builtin_strchr().
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index c74dd5d5325..0ca36b09c80 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -1450,9 +1450,12 @@ record_equivalences_from_incoming_edge (struct dom_walk_data *walk_data,
&bd->avail_exprs,
bb,
&bd->vrp_variables);
- /* Similarly when the parent block ended in a SWITCH_EXPR. */
+ /* Similarly when the parent block ended in a SWITCH_EXPR.
+ We can only know the value of the switch's condition if the dominator
+ parent is also the only predecessor of this block. */
else if (parent_block_last_stmt
&& bb->pred->pred_next == NULL
+ && bb->pred->src == parent
&& TREE_CODE (parent_block_last_stmt) == SWITCH_EXPR)
{
tree switch_cond = SWITCH_COND (parent_block_last_stmt);
@@ -1473,7 +1476,7 @@ record_equivalences_from_incoming_edge (struct dom_walk_data *walk_data,
tree elt = TREE_VEC_ELT (switch_vec, i);
if (label_to_block (CASE_LABEL (elt)) == bb)
{
- if (++case_count > 1)
+ if (++case_count > 1 || CASE_HIGH (elt))
break;
match_case = elt;
}
@@ -1484,6 +1487,7 @@ record_equivalences_from_incoming_edge (struct dom_walk_data *walk_data,
the exact value of SWITCH_COND which caused us to get to
this block. Record that equivalence in EQ_EXPR_VALUE. */
if (case_count == 1
+ && match_case
&& CASE_LOW (match_case)
&& !CASE_HIGH (match_case))
{