[llvm-dev] Can someone give me some pointer on alias analysis ?
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Mon Jan 4 09:16:09 PST 2016
On 01/04/2016 03:29 AM, Amaury SECHET wrote:
>
>
> 2015-12-26 18:32 GMT+01:00 Philip Reames <listmail at philipreames.com
> <mailto:listmail at philipreames.com>>:
>
> On 12/26/2015 02:17 AM, Amaury SECHET via llvm-dev wrote:
>> I'm trying to fix that bug:
>> https://llvm.org/bugs/show_bug.cgi?id=20049
>>
>> It turns out this is the kind of optimization that I really need,
>> as when it isn't done, all kind of other optimizations
>> opportunities down the road are not realized as they are not exposed.
>>
>> I have no idea where to start digging for this. I assume there is
>> some kind of interaction between memory dependency and alias
>> analysis that is overly conservative. Can someone gives me some
>> infos on how the 2 interact together ? What is the code that is
>> supposed to remove these kind of loads ?
> First, it looks like you're using an older version of LLVM (the
> load syntax has changed). That's definitely not recommended since
> it will greatly limit your choices when encountering an issue like
> this.
>
>
> I just reused an old code sample. The problem still exists in recent
> version of LLVM.
>
> Second, the aliasing problem has to do with the effects of the
> "allocmemory" callsite on a memory location associated with an
> earlier alloca. There's nothing that prevents your allocmemory
> function from writing to global state. You have to teach the alias
> analysis that an unescaped noalias pointer can't alias the global
> state allocmemory might access. Slightly surprised we don't get
> this today, but oh well. Take a look at the
> isNonEscapingLocalObject predicate in BasicAA. Then look at
> "getModRefInfo(ImmutableCallSite CS, const MemoryLocation &Loc)".
> Double check to make sure this is the one that MDA actually calls.
>
>
> I don't think this is the problem. When there is only 2 calls to
> allocmemory, loads are optimized away as expected. But it seems that
> the analysis is confused with 3+ calls.
>
> Third, you might want to take a look the new
> inaccessiblememonlyattribute. Depending on how you're modelling
> your allocation, this might help resolve the aliasing problem in
> different way. However, be aware that this is *very* new. In
> particular, I triggered an optimizer bug by adding the new
> attribute to your particular example. :(
>
> Fourth, have you considered implementing a simple escape analysis
> pass? I notice that the store-load forwarding would just fall out
> once you removed the last allocation. I believe the fixed point
> would then become a function which returns the constant answer and
> does nothing else.
>
>
> Yes I did. More specifically, there is a pass that try to recognize
> memory allocation like calls and optimize them, which right now have
> libc and some overloads of operator new hardcoded in it but not much
> more. This could be greatly improved IMO, to be language agnostic (and
> better support C++ in the process), but really, I do think relying on
> this to get the load eliminated, when noalias already provide this
> information to the optimizer, is overkill.
It turns out we already have something along these lines in
InstCombine. Take a look at visitAllocSite in
InstructionCombining.cpp. It's rough and good use some refinement, but
its a good starting place for a generalized escape analysis.
>
> Fifth, some pointers on debugging this yourself. GVN (which is
> the one which does complicated *-load forwarding) calls MDA
> (MemoryDepedenceAnalysis). Using the appropriate -debug-only
> options will likely get you to the right area. You can also
> consider using the MemDepPrinter pass to bypass GVN. I don't know
> of a way to issue raw AA queries for testing. That would be
> useful, but I don't know that we have it.
>
> Hope that helps.
>
>
> Yes, thanks. I'll probably come back with more question once I've
> played with these options a bit. Sorry for the late answer, I was
> mostly off the grid the past 2 weeks.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160104/d3459458/attachment.html>
More information about the llvm-dev
mailing list