recog.c (split_insn): Consider attaching a REG_EQUAL note to the final insn of a split.
gcc/ * recog.c (split_insn): Consider attaching a REG_EQUAL note to the final insn of a split. From-SVN: r139802
This commit is contained in:
parent
8bcf15f6ea
commit
a2a9208308
2 changed files with 25 additions and 0 deletions
|
@ -1,3 +1,8 @@
|
|||
2008-08-30 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* recog.c (split_insn): Consider attaching a REG_EQUAL note to the
|
||||
final insn of a split.
|
||||
|
||||
2008-08-30 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* postreload-gcse.c (gate_handle_gcse2): Disable for functions
|
||||
|
|
20
gcc/recog.c
20
gcc/recog.c
|
@ -2630,10 +2630,29 @@ split_insn (rtx insn)
|
|||
/* Split insns here to get max fine-grain parallelism. */
|
||||
rtx first = PREV_INSN (insn);
|
||||
rtx last = try_split (PATTERN (insn), insn, 1);
|
||||
rtx insn_set, last_set, note;
|
||||
|
||||
if (last == insn)
|
||||
return NULL_RTX;
|
||||
|
||||
/* If the original instruction was a single set that was known to be
|
||||
equivalent to a constant, see if we can say the same about the last
|
||||
instruction in the split sequence. The two instructions must set
|
||||
the same destination. */
|
||||
insn_set = single_set (insn);
|
||||
if (insn_set)
|
||||
{
|
||||
last_set = single_set (last);
|
||||
if (last_set && rtx_equal_p (SET_DEST (last_set), SET_DEST (insn_set)))
|
||||
{
|
||||
note = find_reg_equal_equiv_note (insn);
|
||||
if (note && CONSTANT_P (XEXP (note, 0)))
|
||||
set_unique_reg_note (last, REG_EQUAL, XEXP (note, 0));
|
||||
else if (CONSTANT_P (SET_SRC (insn_set)))
|
||||
set_unique_reg_note (last, REG_EQUAL, SET_SRC (insn_set));
|
||||
}
|
||||
}
|
||||
|
||||
/* try_split returns the NOTE that INSN became. */
|
||||
SET_INSN_DELETED (insn);
|
||||
|
||||
|
@ -2651,6 +2670,7 @@ split_insn (rtx insn)
|
|||
first = NEXT_INSN (first);
|
||||
}
|
||||
}
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue