[LLVMdev] Memset/memcpy: user control of loop-idiom recognizer
Philip Reames
listmail at philipreames.com
Tue Dec 2 13:01:09 PST 2014
On 12/02/2014 11:45 AM, Reid Kleckner wrote:
> What if we had a pragma or attribute that lowered down to metadata
> indicating that the variable length trip count was small?
>
> Then backends could choose to lower short memcpys to an inlined,
> slightly widened loop. For example, 'rep movsq' on x86_64.
>
> That seems nice from the compiler perspective, since it preserves the
> canonical form and we get the same kind of information from profiling.
> Then again, I can imagine most game dev users just want control and
> don't want to change their code.
I like this general idea. Here's another possibility...
We actually already have such a construct in the form of the expect
builtins.
http://llvm.org/docs/BranchWeightMetadata.html#built-in-expect-instructions
One way to structure this would be:
if (__builtin_expect(N < SmallSize, 1)) {
//small loop here
} else {
// memcpy here
// or unreachable if you're really brave
}
I could see us failing to exploit this of course. :)
>
> On Tue, Dec 2, 2014 at 11:23 AM, Robert Lougher <rob.lougher at gmail.com
> <mailto:rob.lougher at gmail.com>> wrote:
>
> Hi,
>
> In feedback from game studios a common issue is the replacement of
> loops with calls to memcpy/memset. These loops are often
> hand-optimised, and highly-efficient and the developers strongly want
> a way to control the compiler (i.e. leave my loop alone).
>
> The culprit is of course the loop-idiom recognizer. This replaces any
> loop that looks like a memset/memcpy with calls. This affects loops
> with both a variable and a constant trip-count. The question is, does
> this make sense in all cases? Also, should the compiler provide a way
> to turn it off for certain types of loop, or on a loop individually?
> The standard answer is to use -fno-builtin but this does not provide
> fine-grain control (e.g. we may want the loop-idiom to recognise
> constant loops but not variable loops).
>
> As an example, it could be argued that replacing constant loops always
> makes sense. Here the compiler knows how big the memset/memcpy is and
> can make an accurate decision. For small values the memcpy/memset
> will be expanded inline, while larger values will remain a call, but
> due to the size the overhead will be negligible.
>
> On the other hand, the compiler knows very little about variable loops
> (the loop could be used primarily for copying 10 bytes or 10 Mbytes,
> the compiler doesn't know). The compiler will replace it with a call,
> but as it is variable it will not be expanded inline. In this case
> small values may see significant overhead in comparison to the
> original loop. The game studio examples all fall into this category.
>
> The loop-idiom recognizer also has no notion of "quality" - it always
> assumes that replacing the loop makes sense. While it might be the
> case for a naive byte-copy, some of the examples we've seen have been
> carefully tuned.
>
> So, to summarise, we feel that there's sufficient justification to add
> some sort of user-control. However, we do not want to suggest a
> solution, but prefer to start a discussion, and obtain opinions. So
> to start, how do people feel about:
>
> - A switch to disable loop-idiom recognizer completely?
>
> - A switch to disable loop-idiom recognizer for loops with
> variable trip count?
>
> - A switch to disable loop-idiom recognizer for loops with constant
> trip count (can't see this being much use)?
>
> - Per-function control of loop-idiom recognizer (which must work
> with LTO)?
>
> Thanks for any feedback!
> Rob.
>
> --
> Robert Lougher
> SN Systems - Sony Computer Entertainment Group
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
> http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141202/5202408c/attachment.html>
More information about the llvm-dev
mailing list