tree-ssa-forwprop.c (can_propagate_from): Exclude loads from decls explicitly.
authorRichard Guenther <rguenther@suse.de>
Wed, 2 Jul 2008 11:25:26 +0000 (11:25 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 2 Jul 2008 11:25:26 +0000 (11:25 +0000)
2008-07-02  Richard Guenther  <rguenther@suse.de>

* tree-ssa-forwprop.c (can_propagate_from): Exclude loads
from decls explicitly.  Merge operand checking from tuples.

From-SVN: r137352

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

index bb3362e6d9b6b8e9b42980be3fa2b0b43338c5e7..9a0c28390ae87cecbc5c74948806fd3260a4abd8 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-02  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-forwprop.c (can_propagate_from): Exclude loads
+       from decls explicitly.  Merge operand checking from tuples.
+
 2008-07-02  Martin Jambor  <mjambor@suse.cz>
 
        * tree-switch-conversion.c: Included timevar.h which I forgot before.
index ac9d8514784045251a34f22d6fdbbf5cbcc182d1..c49f0a489093e35dfabd1995a3621b0ebc9bbafc 100644 (file)
@@ -257,42 +257,27 @@ static bool
 can_propagate_from (tree def_stmt)
 {
   tree rhs = GIMPLE_STMT_OPERAND (def_stmt, 1);
+  use_operand_p use_p;
+  ssa_op_iter iter;
 
   /* If the rhs has side-effects we cannot propagate from it.  */
   if (TREE_SIDE_EFFECTS (rhs))
     return false;
 
   /* If the rhs is a load we cannot propagate from it.  */
-  if (REFERENCE_CLASS_P (rhs))
+  if (REFERENCE_CLASS_P (rhs)
+      || DECL_P (rhs))
     return false;
 
   /* Constants can be always propagated.  */
   if (is_gimple_min_invariant (rhs))
     return true;
 
-  /* We cannot propagate ssa names that occur in abnormal phi nodes.  */
-  switch (TREE_CODE_LENGTH (TREE_CODE (rhs)))
-    {
-    case 3:
-      if (TREE_OPERAND (rhs, 2) != NULL_TREE
-         && TREE_CODE (TREE_OPERAND (rhs, 2)) == SSA_NAME
-         && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (rhs, 2)))
-       return false;
-    case 2:
-      if (TREE_OPERAND (rhs, 1) != NULL_TREE
-         && TREE_CODE (TREE_OPERAND (rhs, 1)) == SSA_NAME
-         && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (rhs, 1)))
-       return false;
-    case 1:
-      if (TREE_OPERAND (rhs, 0) != NULL_TREE
-         && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
-         && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (rhs, 0)))
-       return false;
-      break;
-
-    default:
+  /* If any of the SSA operands occurs in abnormal PHIs we cannot
+     propagate from this stmt.  */
+  FOR_EACH_SSA_USE_OPERAND (use_p, def_stmt, iter, SSA_OP_USE)
+    if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
       return false;
-    }
 
   /* If the definition is a conversion of a pointer to a function type,
      then we can not apply optimizations as some targets require function