1 //===- LoopExtractor.cpp - Extract each loop into a new function ----------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file was developed by the LLVM research group and is distributed under 6 // the University of Illinois Open Source License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // A pass wrapper around the ExtractLoop() scalar transformation to extract each 11 // top-level loop into its own new function. If the loop is the ONLY loop in a 12 // given function, it is not touched. This is a pass most useful for debugging 13 // via bugpoint. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #include "llvm/Transforms/IPO.h" 18 #include "llvm/iTerminators.h" 19 #include "llvm/Module.h" 20 #include "llvm/Pass.h" 21 #include "llvm/Analysis/Dominators.h" 22 #include "llvm/Analysis/LoopInfo.h" 23 #include "llvm/Transforms/Scalar.h" 24 #include "llvm/Transforms/Utils/FunctionUtils.h" 25 #include "Support/Statistic.h" 26 using namespace llvm; 27 28 namespace { 29 Statistic<> NumExtracted("loop-extract", "Number of loops extracted"); 30 31 // FIXME: This is not a function pass, but the PassManager doesn't allow 32 // Module passes to require FunctionPasses, so we can't get loop info if we're 33 // not a function pass. 34 struct LoopExtractor : public FunctionPass { 35 unsigned NumLoops; 36 37 LoopExtractor(unsigned numLoops = ~0) : NumLoops(numLoops) {} 38 39 virtual bool runOnFunction(Function &F); 40 41 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 42 AU.addRequiredID(BreakCriticalEdgesID); 43 AU.addRequiredID(LoopSimplifyID); 44 AU.addRequired<DominatorSet>(); 45 AU.addRequired<LoopInfo>(); 46 } 47 }; 48 49 RegisterOpt<LoopExtractor> 50 X("loop-extract", "Extract loops into new functions"); 51 52 /// SingleLoopExtractor - For bugpoint. 53 struct SingleLoopExtractor : public LoopExtractor { 54 SingleLoopExtractor() : LoopExtractor(1) {} 55 }; 56 57 RegisterOpt<SingleLoopExtractor> 58 Y("loop-extract-single", "Extract at most one loop into a new function"); 59 } // End anonymous namespace 60 61 bool LoopExtractor::runOnFunction(Function &F) { 62 LoopInfo &LI = getAnalysis<LoopInfo>(); 63 64 // If this function has no loops, there is nothing to do. 65 if (LI.begin() == LI.end()) 66 return false; 67 68 DominatorSet &DS = getAnalysis<DominatorSet>(); 69 70 // If there is more than one top-level loop in this function, extract all of 71 // the loops. 72 bool Changed = false; 73 if (LI.end()-LI.begin() > 1) { 74 for (LoopInfo::iterator i = LI.begin(), e = LI.end(); i != e; ++i) { 75 if (NumLoops == 0) return Changed; 76 --NumLoops; 77 Changed |= ExtractLoop(DS, *i) != 0; 78 ++NumExtracted; 79 } 80 } else { 81 // Otherwise there is exactly one top-level loop. If this function is more 82 // than a minimal wrapper around the loop, extract the loop. 83 Loop *TLL = *LI.begin(); 84 bool ShouldExtractLoop = false; 85 86 // Extract the loop if the entry block doesn't branch to the loop header. 87 TerminatorInst *EntryTI = F.getEntryBlock().getTerminator(); 88 if (!isa<BranchInst>(EntryTI) || 89 !cast<BranchInst>(EntryTI)->isUnconditional() || 90 EntryTI->getSuccessor(0) != TLL->getHeader()) 91 ShouldExtractLoop = true; 92 else { 93 // Check to see if any exits from the loop are more than just return 94 // blocks. 95 std::vector<BasicBlock*> ExitBlocks; 96 TLL->getExitBlocks(ExitBlocks); 97 for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) 98 if (!isa<ReturnInst>(ExitBlocks[i]->getTerminator())) { 99 ShouldExtractLoop = true; 100 break; 101 } 102 } 103 104 if (ShouldExtractLoop) { 105 if (NumLoops == 0) return Changed; 106 --NumLoops; 107 Changed |= ExtractLoop(DS, TLL) != 0; 108 ++NumExtracted; 109 } else { 110 // Okay, this function is a minimal container around the specified loop. 111 // If we extract the loop, we will continue to just keep extracting it 112 // infinitely... so don't extract it. However, if the loop contains any 113 // subloops, extract them. 114 for (Loop::iterator i = TLL->begin(), e = TLL->end(); i != e; ++i) { 115 if (NumLoops == 0) return Changed; 116 --NumLoops; 117 Changed |= ExtractLoop(DS, *i) != 0; 118 ++NumExtracted; 119 } 120 } 121 } 122 123 return Changed; 124 } 125 126 // createSingleLoopExtractorPass - This pass extracts one natural loop from the 127 // program into a function if it can. This is used by bugpoint. 128 // 129 Pass *llvm::createSingleLoopExtractorPass() { 130 return new SingleLoopExtractor(); 131 } 132