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???

Reply via email to