diff options
author | Richard Guenther <rguenther@suse.de> | 2010-01-02 19:14:52 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-01-02 19:14:52 +0000 |
commit | 1d86f5e9ecf0454eae2c3edc8eed7aafdf2c994e (patch) | |
tree | 73badf5e1d0ce4aae2c5377454a51793fdb34713 /gcc | |
parent | 78ce4053fa82a756bf2cb1a9e60d95a4f3ba7b05 (diff) | |
download | gcc-1d86f5e9ecf0454eae2c3edc8eed7aafdf2c994e.zip gcc-1d86f5e9ecf0454eae2c3edc8eed7aafdf2c994e.tar.gz gcc-1d86f5e9ecf0454eae2c3edc8eed7aafdf2c994e.tar.bz2 |
re PR middle-end/42577 (array bounds false positive with -O3, goes away with -O2)
2010-01-02 Richard Guenther <rguenther@suse.de>
PR middle-end/42577
* tree-vrp.c (check_all_array_refs): Skip non-excutable blocks.
(simplify_switch_using_ranges): Mark to be removed edges
as non-executable.
From-SVN: r155577
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 39 |
2 files changed, 17 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e32c54..93890c6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-02 Richard Guenther <rguenther@suse.de> + + PR middle-end/42577 + * tree-vrp.c (check_all_array_refs): Skip non-excutable blocks. + (simplify_switch_using_ranges): Mark to be removed edges + as non-executable. + 2010-01-02 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * config/pa/t-slibgcc-dwarf-ver (SHLIB_SOVERSION): Bump by two. diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 2d0761b1..c1ba16a 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -5122,36 +5122,16 @@ check_all_array_refs (void) FOR_EACH_BB (bb) { - /* Skip bb's that are clearly unreachable. */ - if (single_pred_p (bb)) - { - int i; - bool reachable = true; - edge e2; - edge e = EDGE_PRED (bb, 0); - basic_block pred_bb = e->src; - gimple ls = NULL; - - for (i = 0; VEC_iterate (edge, to_remove_edges, i, e2); ++i) - if (e == e2) - { - reachable = false; - break; - } - - if (!reachable) - continue; + edge_iterator ei; + edge e; + bool executable = false; - if (!gsi_end_p (gsi_last_bb (pred_bb))) - ls = gsi_stmt (gsi_last_bb (pred_bb)); + /* Skip blocks that were found to be unreachable. */ + FOR_EACH_EDGE (e, ei, bb->preds) + executable |= !!(e->flags & EDGE_EXECUTABLE); + if (!executable) + continue; - if (ls && gimple_code (ls) == GIMPLE_COND - && ((gimple_cond_false_p (ls) - && (EDGE_PRED (bb, 0)->flags & EDGE_TRUE_VALUE)) - || (gimple_cond_true_p (ls) - && (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE)))) - continue; - } for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) { gimple stmt = gsi_stmt (si); @@ -6926,6 +6906,7 @@ simplify_switch_using_ranges (gimple stmt) fprintf (dump_file, "removing unreachable case label\n"); } VEC_safe_push (edge, heap, to_remove_edges, e); + e->flags &= ~EDGE_EXECUTABLE; } /* And queue an update for the stmt. */ @@ -7255,7 +7236,7 @@ vrp_finalize (void) substitute_and_fold (single_val_range, vrp_fold_stmt); if (warn_array_bounds) - check_all_array_refs (); + check_all_array_refs (); /* We must identify jump threading opportunities before we release the datastructures built by VRP. */ |