aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <erich@gnu.org>1994-06-24 19:35:38 +0000
committerRichard Earnshaw <erich@gnu.org>1994-06-24 19:35:38 +0000
commitf0e1b9a9887363dc693310491da72bd22b061cf4 (patch)
tree339f0e0298905ef53480ec8f6e9b5e8d11d50833 /gcc
parentc9d4d2b46bee41014c266cf657f65852edaf95cd (diff)
downloadgcc-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.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/jump.c b/gcc/jump.c
index 076f695..2f9621f 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -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;
}