[llvm-dev] How to make ScalarEvolution recompute SCEV values?
Eli Friedman via llvm-dev
llvm-dev at lists.llvm.org
Wed Oct 30 11:55:45 PDT 2019
It looks like you're passing the wrong DominatorTree to cloneLoopWithPreheader. ScalarEvolutionWrapperPass depends on LoopInfoWrapperPass and DominatorTreeWrapperPass; if those are outdated, SCEV won't recognize your loops at all.
ScalarEvolution::forgetAllLoops should clear out all the cached data in SCEV itself.
-Eli
> -----Original Message-----
> From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of Augusto
> Noronha via llvm-dev
> Sent: Wednesday, October 30, 2019 4:19 AM
> To: llvm-dev at lists.llvm.org
> Subject: [EXT] [llvm-dev] How to make ScalarEvolution recompute SCEV values?
>
> Hello all,
>
> I’m pretty new to LLVM.
>
> I'm writing a pass for loop optimization. I clone and rearrange loops, setting the
> cloned loop as the original loop’s parent. This can be done multiple times, until
> there is no more work to do. The trouble is, after the first time I do this, the
> cloned loop's SCEVs become unknown types when they should be AddRecExpr.
>
> If I re-run the whole pass on the IR outputted by the first iteration, it will
> correctly identify them as AddRecExpr.
>
> I've already tried called Scalar Evolution’s *ForgetAllLoops* function, but that
> doesn't work. I also tried calling the *runOnFunction* from the ScalarEvolution
> pass, but that also didn't work.
>
> My question is: how can I make ScalarEvolution re-calculate the SCEV values for
> the unknown SCEVs, or, is there a way to re-run ScalarEvolution and LoopInfo
> analysis pass during my pass?
>
> This is my current CloneLoop function:
>
> Loop *cloneLoop(Function *F, Loop *L, LoopInfo *LI, const Twine &NameSuffix,
> ValueToValueMapTy &VMap) {
>
> // original preheader of the loop
> const auto PreHeader = L->getLoopPreheader();
>
> // keep track of the original predecessors
> std::set<BasicBlock *> AllPredecessors;
> for (auto PredIt = pred_begin(PreHeader), E = pred_end(PreHeader);
> PredIt != E; PredIt++)
> AllPredecessors.insert(*PredIt);
>
> BasicBlock *ExitBlock = L->getExitBlock();
>
> auto DT = DominatorTree(*F);
>
> SmallVector<BasicBlock *, 8> Blocks;
> const auto ClonedLoop = cloneLoopWithPreheader(PreHeader, PreHeader, L,
> VMap, NameSuffix, LI, &DT, Blocks);
> VMap[ExitBlock] = PreHeader; // chain: cloned loop -> original loop
> remapInstructionsInBlocks(Blocks, VMap);
>
> // remap original predecessors to the cloned loop
> for (BasicBlock *PredBB : AllPredecessors) {
> Instruction *TI = PredBB->getTerminator();
> for (unsigned i = 0; i < TI->getNumOperands(); i++) {
> if (TI->getOperand(i) == PreHeader)
> TI->setOperand(i, ClonedLoop->getLoopPreheader());
> }
> }
>
> return ClonedLoop;
> }
>
> Regards,
> Augusto Noronha
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list