+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.
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);
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. */
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. */