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

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-11-18
   Target Milestone|---                         |7.4
     Ever confirmed|0                           |1

--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
This is the case of scheduler splitting return copy pair:

(insn 19 18 16 2 (set (reg:V2SF 21 xmm0)
        (mem/c:V2SF (plus:DI (reg/f:DI 7 sp)
                (const_int -72 [0xffffffffffffffb8])) [0  S8 A64]))
"pr88070.c":8 1157 {*movv2sf_internal}
     (nil))
(insn 16 19 20 2 (set (reg:V2SF 0 ax [orig:91 <retval> ] [91])
        (reg:V2SF 0 ax [89])) "pr88070.c":8 1157 {*movv2sf_internal}
     (nil))
(insn 20 16 21 2 (unspec_volatile [
            (const_int 0 [0])
        ] UNSPECV_BLOCKAGE) "pr88070.c":8 710 {blockage}
     (nil))
(insn 21 20 23 2 (use (reg:V2SF 21 xmm0)) "pr88070.c":8 -1
     (nil))

Please note how (insn 16) interferes with (insn 19)-(insn 21) pair.

I think that the assert is too restrictive for post-reload vzeroupper
insertion. There will be no end of problems, similar to the one above (mainly
due to pre-reload scheduler, or the RA itself), so I guess the following patch,
that relaxes the assert is justified:

--cut here--
Index: mode-switching.c
===================================================================
--- mode-switching.c    (revision 266250)
+++ mode-switching.c    (working copy)
@@ -431,11 +431,12 @@
              }
            while (nregs);

-           /* If we didn't see a full return value copy, verify that there
-              is a plausible reason for this.  If some, but not all of the
-              return register is likely spilled, we can expect that there
-              is a copy for the likely spilled part.  */
-           gcc_assert (!nregs
+           /* Before reload, if we didn't see a full return value copy,
+              verify that there is a plausible reason for this.  If some,
+              but not all of the return register is likely spilled, we can
+              expect that there is a copy for the likely spilled part.  */
+           gcc_assert (reload_completed
+                       || !nregs
                        || forced_late_switch
                        || short_block
                        || !(targetm.class_likely_spilled_p
--cut here--

Reply via email to