cse.c (cse_insn): Mostly remove first hunk of code which collapsed a computed jump into an...
* cse.c (cse_insn): Mostly remove first hunk of code which collapsed a computed jump into an unconditional jump. In second hunk of code for collapsing computed and conditional jumps into unconditional jumps, reemit the jump in additional cases. From-SVN: r41953
This commit is contained in:
parent
f3ce87a905
commit
d466c016c5
@ -5,6 +5,11 @@
|
||||
|
||||
Thu May 10 14:45:44 2001 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* cse.c (cse_insn): Mostly remove first hunk of code which collapsed
|
||||
a computed jump into an unconditional jump.
|
||||
In second hunk of code for collapsing computed and conditional jumps
|
||||
into unconditional jumps, reemit the jump in additional cases.
|
||||
|
||||
* jump.c (jump_optimize_1): Do not wrap the new jump target
|
||||
inside a LABEL_REF; gen_jump will do that automatically.
|
||||
|
||||
|
45
gcc/cse.c
45
gcc/cse.c
@ -5518,31 +5518,17 @@ cse_insn (insn, libcall_insn)
|
||||
check for this separately here. We will delete such an
|
||||
insn below.
|
||||
|
||||
Tablejump insns contain a USE of the table, so simply replacing
|
||||
the operand with the constant won't match. This is simply an
|
||||
unconditional branch, however, and is therefore valid. Just
|
||||
insert the substitution here and we will delete and re-emit
|
||||
the insn later. */
|
||||
|
||||
For other cases such as a table jump or conditional jump
|
||||
where we know the ultimate target, go ahead and replace the
|
||||
operand. While that may not make a valid insn, we will
|
||||
reemit the jump below (and also insert any necessary
|
||||
barriers). */
|
||||
if (n_sets == 1 && dest == pc_rtx
|
||||
&& (trial == pc_rtx
|
||||
|| (GET_CODE (trial) == LABEL_REF
|
||||
&& ! condjump_p (insn))))
|
||||
{
|
||||
if (trial == pc_rtx)
|
||||
{
|
||||
SET_SRC (sets[i].rtl) = trial;
|
||||
cse_jumps_altered = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
PATTERN (insn) = gen_jump (XEXP (trial, 0));
|
||||
INSN_CODE (insn) = -1;
|
||||
|
||||
if (NEXT_INSN (insn) != 0
|
||||
&& GET_CODE (NEXT_INSN (insn)) != BARRIER)
|
||||
emit_barrier_after (insn);
|
||||
|
||||
SET_SRC (sets[i].rtl) = trial;
|
||||
cse_jumps_altered = 1;
|
||||
break;
|
||||
}
|
||||
@ -5804,13 +5790,17 @@ cse_insn (insn, libcall_insn)
|
||||
}
|
||||
|
||||
/* If this SET is now setting PC to a label, we know it used to
|
||||
be a conditional or computed branch. So we see if we can follow
|
||||
it. If it was a computed branch, delete it and re-emit. */
|
||||
be a conditional or computed branch. */
|
||||
else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF)
|
||||
{
|
||||
/* If this is not in the format for a simple branch and
|
||||
we are the only SET in it, re-emit it. */
|
||||
if (! simplejump_p (insn) && n_sets == 1)
|
||||
/* We reemit the jump in as many cases as possible just in
|
||||
case the form of an unconditional jump is significantly
|
||||
different than a computed jump or conditional jump.
|
||||
|
||||
If this insn has multiple sets, then reemitting the
|
||||
jump is nontrivial. So instead we just force rerecognition
|
||||
and hope for the best. */
|
||||
if (n_sets == 1)
|
||||
{
|
||||
rtx new = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
|
||||
JUMP_LABEL (new) = XEXP (src, 0);
|
||||
@ -5818,11 +5808,6 @@ cse_insn (insn, libcall_insn)
|
||||
insn = new;
|
||||
}
|
||||
else
|
||||
/* Otherwise, force rerecognition, since it probably had
|
||||
a different pattern before.
|
||||
This shouldn't really be necessary, since whatever
|
||||
changed the source value above should have done this.
|
||||
Until the right place is found, might as well do this here. */
|
||||
INSN_CODE (insn) = -1;
|
||||
|
||||
never_reached_warning (insn);
|
||||
|
Loading…
Reference in New Issue
Block a user