Do not foward a branch to just after a loop exit before
authorDale Johannesen <dalej@gcc.gnu.org>
Tue, 17 Sep 2002 21:25:13 +0000 (21:25 +0000)
committerDale Johannesen <dalej@gcc.gnu.org>
Tue, 17 Sep 2002 21:25:13 +0000 (21:25 +0000)
loop optimization; this broke doloop detection.

From-SVN: r57260

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/testsuite/gcc.dg/doloop-1.c [new file with mode: 0644]

index 78348154a2dfd5c56c224616df9c22cd8c918b72..472a9b8af607f1edf94514aaabf4079b90a2980d 100644 (file)
@@ -1,3 +1,8 @@
+2002-09-17  Dale Johannesen  <dalej@apple.com>
+       * cfgcleanup.c (try_forward_edges):  Do not forward a
+       branch to just after a loop exit before loop optimization;
+       this interfered with doloop detection.
+
 2002-09-17  Nick Clifton  <nickc@redhat.com>
 
        * config/arm/arm.c (output_return_instruction): Do not
@@ -118,6 +123,7 @@ Tue Sep 17 13:40:13 2002  Nicola Pero  <n.pero@mi.flashnet.it>
        * real.h (real_nan): Return bool.
        * doc/extend.texi: Document new builtins.
 
+>>>>>>> 1.15460
 2002-09-16  Jason Merrill  <jason@redhat.com>
            Danny Smith  <dannysmith@users.sourceforge.net>
 
index f6a011ad51e51c0669a25dd313f054bb98e76239..fe221036b99c3979e4a4d0fa4cd3ae99dc26454b 100644 (file)
@@ -515,6 +515,15 @@ try_forward_edges (mode, b)
 
              if (GET_CODE (insn) == NOTE)
                break;
+
+             /* Do not clean up branches to just past the end of a loop
+                at this time; it can mess up the loop optimizer's
+                recognition of some patterns. */
+
+             insn = PREV_INSN (target->head);
+             if (insn && GET_CODE (insn) == NOTE
+                   && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
+               break;
            }
 
          counter++;
diff --git a/gcc/testsuite/gcc.dg/doloop-1.c b/gcc/testsuite/gcc.dg/doloop-1.c
new file mode 100644 (file)
index 0000000..3561a17
--- /dev/null
@@ -0,0 +1,18 @@
+/* Make sure both loops are recognized as doloops.
+   If so, "bdnz" will be generated on ppc; if not,
+   you will get "ble". */
+
+/* { dg-do compile { target powerpc-*-* } } */
+/* { dg-options "-O2" } */
+void foo (int count, char* pca, char* pcb) {
+    int i;
+    if (count > 10)
+        for (i = 0; i < count; ++i)
+            pcb += i;
+    else
+        for (i = 0; i < count; ++i)
+            pca += i;
+    *pca = *pcb;
+}
+/* { dg-final { scan-assembler "bdnz" } } */
+/* { dg-final { scan-assembler-not "blt" } } */