https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78378
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So we have: (insn 6 3 7 2 (parallel [ (set (reg/v:DI 90 [ x ]) (ashift:DI (reg/v:DI 93 [ x ]) (const_int 41 [0x29]))) (clobber (reg:CC 17 flags)) ]) "pr78378.c":7 530 {*ashldi3_1} (expr_list:REG_DEAD (reg/v:DI 93 [ x ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) (insn 7 6 8 2 (parallel [ (set (reg:DI 96) (lshiftrt:DI (reg/v:DI 90 [ x ]) (const_int 3 [0x3]))) (clobber (reg:CC 17 flags)) ]) "pr78378.c":8 564 {*lshrdi3_1} (expr_list:REG_DEAD (reg/v:DI 90 [ x ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) (insn 8 7 9 2 (set (reg:DI 98) (const_int 636094623231363849 [0x8d3dcb08d3dcb09])) "pr78378.c":8 81 {*movdi_internal} (nil)) (insn 9 8 10 2 (parallel [ (set (reg:DI 97 [ x ]) (truncate:DI (lshiftrt:TI (mult:TI (zero_extend:TI (reg:DI 96)) (zero_extend:TI (reg:DI 98))) (const_int 64 [0x40])))) (clobber (scratch:DI)) (clobber (reg:CC 17 flags)) ]) "pr78378.c":8 342 {*umuldi3_highpart_1} (expr_list:REG_DEAD (reg:DI 98) (expr_list:REG_DEAD (reg:DI 96) (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_EQUAL (truncate:DI (lshiftrt:TI (mult:TI (zero_extend:TI (reg:DI 96)) (const_int 636094623231363849 [0x8d3dcb08d3dcb09])) (const_int 64 [0x40]))) (nil)))))) and I think the bug is already when substing (reg:DI 98) to (const_int 636094623231363849 [0x8d3dcb08d3dcb09]), because we turn it into: (set (reg:DI 97 [ x ]) (subreg:DI (mult:TI (zero_extend:TI (reg:DI 96)) (const_int 636094623231363849 [0x8d3dcb08d3dcb09])) 8)) the right shift by 64 around mult is lost, so it is no longer high part multiply, but lowpart multiply.