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  <seg...@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(-)

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)))]
-- 
1.8.1.4

Reply via email to