X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=lib%2FTransforms%2FUtils%2FMem2Reg.cpp;h=70fbf13b97b3d1741aca2be2e208269fd28de5c6;hb=d04a8d4b33ff316ca4cf961e06c9e312eff8e64f;hp=52033940997747b87f285e659750e9caab6e301b;hpb=43f820d1f7638656be2158efac7dd8f5b08b8b77;p=oota-llvm.git diff --git a/lib/Transforms/Utils/Mem2Reg.cpp b/lib/Transforms/Utils/Mem2Reg.cpp index 52033940997..70fbf13b97b 100644 --- a/lib/Transforms/Utils/Mem2Reg.cpp +++ b/lib/Transforms/Utils/Mem2Reg.cpp @@ -1,51 +1,68 @@ //===- Mem2Reg.cpp - The -mem2reg pass, a wrapper around the Utils lib ----===// // +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// // This pass is a simple pass wrapper around the PromoteMemToReg function call // exposed by the Utils library. // //===----------------------------------------------------------------------===// +#define DEBUG_TYPE "mem2reg" #include "llvm/Transforms/Scalar.h" -#include "llvm/Transforms/Utils/PromoteMemToReg.h" +#include "llvm/ADT/Statistic.h" #include "llvm/Analysis/Dominators.h" -#include "llvm/iMemory.h" #include "llvm/Function.h" -#include "llvm/Target/TargetData.h" -#include "Support/Statistic.h" +#include "llvm/Instructions.h" +#include "llvm/Transforms/Utils/PromoteMemToReg.h" +#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h" +using namespace llvm; -namespace { - Statistic<> NumPromoted("mem2reg", "Number of alloca's promoted"); +STATISTIC(NumPromoted, "Number of alloca's promoted"); +namespace { struct PromotePass : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + PromotePass() : FunctionPass(ID) { + initializePromotePassPass(*PassRegistry::getPassRegistry()); + } + // runOnFunction - To run this pass, first we calculate the alloca // instructions that are safe for promotion, then we promote each one. // virtual bool runOnFunction(Function &F); - // getAnalysisUsage - We need dominance frontiers - // virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); - AU.addRequired(); - AU.addRequired(); AU.setPreservesCFG(); + // This is a cluster of orthogonal Transforms + AU.addPreserved(); + AU.addPreservedID(LowerSwitchID); + AU.addPreservedID(LowerInvokePassID); } }; - - RegisterOpt X("mem2reg", "Promote Memory to Register"); } // end of anonymous namespace +char PromotePass::ID = 0; +INITIALIZE_PASS_BEGIN(PromotePass, "mem2reg", "Promote Memory to Register", + false, false) +INITIALIZE_PASS_DEPENDENCY(DominatorTree) +INITIALIZE_PASS_END(PromotePass, "mem2reg", "Promote Memory to Register", + false, false) + bool PromotePass::runOnFunction(Function &F) { std::vector Allocas; - const TargetData &TD = getAnalysis(); BasicBlock &BB = F.getEntryBlock(); // Get the entry node for the function bool Changed = false; - DominatorTree &DT = getAnalysis(); - DominanceFrontier &DF = getAnalysis(); - + DominatorTree &DT = getAnalysis(); + while (1) { Allocas.clear(); @@ -53,12 +70,12 @@ bool PromotePass::runOnFunction(Function &F) { // the entry node for (BasicBlock::iterator I = BB.begin(), E = --BB.end(); I != E; ++I) if (AllocaInst *AI = dyn_cast(I)) // Is it an alloca? - if (isAllocaPromotable(AI, TD)) + if (isAllocaPromotable(AI)) Allocas.push_back(AI); if (Allocas.empty()) break; - PromoteMemToReg(Allocas, DT, DF, TD); + PromoteMemToReg(Allocas, DT); NumPromoted += Allocas.size(); Changed = true; } @@ -68,6 +85,6 @@ bool PromotePass::runOnFunction(Function &F) { // createPromoteMemoryToRegister - Provide an entry point to create this pass. // -Pass *createPromoteMemoryToRegister() { +FunctionPass *llvm::createPromoteMemoryToRegisterPass() { return new PromotePass(); }