aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1995-02-06 16:29:31 -0800
committerJim Wilson <wilson@gcc.gnu.org>1995-02-06 16:29:31 -0800
commitca188f167980504318441867688990b3cdec76fb (patch)
tree252290a972873b5e3f00f1a607d1a01b5de9c135 /gcc
parent4f2d36749024d35dd0119be7af2123b935f92241 (diff)
downloadgcc-ca188f167980504318441867688990b3cdec76fb.zip
gcc-ca188f167980504318441867688990b3cdec76fb.tar.gz
gcc-ca188f167980504318441867688990b3cdec76fb.tar.bz2
(jump_optimize): When searching for a LOOP_END note to move,
stop if we find a LOOP_BEG note first. From-SVN: r8885
Diffstat (limited to 'gcc')
-rw-r--r--gcc/jump.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/gcc/jump.c b/gcc/jump.c
index 9cabf41..ff26729 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -1878,24 +1878,31 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
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. */
+ optimization. Stop if we find a LOOP_BEG note
+ first, since we don't want to move the LOOP_END
+ note in that case. */
for (;range2after != label2; range2after = rangenext)
{
rangenext = NEXT_INSN (range2after);
- if (GET_CODE (range2after) == NOTE
- && (NOTE_LINE_NUMBER (range2after)
- == NOTE_INSN_LOOP_END))
+ if (GET_CODE (range2after) == NOTE)
{
- 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;
+ if (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;
+ }
+ else if (NOTE_LINE_NUMBER (range2after)
+ == NOTE_INSN_LOOP_BEG)
+ break;
}
}
changed = 1;