<div dir="ltr">Maybe there is a concrete document or paper about VRP in llvm (what it exactly has)? After studying the code, seems that the answer is : llvm can't detect borders with help of cmp statements but I still want to be sure.<br></div><div class="gmail_extra"><br><div class="gmail_quote">2017-08-07 12:38 GMT+02:00 Anastasiya Ruzhanskaya <span dir="ltr"><<a href="mailto:anastasiya.ruzhanskaya@frtk.ru" target="_blank">anastasiya.ruzhanskaya@frtk.ru</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>When I am printing, I call getConstantRange and this method internally calls : gerValueInBlock()<br><br><div class="m_3605642340922493343gmail-line">LVILatticeVal LazyValueInfoImpl::<wbr>getValueInBlock(<a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/classllvm_1_1Value.html" target="_blank">Value</a> *V, <a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/classllvm_1_1BasicBlock.html" target="_blank">BasicBlock</a> *BB,</div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01574"></a></div><div class="m_3605642340922493343gmail-line">                                                   <a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/classllvm_1_1Instruction.html" target="_blank">Instruction</a> *CxtI) {</div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01575"></a></div><div class="m_3605642340922493343gmail-line">   <a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978" target="_blank">DEBUG</a>(<a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/namespacellvm.html#a7c46c742c31be54870e2038048e6b391" target="_blank">dbgs</a>() << <span class="m_3605642340922493343gmail-stringliteral">"LVI Getting block end value "</span> << *V << <span class="m_3605642340922493343gmail-stringliteral">" at '"</span></div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01576"></a></div><div class="m_3605642340922493343gmail-line">         << BB-><a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/classllvm_1_1Value.html#adb5c319f5905c1d3ca9eb5df546388c5" target="_blank">getName</a>() << <span class="m_3605642340922493343gmail-stringliteral">"'\n"</span>);</div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01577"></a></div><div class="m_3605642340922493343gmail-line"> </div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01578"></a></div><div class="m_3605642340922493343gmail-line">   <a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/SILowerControlFlow_8cpp.html#a4868c5d81c5ccc98c47aeab6244346a0" target="_blank">assert</a>(BlockValueStack.empty() && BlockValueSet.empty());</div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01579"></a></div><div class="m_3605642340922493343gmail-line">   <span class="m_3605642340922493343gmail-keywordflow">if</span> (!hasBlockValue(V, BB)) {</div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01580"></a></div><div class="m_3605642340922493343gmail-line">     pushBlockValue(std::make_pair(<wbr>BB, V));</div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01581"></a></div><div class="m_3605642340922493343gmail-line">     <a class="m_3605642340922493343gmail-code" href="https://llvm.org/doxygen/namespacellvm_1_1PBQP_1_1RegAlloc.html#a57e1115cb3c891254a6e675437c1a40c" target="_blank">solve</a>();</div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01582"></a></div><div class="m_3605642340922493343gmail-line">   }<br></div><div class="m_3605642340922493343gmail-line"><...><br></div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01583"></a></div><div class="m_3605642340922493343gmail-line"><a name="m_3605642340922493343_l01588"></a></div> }<br><br></div>which internally inserts the pair, so it seems that the informations, that I am printing , is in cache.<br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2017-08-07 12:05 GMT+02:00 Anastasiya Ruzhanskaya <span dir="ltr"><<a href="mailto:anastasiya.ruzhanskaya@frtk.ru" target="_blank">anastasiya.ruzhanskaya@frtk.<wbr>ru</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I am primarily interested in phi nodes and their induction variables, in ValueTracking file there is an analysis of them, but if the upper bound is inf, it is not working?<br></div><div class="m_3605642340922493343HOEnZb"><div class="m_3605642340922493343h5"><div class="gmail_extra"><br><div class="gmail_quote">2017-08-07 11:41 GMT+02:00 Anastasiya Ruzhanskaya <span dir="ltr"><<a href="mailto:anastasiya.ruzhanskaya@frtk.ru" target="_blank">anastasiya.ruzhanskaya@frtk.r<wbr>u</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>So, it is not supported to determine by this instruction : %cmp = icmp slt i32 %i.03, 99, <br></div>that %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.body ] has <br>a range [0, 99]?<br><br></div>And what is then a correct way to get such an info, that you sent ( with more specified ranges)? ...seems that appropriate method for it is not in LazyValueInfo class.<br></div><div class="m_3605642340922493343m_6611255743758016312HOEnZb"><div class="m_3605642340922493343m_6611255743758016312h5"><div class="gmail_extra"><br><div class="gmail_quote">2017-08-07 11:34 GMT+02:00 Davide Italiano <span dir="ltr"><<a href="mailto:davide@freebsd.org" target="_blank">davide@freebsd.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>On Mon, Aug 7, 2017 at 2:14 AM, Anastasiya Ruzhanskaya via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
> I am trying to print it like this (maybe here is smth wrong?)<br>
><br>
><br>
>     LazyValueInfo &LV = getAnalysis<LazyValueInfoWrapp<wbr>erPass>().getLVI();<br>
>     DominatorTree &DT =<br>
> getAnalysis<DominatorTreeWrapp<wbr>erPass>().getDomTree();<br>
>     LV.printLVI(F, DT, llvm::outs());<br>
<br>
</span>The value analysis in llvm is lazy (hence, LVI), so you're trying to<br>
print an empty cache, I guess.<br>
<span><br>
>     for (BasicBlock &BB : F) {<br>
>       for (Instruction &I : BB) {<br>
>     if (Value* v = dyn_cast<Value>(&I))<br>
>       if (v->getType()->isIntegerTy()) {<br>
>         ConstantRange r = LV.getConstantRange(v, &BB, &I);<br>
>         I.dump();<br>
>         printf("LOWER VALUE : %llu\n",r.getLower().getRawDat<wbr>a());<br>
>         printf("UPPER VALUE : %llu\n",r.getUpper().getRawDat<wbr>a());<br>
>       }<br>
>       }<br>
<br>
</span>About your other question, "the value range pass was not able to<br>
<span>determine any size, even of the induction variable, is it a correct<br>
</span>behavior?". Yes, returning a conservative answer is always correct,<br>
but not optimal.<br>
<br>
As reference, a more sophisticated range analysis finds the following<br>
ranges for your IR:<br>
<br>
[0, +inf]  %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.body ]<br>
[0, +inf]  %s.02 = phi i32 [ 0, %entry ], [ %add2, %for.body ]<br>
[0, +inf]  %j.01 = phi i32 [ 0, %entry ], [ %add1, %for.body ]<br>
[0, +inf]  %add = add nsw i32 %j.01, %i.03<br>
[1, +inf]  %add1 = add nsw i32 %add, 1<br>
[1, +inf]  %add2 = add nsw i32 %s.02, %add1<br>
[1, +inf]  %inc = add nsw i32 %i.03, 1<br>
[2, +inf]  %add3 = add nsw i32 %add2, %add1<br>
<br>
<br>
--<br>
Davide<br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>