<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">On 01/04/2016 03:29 AM, Amaury SECHET
wrote:<br>
</div>
<blockquote
cite="mid:CANGV3T0oyE7KhxkN_Nt-fwWF0tgf_3g2abiOOYmAvWCaHx+3zQ@mail.gmail.com"
type="cite">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote">2015-12-26 18:32 GMT+01:00 Philip
Reames <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<div>
<div>
<div>On 12/26/2015 02:17 AM, Amaury SECHET via
llvm-dev wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>
<div>I'm trying to fix that bug: <a
moz-do-not-send="true"
href="https://llvm.org/bugs/show_bug.cgi?id=20049"
target="_blank"><a class="moz-txt-link-freetext" href="https://llvm.org/bugs/show_bug.cgi?id=20049">https://llvm.org/bugs/show_bug.cgi?id=20049</a></a><br>
<br>
</div>
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.<br>
<br>
</div>
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 ?<br>
</div>
</blockquote>
</div>
</div>
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.<br>
<br>
</div>
</blockquote>
<div><br>
</div>
<div>I just reused an old code sample. The problem still
exists in recent version of LLVM.<br>
</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> 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. <br>
<br>
</div>
</blockquote>
<div><br>
</div>
<div>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.<br>
</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> Third, you might
want to take a look the new <tt><span>inaccessiblememonly</span></tt><span><span>
attribute. 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. :( <br>
<br>
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. <br>
</span></span><tt><span></span></tt><br>
</div>
</blockquote>
<div><br>
</div>
<div>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.<br>
</div>
</div>
</div>
</div>
</blockquote>
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. <br>
<blockquote
cite="mid:CANGV3T0oyE7KhxkN_Nt-fwWF0tgf_3g2abiOOYmAvWCaHx+3zQ@mail.gmail.com"
type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> 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. <br>
<br>
Hope that helps.<br>
<br>
</div>
</blockquote>
<div><br>
</div>
<div>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.<br>
</div>
<div><br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
</body>
</html>