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" 48using namespace llvm; 49 50#define DEBUG_TYPE "lcssa" 51 52STATISTIC(NumLCSSA, "Number of live out of a loop variables"); 53 54/// Return true if the specified block is in the list. 55static 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. 63static 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. 206static bool 207blockDominatesAnExit(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 216bool 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. 262bool 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. 275static 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 283namespace { 284struct 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 315char LCSSAWrapperPass::ID = 0; 316INITIALIZE_PASS_BEGIN(LCSSAWrapperPass, "lcssa", "Loop-Closed SSA Form Pass", 317 false, false) 318INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 319INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) 320INITIALIZE_PASS_END(LCSSAWrapperPass, "lcssa", "Loop-Closed SSA Form Pass", 321 false, false) 322 323Pass *llvm::createLCSSAPass() { return new LCSSAWrapperPass(); } 324char &llvm::LCSSAID = LCSSAWrapperPass::ID; 325 326/// Transform \p F into loop-closed SSA form. 327bool 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 336PreservedAnalyses 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