]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-dse.c (dse_optimize_stmt): Correctly handle PHI nodes which represent a...
authorJeff Law <law@redhat.com>
Fri, 16 Dec 2005 07:03:12 +0000 (00:03 -0700)
committerJeff Law <law@gcc.gnu.org>
Fri, 16 Dec 2005 07:03:12 +0000 (00:03 -0700)
* tree-ssa-dse.c (dse_optimize_stmt): Correctly handle PHI nodes which
represent a use and definition of the same SSA_NAME.

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

From-SVN: r108630

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 661e5337a53500494977ffb09167686a09e1b6bc..d90de63c4a95110da05b275b46af354cea1a2809 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 6662c2eaffa0e7434b7f6fd4304f7d443e1f93f7..9c4ba84cbe308523f42d19d92e04560e28ba37a4 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 fa3ba960a289a4f4bae5d76b60578b8942841f86..f1cc22ae310224fc42c777e6a0bd8095a00db288 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))