Message ID | 3d9562470808d468756313eb70fa64ace2eaff0f.1431091787.git.segher@kernel.crashing.org |
---|---|
State | New |
Headers | show |
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 --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)))]