]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-forwprop.c (forward_propagate_into_cond): Return 2 if we need to schedule...
authorRichard Biener <rguenth@gcc.gnu.org>
Wed, 6 Jun 2007 13:58:41 +0000 (13:58 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 6 Jun 2007 13:58:41 +0000 (13:58 +0000)
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.

From-SVN: r125490

gcc/ChangeLog
gcc/tree-ssa-forwprop.c

index 5e775c31d1608756a3a8eaa0a9472a7de2e008b3..b2daf37c9a5bc89a647a293d9e4c22d6cbba79bd 100644 (file)
@@ -1,3 +1,9 @@
+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
index e42406c3ed6096bfae6d9f995d91a430d441427a..967a824e9c7787d46300741665e1b01d5e46a725 100644 (file)
@@ -370,12 +370,14 @@ combine_cond_expr_cond (enum tree_code code, tree type,
 }
 
 /* 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;
@@ -449,7 +451,10 @@ forward_propagate_into_cond (tree cond_expr, tree stmt)
        /* 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;
@@ -1014,9 +1019,11 @@ tree_ssa_forward_propagate_single_use_vars (void)
                }
               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);
@@ -1042,9 +1049,11 @@ tree_ssa_forward_propagate_single_use_vars (void)
            }
          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);