]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | //===- Mem2Reg.cpp - The -mem2reg pass, a wrapper around the Utils lib ----===// |
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 is a simple pass wrapper around the PromoteMemToReg function call | |
11 | // exposed by the Utils library. | |
12 | // | |
13 | //===----------------------------------------------------------------------===// | |
14 | ||
223e47cc | 15 | #include "llvm/Transforms/Scalar.h" |
970d7e83 | 16 | #include "llvm/ADT/Statistic.h" |
85aaf69f | 17 | #include "llvm/Analysis/AssumptionCache.h" |
1a4d82fc | 18 | #include "llvm/IR/Dominators.h" |
970d7e83 LB |
19 | #include "llvm/IR/Function.h" |
20 | #include "llvm/IR/Instructions.h" | |
223e47cc LB |
21 | #include "llvm/Transforms/Utils/PromoteMemToReg.h" |
22 | #include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h" | |
223e47cc LB |
23 | using namespace llvm; |
24 | ||
1a4d82fc JJ |
25 | #define DEBUG_TYPE "mem2reg" |
26 | ||
223e47cc LB |
27 | STATISTIC(NumPromoted, "Number of alloca's promoted"); |
28 | ||
29 | namespace { | |
30 | struct PromotePass : public FunctionPass { | |
31 | static char ID; // Pass identification, replacement for typeid | |
32 | PromotePass() : FunctionPass(ID) { | |
33 | initializePromotePassPass(*PassRegistry::getPassRegistry()); | |
34 | } | |
35 | ||
36 | // runOnFunction - To run this pass, first we calculate the alloca | |
37 | // instructions that are safe for promotion, then we promote each one. | |
38 | // | |
1a4d82fc | 39 | bool runOnFunction(Function &F) override; |
223e47cc | 40 | |
1a4d82fc | 41 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
85aaf69f | 42 | AU.addRequired<AssumptionCacheTracker>(); |
1a4d82fc | 43 | AU.addRequired<DominatorTreeWrapperPass>(); |
223e47cc LB |
44 | AU.setPreservesCFG(); |
45 | // This is a cluster of orthogonal Transforms | |
46 | AU.addPreserved<UnifyFunctionExitNodes>(); | |
47 | AU.addPreservedID(LowerSwitchID); | |
48 | AU.addPreservedID(LowerInvokePassID); | |
49 | } | |
50 | }; | |
51 | } // end of anonymous namespace | |
52 | ||
53 | char PromotePass::ID = 0; | |
54 | INITIALIZE_PASS_BEGIN(PromotePass, "mem2reg", "Promote Memory to Register", | |
55 | false, false) | |
85aaf69f | 56 | INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) |
1a4d82fc | 57 | INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) |
223e47cc LB |
58 | INITIALIZE_PASS_END(PromotePass, "mem2reg", "Promote Memory to Register", |
59 | false, false) | |
60 | ||
61 | bool PromotePass::runOnFunction(Function &F) { | |
62 | std::vector<AllocaInst*> Allocas; | |
63 | ||
64 | BasicBlock &BB = F.getEntryBlock(); // Get the entry node for the function | |
65 | ||
66 | bool Changed = false; | |
67 | ||
1a4d82fc | 68 | DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); |
85aaf69f SL |
69 | AssumptionCache &AC = |
70 | getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); | |
223e47cc LB |
71 | |
72 | while (1) { | |
73 | Allocas.clear(); | |
74 | ||
75 | // Find allocas that are safe to promote, by looking at all instructions in | |
76 | // the entry node | |
77 | for (BasicBlock::iterator I = BB.begin(), E = --BB.end(); I != E; ++I) | |
78 | if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) // Is it an alloca? | |
79 | if (isAllocaPromotable(AI)) | |
80 | Allocas.push_back(AI); | |
81 | ||
82 | if (Allocas.empty()) break; | |
83 | ||
85aaf69f | 84 | PromoteMemToReg(Allocas, DT, nullptr, &AC); |
223e47cc LB |
85 | NumPromoted += Allocas.size(); |
86 | Changed = true; | |
87 | } | |
88 | ||
89 | return Changed; | |
90 | } | |
91 | ||
92 | // createPromoteMemoryToRegister - Provide an entry point to create this pass. | |
93 | // | |
94 | FunctionPass *llvm::createPromoteMemoryToRegisterPass() { | |
95 | return new PromotePass(); | |
96 | } |