[Bug target/92190] [10 Regression] ICE in sp_valid_at, at config/i386/i386.c:6162 since r276648
rsandifo at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Nov 27 21:03:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92190
--- Comment #10 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> ---
(In reply to Uroš Bizjak from comment #8)
> (In reply to Liu Hao from comment #7)
> > MSDN says 'the upper portions of YMM0-15 and ZMM0-15 are considered volatile
> > and must be considered destroyed on function calls' explicitly [1].
> >
> > I am not clear about the cause of OP's ICE, but I think it should conform to
> > MSABI to emit VZEROUPPER in the epilog, followed by restoring XMM6 - XMM15,
> > destroying their upper halves. Similar with the prolog.
>
> The insertion of vzeroupper is not "invisible" to stack frame management
> code any more, since vzeroupper is now defined as:
>
> (insn 738 619 434 2 (parallel [
> (unspec_volatile [
> (const_int 0 [0])
> ] UNSPECV_VZEROUPPER)
> (clobber (reg:V2DI 20 xmm0))
> (clobber (reg:V2DI 21 xmm1))
> (clobber (reg:V2DI 22 xmm2))
> (clobber (reg:V2DI 23 xmm3))
> (clobber (reg:V2DI 24 xmm4))
> (clobber (reg:V2DI 25 xmm5))
> (set (reg:V2DI 26 xmm6)
> (reg:V2DI 26 xmm6))
> (clobber (reg:V2DI 27 xmm7))
> (clobber (reg:V2DI 44 xmm8))
> (clobber (reg:V2DI 45 xmm9))
> (clobber (reg:V2DI 46 xmm10))
> (clobber (reg:V2DI 47 xmm11))
> (clobber (reg:V2DI 48 xmm12))
> (clobber (reg:V2DI 49 xmm13))
> (clobber (reg:V2DI 50 xmm14))
> (clobber (reg:V2DI 51 xmm15))
> ]) "pr92190.c":8:3 -1
> (nil))
>
>
> . The insertion point of vzeroupper pass is just after reload pass, and now
> all xmm registers (xmm0 - xmm15) become live. This is not a problem in SYSV
> ABI, where all registers are call_used, but in MS ABI, the prologue now
> tries to save xmm6 - xmm15 to the stack.
>
> So, vzeroupper should be described in a way that won't trigger saves of xmm6
> - xmm15 to the stack, while still mark that high part of the register is
> clobbered.
Ah, OK. It should be safe to leave out a clobber if
!df_regs_ever_live_p and if we're guaranteed not to introduce
new references to the register later.
More information about the Gcc-bugs
mailing list