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
This commit is contained in:
Segher Boessenkool 2014-10-02 04:18:01 +02:00 committed by Segher Boessenkool
parent 3f4dd27a6e
commit fef32cf89f
3 changed files with 16 additions and 4 deletions

View 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

View 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++;

View 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