https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71779
--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> --- That is the following (I am using ubuntu's 5.3.1 in 1604 right now): Trying 944, 945 -> 946: Successfully matched this instruction: (set (reg:DI 1 x1) (ior:DI (ashift:DI (reg/f:DI 110 [ obj1$4 ]) (const_int 32 [0x20])) (reg/f:DI 419))) Where 944, 945 and 946 was: (insn 944 943 945 100 (set (zero_extract:DI (reg/v:DI 197 [ obj1 ]) (const_int 32 [0x20]) (const_int 0 [0])) (reg/f:DI 419)) isl_input.c:2496 687 {*insv_regdi} (nil)) (insn 945 944 946 100 (set (zero_extract:DI (reg/v:DI 197 [ obj1 ]) (const_int 32 [0x20]) (const_int 32 [0x20])) (reg/f:DI 110 [ obj1$4 ])) isl_input.c:2496 687 {*insv_regdi} (expr_list:REG_DEAD (reg/f:DI 110 [ obj1$4 ]) (nil))) (insn 946 945 947 100 (set (reg:DI 1 x1) (reg/v:DI 197 [ obj1 ])) isl_input.c:2496 48 {*movdi_aarch64} (expr_list:REG_DEAD (reg/v:DI 197 [ obj1 ]) (nil))) Is an invalid combine. GCC must be thinking the upper bits of reg 419 (aka 487) was zero for some reason.