From 84645e0549793ea45be7e20fe87dacb763406e35 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Tue, 14 Jun 2016 03:22:22 +0000 Subject: [PATCH] [PM] Port Mem2Reg to the new pass manager. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272630 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/InitializePasses.h | 2 +- include/llvm/Transforms/Utils/Mem2Reg.h | 28 ++++++ lib/Passes/PassBuilder.cpp | 2 + lib/Passes/PassRegistry.def | 1 + lib/Transforms/Utils/Mem2Reg.cpp | 116 ++++++++++++++---------- lib/Transforms/Utils/Utils.cpp | 2 +- test/Transforms/Mem2Reg/pr24179.ll | 1 + 7 files changed, 100 insertions(+), 52 deletions(-) create mode 100644 include/llvm/Transforms/Utils/Mem2Reg.h diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index d4565b3e88f..954d7d75b54 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -267,7 +267,7 @@ void initializePrintFunctionPassWrapperPass(PassRegistry&); void initializePrintModulePassWrapperPass(PassRegistry&); void initializeProcessImplicitDefsPass(PassRegistry&); void initializeProfileSummaryInfoWrapperPassPass(PassRegistry &); -void initializePromotePassPass(PassRegistry&); +void initializePromoteLegacyPassPass(PassRegistry &); void initializePruneEHPass(PassRegistry&); void initializeReassociateLegacyPassPass(PassRegistry&); void initializeRegBankSelectPass(PassRegistry &); diff --git a/include/llvm/Transforms/Utils/Mem2Reg.h b/include/llvm/Transforms/Utils/Mem2Reg.h new file mode 100644 index 00000000000..f3c80edf544 --- /dev/null +++ b/include/llvm/Transforms/Utils/Mem2Reg.h @@ -0,0 +1,28 @@ +//===- Mem2Reg.h - 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. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TRANSFORMS_UTILS_MEM2REG_H +#define LLVM_TRANSFORMS_UTILS_MEM2REG_H + +#include "llvm/IR/Function.h" +#include "llvm/IR/PassManager.h" + +namespace llvm { +class PromotePass : public PassInfoMixin { +public: + PreservedAnalyses run(Function &F, AnalysisManager &AM); +}; +} + +#endif // LLVM_TRANSFORMS_UTILS_MEM2REG_H \ No newline at end of file diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index 16295b4fe1d..a519a657ae7 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -89,7 +89,9 @@ #include "llvm/Transforms/Scalar/SimplifyCFG.h" #include "llvm/Transforms/Scalar/Sink.h" #include "llvm/Transforms/Utils/LCSSA.h" +#include "llvm/Transforms/Utils/Mem2Reg.h" #include "llvm/Transforms/Utils/MemorySSA.h" + #include using namespace llvm; diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index 46f7850414a..5e4b7604200 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -129,6 +129,7 @@ FUNCTION_PASS("loweratomic", LowerAtomicPass()) FUNCTION_PASS("lower-expect", LowerExpectIntrinsicPass()) FUNCTION_PASS("guard-widening", GuardWideningPass()) FUNCTION_PASS("gvn", GVN()) +FUNCTION_PASS("mem2reg", PromotePass()) FUNCTION_PASS("memcpyopt", MemCpyOptPass()) FUNCTION_PASS("mldst-motion", MergedLoadStoreMotionPass()) FUNCTION_PASS("jump-threading", JumpThreadingPass()) diff --git a/lib/Transforms/Utils/Mem2Reg.cpp b/lib/Transforms/Utils/Mem2Reg.cpp index 8b70cb80539..28b802e2788 100644 --- a/lib/Transforms/Utils/Mem2Reg.cpp +++ b/lib/Transforms/Utils/Mem2Reg.cpp @@ -12,12 +12,13 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/Mem2Reg.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" +#include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/PromoteMemToReg.h" #include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h" using namespace llvm; @@ -26,51 +27,11 @@ using namespace llvm; 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. - // - bool runOnFunction(Function &F) override; - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.addRequired(); - AU.addRequired(); - AU.setPreservesCFG(); - // This is a cluster of orthogonal Transforms - AU.addPreserved(); - AU.addPreservedID(LowerSwitchID); - AU.addPreservedID(LowerInvokePassID); - } - }; -} // end of anonymous namespace - -char PromotePass::ID = 0; -INITIALIZE_PASS_BEGIN(PromotePass, "mem2reg", "Promote Memory to Register", - false, false) -INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) -INITIALIZE_PASS_END(PromotePass, "mem2reg", "Promote Memory to Register", - false, false) - -bool PromotePass::runOnFunction(Function &F) { - if (skipFunction(F)) - return false; - - std::vector Allocas; - - BasicBlock &BB = F.getEntryBlock(); // Get the entry node for the function - - bool Changed = false; - - DominatorTree &DT = getAnalysis().getDomTree(); - AssumptionCache &AC = - getAnalysis().getAssumptionCache(F); +static bool promoteMemoryToRegister(Function &F, DominatorTree &DT, + AssumptionCache &AC) { + std::vector Allocas; + BasicBlock &BB = F.getEntryBlock(); // Get the entry node for the function + bool Changed = false; while (1) { Allocas.clear(); @@ -78,22 +39,77 @@ bool PromotePass::runOnFunction(Function &F) { // Find allocas that are safe to promote, by looking at all instructions in // 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 (AllocaInst *AI = dyn_cast(I)) // Is it an alloca? if (isAllocaPromotable(AI)) Allocas.push_back(AI); - if (Allocas.empty()) break; + if (Allocas.empty()) + break; PromoteMemToReg(Allocas, DT, nullptr, &AC); NumPromoted += Allocas.size(); Changed = true; } - return Changed; } +PreservedAnalyses PromotePass::run(Function &F, AnalysisManager &AM) { + auto &DT = AM.getResult(F); + auto &AC = AM.getResult(F); + if (!promoteMemoryToRegister(F, DT, AC)) + return PreservedAnalyses::all(); + + // FIXME: This pass should preserve the CFG. + // There's currently no way to do it in the new PM. + // In the old PM this pass preserved a fair amount of "orthogonal" + // transformation passes. This concept has no sense in the new PM, + // therefore we don't preserve them here. + return PreservedAnalyses::none(); +} + +namespace { +struct PromoteLegacyPass : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + PromoteLegacyPass() : FunctionPass(ID) { + initializePromoteLegacyPassPass(*PassRegistry::getPassRegistry()); + } + + // runOnFunction - To run this pass, first we calculate the alloca + // instructions that are safe for promotion, then we promote each one. + // + bool runOnFunction(Function &F) override { + if (skipFunction(F)) + return false; + + DominatorTree &DT = getAnalysis().getDomTree(); + AssumptionCache &AC = + getAnalysis().getAssumptionCache(F); + return promoteMemoryToRegister(F, DT, AC); + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired(); + AU.addRequired(); + AU.setPreservesCFG(); + // This is a cluster of orthogonal Transforms + AU.addPreserved(); + AU.addPreservedID(LowerSwitchID); + AU.addPreservedID(LowerInvokePassID); + } + }; +} // end of anonymous namespace + +char PromoteLegacyPass::ID = 0; +INITIALIZE_PASS_BEGIN(PromoteLegacyPass, "mem2reg", "Promote Memory to " + "Register", + false, false) +INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) +INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) +INITIALIZE_PASS_END(PromoteLegacyPass, "mem2reg", "Promote Memory to Register", + false, false) + // createPromoteMemoryToRegister - Provide an entry point to create this pass. // FunctionPass *llvm::createPromoteMemoryToRegisterPass() { - return new PromotePass(); + return new PromoteLegacyPass(); } diff --git a/lib/Transforms/Utils/Utils.cpp b/lib/Transforms/Utils/Utils.cpp index cdff86b2553..60cb635aae5 100644 --- a/lib/Transforms/Utils/Utils.cpp +++ b/lib/Transforms/Utils/Utils.cpp @@ -29,7 +29,7 @@ void llvm::initializeTransformUtils(PassRegistry &Registry) { initializeLowerInvokePass(Registry); initializeLowerSwitchPass(Registry); initializeNameAnonFunctionPass(Registry); - initializePromotePassPass(Registry); + initializePromoteLegacyPassPass(Registry); initializeUnifyFunctionExitNodesPass(Registry); initializeInstSimplifierPass(Registry); initializeMetaRenamerPass(Registry); diff --git a/test/Transforms/Mem2Reg/pr24179.ll b/test/Transforms/Mem2Reg/pr24179.ll index e4216ce4daa..72a9e61938d 100644 --- a/test/Transforms/Mem2Reg/pr24179.ll +++ b/test/Transforms/Mem2Reg/pr24179.ll @@ -1,4 +1,5 @@ ; RUN: opt -mem2reg < %s -S | FileCheck %s +; RUN: opt -passes=mem2reg < %s -S | FileCheck %s declare i32 @def(i32) declare i1 @use(i32) -- 2.50.1