OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-forwprop.c
index 52c3860..b13894e 100644 (file)
@@ -39,7 +39,7 @@ Boston, MA 02111-1307, USA.  */
 
    Right now we only bother forward propagating into COND_EXPRs since those
    are relatively common cases where forward propagation creates valid
-   gimple code without the expression needing to fold.  ie
+   gimple code without the expression needing to fold.  i.e.
 
      bb0:
        x = a COND b;
@@ -212,6 +212,11 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
                          || !CONSTANT_CLASS_P (op1)
                          || !INTEGRAL_TYPE_P (TREE_TYPE (op1)))
                        continue;
+                     
+                     /* Don't propagate if the first operand occurs in
+                        an abnormal PHI.  */
+                     if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0))
+                       continue;
                    }
 
                  /* These cases require comparisons of a naked SSA_NAME or
@@ -235,6 +240,18 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
                              || (TREE_CODE (op1) != SSA_NAME
                                  && !is_gimple_min_invariant (op1)))
                            continue;
+                     
+                         /* Don't propagate if the first operand occurs in
+                            an abnormal PHI.  */
+                         if (TREE_CODE (op0) == SSA_NAME
+                             && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0))
+                           continue;
+                     
+                         /* Don't propagate if the second operand occurs in
+                            an abnormal PHI.  */
+                         if (TREE_CODE (op1) == SSA_NAME
+                             && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op1))
+                           continue;
                        }
 
                      /* If TEST_VAR is set from a TRUTH_NOT_EXPR, then it
@@ -247,6 +264,12 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
                          if (TREE_CODE (def_rhs) != SSA_NAME
                              && !is_gimple_min_invariant (def_rhs))
                            continue;
+                     
+                         /* Don't propagate if the operand occurs in
+                            an abnormal PHI.  */
+                         if (TREE_CODE (def_rhs) == SSA_NAME
+                             && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def_rhs))
+                           continue;
                        }
 
                      /* If TEST_VAR was set from a cast of an integer type
@@ -268,6 +291,13 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
                            ;
                          else
                            continue;
+                     
+                         /* Don't propagate if the operand occurs in
+                            an abnormal PHI.  */
+                         if (TREE_CODE (TREE_OPERAND (def_rhs, 0)) == SSA_NAME
+                             && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND
+                                                                 (def_rhs, 0)))
+                           continue;
                        }
                      else
                        continue;
@@ -299,7 +329,6 @@ substitute_single_use_vars (varray_type *cond_worklist,
       tree def = SSA_NAME_DEF_STMT (test_var);
       dataflow_t df;
       int j, num_uses, propagated_uses;
-      block_stmt_iterator bsi;
 
       VARRAY_POP (vars_worklist);
 
@@ -436,16 +465,10 @@ substitute_single_use_vars (varray_type *cond_worklist,
         Unfortunately, we have to find the defining statement in
         whatever block it might be in.  */
       if (num_uses && num_uses == propagated_uses)
-       for (bsi = bsi_start (bb_for_stmt (def));
-            !bsi_end_p (bsi);
-            bsi_next (&bsi))
-         {
-           if (def == bsi_stmt (bsi))
-             {
-               bsi_remove (&bsi);
-               break;
-             }
-         }
+       {
+         block_stmt_iterator bsi = bsi_for_stmt (def);
+         bsi_remove (&bsi);
+       }
     }
 }