(mostly_true_jump): When trying to determine if the current insn is essentially a...
authorRichard Kenner <kenner@gcc.gnu.org>
Sun, 27 Dec 1992 15:46:56 +0000 (10:46 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Sun, 27 Dec 1992 15:46:56 +0000 (10:46 -0500)
(mostly_true_jump): When trying to determine if the current insn is
essentially a conditional return, look inside of SEQUENCE insns for
jumps.
Predict jumps to the exit test for loops as likely to be taken.

From-SVN: r2925

gcc/reorg.c

index bf8104e19345ff881c1d292ccc70d0a63d7fd866..bcee35ebf172ead10a349cc304b56fed22a74e78 100644 (file)
@@ -1069,10 +1069,13 @@ mostly_true_jump (jump_insn, condition)
 
   /* If TARGET_LABEL has no jumps between it and the end of the function,
      this is essentially a conditional return, so predict it as false.  */
-  for (insn = NEXT_INSN (target_label);
-       insn && GET_CODE (insn) != JUMP_INSN;
-       insn = NEXT_INSN (insn))
-    ;
+  for (insn = NEXT_INSN (target_label); insn; insn = NEXT_INSN (insn))
+    {
+      if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
+       insn = XVECEXP (PATTERN (insn), 0, 0);
+      if (GET_CODE (insn) == JUMP_INSN)
+       break;
+    }
 
   if (insn == 0)
     return 0;
@@ -1086,6 +1089,16 @@ mostly_true_jump (jump_insn, condition)
     if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
       return 2;
 
+  /* If this is a jump to the test of a loop, it is likely true.  We scan
+     forwards from the target label.  If we find a NOTE_INSN_LOOP_VTOP
+     before the next real insn, we assume the branch is to the loop branch
+     test.  */
+  for (insn = NEXT_INSN (target_label);
+       insn && GET_CODE (insn) == NOTE;
+       insn = PREV_INSN (insn))
+    if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_VTOP)
+      return 1;
+
   /* If we couldn't figure out what this jump was, assume it won't be 
      taken.  This should be rare.  */
   if (condition == 0)