[llvm-dev] ScalarEvolution class returns no valid loop exit count
benedikt steinmeier via llvm-dev
llvm-dev at lists.llvm.org
Wed Nov 28 05:26:35 PST 2018
Hi Sanjoy,
the LLVM IR is parsed with following expression:
.......
string file = "....";
static LLVMContext cont;
SMDiagnostic diag;
unique_ptr<Module> module = parseIRFile(file, diag, cont);
.......
I mixed up the LLVM loop exit block with the loop exiting block in my
analyses code. But after
resolving this issue, the exiting block is successfully determined:
......
BB1: ; preds = %BB3, %BB0
%3 = load i32, i32* %2, align 4
%4 = icmp slt i32 %3, 10
br i1 %4, label %BB2, label %BB4
.......
Nevertheless the loop exiting count can not be calculated with the
ScalarEvolution class. I will try to
do the loop optimizations.
Many greetings
Benedikt
Am Di., 27. Nov. 2018 um 22:25 Uhr schrieb Sanjoy Das <
sanjoy at playingwithpointers.com>:
> Are you sure exitingblock is not null? This should probably be an
> assert in getExitCount itself.
>
> Other than that, SCEV normally expects that the loops have been
> canonicalized and some basic optimizations have been performed. How
> are you obtaining the IR you're passing to analysis?
>
> -- Sanjoy
> On Tue, Nov 27, 2018 at 1:14 PM benedikt steinmeier via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
> >
> > Hi,
> >
> > I have problems to estimate the loop exit count of a simple loop with
> the ScalarEvolution class.
> >
> > simple loop:
> > ......
> > int a = 0;
> > for(int i; i < 10; ++i){
> > a = a + 1;
> > };
> > ......
> >
> > For the loop analyzation I use the ScalarEvolution class with the
> following initialization:
> > ......
> > void analysis(Function* func)
> > DominatorTree DT = DominatorTree();
> > DT.recalculate(*func);
> > DT.updateDFSNumbers();
> >
> > LoopInfoBase<BasicBlock, Loop> LIB;
> > LIB.releaseMemory();
> > LIB.analyze(DT);
> >
> > for(auto&bb :*func){
> > Loop * L = LIB.getLoopFor(&bb);
> > if(L != nullptr){
> > AssumptionCache AC = AssumptionCache(*bb.getParent());
> > Triple MT(llvm::sys::getDefaultTargetTriple());
> > TargetLibraryInfoImpl TLII(MT);
> > TargetLibraryInfoWrapperPass TLI =
> TargetLibraryInfoWrapperPass(TLII);
> >
> > LoopInfo LI = LoopInfo(DT);
> > LI.analyze(DT);
> >
> > ScalarEvolution SE = ScalarEvolution(*func, TLI.getTLI(),AC,
> DT, LI);
> > BasicBlock * exitingblock = L->getUniqueExitBlock();
> > const SCEV * exitingcount = SE.getExitCount (L,exitblock );
> > }
> > }
> > }
> > ......
> >
> > Unfortunately I get this result by printing the SCEV exitingcount
> variable:
> > ***COULDNOTCOMPUTE***
> >
> > It has been tested that the exitingblock of the loop was calculated
> successfully.
> > The LLVM IR is parsed and analysed without the usual pass framework. For
> this reason
> > the use of the getAnalysis<ScalarEvolution>() is not possible. The
> question is wether there
> > is something I`m doing wrong during the initialization of the
> ScalarEvolution class? Or is
> > the use of LLVM analysis classes without the passmanager framework not
> possible?
> >
> > Best regards!
> > Benedikt
> >
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181128/badabcbf/attachment.html>
More information about the llvm-dev
mailing list