OSDN Git Service

* tree-ssa-dse.c (dse_optimize_stmt): Correctly handle PHI nodes which
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Dec 2005 07:03:12 +0000 (07:03 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Dec 2005 07:03:12 +0000 (07:03 +0000)
represent a use and definition of the same SSA_NAME.

* gcc.dg/tree-ssa/ssa-dse-8.c: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-8.c [new file with mode: 0644]
gcc/tree-ssa-dse.c

index 661e533..d90de63 100644 (file)
@@ -1,3 +1,8 @@
+2005-12-16  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-dse.c (dse_optimize_stmt): Correctly handle PHI nodes which
+       represent a use and definition of the same SSA_NAME.
+
 2005-12-16  Jon Grimm  <jgrimm2@us.ibm.com>
            Janis Johnson  <janis187@us.ibm.com>
            Ben Elliston  <bje@au.ibm.com>
index 6662c2e..9c4ba84 100644 (file)
@@ -1,3 +1,7 @@
+2005-12-16  Jeff Law  <law@redhat.com>
+
+       * gcc.dg/tree-ssa/ssa-dse-8.c: New test.
+
 2005-12-16  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c (base_types):
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-8.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-8.c
new file mode 100644 (file)
index 0000000..de1d5bb
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-dce -fno-tree-ccp -fno-tree-copy-prop -fno-tree-dominator-opts" } */
+
+/* This caused the compiler to enter an infinite loop if copies are not
+   fully propagated.   The options are to disable copy propagation and
+   thus expose the bug.   */
+
+int foo (void);
+
+struct A {
+  struct B {
+    struct B *n;
+  } *p;
+};
+
+static inline void baz (struct A *a)
+{
+  a->p = a->p->n;
+}
+
+void bar (struct A a)
+{
+  while (foo ())
+    baz (&a);
+  while (foo ());
+}
index fa3ba96..f1cc22a 100644 (file)
@@ -309,6 +309,15 @@ dse_optimize_stmt (struct dom_walk_data *walk_data,
             && TREE_CODE (use_stmt) == PHI_NODE
             && bitmap_bit_p (dse_gd->stores, get_stmt_uid (use_stmt)))
        {
+         /* A PHI node can both define and use the same SSA_NAME if
+            the PHI is at the top of a loop and the PHI_RESULT is
+            a loop invariant and copies have not been fully propagated.
+
+            The safe thing to do is exit assuming no optimization is
+            possible.  */
+         if (SSA_NAME_DEF_STMT (PHI_RESULT (use_stmt)) == use_stmt)
+           return;
+
          /* Skip past this PHI and loop again in case we had a PHI
             chain.  */
          if (single_imm_use (PHI_RESULT (use_stmt), &use_p, &use_stmt))