2001-10-08 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
authorsirl <sirl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Oct 2001 21:20:43 +0000 (21:20 +0000)
committersirl <sirl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Oct 2001 21:20:43 +0000 (21:20 +0000)
* unroll.c (loop_iterations): Extend check for multiple back edges.

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

gcc/ChangeLog
gcc/unroll.c

index f21ad78..854f28a 100644 (file)
@@ -1,3 +1,7 @@
+2001-10-08  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
+
+       * unroll.c (loop_iterations): Extend check for multiple back edges.
+
 2001-10-08  Alexandre Oliva  <aoliva@redhat.com>
 
        * langhooks.h: New file.
index c0fe373..a2af213 100644 (file)
@@ -3519,6 +3519,27 @@ loop_iterations (loop)
       return 0;
     }
 
+  /* If there are multiple conditionalized loop exit tests, they may jump
+     back to differing CODE_LABELs.  */
+  if (loop->top && loop->cont)
+    {
+      rtx temp = PREV_INSN (last_loop_insn);
+
+      do
+       {
+         if (GET_CODE (temp) == JUMP_INSN
+             && INSN_LUID (JUMP_LABEL (temp)) > INSN_LUID (loop->top)
+             && INSN_LUID (JUMP_LABEL (temp)) < INSN_LUID (loop->cont))
+           {
+             if (loop_dump_stream)
+               fprintf (loop_dump_stream,
+                        "Loop iterations: Loop has multiple back edges.\n");
+             return 0;
+           }
+       }
+      while ((temp = PREV_INSN (temp)) != loop->cont);
+    }
+
   /* Find the iteration variable.  If the last insn is a conditional
      branch, and the insn before tests a register value, make that the
      iteration variable.  */