diff options
author | Steven Bosscher <stevenb@suse.de> | 2004-05-31 10:18:36 +0000 |
---|---|---|
committer | Steven Bosscher <steven@gcc.gnu.org> | 2004-05-31 10:18:36 +0000 |
commit | 1c052514f657db4f56b876814fee2ffd564fae59 (patch) | |
tree | 03546cea2e85d029b448847ecd142555b3ffec6e | |
parent | 58128b9da11df305d8e631bcbbaa6aad2ad970d6 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-ssa-dom.c | 8 |
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)) { |