From: rguenth Date: Sat, 2 Jan 2010 19:14:52 +0000 (+0000) Subject: 2010-01-02 Richard Guenther X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=8b9386176b708fb5b77b527d17bbecbfb56030f1 2010-01-02 Richard Guenther 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155577 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e32c542ac8..93890c6d628 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-02 Richard Guenther + + 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 * config/pa/t-slibgcc-dwarf-ver (SHLIB_SOVERSION): Bump by two. diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 2d0761b15fa..c1ba16a04c2 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. */