Commit 4d0e69c3 by Richard Kenner

(mostly_true_jump): When trying to determine if the current insn is essentially…

(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
parent cf526dcc
...@@ -1069,10 +1069,13 @@ mostly_true_jump (jump_insn, condition) ...@@ -1069,10 +1069,13 @@ mostly_true_jump (jump_insn, condition)
/* If TARGET_LABEL has no jumps between it and the end of the function, /* 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. */ this is essentially a conditional return, so predict it as false. */
for (insn = NEXT_INSN (target_label); for (insn = NEXT_INSN (target_label); insn; insn = NEXT_INSN (insn))
insn && GET_CODE (insn) != JUMP_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) if (insn == 0)
return 0; return 0;
...@@ -1086,6 +1089,16 @@ mostly_true_jump (jump_insn, condition) ...@@ -1086,6 +1089,16 @@ mostly_true_jump (jump_insn, condition)
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG) if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
return 2; 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 /* If we couldn't figure out what this jump was, assume it won't be
taken. This should be rare. */ taken. This should be rare. */
if (condition == 0) if (condition == 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment