OSDN Git Service

* tree-ssa-uncprop.c (associate_equivalences_with_edges): Properly
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 Nov 2005 08:53:22 +0000 (08:53 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 Nov 2005 08:53:22 +0000 (08:53 +0000)
        handle SSA_NAME_OCCURS_IN_ABNORMAL_PHI.

        * g++.old-deja/g++.law/pr25000.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@107710 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.law/pr25000.C [new file with mode: 0644]
gcc/tree-ssa-uncprop.c

index 4c2e7be..8cf398b 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-30  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-uncprop.c (associate_equivalences_with_edges): Properly
+       handle SSA_NAME_OCCURS_IN_ABNORMAL_PHI.
+
 2005-11-30  Jakub Jelinek  <jakub@redhat.com>
 
        * config/ia64/ia64.c (ia64_expand_tls_address): Add ORIG_OP1 argument.
index 57ea16d..bca19a5 100644 (file)
@@ -1,3 +1,7 @@
+2005-11-30  Jeff Law  <law@redhat.com>
+
+       * g++.old-deja/g++.law/pr25000.C: New test.
+
 2005-11-30  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.dg/tls/opt-11.c: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.law/pr25000.C b/gcc/testsuite/g++.old-deja/g++.law/pr25000.C
new file mode 100644 (file)
index 0000000..45d4680
--- /dev/null
@@ -0,0 +1,24 @@
+// { dg-do compile  }
+// { dg-options "-O2" }
+int * f(void);
+void g(int*);
+bool h(void);
+void Find( )
+{
+    int * pRes = f();
+    if( !pRes )  {
+        if( h()){
+          if( h()){
+            try     
+             {       
+                pRes = new int();
+                f();    
+             }catch(int& e1 ){}    
+          }     
+          if( !pRes )
+            f();    
+        }
+        g(pRes);
+    }
+}
+
index 4ca90c2..28d3850 100644 (file)
@@ -92,7 +92,8 @@ associate_equivalences_with_edges (void)
 
          /* If the conditional is a single variable 'X', record 'X = 1'
             for the true edge and 'X = 0' on the false edge.  */
-         if (TREE_CODE (cond) == SSA_NAME)
+         if (TREE_CODE (cond) == SSA_NAME
+             && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (cond))
            {
              equivalency = xmalloc (sizeof (struct edge_equivalency));
              equivalency->rhs = constant_boolean_node (1, TREE_TYPE (cond));
@@ -114,6 +115,7 @@ associate_equivalences_with_edges (void)
                 know the value of OP0 on both arms of the branch.  i.e., we
                 can record an equivalence for OP0 rather than COND.  */
              if (TREE_CODE (op0) == SSA_NAME
+                 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0)
                  && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
                  && is_gimple_min_invariant (op1))
                {
@@ -152,8 +154,10 @@ associate_equivalences_with_edges (void)
                }
 
              if (TREE_CODE (op0) == SSA_NAME
+                 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0)
                  && (is_gimple_min_invariant (op1)
-                     || TREE_CODE (op1) == SSA_NAME))
+                     || (TREE_CODE (op1) == SSA_NAME
+                         && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op1))))
                {
                  /* For IEEE, -0.0 == 0.0, so we don't necessarily know
                     the sign of a variable compared against zero.  If
@@ -185,7 +189,8 @@ associate_equivalences_with_edges (void)
        {
          tree cond = SWITCH_COND (stmt);
 
-         if (TREE_CODE (cond) == SSA_NAME)
+         if (TREE_CODE (cond) == SSA_NAME
+             && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (cond))
            {
              tree labels = SWITCH_LABELS (stmt);
              int i, n_labels = TREE_VEC_LENGTH (labels);