+2007-06-06 Richard Guenther <rguenther@suse.de>
+
+ * tree-ssa-forwprop.c (forward_propagate_into_cond): Return 2
+ if we need to schedule cfg_cleanup.
+ (tree_ssa_forward_propagate_single_use_vars): Do so.
+
2007-06-06 Ian Lance Taylor <iant@google.com>
* fold-const.c (merge_ranges): If range_successor or
PR target/31733
* cfgrtl.c (rtl_verify_flow_info): Skip notes when looking for barrier.
-2007-05-31 Jan Hubicka <jh@suse.cz>
+2007-06-04 Jan Hubicka <jh@suse.cz>
* tree-predcom.c (replace_ref_with, initialize_root_vars_lm,
reassociate_to_the_same_stmt): Call build_gimple_modify_stmt
}
/* Propagate from the ssa name definition statements of COND_EXPR
- in statement STMT into the conditional if that simplifies it. */
+ in statement STMT into the conditional if that simplifies it.
+ Returns zero if no statement was changed, one if there were
+ changes and two if cfg_cleanup needs to run. */
-static bool
+static int
forward_propagate_into_cond (tree cond_expr, tree stmt)
{
- bool did_something = false;
+ int did_something = 0;
do {
tree tmp = NULL_TREE;
/* Remove defining statements. */
remove_prop_source_from_use (name, NULL);
- did_something = true;
+ if (is_gimple_min_invariant (tmp))
+ did_something = 2;
+ else if (did_something == 0)
+ did_something = 1;
/* Continue combining. */
continue;
}
else if (TREE_CODE (rhs) == COND_EXPR)
{
- bool did_something;
+ int did_something;
fold_defer_overflow_warnings ();
did_something = forward_propagate_into_cond (rhs, stmt);
+ if (did_something == 2)
+ cfg_changed = true;
fold_undefer_overflow_warnings (!TREE_NO_WARNING (rhs)
&& did_something, stmt, WARN_STRICT_OVERFLOW_CONDITIONAL);
bsi_next (&bsi);
}
else if (TREE_CODE (stmt) == COND_EXPR)
{
- bool did_something;
+ int did_something;
fold_defer_overflow_warnings ();
did_something = forward_propagate_into_cond (stmt, stmt);
+ if (did_something == 2)
+ cfg_changed = true;
fold_undefer_overflow_warnings (!TREE_NO_WARNING (stmt)
&& did_something, stmt,
WARN_STRICT_OVERFLOW_CONDITIONAL);