[llvm-dev] vrp

Anastasiya Ruzhanskaya via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 7 03:05:04 PDT 2017


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/20170807/bef4fb0b/attachment.html>


More information about the llvm-dev mailing list