From 4d0e69c3f028843b21182d4d4431b5a93766673b Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Sun, 27 Dec 1992 10:46:56 -0500 Subject: [PATCH] (mostly_true_jump): When trying to determine if the current insn is essentially a conditional return... (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 | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/gcc/reorg.c b/gcc/reorg.c index bf8104e1934..bcee35ebf17 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -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) -- 2.30.2