re PR rtl-optimization/62151 (wrong code at -O2 and -O3 on x86_64-linux-gnu)
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 2 Oct 2014 02:18:01 +0000 (04:18 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 2 Oct 2014 02:18:01 +0000 (04:18 +0200)
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

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog

index 6a59825c0640337620f51760fcbe4fac258144fa..aafbd2e048687b66bbbd5d8efa658fc8f615540b 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-01  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       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.
+
 2014-10-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/63342
index 1457eabadf9f6e2c761f921eaa5380491ebaec22..ff5f0dbd509c917fca50af74f7f049a0ad242f3a 100644 (file)
@@ -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++;
index 9936e6192ecb4f6000a396663369efe8e90406b1..0cf36a08329ed69d2f537680042f2031929bed02 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-01  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * gcc.dg/combine-clobber.c: New.
+
 2014-10-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/63342