cfgcleanup.c (try_optimize_cfg): Make sure merge_blocks doesn't merge bb with itself.
authorJakub Jelinek <jakub@redhat.com>
Mon, 10 Jun 2002 21:36:15 +0000 (23:36 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 10 Jun 2002 21:36:15 +0000 (23:36 +0200)
* cfgcleanup.c (try_optimize_cfg): Make sure merge_blocks doesn't
merge bb with itself.

* gcc.c-torture/compile/20020605-1.c: New test.

From-SVN: r54456

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20020605-1.c [new file with mode: 0644]

index 4d085336386f7058c392079d0e2f323aa57c2ab5..0964d2700e5854d555cd91e2dc31b94cf8d84e02 100644 (file)
@@ -1,3 +1,8 @@
+2002-06-10  Jakub Jelinek  <jakub@redhat.com>
+
+       * cfgcleanup.c (try_optimize_cfg): Make sure merge_blocks doesn't
+       merge bb with itself.
+
 2002-06-10  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.md (builtin_zap): Fix thinkos expanding mask.
index 2e6e02daba7d25dded1a472def8425f01748630e..74b8d338ca99be0666aa1199f955208a0a94ffd1 100644 (file)
@@ -1675,6 +1675,7 @@ try_optimize_cfg (mode)
                     && !(s->flags & EDGE_COMPLEX)
                     && (c = s->dest) != EXIT_BLOCK_PTR
                     && c->pred->pred_next == NULL
+                    && b != c
                     /* If the jump insn has side effects,
                        we can't kill the edge.  */
                     && (GET_CODE (b->end) != JUMP_INSN
index ea104cf5335d48bd8b91917cb1241c3e7723b86f..afc08f4b8cea91f53d8c0464785675af997b072e 100644 (file)
@@ -1,3 +1,7 @@
+2002-06-10  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/compile/20020605-1.c: New test.
+
 2002-06-07  Roger Sayle  <roger@eyesopen.com>
 
        * gcc.dg/20020607-2.c: New test case.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020605-1.c b/gcc/testsuite/gcc.c-torture/compile/20020605-1.c
new file mode 100644 (file)
index 0000000..960a4be
--- /dev/null
@@ -0,0 +1,17 @@
+/* This testcase caused on IA-32 -O2 endless loop in
+   merge_blocks when trying to merge a basic block
+   with itself.  */
+
+void f (void)
+{
+  char *c;
+  do
+    {
+      if (c)
+       break;
+    }
+  while (1);
+  if (!c)
+    while (1)
+      f ();
+}