[llvm-dev] vrp

Anastasiya Ruzhanskaya via llvm-dev llvm-dev at lists.llvm.org
Tue Aug 8 02:14:49 PDT 2017


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.

2017-08-07 12:38 GMT+02:00 Anastasiya Ruzhanskaya <
anastasiya.ruzhanskaya at frtk.ru>:

> When I am printing, I call getConstantRange and this method internally
> calls : gerValueInBlock()
>
> LVILatticeVal LazyValueInfoImpl::getValueInBlock(Value
> <https://llvm.org/doxygen/classllvm_1_1Value.html> *V, BasicBlock
> <https://llvm.org/doxygen/classllvm_1_1BasicBlock.html> *BB,
>   Instruction <https://llvm.org/doxygen/classllvm_1_1Instruction.html>
> *CxtI) {
>   DEBUG
> <https://llvm.org/doxygen/Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978>
> (dbgs
> <https://llvm.org/doxygen/namespacellvm.html#a7c46c742c31be54870e2038048e6b391>()
> << "LVI Getting block end value " << *V << " at '"
>   << BB->getName
> <https://llvm.org/doxygen/classllvm_1_1Value.html#adb5c319f5905c1d3ca9eb5df546388c5>()
> << "'\n");
>
>   assert
> <https://llvm.org/doxygen/SILowerControlFlow_8cpp.html#a4868c5d81c5ccc98c47aeab6244346a0>(BlockValueStack.empty()
> && BlockValueSet.empty());
>   if (!hasBlockValue(V, BB)) {
>   pushBlockValue(std::make_pair(BB, V));
>   solve
> <https://llvm.org/doxygen/namespacellvm_1_1PBQP_1_1RegAlloc.html#a57e1115cb3c891254a6e675437c1a40c>
> ();
>   }
> <...>
>  }
>
> which internally inserts the pair, so it seems that the informations, that
> I am printing , is in cache.
>
> 2017-08-07 12:05 GMT+02:00 Anastasiya Ruzhanskaya <
> anastasiya.ruzhanskaya at frtk.ru>:
>
>> 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?
>>
>> 2017-08-07 11:41 GMT+02:00 Anastasiya Ruzhanskaya <
>> anastasiya.ruzhanskaya at frtk.ru>:
>>
>>> So, it is not supported to determine by this instruction : %cmp = icmp
>>> slt i32 %i.03, 99,
>>> that %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.body ] has
>>> a range [0, 99]?
>>>
>>> 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.
>>>
>>> 2017-08-07 11:34 GMT+02:00 Davide Italiano <davide at freebsd.org>:
>>>
>>>> On Mon, Aug 7, 2017 at 2:14 AM, Anastasiya Ruzhanskaya via llvm-dev
>>>> <llvm-dev at lists.llvm.org> wrote:
>>>> > I am trying to print it like this (maybe here is smth wrong?)
>>>> >
>>>> >
>>>> >     LazyValueInfo &LV = getAnalysis<LazyValueInfoWrapp
>>>> erPass>().getLVI();
>>>> >     DominatorTree &DT =
>>>> > getAnalysis<DominatorTreeWrapperPass>().getDomTree();
>>>> >     LV.printLVI(F, DT, llvm::outs());
>>>>
>>>> The value analysis in llvm is lazy (hence, LVI), so you're trying to
>>>> print an empty cache, I guess.
>>>>
>>>> >     for (BasicBlock &BB : F) {
>>>> >       for (Instruction &I : BB) {
>>>> >     if (Value* v = dyn_cast<Value>(&I))
>>>> >       if (v->getType()->isIntegerTy()) {
>>>> >         ConstantRange r = LV.getConstantRange(v, &BB, &I);
>>>> >         I.dump();
>>>> >         printf("LOWER VALUE : %llu\n",r.getLower().getRawData());
>>>> >         printf("UPPER VALUE : %llu\n",r.getUpper().getRawData());
>>>> >       }
>>>> >       }
>>>>
>>>> About your other question, "the value range pass was not able to
>>>> determine any size, even of the induction variable, is it a correct
>>>> behavior?". Yes, returning a conservative answer is always correct,
>>>> but not optimal.
>>>>
>>>> As reference, a more sophisticated range analysis finds the following
>>>> ranges for your IR:
>>>>
>>>> [0, +inf]  %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
>>>> [0, +inf]  %s.02 = phi i32 [ 0, %entry ], [ %add2, %for.body ]
>>>> [0, +inf]  %j.01 = phi i32 [ 0, %entry ], [ %add1, %for.body ]
>>>> [0, +inf]  %add = add nsw i32 %j.01, %i.03
>>>> [1, +inf]  %add1 = add nsw i32 %add, 1
>>>> [1, +inf]  %add2 = add nsw i32 %s.02, %add1
>>>> [1, +inf]  %inc = add nsw i32 %i.03, 1
>>>> [2, +inf]  %add3 = add nsw i32 %add2, %add1
>>>>
>>>>
>>>> --
>>>> Davide
>>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170808/968538d7/attachment.html>


More information about the llvm-dev mailing list