diff options
| author | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-02-14 18:34:25 +0000 |
|---|---|---|
| committer | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-02-14 18:34:25 +0000 |
| commit | 478f181c05d228c2ee8a83743c6cdba8012f0d5c (patch) | |
| tree | 94760e35379c8c6c0c88a32dbc7d989737bb1970 | |
| parent | 3bc77e77b4557c79b0e2df9927c528c0bf4063e0 (diff) | |
| download | ppe42-gcc-478f181c05d228c2ee8a83743c6cdba8012f0d5c.tar.gz ppe42-gcc-478f181c05d228c2ee8a83743c6cdba8012f0d5c.zip | |
* jump.c (jump_optimize_1): When we delete a conditional jump
preceeding a non-conditional jump to effectively the same place,
make sure that the combined jump skips any clobber insns between
the two labels.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@39686 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 8 | ||||
| -rw-r--r-- | gcc/jump.c | 22 |
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63bbb9bff3f..a97e22abc24 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2001-02-14 Richard Henderson <rth@redhat.com> + DJ Delorie <dj@redhat.com> + + * jump.c (jump_optimize_1): When we delete a conditional jump + preceeding a non-conditional jump to effectively the same place, + make sure that the combined jump skips any clobber insns between + the two labels. + 2001-02-14 Jeffrey Oldham <oldham@codesourcery.com> * gcc.c (do_spec_1): Fix off-by-one error for '%M' case. diff --git a/gcc/jump.c b/gcc/jump.c index 978b2666a0e..121375395bd 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -420,6 +420,28 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan, if (temp2 == temp) { + /* Ensure that we jump to the later of the two labels. + Consider: + + if (test) goto L2; + goto L1; + ... + L1: + (clobber return-reg) + L2: + (use return-reg) + + If we leave the goto L1, we'll incorrectly leave + return-reg dead for TEST true. */ + + temp2 = next_active_insn (JUMP_LABEL (insn)); + if (!temp2) + temp2 = get_last_insn (); + if (GET_CODE (temp2) != CODE_LABEL) + temp2 = prev_label (temp2); + if (temp2 != JUMP_LABEL (temp)) + redirect_jump (temp, temp2, 1); + delete_jump (insn); changed = 1; continue; |

