diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2008-08-30 13:12:16 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2008-08-30 13:12:16 +0000 |
commit | a2a9208308a0bd367921b7f2ae154c7abd71e003 (patch) | |
tree | c70903997f961b8c258ea908d386a9c3ef689cff /gcc | |
parent | 8bcf15f6ea0bcd8eca70bc83f5390a7bf464c223 (diff) | |
download | gcc-a2a9208308a0bd367921b7f2ae154c7abd71e003.zip gcc-a2a9208308a0bd367921b7f2ae154c7abd71e003.tar.gz gcc-a2a9208308a0bd367921b7f2ae154c7abd71e003.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/recog.c | 20 |
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a2ec12..b6186bb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/recog.c b/gcc/recog.c index 44d3b40..8da4e20 100644 --- a/gcc/recog.c +++ b/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; } |