https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87763
--- Comment #58 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Jeffrey A. Law from comment #39) > We've actually got an RMW insn when combine starts. But... > Trying 17, 7 -> 13: > 17: r92:DI=r95:DI > REG_DEAD r95:DI > 7: zero_extract(r92:DI,0x8,0)=r93:DI > REG_DEAD r93:DI > 13: x0:DI=r92:DI > REG_DEAD r92:DI > Failed to match this instruction: > (set (reg/i:DI 0 x0) > (ior:DI (and:DI (reg:DI 95) > (const_int -256 [0xffffffffffffff00])) > (reg:DI 93))) > > We've torn the damn thing apart via expand_field_assignment. Worse yet, > that naturally splits and results in: I have been thinking about how to fix this for the last 6 years :). It would be useful if we could produce the following two instructions: zero_extract(r95:DI,0x8,0)=r93 x0=r95 But I have not figured out how to produce that.