jump.c (jump_optimize_1): When we delete a conditional jump preceeding a non-conditional jump to...

* 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.

Co-Authored-By: DJ Delorie <dj@redhat.com>

From-SVN: r39686
This commit is contained in:
Richard Henderson 2001-02-14 10:34:25 -08:00 committed by DJ Delorie
parent 7161c1a582
commit 8e0b124eaf
2 changed files with 30 additions and 0 deletions

View File

@ -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.

View File

@ -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;