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