diff options
author | Richard Earnshaw <erich@gnu.org> | 1994-06-24 19:35:38 +0000 |
---|---|---|
committer | Richard Earnshaw <erich@gnu.org> | 1994-06-24 19:35:38 +0000 |
commit | f0e1b9a9887363dc693310491da72bd22b061cf4 (patch) | |
tree | 339f0e0298905ef53480ec8f6e9b5e8d11d50833 /gcc | |
parent | c9d4d2b46bee41014c266cf657f65852edaf95cd (diff) | |
download | gcc-f0e1b9a9887363dc693310491da72bd22b061cf4.zip gcc-f0e1b9a9887363dc693310491da72bd22b061cf4.tar.gz gcc-f0e1b9a9887363dc693310491da72bd22b061cf4.tar.bz2 |
(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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/jump.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -1750,6 +1750,7 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) rtx range2beg = next_active_insn (label1); rtx range1after, range2after; rtx range1before, range2before; + rtx rangenext; /* Include in each range any notes before it, to be sure that we get the line number note if any, even @@ -1783,6 +1784,34 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) PREV_INSN (range1beg) = range2before; NEXT_INSN (range1end) = range2after; 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; continue; } |