aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-01-02 19:14:52 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-01-02 19:14:52 +0000
commit1d86f5e9ecf0454eae2c3edc8eed7aafdf2c994e (patch)
tree73badf5e1d0ce4aae2c5377454a51793fdb34713 /gcc
parent78ce4053fa82a756bf2cb1a9e60d95a4f3ba7b05 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/tree-vrp.c39
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. */