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
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<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 >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170807/49b2ca8a/attachment-0001.html>
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>