<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">> Yes, this is what I was proposing above and here ;):<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Thanks Adam it’s for confirming
</span><span style="font-size:11.0pt;font-family:Wingdings;color:#1F497D">J</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal">> No, not hasLoopInvariantStore but hasAccessToLoopInvariantAddress.<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Its only for invariant stores[not loads], Using ‘hasLoopInvariantStore’ (or a name with invariant store) makes more sense over ‘hasAccessToLoopInvariantAddress’.<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> You will also need to generate the memchecks for such accesses in
<o:p></o:p></p>
<p class="MsoNormal">> canCheckPtrAtRT and addRuntimeCheck.  Without those memchecks passing,
<o:p></o:p></p>
<p class="MsoNormal">> the result of the dependence analysis is incorrect.<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">I did not understood this point correctly, I feel the current functionality take cares of it
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">And we do not need any new handling for these invariant stores in “canCheckPtrAtRT” and “addRuntimeCheck”.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">“canCheckPtrAtRT” consider all the pointers because its working over AliasSets.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">It adds qualified pointers to “RuntimePointerCheck”.
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">“addRuntimeCheck” works on collected pointers by “canCheckPtrAtRT”
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">For non-invariant it creates range check by considering start & end.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">But for invariant start & end are considered as same.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">This same behavior we need for invariant store.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">By debugging sample programs I can see its adding invariant stores pointers
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">to runtime check.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Can you provide more details, what you meant by above comment.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Ashutosh<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Adam Nemet [mailto:anemet@apple.com]
<br>
<b>Sent:</b> Friday, March 20, 2015 10:30 AM<br>
<b>To:</b> Nema, Ashutosh<br>
<b>Cc:</b> Hal Finkel; Philip Reames; llvmdev@cs.uiuc.edu<br>
<b>Subject:</b> Re: [LLVMdev] RFC: Loop versioning for LICM<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">On Mar 19, 2015, at 9:46 PM, Nema, Ashutosh <<a href="mailto:Ashutosh.Nema@amd.com">Ashutosh.Nema@amd.com</a>> wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Thanks Adam for your reply.</span><o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<div style="margin-left:.5in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span class="apple-converted-space"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Adam
 Nemet [</span><a href="mailto:anemet@apple.com"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:purple">mailto:anemet@apple.com</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">]<span class="apple-converted-space"> </span><br>
<b>Sent:</b><span class="apple-converted-space"> </span>Friday, March 20, 2015 3:23 AM<br>
<b>To:</b><span class="apple-converted-space"> </span>Nema, Ashutosh<br>
<b>Cc:</b><span class="apple-converted-space"> </span>Hal Finkel; Philip Reames;<span class="apple-converted-space"> </span></span><a href="mailto:llvmdev@cs.uiuc.edu"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:purple">llvmdev@cs.uiuc.edu</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><br>
<b>Subject:</b><span class="apple-converted-space"> </span>Re: [LLVMdev] RFC: Loop versioning for LICM</span><o:p></o:p></p>
</div>
</div>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">Hi Ashutosh,<o:p></o:p></p>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div style="margin-left:.5in">
<p class="MsoNormal">On Mar 16, 2015, at 9:06 PM, Nema, Ashutosh <<a href="mailto:Ashutosh.Nema@amd.com"><span style="color:purple">Ashutosh.Nema@amd.com</span></a>> wrote:<o:p></o:p></p>
</div>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="color:#1F497D">Hi Adam,</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span class="apple-converted-space"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Adam
 Nemet [</span><a href="mailto:anemet@apple.com"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:purple">mailto:anemet@apple.com</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">]<span class="apple-converted-space"> </span><br>
<b>Sent:</b><span class="apple-converted-space"> </span>Wednesday, March 11, 2015 10:48 AM<br>
<b>To:</b><span class="apple-converted-space"> </span>Nema, Ashutosh<br>
<b>Cc:</b><span class="apple-converted-space"> </span></span><a href="mailto:llvmdev@cs.uiuc.edu"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:purple">llvmdev@cs.uiuc.edu</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><br>
<b>Subject:</b><span class="apple-converted-space"> </span>Re: [LLVMdev] RFC: Loop versioning for LICM</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<div style="margin-left:.5in">
<p class="MsoNormal">Hi Ashutosh,<o:p></o:p></p>
</div>
</div>
</div>
<div>
<div style="margin-left:.5in">
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
</div>
<div>
<div style="margin-left:.5in">
<div style="margin-left:.5in">
<p class="MsoNormal">My changes are committed now.  LoopAccessAnalysis is an analysis pass, so it has the advantage that the result of the analysis is cached until it gets invalidated (i.e. when the loop changes).<o:p></o:p></p>
</div>
</div>
</div>
<div>
<div style="margin-left:.5in">
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
</div>
<div>
<div style="margin-left:.5in">
<div style="margin-left:.5in">
<p class="MsoNormal">For an example of how to use it, you can look at either the loop-vectorizer in the tree or the WIP patch for the loop-distribution pass in <a href="http://reviews.llvm.org/D6930"><span style="color:purple">http://reviews.llvm.org/D6930</span></a>.<o:p></o:p></p>
</div>
</div>
</div>
<div>
<div style="margin-left:.5in">
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
</div>
<div>
<div style="margin-left:.5in">
<div style="margin-left:.5in">
<p class="MsoNormal">Please let me know if you have any questions.<o:p></o:p></p>
</div>
</div>
</div>
<div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">I have gone through current LAA, found few gaps for reusing it.</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">i.e.</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">928 void LoopAccessInfo::analyzeLoop(const ValueToValueMap &Strides) {</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1029     if (isUniform(Ptr)) {</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1030       emitAnalysis(</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1031           LoopAccessReport(ST)</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1032           << "write to a loop invariant address could not be vectorized");</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1033       DEBUG(dbgs() << "LAA: We don't allow storing to uniform addresses\n");</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1034       CanVecMem = false;</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1035       return;</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">1036     }</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">LAA is ignoring the cases where store is loop invariant, it sets memory can’t be vectorize.</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">In loop versioning for LICM, we are more interested in loop invariant cases.</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Invariant store is one of the important case for “LICM::promoteLoopAccessesToScalars”</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">If there any loop invariant exists then only we do loop versioning.</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">This check looks specific to loop vectorizer, with this check we can’t use LAA for LICM loop versioning.</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">If we like to make this reusable probably we need to remove this or make it conditional.</span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Probably, agents to LAA can implements such check instead LAA.</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</blockquote>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal">Not really.  Don’t you need memchecks for loop-invariant addresses as well?<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">We do need memcheck for loop-invariant addresses, but with current implementation if there is any invariant store, LAA simply returns by setting CanVecMem to false.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal">I think we should just teach the analysis to also emit run-time checks for loop-invariant addresses.  Assuming the memchecks pass we should have valid dependence analysis results so we could for example distribute the loop.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">Yes, I think that functionality exists, but the only blocker to it is the check mentioned in my previous mail.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">So, instead of returning & setting ‘CanVecMem’ for loop invariant store.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">Can’t we maintain a separate variable i.e. hasLoopInvariantStore in LoopAccessInfo and set it accordingly.</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Yes, this is what I was proposing above and here ;):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div style="margin-left:.5in">
<p class="MsoNormal">We couldn’t vectorize thus the analysis should provide a new piece of information about the loop having accesses to loop-invariant addresses.<o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">Also we can provide a getter function for the same.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">i.e.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">928 void LoopAccessInfo::analyzeLoop(const ValueToValueMap &Strides) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">1029     if (isUniform(Ptr)) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">1030        hasLoopInvariantStore = true;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">1031      }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">So later optimization can use this information in their legality analysis and make specific actions.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">i.e. LoopVectorizer:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">4002 bool LoopVectorizationLegality::canVectorizeMemory() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">4008   if (LAI->hasLoopInvariantStore) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">4009     emitAnalysis(VectorizationReport()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">4010           << "write to a loop invariant address could not be vectorized");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">4011     DEBUG(dbgs() << "LV: We don't allow storing to uniform addresses\n");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">4012     return false;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">4013   }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D"> </span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">No, not hasLoopInvariantStore but hasAccessToLoopInvariantAddress.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">You will also need to generate the memchecks for such accesses in canCheckPtrAtRT and addRuntimeCheck.  Without those memchecks passing, the result of the dependence analysis is incorrect.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Adam<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal">Adam<o:p></o:p></p>
</div>
</div>
<div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Regards,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Ashutosh</span><o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>