[llvm-dev] vrp

Davide Italiano via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 7 02:34:45 PDT 2017


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<LazyValueInfoWrapperPass>().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


More information about the llvm-dev mailing list