[llvm-dev] How to make ScalarEvolution recompute SCEV values?

Augusto Noronha via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 30 13:03:38 PDT 2019


Thanks Eli! 

That was it, I got the DominatorTree by calling 

getAnalysis<DominatorTreeWrapperPass>().getDomTree()

and it worked.

Regards,
Augusto Noronha

> On 30 Oct 2019, at 15:55, Eli Friedman <efriedma at quicinc.com> wrote:
> 
> 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