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