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