diff mbox

rs6000: Fix peephole

Message ID 3d9562470808d468756313eb70fa64ace2eaff0f.1431091787.git.segher@kernel.crashing.org
State New
Headers show

Commit Message

Segher Boessenkool May 8, 2015, 1:38 p.m. UTC
This peephole transforms

  lis a,HI ; ori a,a,LO
  cmpw c,a,b ; beq c,...

to

  xoris a,b,HI1
  cmpwi c,a,LO1 ; beq c,...

when a and c are dead after this.  But it forgets to check that a and b
are not the same reg, generating non-sensical code.  This patch fixes that.

Tested etc.; is this okay for trunk?

(This peephole caused some FAILs in the testsuite after an unrelated change;
gone after this patch).


Segher


2015-05-08  Segher Boessenkool  <segher@kernel.crashing.org>

	* config/rs6000/rs6000.md: Require operand inequality in one
	of the peepholes.

---
 gcc/config/rs6000/rs6000.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

David Edelsohn May 8, 2015, 2:18 p.m. UTC | #1
On Fri, May 8, 2015 at 9:38 AM, Segher Boessenkool
<segher@kernel.crashing.org> wrote:
> This peephole transforms
>
>   lis a,HI ; ori a,a,LO
>   cmpw c,a,b ; beq c,...
>
> to
>
>   xoris a,b,HI1
>   cmpwi c,a,LO1 ; beq c,...
>
> when a and c are dead after this.  But it forgets to check that a and b
> are not the same reg, generating non-sensical code.  This patch fixes that.
>
> Tested etc.; is this okay for trunk?
>
> (This peephole caused some FAILs in the testsuite after an unrelated change;
> gone after this patch).
>
>
> Segher
>
>
> 2015-05-08  Segher Boessenkool  <segher@kernel.crashing.org>
>
>         * config/rs6000/rs6000.md: Require operand inequality in one
>         of the peepholes.

Okay.

Is there an artificial testcase?

Thanks, David
diff mbox

Patch

diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 0178bf4..463bd3c 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -11954,7 +11954,8 @@  (define_peephole2
                       (match_operand 7 "" "")
                       (match_operand 8 "" "")))]
   "peep2_reg_dead_p (3, operands[0])
-   && peep2_reg_dead_p (4, operands[4])"
+   && peep2_reg_dead_p (4, operands[4])
+   && REGNO (operands[0]) != REGNO (operands[5])"
  [(set (match_dup 0) (xor:SI (match_dup 5) (match_dup 9)))
   (set (match_dup 4) (compare:CC (match_dup 0) (match_dup 10)))
   (set (pc) (if_then_else (match_dup 6) (match_dup 7) (match_dup 8)))]