https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89310
--- Comment #1 from Peter Bergner <bergner at gcc dot gnu.org> --- Before combine, we have the following rtl: (insn # # # 2 (set (reg/v:DI 122 [ argD.2825 ]) (reg:DI 3 3 [ argD.2825 ])) "struct.i":8:1# {*movdi_internal64} (expr_list:REG_DEAD (reg:DI 3 3 [ argD.2825 ]) (nil))) (note # # # 2 NOTE_INSN_FUNCTION_BEG) (insn # # # 2 (parallel [ (set (reg:DI 124) (ashiftrt:DI (reg/v:DI 122 [ argD.2825 ]) (const_int 32 [0x20]))) (clobber (reg:DI 76 ca)) ]) "struct.i":9:13# {ashrdi3} (expr_list:REG_DEAD (reg/v:DI 122 [ argD.2825 ]) (expr_list:REG_UNUSED (reg:DI 76 ca) (nil)))) (insn # # # 2 (set (reg:SI 125) (subreg:SI (reg:DI 124) 0)) "struct.i":9:13# {*movsi_internal1} (expr_list:REG_DEAD (reg:DI 124) (nil))) (insn # # # 2 (parallel [ (set (reg:SF 121 [ <retval> ]) (unspec:SF [ (reg:SI 125) ] UNSPEC_SF_FROM_SI)) (clobber (scratch:DI)) ]) "struct.i":9:13# {movsf_from_si} (expr_list:REG_DEAD (reg:SI 125) (nil))) after combine, we get a strange paradoxical subreg: (insn # # # 2 (set (reg:DI 126) (reg:DI 3 3 [ argD.2825 ])) "struct.i":8:1# {*movdi_internal64} (expr_list:REG_DEAD (reg:DI 3 3 [ argD.2825 ]) (nil))) (insn # # # 2 (set (subreg:DI (reg:SI 125) 0) (lshiftrt:DI (reg:DI 126) (const_int 32 [0x20]))) "struct.i":9:13# {lshrdi3} (expr_list:REG_DEAD (reg:DI 126) (nil))) (insn # # # 2 (parallel [ (set (reg/i:SF 33 1) (unspec:SF [ (reg:SI 125) ] UNSPEC_SF_FROM_SI)) (clobber (scratch:DI)) ]) "struct.i":10:1# {movsf_from_si} (expr_list:REG_DEAD (reg:SI 125) (nil))) LRA cleans things up a bit to: (insn # # # 2 (set (reg:DI 3 3 [125]) (lshiftrt:DI (reg:DI 3 3 [126]) (const_int 32 [0x20]))) "struct.i":9:13# {lshrdi3} (nil)) (insn # # # 2 (parallel [ (set (reg/i:SF 33 1) (unspec:SF [ (reg:SI 3 3 [125]) ] UNSPEC_SF_FROM_SI)) (clobber (reg:DI 9 9 [127])) ]) "struct.i":10:1# {movsf_from_si} (nil)) and then split2 creates the shift followed by shift: insn # # # 2 (set (reg:DI 3 3 [125]) (lshiftrt:DI (reg:DI 3 3 [126]) (const_int 32 [0x20]))) "struct.i":9:13# {lshrdi3} (nil)) (insn # # # 2 (set (reg:DI 9 9 [127]) (ashift:DI (reg:DI 3 3) (const_int 32 [0x20]))) "struct.i":10:1# {ashldi3} (nil)) (insn # # # 2 (set (reg/i:SF 33 1) (unspec:SF [ (reg:DI 9 9 [127]) ] UNSPEC_P8V_MTVSRD)) "struct.i":10:1# {p8_mtvsrd_sf} (nil)) (insn # # # 2 (set (reg/i:SF 33 1) (unspec:SF [ (reg/i:SF 33 1) ] UNSPEC_VSX_CVSPDPN)) "struct.i":10:1# {vsx_xscvspdpn_directmove} (nil)) Is the paradoxical subreg from combine at fault here???