Home | History | Annotate | Download | only in Utils
      1 //===-- LCSSA.cpp - Convert loops into loop-closed SSA form ---------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This pass transforms loops by placing phi nodes at the end of the loops for
     11 // all values that are live across the loop boundary.  For example, it turns
     12 // the left into the right code:
     13 //
     14 // for (...)                for (...)
     15 //   if (c)                   if (c)
     16 //     X1 = ...                 X1 = ...
     17 //   else                     else
     18 //     X2 = ...                 X2 = ...
     19 //   X3 = phi(X1, X2)         X3 = phi(X1, X2)
     20 // ... = X3 + 4             X4 = phi(X3)
     21 //                          ... = X4 + 4
     22 //
     23 // This is still valid LLVM; the extra phi nodes are purely redundant, and will
     24 // be trivially eliminated by InstCombine.  The major benefit of this
     25 // transformation is that it makes many other loop optimizations, such as
     26 // LoopUnswitching, simpler.
     27 //
     28 //===----------------------------------------------------------------------===//
     29 
     30 #include "llvm/Transforms/Utils/LCSSA.h"
     31 #include "llvm/ADT/STLExtras.h"
     32 #include "llvm/ADT/Statistic.h"
     33 #include "llvm/Analysis/AliasAnalysis.h"
     34 #include "llvm/Analysis/BasicAliasAnalysis.h"
     35 #include "llvm/Analysis/GlobalsModRef.h"
     36 #include "llvm/Analysis/LoopPass.h"
     37 #include "llvm/Analysis/ScalarEvolution.h"
     38 #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
     39 #include "llvm/IR/Constants.h"
     40 #include "llvm/IR/Dominators.h"
     41 #include "llvm/IR/Function.h"
     42 #include "llvm/IR/Instructions.h"
     43 #include "llvm/IR/PredIteratorCache.h"
     44 #include "llvm/Pass.h"
     45 #include "llvm/Transforms/Scalar.h"
     46 #include "llvm/Transforms/Utils/LoopUtils.h"
     47 #include "llvm/Transforms/Utils/SSAUpdater.h"
     48 using namespace llvm;
     49 
     50 #define DEBUG_TYPE "lcssa"
     51 
     52 STATISTIC(NumLCSSA, "Number of live out of a loop variables");
     53 
     54 /// Return true if the specified block is in the list.
     55 static bool isExitBlock(BasicBlock *BB,
     56                         const SmallVectorImpl<BasicBlock *> &ExitBlocks) {
     57   return find(ExitBlocks, BB) != ExitBlocks.end();
     58 }
     59 
     60 /// Given an instruction in the loop, check to see if it has any uses that are
     61 /// outside the current loop.  If so, insert LCSSA PHI nodes and rewrite the
     62 /// uses.
     63 static bool processInstruction(Loop &L, Instruction &Inst, DominatorTree &DT,
     64                                const SmallVectorImpl<BasicBlock *> &ExitBlocks,
     65                                PredIteratorCache &PredCache, LoopInfo *LI) {
     66   SmallVector<Use *, 16> UsesToRewrite;
     67 
     68   // Tokens cannot be used in PHI nodes, so we skip over them.
     69   // We can run into tokens which are live out of a loop with catchswitch
     70   // instructions in Windows EH if the catchswitch has one catchpad which
     71   // is inside the loop and another which is not.
     72   if (Inst.getType()->isTokenTy())
     73     return false;
     74 
     75   BasicBlock *InstBB = Inst.getParent();
     76 
     77   for (Use &U : Inst.uses()) {
     78     Instruction *User = cast<Instruction>(U.getUser());
     79     BasicBlock *UserBB = User->getParent();
     80     if (PHINode *PN = dyn_cast<PHINode>(User))
     81       UserBB = PN->getIncomingBlock(U);
     82 
     83     if (InstBB != UserBB && !L.contains(UserBB))
     84       UsesToRewrite.push_back(&U);
     85   }
     86 
     87   // If there are no uses outside the loop, exit with no change.
     88   if (UsesToRewrite.empty())
     89     return false;
     90 
     91   ++NumLCSSA; // We are applying the transformation
     92 
     93   // Invoke instructions are special in that their result value is not available
     94   // along their unwind edge. The code below tests to see whether DomBB
     95   // dominates the value, so adjust DomBB to the normal destination block,
     96   // which is effectively where the value is first usable.
     97   BasicBlock *DomBB = Inst.getParent();
     98   if (InvokeInst *Inv = dyn_cast<InvokeInst>(&Inst))
     99     DomBB = Inv->getNormalDest();
    100 
    101   DomTreeNode *DomNode = DT.getNode(DomBB);
    102 
    103   SmallVector<PHINode *, 16> AddedPHIs;
    104   SmallVector<PHINode *, 8> PostProcessPHIs;
    105 
    106   SSAUpdater SSAUpdate;
    107   SSAUpdate.Initialize(Inst.getType(), Inst.getName());
    108 
    109   // Insert the LCSSA phi's into all of the exit blocks dominated by the
    110   // value, and add them to the Phi's map.
    111   for (BasicBlock *ExitBB : ExitBlocks) {
    112     if (!DT.dominates(DomNode, DT.getNode(ExitBB)))
    113       continue;
    114 
    115     // If we already inserted something for this BB, don't reprocess it.
    116     if (SSAUpdate.HasValueForBlock(ExitBB))
    117       continue;
    118 
    119     PHINode *PN = PHINode::Create(Inst.getType(), PredCache.size(ExitBB),
    120                                   Inst.getName() + ".lcssa", &ExitBB->front());
    121 
    122     // Add inputs from inside the loop for this PHI.
    123     for (BasicBlock *Pred : PredCache.get(ExitBB)) {
    124       PN->addIncoming(&Inst, Pred);
    125 
    126       // If the exit block has a predecessor not within the loop, arrange for
    127       // the incoming value use corresponding to that predecessor to be
    128       // rewritten in terms of a different LCSSA PHI.
    129       if (!L.contains(Pred))
    130         UsesToRewrite.push_back(
    131             &PN->getOperandUse(PN->getOperandNumForIncomingValue(
    132                  PN->getNumIncomingValues() - 1)));
    133     }
    134 
    135     AddedPHIs.push_back(PN);
    136 
    137     // Remember that this phi makes the value alive in this block.
    138     SSAUpdate.AddAvailableValue(ExitBB, PN);
    139 
    140     // LoopSimplify might fail to simplify some loops (e.g. when indirect
    141     // branches are involved). In such situations, it might happen that an exit
    142     // for Loop L1 is the header of a disjoint Loop L2. Thus, when we create
    143     // PHIs in such an exit block, we are also inserting PHIs into L2's header.
    144     // This could break LCSSA form for L2 because these inserted PHIs can also
    145     // have uses outside of L2. Remember all PHIs in such situation as to
    146     // revisit than later on. FIXME: Remove this if indirectbr support into
    147     // LoopSimplify gets improved.
    148     if (auto *OtherLoop = LI->getLoopFor(ExitBB))
    149       if (!L.contains(OtherLoop))
    150         PostProcessPHIs.push_back(PN);
    151   }
    152 
    153   // Rewrite all uses outside the loop in terms of the new PHIs we just
    154   // inserted.
    155   for (Use *UseToRewrite : UsesToRewrite) {
    156     // If this use is in an exit block, rewrite to use the newly inserted PHI.
    157     // This is required for correctness because SSAUpdate doesn't handle uses in
    158     // the same block.  It assumes the PHI we inserted is at the end of the
    159     // block.
    160     Instruction *User = cast<Instruction>(UseToRewrite->getUser());
    161     BasicBlock *UserBB = User->getParent();
    162     if (PHINode *PN = dyn_cast<PHINode>(User))
    163       UserBB = PN->getIncomingBlock(*UseToRewrite);
    164 
    165     if (isa<PHINode>(UserBB->begin()) && isExitBlock(UserBB, ExitBlocks)) {
    166       // Tell the VHs that the uses changed. This updates SCEV's caches.
    167       if (UseToRewrite->get()->hasValueHandle())
    168         ValueHandleBase::ValueIsRAUWd(*UseToRewrite, &UserBB->front());
    169       UseToRewrite->set(&UserBB->front());
    170       continue;
    171     }
    172 
    173     // Otherwise, do full PHI insertion.
    174     SSAUpdate.RewriteUse(*UseToRewrite);
    175   }
    176 
    177   // Post process PHI instructions that were inserted into another disjoint loop
    178   // and update their exits properly.
    179   for (auto *I : PostProcessPHIs) {
    180     if (I->use_empty())
    181       continue;
    182 
    183     BasicBlock *PHIBB = I->getParent();
    184     Loop *OtherLoop = LI->getLoopFor(PHIBB);
    185     SmallVector<BasicBlock *, 8> EBs;
    186     OtherLoop->getExitBlocks(EBs);
    187     if (EBs.empty())
    188       continue;
    189 
    190     // Recurse and re-process each PHI instruction. FIXME: we should really
    191     // convert this entire thing to a worklist approach where we process a
    192     // vector of instructions...
    193     processInstruction(*OtherLoop, *I, DT, EBs, PredCache, LI);
    194   }
    195 
    196   // Remove PHI nodes that did not have any uses rewritten.
    197   for (PHINode *PN : AddedPHIs)
    198     if (PN->use_empty())
    199       PN->eraseFromParent();
    200 
    201   return true;
    202 }
    203 
    204 /// Return true if the specified block dominates at least
    205 /// one of the blocks in the specified list.
    206 static bool
    207 blockDominatesAnExit(BasicBlock *BB,
    208                      DominatorTree &DT,
    209                      const SmallVectorImpl<BasicBlock *> &ExitBlocks) {
    210   DomTreeNode *DomNode = DT.getNode(BB);
    211   return llvm::any_of(ExitBlocks, [&](BasicBlock * EB) {
    212     return DT.dominates(DomNode, DT.getNode(EB));
    213   });
    214 }
    215 
    216 bool llvm::formLCSSA(Loop &L, DominatorTree &DT, LoopInfo *LI,
    217                      ScalarEvolution *SE) {
    218   bool Changed = false;
    219 
    220   // Get the set of exiting blocks.
    221   SmallVector<BasicBlock *, 8> ExitBlocks;
    222   L.getExitBlocks(ExitBlocks);
    223 
    224   if (ExitBlocks.empty())
    225     return false;
    226 
    227   PredIteratorCache PredCache;
    228 
    229   // Look at all the instructions in the loop, checking to see if they have uses
    230   // outside the loop.  If so, rewrite those uses.
    231   for (BasicBlock *BB : L.blocks()) {
    232     // For large loops, avoid use-scanning by using dominance information:  In
    233     // particular, if a block does not dominate any of the loop exits, then none
    234     // of the values defined in the block could be used outside the loop.
    235     if (!blockDominatesAnExit(BB, DT, ExitBlocks))
    236       continue;
    237 
    238     for (Instruction &I : *BB) {
    239       // Reject two common cases fast: instructions with no uses (like stores)
    240       // and instructions with one use that is in the same block as this.
    241       if (I.use_empty() ||
    242           (I.hasOneUse() && I.user_back()->getParent() == BB &&
    243            !isa<PHINode>(I.user_back())))
    244         continue;
    245 
    246       Changed |= processInstruction(L, I, DT, ExitBlocks, PredCache, LI);
    247     }
    248   }
    249 
    250   // If we modified the code, remove any caches about the loop from SCEV to
    251   // avoid dangling entries.
    252   // FIXME: This is a big hammer, can we clear the cache more selectively?
    253   if (SE && Changed)
    254     SE->forgetLoop(&L);
    255 
    256   assert(L.isLCSSAForm(DT));
    257 
    258   return Changed;
    259 }
    260 
    261 /// Process a loop nest depth first.
    262 bool llvm::formLCSSARecursively(Loop &L, DominatorTree &DT, LoopInfo *LI,
    263                                 ScalarEvolution *SE) {
    264   bool Changed = false;
    265 
    266   // Recurse depth-first through inner loops.
    267   for (Loop *SubLoop : L.getSubLoops())
    268     Changed |= formLCSSARecursively(*SubLoop, DT, LI, SE);
    269 
    270   Changed |= formLCSSA(L, DT, LI, SE);
    271   return Changed;
    272 }
    273 
    274 /// Process all loops in the function, inner-most out.
    275 static bool formLCSSAOnAllLoops(LoopInfo *LI, DominatorTree &DT,
    276                                 ScalarEvolution *SE) {
    277   bool Changed = false;
    278   for (auto &L : *LI)
    279     Changed |= formLCSSARecursively(*L, DT, LI, SE);
    280   return Changed;
    281 }
    282 
    283 namespace {
    284 struct LCSSAWrapperPass : public FunctionPass {
    285   static char ID; // Pass identification, replacement for typeid
    286   LCSSAWrapperPass() : FunctionPass(ID) {
    287     initializeLCSSAWrapperPassPass(*PassRegistry::getPassRegistry());
    288   }
    289 
    290   // Cached analysis information for the current function.
    291   DominatorTree *DT;
    292   LoopInfo *LI;
    293   ScalarEvolution *SE;
    294 
    295   bool runOnFunction(Function &F) override;
    296 
    297   /// This transformation requires natural loop information & requires that
    298   /// loop preheaders be inserted into the CFG.  It maintains both of these,
    299   /// as well as the CFG.  It also requires dominator information.
    300   void getAnalysisUsage(AnalysisUsage &AU) const override {
    301     AU.setPreservesCFG();
    302 
    303     AU.addRequired<DominatorTreeWrapperPass>();
    304     AU.addRequired<LoopInfoWrapperPass>();
    305     AU.addPreservedID(LoopSimplifyID);
    306     AU.addPreserved<AAResultsWrapperPass>();
    307     AU.addPreserved<BasicAAWrapperPass>();
    308     AU.addPreserved<GlobalsAAWrapperPass>();
    309     AU.addPreserved<ScalarEvolutionWrapperPass>();
    310     AU.addPreserved<SCEVAAWrapperPass>();
    311   }
    312 };
    313 }
    314 
    315 char LCSSAWrapperPass::ID = 0;
    316 INITIALIZE_PASS_BEGIN(LCSSAWrapperPass, "lcssa", "Loop-Closed SSA Form Pass",
    317                       false, false)
    318 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
    319 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
    320 INITIALIZE_PASS_END(LCSSAWrapperPass, "lcssa", "Loop-Closed SSA Form Pass",
    321                     false, false)
    322 
    323 Pass *llvm::createLCSSAPass() { return new LCSSAWrapperPass(); }
    324 char &llvm::LCSSAID = LCSSAWrapperPass::ID;
    325 
    326 /// Transform \p F into loop-closed SSA form.
    327 bool LCSSAWrapperPass::runOnFunction(Function &F) {
    328   LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
    329   DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
    330   auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>();
    331   SE = SEWP ? &SEWP->getSE() : nullptr;
    332 
    333   return formLCSSAOnAllLoops(LI, *DT, SE);
    334 }
    335 
    336 PreservedAnalyses LCSSAPass::run(Function &F, AnalysisManager<Function> &AM) {
    337   auto &LI = AM.getResult<LoopAnalysis>(F);
    338   auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
    339   auto *SE = AM.getCachedResult<ScalarEvolutionAnalysis>(F);
    340   if (!formLCSSAOnAllLoops(&LI, DT, SE))
    341     return PreservedAnalyses::all();
    342 
    343   // FIXME: This should also 'preserve the CFG'.
    344   PreservedAnalyses PA;
    345   PA.preserve<BasicAA>();
    346   PA.preserve<GlobalsAA>();
    347   PA.preserve<SCEVAA>();
    348   PA.preserve<ScalarEvolutionAnalysis>();
    349   return PA;
    350 }
    351