Commit f0e1b9a9 by Richard Earnshaw

(jump_optimize): If we reverse "if (foo) bar else break;" and there follows a NOTE_INSN_LOOP_END...

(jump_optimize): If we reverse "if (foo) bar else break;"
and there follows a NOTE_INSN_LOOP_END, move the note before "bar".

From-SVN: r7557
parent c9d4d2b4
...@@ -1750,6 +1750,7 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) ...@@ -1750,6 +1750,7 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
rtx range2beg = next_active_insn (label1); rtx range2beg = next_active_insn (label1);
rtx range1after, range2after; rtx range1after, range2after;
rtx range1before, range2before; rtx range1before, range2before;
rtx rangenext;
/* Include in each range any notes before it, to be /* Include in each range any notes before it, to be
sure that we get the line number note if any, even sure that we get the line number note if any, even
...@@ -1783,6 +1784,34 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) ...@@ -1783,6 +1784,34 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
PREV_INSN (range1beg) = range2before; PREV_INSN (range1beg) = range2before;
NEXT_INSN (range1end) = range2after; NEXT_INSN (range1end) = range2after;
PREV_INSN (range2after) = range1end; PREV_INSN (range2after) = range1end;
/* Check for a loop end note between the end of
range2, and the next code label. If there is one,
then what we have really seen is
if (foo) break; end_of_loop;
and moved the break sequence outside the loop.
We must move the LOOP_END note to where the
loop really ends now, or we will confuse loop
optimization. */
for (;range2after != label2; range2after = rangenext)
{
rangenext = NEXT_INSN (range2after);
if (GET_CODE (range2after) == NOTE
&& (NOTE_LINE_NUMBER (range2after)
== NOTE_INSN_LOOP_END))
{
NEXT_INSN (PREV_INSN (range2after))
= rangenext;
PREV_INSN (rangenext)
= PREV_INSN (range2after);
PREV_INSN (range2after)
= PREV_INSN (range1beg);
NEXT_INSN (range2after) = range1beg;
NEXT_INSN (PREV_INSN (range1beg))
= range2after;
PREV_INSN (range1beg) = range2after;
}
}
changed = 1; changed = 1;
continue; continue;
} }
......
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