1f22ef01cSRoman Divacky //===- LoopExtractor.cpp - Extract each loop into a new function ----------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // A pass wrapper around the ExtractLoop() scalar transformation to extract each
11f22ef01cSRoman Divacky // top-level loop into its own new function. If the loop is the ONLY loop in a
12f22ef01cSRoman Divacky // given function, it is not touched. This is a pass most useful for debugging
13f22ef01cSRoman Divacky // via bugpoint.
14f22ef01cSRoman Divacky //
15f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
16f22ef01cSRoman Divacky 
17139f7f9bSDimitry Andric #include "llvm/ADT/Statistic.h"
18f22ef01cSRoman Divacky #include "llvm/Analysis/LoopPass.h"
1991bc56edSDimitry Andric #include "llvm/IR/Dominators.h"
20139f7f9bSDimitry Andric #include "llvm/IR/Instructions.h"
21139f7f9bSDimitry Andric #include "llvm/IR/Module.h"
22139f7f9bSDimitry Andric #include "llvm/Pass.h"
23f22ef01cSRoman Divacky #include "llvm/Support/CommandLine.h"
24db17bf38SDimitry Andric #include "llvm/Transforms/IPO.h"
25f22ef01cSRoman Divacky #include "llvm/Transforms/Scalar.h"
264ba319b5SDimitry Andric #include "llvm/Transforms/Utils.h"
276122f3e6SDimitry Andric #include "llvm/Transforms/Utils/BasicBlockUtils.h"
287ae0e2c9SDimitry Andric #include "llvm/Transforms/Utils/CodeExtractor.h"
29f22ef01cSRoman Divacky #include <fstream>
30f22ef01cSRoman Divacky #include <set>
31f22ef01cSRoman Divacky using namespace llvm;
32f22ef01cSRoman Divacky 
3391bc56edSDimitry Andric #define DEBUG_TYPE "loop-extract"
3491bc56edSDimitry Andric 
35f22ef01cSRoman Divacky STATISTIC(NumExtracted, "Number of loops extracted");
36f22ef01cSRoman Divacky 
37f22ef01cSRoman Divacky namespace {
38f22ef01cSRoman Divacky   struct LoopExtractor : public LoopPass {
39f22ef01cSRoman Divacky     static char ID; // Pass identification, replacement for typeid
40f22ef01cSRoman Divacky     unsigned NumLoops;
41f22ef01cSRoman Divacky 
LoopExtractor__anond5a399400111::LoopExtractor42f22ef01cSRoman Divacky     explicit LoopExtractor(unsigned numLoops = ~0)
432754fe60SDimitry Andric       : LoopPass(ID), NumLoops(numLoops) {
442754fe60SDimitry Andric         initializeLoopExtractorPass(*PassRegistry::getPassRegistry());
452754fe60SDimitry Andric       }
46f22ef01cSRoman Divacky 
477d523365SDimitry Andric     bool runOnLoop(Loop *L, LPPassManager &) override;
48f22ef01cSRoman Divacky 
getAnalysisUsage__anond5a399400111::LoopExtractor4991bc56edSDimitry Andric     void getAnalysisUsage(AnalysisUsage &AU) const override {
50f22ef01cSRoman Divacky       AU.addRequiredID(BreakCriticalEdgesID);
51f22ef01cSRoman Divacky       AU.addRequiredID(LoopSimplifyID);
5291bc56edSDimitry Andric       AU.addRequired<DominatorTreeWrapperPass>();
537d523365SDimitry Andric       AU.addRequired<LoopInfoWrapperPass>();
54f22ef01cSRoman Divacky     }
55f22ef01cSRoman Divacky   };
563dac3a9bSDimitry Andric }
57f22ef01cSRoman Divacky 
58f22ef01cSRoman Divacky char LoopExtractor::ID = 0;
592754fe60SDimitry Andric INITIALIZE_PASS_BEGIN(LoopExtractor, "loop-extract",
602754fe60SDimitry Andric                       "Extract loops into new functions", false, false)
612754fe60SDimitry Andric INITIALIZE_PASS_DEPENDENCY(BreakCriticalEdges)
622754fe60SDimitry Andric INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
6391bc56edSDimitry Andric INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
642754fe60SDimitry Andric INITIALIZE_PASS_END(LoopExtractor, "loop-extract",
652754fe60SDimitry Andric                     "Extract loops into new functions", false, false)
66f22ef01cSRoman Divacky 
67f22ef01cSRoman Divacky namespace {
68f22ef01cSRoman Divacky   /// SingleLoopExtractor - For bugpoint.
69f22ef01cSRoman Divacky   struct SingleLoopExtractor : public LoopExtractor {
70f22ef01cSRoman Divacky     static char ID; // Pass identification, replacement for typeid
SingleLoopExtractor__anond5a399400211::SingleLoopExtractor71f22ef01cSRoman Divacky     SingleLoopExtractor() : LoopExtractor(1) {}
72f22ef01cSRoman Divacky   };
73f22ef01cSRoman Divacky } // End anonymous namespace
74f22ef01cSRoman Divacky 
75f22ef01cSRoman Divacky char SingleLoopExtractor::ID = 0;
76e580952dSDimitry Andric INITIALIZE_PASS(SingleLoopExtractor, "loop-extract-single",
772754fe60SDimitry Andric                 "Extract at most one loop into a new function", false, false)
78f22ef01cSRoman Divacky 
79f22ef01cSRoman Divacky // createLoopExtractorPass - This pass extracts all natural loops from the
80f22ef01cSRoman Divacky // program into a function if it can.
81f22ef01cSRoman Divacky //
createLoopExtractorPass()82f22ef01cSRoman Divacky Pass *llvm::createLoopExtractorPass() { return new LoopExtractor(); }
83f22ef01cSRoman Divacky 
runOnLoop(Loop * L,LPPassManager & LPM)842cab237bSDimitry Andric bool LoopExtractor::runOnLoop(Loop *L, LPPassManager &LPM) {
853ca95b02SDimitry Andric   if (skipLoop(L))
8691bc56edSDimitry Andric     return false;
8791bc56edSDimitry Andric 
88f22ef01cSRoman Divacky   // Only visit top-level loops.
89f22ef01cSRoman Divacky   if (L->getParentLoop())
90f22ef01cSRoman Divacky     return false;
91f22ef01cSRoman Divacky 
92f22ef01cSRoman Divacky   // If LoopSimplify form is not available, stay out of trouble.
93f22ef01cSRoman Divacky   if (!L->isLoopSimplifyForm())
94f22ef01cSRoman Divacky     return false;
95f22ef01cSRoman Divacky 
9691bc56edSDimitry Andric   DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
977d523365SDimitry Andric   LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
98f22ef01cSRoman Divacky   bool Changed = false;
99f22ef01cSRoman Divacky 
100f22ef01cSRoman Divacky   // If there is more than one top-level loop in this function, extract all of
101f22ef01cSRoman Divacky   // the loops. Otherwise there is exactly one top-level loop; in this case if
102f22ef01cSRoman Divacky   // this function is more than a minimal wrapper around the loop, extract
103f22ef01cSRoman Divacky   // the loop.
104f22ef01cSRoman Divacky   bool ShouldExtractLoop = false;
105f22ef01cSRoman Divacky 
106f22ef01cSRoman Divacky   // Extract the loop if the entry block doesn't branch to the loop header.
107*b5893f02SDimitry Andric   Instruction *EntryTI =
108f22ef01cSRoman Divacky       L->getHeader()->getParent()->getEntryBlock().getTerminator();
109f22ef01cSRoman Divacky   if (!isa<BranchInst>(EntryTI) ||
110f22ef01cSRoman Divacky       !cast<BranchInst>(EntryTI)->isUnconditional() ||
1116122f3e6SDimitry Andric       EntryTI->getSuccessor(0) != L->getHeader()) {
112f22ef01cSRoman Divacky     ShouldExtractLoop = true;
1136122f3e6SDimitry Andric   } else {
114f22ef01cSRoman Divacky     // Check to see if any exits from the loop are more than just return
115f22ef01cSRoman Divacky     // blocks.
116f22ef01cSRoman Divacky     SmallVector<BasicBlock*, 8> ExitBlocks;
117f22ef01cSRoman Divacky     L->getExitBlocks(ExitBlocks);
118f22ef01cSRoman Divacky     for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i)
119f22ef01cSRoman Divacky       if (!isa<ReturnInst>(ExitBlocks[i]->getTerminator())) {
120f22ef01cSRoman Divacky         ShouldExtractLoop = true;
121f22ef01cSRoman Divacky         break;
122f22ef01cSRoman Divacky       }
123f22ef01cSRoman Divacky   }
1246122f3e6SDimitry Andric 
1256122f3e6SDimitry Andric   if (ShouldExtractLoop) {
1267d523365SDimitry Andric     // We must omit EH pads. EH pads must accompany the invoke
1276122f3e6SDimitry Andric     // instruction. But this would result in a loop in the extracted
1286122f3e6SDimitry Andric     // function. An infinite cycle occurs when it tries to extract that loop as
1296122f3e6SDimitry Andric     // well.
1306122f3e6SDimitry Andric     SmallVector<BasicBlock*, 8> ExitBlocks;
1316122f3e6SDimitry Andric     L->getExitBlocks(ExitBlocks);
1326122f3e6SDimitry Andric     for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i)
1337d523365SDimitry Andric       if (ExitBlocks[i]->isEHPad()) {
1346122f3e6SDimitry Andric         ShouldExtractLoop = false;
1356122f3e6SDimitry Andric         break;
1366122f3e6SDimitry Andric       }
1376122f3e6SDimitry Andric   }
1386122f3e6SDimitry Andric 
139f22ef01cSRoman Divacky   if (ShouldExtractLoop) {
140f22ef01cSRoman Divacky     if (NumLoops == 0) return Changed;
141f22ef01cSRoman Divacky     --NumLoops;
1427ae0e2c9SDimitry Andric     CodeExtractor Extractor(DT, *L);
14391bc56edSDimitry Andric     if (Extractor.extractCodeRegion() != nullptr) {
144f22ef01cSRoman Divacky       Changed = true;
145f22ef01cSRoman Divacky       // After extraction, the loop is replaced by a function call, so
146f22ef01cSRoman Divacky       // we shouldn't try to run any more loop passes on it.
1472cab237bSDimitry Andric       LPM.markLoopAsDeleted(*L);
1482cab237bSDimitry Andric       LI.erase(L);
149f22ef01cSRoman Divacky     }
150f22ef01cSRoman Divacky     ++NumExtracted;
151f22ef01cSRoman Divacky   }
152f22ef01cSRoman Divacky 
153f22ef01cSRoman Divacky   return Changed;
154f22ef01cSRoman Divacky }
155f22ef01cSRoman Divacky 
156f22ef01cSRoman Divacky // createSingleLoopExtractorPass - This pass extracts one natural loop from the
157f22ef01cSRoman Divacky // program into a function if it can.  This is used by bugpoint.
158f22ef01cSRoman Divacky //
createSingleLoopExtractorPass()159f22ef01cSRoman Divacky Pass *llvm::createSingleLoopExtractorPass() {
160f22ef01cSRoman Divacky   return new SingleLoopExtractor();
161f22ef01cSRoman Divacky }
162