https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55212

--- Comment #325 from Kazumoto Kojima <kkojima at gcc dot gnu.org> ---
(In reply to John Paul Adrian Glaubitz from comment #319)
> Created attachment 59188 [details]
> Preprocessed source from from comment #318

Thanks for the test case and other comments.  I can reproduce the ICE with
cross gnat1.  From the rtl dumps, it seems

* A complex valued function returns SCmode value in fr0 and fr1 pair.
* The real/imaginary part of this value is moved to the SFmode reg.

(insn 105 104 106 16 (parallel [
            (set (reg:SF 184 [ _24 ])
                (subreg:SF (reg:SC 241) 0))
            (use (reg:SI 154 fpscr0))
        ]) "a-ngcefu.adb":164:17 -1
     (nil))

* subreg1 pass splits this multiword subreg to single word subreg but with
SImode reg.

(insn 103 101 104 10 (parallel [
            (set (subreg:SF (reg:SI 344) 0)
                (reg:SF 64 fr0))
            (use (reg:SI 154 fpscr0))
        ]) "a-ngcefu.adb":164:17 222 {movsf_ie_ra}
     (expr_list:REG_DEAD (reg:SF 64 fr0)
        (nil)))
...
(insn 105 104 106 10 (parallel [
            (set (reg:SF 184 [ _24 ])
                (subreg:SF (reg:SI 344) 0))
            (use (reg:SI 154 fpscr0))
        ]) "a-ngcefu.adb":164:17 222 {movsf_ie_ra}
     (expr_list:REG_DEAD (reg:SI 344)
        (nil)))

Our movsf logic for LRA doesn't handle these well.  If these reg from/to subreg
of SImode move is splitted with fpul, it will cause some very bad code or ICE.

Reply via email to