https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80546
Segher Boessenkool <segher at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target| |powerpc*-*-* Status|UNCONFIRMED |NEW Last reconfirmed| |2017-04-27 Ever confirmed|0 |1 --- Comment #1 from Segher Boessenkool <segher at gcc dot gnu.org> --- This is a NOT instruction, which we usually implement with a NOR with two identical inputs, so it should behave similar to that in LRA. But the NOT does (in ptr4) for this insn: 0 Non input pseudo reload: reject++ 0 Early clobber: reject++ alt=0,overall=14,losers=2,rld_nregs=2 0 Non input pseudo reload: reject++ 1 Matching earlyclobber alt: reject-- 1 Dying matched operand reload: reject++ alt=1,overall=13,losers=2,rld_nregs=4 0 Non input pseudo reload: reject++ 1 Matching earlyclobber alt: reject-- 1 Dying matched operand reload: reject++ alt=2,overall=13,losers=2,rld_nregs=4 alt=3,overall=12,losers=2,rld_nregs=1 0 Non input pseudo reload: reject++ alt=4,overall=19,losers=3 -- refuse Choosing alt 3 in insn 10: (0) wt (1) wt {*one_cmplti3_internal} while a two-op boolean op does (ptr5): 0 Early clobber: reject++ 0 Matched conflict early clobber reloads: reject-- alt=0,overall=6,losers=1,rld_nregs=0 alt=1,overall=0,losers=0,rld_nregs=0 Choosing alt 1 in insn 14: (0) r (1) 0 (2) r {*boolccti3_internal2} The constraints for the NOT are =&r,r,r,wt,v r,0,0,wt,v while for the two-op they are =&r,r,r,wt,v r,0,r,wt,v r,r,0,wt,v Hrm, the difference us that in the two-op case the output is assigned the same reg as one of the inputs, but in the NOT case it is not (the output is assigned a VSR there, not a GPR).