aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2008-08-30 13:12:16 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2008-08-30 13:12:16 +0000
commita2a9208308a0bd367921b7f2ae154c7abd71e003 (patch)
treec70903997f961b8c258ea908d386a9c3ef689cff /gcc
parent8bcf15f6ea0bcd8eca70bc83f5390a7bf464c223 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/recog.c20
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;
}