aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2014-10-02 04:18:01 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2014-10-02 04:18:01 +0200
commitfef32cf89f7fe0c8864443dca942c6e34a204976 (patch)
tree002696394921c8abd7ea2ffccb3f77aae36b575c /gcc/combine.c
parent3f4dd27a6e582dd3e072656c61c61f2208c11a86 (diff)
downloadgcc-fef32cf89f7fe0c8864443dca942c6e34a204976.zip
gcc-fef32cf89f7fe0c8864443dca942c6e34a204976.tar.gz
gcc-fef32cf89f7fe0c8864443dca942c6e34a204976.tar.bz2
re PR rtl-optimization/62151 (wrong code at -O2 and -O3 on x86_64-linux-gnu)
2014-10-01 Segher Boessenkool <segher@kernel.crashing.org> gcc/ PR rtl-optimization/62151 * combine.c (can_combine_p): Allow the destination register of INSN to be clobbered in I3. (subst): Do not substitute into clobbers of registers. gcc/testsuite/ * gcc.dg/combine-clobber.c: New. From-SVN: r215789
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 1457eab..ff5f0db 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -1950,11 +1950,7 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
{
- /* Don't substitute for a register intended as a clobberable
- operand. */
rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
- if (rtx_equal_p (reg, dest))
- return 0;
/* If the clobber represents an earlyclobber operand, we must not
substitute an expression containing the clobbered register.
@@ -4963,6 +4959,11 @@ subst (rtx x, rtx from, rtx to, int in_dest, int in_cond, int unique_copy)
|| (REG_P (X) && REG_P (Y) \
&& REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
+ /* Do not substitute into clobbers of regs -- this will never result in
+ valid RTL. */
+ if (GET_CODE (x) == CLOBBER && REG_P (XEXP (x, 0)))
+ return x;
+
if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
{
n_occurrences++;