1 //===--------- LoopSimplifyCFG.cpp - Loop CFG Simplification Pass ---------===// 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 file implements the Loop SimplifyCFG Pass. This pass is responsible for 11 // basic loop CFG cleanup, primarily to assist other loop passes. If you 12 // encounter a noncanonical CFG construct that causes another loop pass to 13 // perform suboptimally, this is the place to fix it up. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #include "llvm/Transforms/Scalar.h" 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/Statistic.h" 20 #include "llvm/Analysis/AliasAnalysis.h" 21 #include "llvm/Analysis/BasicAliasAnalysis.h" 22 #include "llvm/Analysis/AssumptionCache.h" 23 #include "llvm/Analysis/DependenceAnalysis.h" 24 #include "llvm/Analysis/GlobalsModRef.h" 25 #include "llvm/Analysis/LoopInfo.h" 26 #include "llvm/Analysis/LoopPass.h" 27 #include "llvm/Analysis/ScalarEvolution.h" 28 #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" 29 #include "llvm/Analysis/TargetTransformInfo.h" 30 #include "llvm/IR/Dominators.h" 31 #include "llvm/Transforms/Utils/Local.h" 32 using namespace llvm; 33 34 #define DEBUG_TYPE "loop-simplifycfg" 35 36 namespace { 37 class LoopSimplifyCFG : public LoopPass { 38 public: 39 static char ID; // Pass ID, replacement for typeid 40 LoopSimplifyCFG() : LoopPass(ID) { 41 initializeLoopSimplifyCFGPass(*PassRegistry::getPassRegistry()); 42 } 43 44 bool runOnLoop(Loop *L, LPPassManager &) override; 45 46 void getAnalysisUsage(AnalysisUsage &AU) const override { 47 AU.addRequired<DominatorTreeWrapperPass>(); 48 AU.addRequired<LoopInfoWrapperPass>(); 49 50 AU.addPreserved<DominatorTreeWrapperPass>(); 51 AU.addPreserved<LoopInfoWrapperPass>(); 52 AU.addPreserved<GlobalsAAWrapperPass>(); 53 AU.addPreserved<BasicAAWrapperPass>(); 54 AU.addPreserved<AAResultsWrapperPass>(); 55 AU.addPreserved<ScalarEvolutionWrapperPass>(); 56 AU.addPreserved<SCEVAAWrapperPass>(); 57 AU.addPreserved<DependenceAnalysis>(); 58 AU.addPreservedID(LoopSimplifyID); 59 AU.addPreservedID(LCSSAID); 60 } 61 }; 62 } 63 64 char LoopSimplifyCFG::ID = 0; 65 INITIALIZE_PASS_BEGIN(LoopSimplifyCFG, "loop-simplifycfg", "Simplify loop CFG", 66 false, false) 67 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 68 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) 69 INITIALIZE_PASS_END(LoopSimplifyCFG, "loop-simplifycfg", "Simplify loop CFG", 70 false, false) 71 72 Pass *llvm::createLoopSimplifyCFGPass() { return new LoopSimplifyCFG(); } 73 74 static bool simplifyLoopCFG(Loop *L, DominatorTree *DT, LoopInfo *LI) { 75 bool Changed = false; 76 // Copy blocks into a temporary array to avoid iterator invalidation issues 77 // as we remove them. 78 SmallVector<WeakVH, 16> Blocks(L->blocks()); 79 80 for (auto &Block : Blocks) { 81 // Attempt to merge blocks in the trivial case. Don't modify blocks which 82 // belong to other loops. 83 BasicBlock *Succ = cast_or_null<BasicBlock>(Block); 84 if (!Succ) 85 continue; 86 87 BasicBlock *Pred = Succ->getSinglePredecessor(); 88 if (!Pred || !Pred->getSingleSuccessor() || LI->getLoopFor(Pred) != L) 89 continue; 90 91 // Pred is going to disappear, so we need to update the loop info. 92 if (L->getHeader() == Pred) 93 L->moveToHeader(Succ); 94 LI->removeBlock(Pred); 95 MergeBasicBlockIntoOnlyPred(Succ, DT); 96 Changed = true; 97 } 98 99 return Changed; 100 } 101 102 /// runOnLoop - Perform basic CFG simplifications to assist other loop passes. 103 /// For now, this only attempts to merge blocks in the trivial case. 104 bool LoopSimplifyCFG::runOnLoop(Loop *L, LPPassManager &) { 105 if (skipOptnoneFunction(L)) 106 return false; 107 108 DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 109 LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); 110 return simplifyLoopCFG(L, DT, LI); 111 } 112