]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/31797 (infinite loop in tree-ssa-pre or ICE)
authorRichard Guenther <rguenther@suse.de>
Sat, 12 May 2007 17:21:43 +0000 (17:21 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sat, 12 May 2007 17:21:43 +0000 (17:21 +0000)
2007-05-12  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/31797
* tree-ssa-forwprop.c (forward_propagate_addr_expr): Do not
propagate into a stmt that has volatile ops.

* gcc.c-torture/compile/pr31797.c: New testcase.

From-SVN: r124637

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr31797.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index 01ce517bccad7f833819fcc15cdcac3693591a22..bc7e921124fc26170aff657b040e58706dec476a 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-12  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/31797
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr): Do not
+       propagate into a stmt that has volatile ops.
+
 2007-05-12  Richard Sandiford  <richard@codesourcery.com>
 
        * configure.ac (gcc_gxx_include_dir): Use $(libsubdir_to_prefix).
index 3109938e70241a07d7174991147887a1ec109a4d..b4ad8f7384b83a417d32df6a1c0ed76e6e275b4f 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-12  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/31797
+       * gcc.c-torture/compile/pr31797.c: New testcase.
+
 2007-05-12  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/30746
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr31797.c b/gcc/testsuite/gcc.c-torture/compile/pr31797.c
new file mode 100644 (file)
index 0000000..97958f3
--- /dev/null
@@ -0,0 +1,31 @@
+struct GTeth_desc
+{
+  unsigned ed_cmdsts;
+};
+struct GTeth_softc
+{
+  struct GTeth_desc txq_desc[32];
+  unsigned int txq_fi;
+  unsigned int txq_nactive;
+};
+
+void
+GTeth_txq_free (struct GTeth_softc *sc)
+{
+  struct GTeth_desc *txd = &sc->txq_desc[0];
+  txd->ed_cmdsts &= ~(1U << (31));
+}
+void
+GTeth_txq_done (struct GTeth_softc *sc)
+{
+  while (sc->txq_nactive > 0)
+    {
+      volatile struct GTeth_desc *txd = &sc->txq_desc[sc->txq_fi];
+      if (txd->ed_cmdsts)
+       {
+         if (sc->txq_nactive == 1)
+           return;
+       }
+      GTeth_txq_free (sc);
+    }
+}
index d91aa89325d0f47a1e3f93eacd0770c22469cb93..2afdd9a633238ef695855b7be09fb6495158ef50 100644 (file)
@@ -727,7 +727,7 @@ forward_propagate_addr_expr (tree name, tree rhs)
          continue;
        }
 
-     /* If the use is in a deeper loop nest, then we do not want
+      /* If the use is in a deeper loop nest, then we do not want
        to propagate the ADDR_EXPR into the loop as that is likely
        adding expression evaluations into the loop.  */
       if (bb_for_stmt (use_stmt)->loop_depth > stmt_loop_depth)
@@ -735,7 +735,14 @@ forward_propagate_addr_expr (tree name, tree rhs)
          all = false;
          continue;
        }
-      
+
+      /* If the use_stmt has side-effects, don't propagate into it.  */
+      if (stmt_ann (use_stmt)->has_volatile_ops)
+       {
+         all = false;
+         continue;
+       }
+
       push_stmt_changes (&use_stmt);
 
       result = forward_propagate_addr_expr_1 (name, rhs, use_stmt,