[LLVMdev] Proposal to improve vzeroupper optimization strategy
nrotem at apple.com
Fri Sep 20 15:15:41 PDT 2013
Eli is right. In many cases the OS is not compiled with AVX support but the application is. In other words, AVX code calling non-avx code is very common.
On Sep 20, 2013, at 2:58 PM, Gao, Yunzhong <yunzhong_gao at playstation.sony.com> wrote:
> Hi Eli,
> Thanks for the feedback. Please see below.
> - Gao.
> From: Eli Friedman [mailto:eli.friedman at gmail.com]
> Sent: Thursday, September 19, 2013 12:31 PM
> To: Gao, Yunzhong
> Cc: llvmdev at cs.uiuc.edu
> Subject: Re: [LLVMdev] Proposal to improve vzeroupper optimization strategy
> > This is essentially equivalent to "don't insert vzeroupper anywhere", as
> > far as I can tell. (The case of SSE instructions without a v- prefixed
> > equivalent is rare enough we can separate it from this discussion.)
> So will you be interested in a patch that disables vzeroupper by default?
> I implemented this possibly over-engineering solution in our local tree to work
> around some bad instruction selection issues in LLVM backend. When benchmarking
> on our game codes, I noticed that sometimes legacy SSE instructions were
> selected despite existence of AVX equivalent, in which case the vzeroupper
> instruction was needed. And it is much easier to detect existence of vzeroupper
> instruction than to detect each single legacy SSE instructions.
> The instruction selection issues were later fixed in our tree (patches to be
> submitted later), at least for the handful of games I tested on. So a simple
> change to just disable vzeroupper by default will be acceptable to us as well.
> > The reason we need vzeroupper in the first place is because we can't assume
> > other functions won't use legacy SSE instructions; for example, on most
> > systems, calling sin() will use legacy SSE instructions. I mean, if you can
> > make some unusual guarantee about your platform, it might make sense to
> > disable vzeroupper generation in general, but it simply doesn't make sense
> > on most platforms.
> I am confused by this point. By "most systems," do you have in mind a platform
> where the sin() function was compiled by gcc but the application codes were
> compiled by clang?
> If the sin() function was compiled by clang for a platform that supports AVX
> instructions, I do not expect it to contain legacy SSE instructions. Is it not
> the case for your platform?
> I just looked at the library code for our sin() function and I do not see any
> legacy SSE instructions (but for license restrictions I cannot share our
> library codes; sorry).
> > If you want a mechanism to disable vzeroupper generation for particular
> > function calls, that might make sense...
> > -Eli
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev