https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93453
Segher Boessenkool <segher at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2020-01-28 Ever confirmed|0 |1 --- Comment #1 from Segher Boessenkool <segher at gcc dot gnu.org> --- The first case is because the splitter does emit_insn (gen_ashldi3 (op3, op3, GEN_INT (32))); emit_insn (gen_iordi3 (dest, dest, op3)); but this splitter runs late, so it has to do all wanted simple optimisations manually. The second is Trying 7 -> 8: 7: r124:DI=r125:DI<<0x20 REG_DEAD r125:DI 8: r123:DI=r124:DI|r126:DI REG_DEAD r126:DI REG_DEAD r124:DI Failed to match this instruction: (set (reg:DI 123) (ior:DI (ashift:DI (reg:DI 125) (const_int 32 [0x20])) (reg:DI 126))) We need a separate pattern to also recognise this (instead of just a version with the AND) if we already know the high half bits (of r126 here) are zero. Confirmed.