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

Augusto Noronha via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 30 04:18:33 PDT 2019


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


More information about the llvm-dev mailing list