<div dir="ltr">Ty Eli for your answer.<br><div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 17, 2017 at 8:11 PM, Friedman, Eli <span dir="ltr"><<a target="_blank" href="mailto:efriedma@codeaurora.org">efriedma@codeaurora.org</a>></span> wrote:<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><span class="gmail-">On 1/17/2017 7:12 AM, Thomas RUBIANO via llvm-dev wrote:<br>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">
Hi all!<br>
<br>
I'm new here, and would like to implement my own Loop Invariant Detection adding some more information on Quasi-Invariants.<br>
<br>
First, is there anything about Quasi-Invariants detection in LLVM I would missed?<br>
<br>
I've seen LICM using LoopInfo::isLoopInvariant for finding invariants.<br>
It seems that this method considers a Value invariant if:<br>
- it's an Instruction not presents in the current loop (what does it mean? There is no dependence analysis on In and Out "variables" of all instructions in the loop?)<br>
</blockquote>
<br></span>
isLoopInvariant just checks whether the definition of a value is an instruction inside the loop.<span class="gmail-"><br></span></blockquote><div><br></div><div>Ok, the term "definition" makes it clear. Do, if here it's:<br><span class="gmail-">%1 = load i32, i32* %fact, align 4</span><br><span class="gmail-">%mul = mul nsw i32 %1, %2<br>
<br></span><br><span class="gmail-">load i32, i32* %fact, align 4 is the def of %1 and it's inside the loop then it's not invariant…<br></span></div><div><span class="gmail-"><br></span></div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><span class="gmail-">
<br>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">
- this Value is not an Instruction (then a Constant I guess…).<br>
</blockquote>
<br></span>
Or an function argument, or a few other obscure things which don't really matter in this context.<span class="gmail-"><br>
<br>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">
I've seen LoopAccessAnalysis using it too. What does this analysis do exactly on loop invariant address?<br>
</blockquote>
<br></span>
ScalarEvolution::isLoopInvaria<wbr>nt works on SCEV expressions instead of Values, but it's essentially the same thing.<span class="gmail-"><br></span></blockquote><div><br></div><div>What can offer this SCEV expression more than Values? <br></div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><span class="gmail-">
<br>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">
<br>
Also DependenceAnalysis seems to give dependence information on memory refs. But it seems to not be used by LICM…<br>
</blockquote>
<br></span>
Yes, the current LICM uses alias analysis in a more direct manner (look for AliasSetTracker).<span class="gmail-"><br>
<br>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">
<br>
Also MemoryDependenceAnalysis "determines, for a given memory operation, what preceding memory operations it depends on".<br>
<br>
My question is: Where is really done this dependence analysis. The one which figures out which Instructions depends on others?<br>
<br>
Simply if I have:<br>
%0 = load i32, i32* %coucou, align 4<br>
%1 = load i32, i32* %fact, align 4<br>
%2 = load i32, i32* %i, align 4<br>
%mul = mul nsw i32 %1, %2<br>
<br>
mul instruction will depends on the two precedents loads because it uses their results %1 and %2 but not the first one.<br>
<br>
I guess this is done somewhere, and there is a special representation of this information but I didn't find, I'm a bit lost ^^'<br>
</blockquote>
<br></span>
If you call "operands()" on the Instruction, it will return %1 and %2. Please keep in mind that LLVM IR is SSA.<span class="gmail-HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br></div><div>Yes but if I understand well, the AliasSetTracker can tell me which load it corresponds to… <br>How can I use this AliasSetTracker to disambiguate the registers?<br></div><div>Here it's just having the correspondence %1 → %fact and %2 → %i <br></div><div><br></div><div>It would be just perfect for me to have the "real" In and Out of each Instruction.<br></div><div>Maybe I should work on another level or with another object representation?<br></div><div><br></div><div>Ty again :)<br></div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><span class="gmail-HOEnZb"><font color="#888888">
<br>
-Eli<br>
<br>
-- <br>
Employee of Qualcomm Innovation Center, Inc.<br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project<br>
<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"> RUBIANO Thomas<br></div>
</div></div></div>