diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-10-26 07:28:24 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-10-26 07:28:24 -0400 |
commit | fe464cafd9157578e3f8bb6dee341d470d0e96e7 (patch) | |
tree | 439a183c6cb81060ed25bbf1ad49ffe1fa1f1d9f /gcc | |
parent | e934eef9760b4326c907b295216360eb06da0de5 (diff) | |
download | gcc-fe464cafd9157578e3f8bb6dee341d470d0e96e7.zip gcc-fe464cafd9157578e3f8bb6dee341d470d0e96e7.tar.gz gcc-fe464cafd9157578e3f8bb6dee341d470d0e96e7.tar.bz2 |
(duplicate_loop_exit_test): Return 0 if found a NOTE_INSN_LOOP_CONT.
From-SVN: r10510
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/jump.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -2122,12 +2122,6 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) followed by a jump to the exit of the loop. Then delete the unconditional jump after INSN. - Note that it is possible we can get confused here if the jump immediately - after the loop start branches outside the loop but within an outer loop. - If we are near the exit of that loop, we will copy its exit test. This - will not generate incorrect code, but could suppress some optimizations. - However, such cases are degenerate loops anyway. - Return 1 if we made the change, else 0. This is only safe immediately after a regscan pass because it uses the @@ -2168,9 +2162,19 @@ duplicate_loop_exit_test (loop_start) case CALL_INSN: return 0; case NOTE: + /* We could be in front of the wrong NOTE_INSN_LOOP_END if there is + a jump immediately after the loop start that branches outside + the loop but within an outer loop, near the exit test. + If we copied this exit test and created a phony + NOTE_INSN_LOOP_VTOP, this could make instructions immediately + before the exit test look like these could be safely moved + out of the loop even if they actually may be never executed. + This can be avoided by checking here for NOTE_INSN_LOOP_CONT. */ + if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG - || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END) + || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END + || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT) return 0; break; case JUMP_INSN: |