[PATCH] D19664: [MemorySSA] Port to new pass manager
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed May 4 10:40:06 PDT 2016
Geoff Berry via llvm-commits <llvm-commits at lists.llvm.org> writes:
> gberry updated this revision to Diff 55623.
A couple of comments below. In short, I don't think this has quite the
right model. I've also cc'd Chandler for his thoughts.
>
> http://reviews.llvm.org/D19664
>
> Files:
> include/llvm/InitializePasses.h
> include/llvm/Transforms/Utils/MemorySSA.h
> lib/Passes/PassBuilder.cpp
> lib/Passes/PassRegistry.def
> lib/Transforms/Utils/MemorySSA.cpp
> lib/Transforms/Utils/Utils.cpp
> test/Transforms/Util/MemorySSA/assume.ll
> test/Transforms/Util/MemorySSA/atomic-clobber.ll
> test/Transforms/Util/MemorySSA/cyclicphi.ll
> test/Transforms/Util/MemorySSA/function-clobber.ll
> test/Transforms/Util/MemorySSA/function-mem-attrs.ll
> test/Transforms/Util/MemorySSA/livein.ll
> test/Transforms/Util/MemorySSA/load-invariant.ll
> test/Transforms/Util/MemorySSA/many-dom-backedge.ll
> test/Transforms/Util/MemorySSA/many-doms.ll
> test/Transforms/Util/MemorySSA/multi-edges.ll
> test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll
> test/Transforms/Util/MemorySSA/multiple-locations.ll
> test/Transforms/Util/MemorySSA/no-disconnected.ll
> test/Transforms/Util/MemorySSA/optimize-use.ll
> test/Transforms/Util/MemorySSA/phi-translation.ll
> test/Transforms/Util/MemorySSA/volatile-clobber.ll
>
> Index: test/Transforms/Util/MemorySSA/volatile-clobber.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/volatile-clobber.ll
> +++ test/Transforms/Util/MemorySSA/volatile-clobber.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Ensures that volatile stores/loads count as MemoryDefs
>
> Index: test/Transforms/Util/MemorySSA/phi-translation.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/phi-translation.ll
> +++ test/Transforms/Util/MemorySSA/phi-translation.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
>
> ; %ptr can't alias %local, so we should be able to optimize the use of %local to
> ; point to the store to %local.
> Index: test/Transforms/Util/MemorySSA/optimize-use.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/optimize-use.ll
> +++ test/Transforms/Util/MemorySSA/optimize-use.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -analyze -verify-memoryssa < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
>
> ; Function Attrs: ssp uwtable
> define i32 @main() {
> Index: test/Transforms/Util/MemorySSA/no-disconnected.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/no-disconnected.ll
> +++ test/Transforms/Util/MemorySSA/no-disconnected.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -analyze -verify-memoryssa < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; This test ensures we don't end up with multiple reaching defs for a single
> ; use/phi edge If we were to optimize defs, we would end up with 2=
> Index: test/Transforms/Util/MemorySSA/multiple-locations.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/multiple-locations.ll
> +++ test/Transforms/Util/MemorySSA/multiple-locations.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Checks that basicAA is doing some amount of disambiguation for us
>
> Index: test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll
> +++ test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
>
> ; hfinkel's case
> ; [entry]
> Index: test/Transforms/Util/MemorySSA/multi-edges.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/multi-edges.ll
> +++ test/Transforms/Util/MemorySSA/multi-edges.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Makes sure we have a sane model if both successors of some block is the same
> ; block.
> Index: test/Transforms/Util/MemorySSA/many-doms.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/many-doms.ll
> +++ test/Transforms/Util/MemorySSA/many-doms.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Testing many dominators, specifically from a switch statement in C.
>
> Index: test/Transforms/Util/MemorySSA/many-dom-backedge.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/many-dom-backedge.ll
> +++ test/Transforms/Util/MemorySSA/many-dom-backedge.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; many-dom.ll, with an added back-edge back into the switch.
> ; Because people love their gotos.
> Index: test/Transforms/Util/MemorySSA/load-invariant.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/load-invariant.ll
> +++ test/Transforms/Util/MemorySSA/load-invariant.ll
> @@ -1,5 +1,6 @@
> ; XFAIL: *
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Invariant loads should be considered live on entry, because, once the
> ; location is known to be dereferenceable, the value can never change.
> Index: test/Transforms/Util/MemorySSA/livein.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/livein.ll
> +++ test/Transforms/Util/MemorySSA/livein.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> define void @F(i8*) {
> br i1 true, label %left, label %right
> left:
> Index: test/Transforms/Util/MemorySSA/function-mem-attrs.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/function-mem-attrs.ll
> +++ test/Transforms/Util/MemorySSA/function-mem-attrs.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Test that various function attributes give us sane results.
>
> Index: test/Transforms/Util/MemorySSA/function-clobber.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/function-clobber.ll
> +++ test/Transforms/Util/MemorySSA/function-clobber.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Ensuring that external functions without attributes are MemoryDefs
>
> Index: test/Transforms/Util/MemorySSA/cyclicphi.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/cyclicphi.ll
> +++ test/Transforms/Util/MemorySSA/cyclicphi.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
>
> %struct.hoge = type { i32, %struct.widget }
> %struct.widget = type { i64 }
> Index: test/Transforms/Util/MemorySSA/atomic-clobber.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/atomic-clobber.ll
> +++ test/Transforms/Util/MemorySSA/atomic-clobber.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Ensures that atomic loads count as MemoryDefs
>
> Index: test/Transforms/Util/MemorySSA/assume.ll
> ===================================================================
> --- test/Transforms/Util/MemorySSA/assume.ll
> +++ test/Transforms/Util/MemorySSA/assume.ll
> @@ -1,4 +1,5 @@
> ; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
> +; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s
> ;
> ; Ensures that assumes are treated as not reading or writing memory.
>
> Index: lib/Transforms/Utils/Utils.cpp
> ===================================================================
> --- lib/Transforms/Utils/Utils.cpp
> +++ lib/Transforms/Utils/Utils.cpp
> @@ -34,7 +34,7 @@
> initializeInstSimplifierPass(Registry);
> initializeMetaRenamerPass(Registry);
> initializeMemorySSALazyPass(Registry);
> - initializeMemorySSAPrinterPassPass(Registry);
> + initializeMemorySSAPrinterLegacyPassPass(Registry);
> }
>
> /// LLVMInitializeTransformUtils - C binding for initializeTransformUtilsPasses.
> Index: lib/Transforms/Utils/MemorySSA.cpp
> ===================================================================
> --- lib/Transforms/Utils/MemorySSA.cpp
> +++ lib/Transforms/Utils/MemorySSA.cpp
> @@ -46,15 +46,19 @@
> STATISTIC(NumClobberCacheLookups, "Number of Memory SSA version cache lookups");
> STATISTIC(NumClobberCacheHits, "Number of Memory SSA version cache hits");
> STATISTIC(NumClobberCacheInserts, "Number of MemorySSA version cache inserts");
> -INITIALIZE_PASS_WITH_OPTIONS_BEGIN(MemorySSAPrinterPass, "print-memoryssa",
> - "Memory SSA", true, true)
> +INITIALIZE_PASS_BEGIN(MemorySSAPrinterLegacyPass, "print-memoryssa",
> + "Memory SSA", true, true)
> INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)
> -INITIALIZE_PASS_END(MemorySSAPrinterPass, "print-memoryssa", "Memory SSA", true,
> - true)
> +INITIALIZE_PASS_END(MemorySSAPrinterLegacyPass, "print-memoryssa", "Memory SSA",
> + true, true)
> INITIALIZE_PASS(MemorySSALazy, "memoryssalazy", "Memory SSA", true, true)
>
> +static cl::opt<bool> VerifyMemorySSA("verify-memoryssa", cl::init(false),
> + cl::Hidden,
> + cl::desc("Run the Memory SSA verifier"));
> +
> namespace llvm {
>
> /// \brief An assembly annotator class to print Memory SSA information in
> @@ -677,45 +681,36 @@
> dbgs() << "\n";
> }
>
> -char MemorySSAPrinterPass::ID = 0;
> +char MemorySSAPrinterLegacyPass::ID = 0;
>
> -MemorySSAPrinterPass::MemorySSAPrinterPass() : FunctionPass(ID) {
> - initializeMemorySSAPrinterPassPass(*PassRegistry::getPassRegistry());
> +MemorySSAPrinterLegacyPass::MemorySSAPrinterLegacyPass() : FunctionPass(ID) {
> + initializeMemorySSAPrinterLegacyPassPass(*PassRegistry::getPassRegistry());
> }
>
> -void MemorySSAPrinterPass::releaseMemory() {
> +void MemorySSAPrinterLegacyPass::releaseMemory() {
> // Subtlety: Be sure to delete the walker before MSSA, because the walker's
> // dtor may try to access MemorySSA.
> Walker.reset();
> MSSA.reset();
> }
>
> -void MemorySSAPrinterPass::getAnalysisUsage(AnalysisUsage &AU) const {
> +void MemorySSAPrinterLegacyPass::getAnalysisUsage(AnalysisUsage &AU) const {
> AU.setPreservesAll();
> AU.addRequired<AAResultsWrapperPass>();
> AU.addRequired<DominatorTreeWrapperPass>();
> AU.addPreserved<DominatorTreeWrapperPass>();
> AU.addPreserved<GlobalsAAWrapperPass>();
> }
>
> -bool MemorySSAPrinterPass::doInitialization(Module &M) {
> - VerifyMemorySSA = M.getContext()
> - .getOption<bool, MemorySSAPrinterPass,
> - &MemorySSAPrinterPass::VerifyMemorySSA>();
> +bool MemorySSAPrinterLegacyPass::doInitialization(Module &M) {
> return false;
> }
>
> -void MemorySSAPrinterPass::registerOptions() {
> - OptionRegistry::registerOption<bool, MemorySSAPrinterPass,
> - &MemorySSAPrinterPass::VerifyMemorySSA>(
> - "verify-memoryssa", "Run the Memory SSA verifier", false);
> -}
> -
> -void MemorySSAPrinterPass::print(raw_ostream &OS, const Module *M) const {
> +void MemorySSAPrinterLegacyPass::print(raw_ostream &OS, const Module *M) const {
> MSSA->print(OS);
> }
>
> -bool MemorySSAPrinterPass::runOnFunction(Function &F) {
> +bool MemorySSAPrinterLegacyPass::runOnFunction(Function &F) {
> this->F = &F;
> MSSA.reset(new MemorySSA(F));
> AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
> @@ -729,6 +724,36 @@
> return false;
> }
>
> +MemorySSAPrinterPass::MemorySSAPrinterPass(raw_ostream &OS) : OS(OS) {}
> +
> +PreservedAnalyses MemorySSAPrinterPass::run(Function &F,
> + FunctionAnalysisManager &AM) {
> + OS << "MemorySSA for function: " << F.getName() << "\n";
> +
> + auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
> + auto &AA = AM.getResult<AAManager>(F);
> + MemorySSA &MSSA = AM.getResult<MemorySSALazyAnalysis>(F).getMSSA();
> +
> + MSSA.buildMemorySSA(&AA, &DT);
This is pretty weird in a printer pass. Does this mean we would need to
call buildMemorySSA in *any* user of the analysis pass?
> + MSSA.print(OS);
> +
> + if (VerifyMemorySSA)
> + MSSA.verifyMemorySSA();
Just write a separate verify<memoryssa> pass, like we do for domtree and
the like. Having a cl::opt that modifies the print behaviour is
inflexible and awkward.
> +
> + return PreservedAnalyses::all();
> +}
> +
> +MemorySSALazyResults::MemorySSALazyResults(Function &F) {
> + MSSA.reset(new MemorySSA(F));
> +}
> +
> +char MemorySSALazyAnalysis::PassID;
> +
> +MemorySSALazyResults
> +MemorySSALazyAnalysis::run(Function &F, AnalysisManager<Function> &AM) {
> + return MemorySSALazyResults(F);
> +}
> +
> char MemorySSALazy::ID = 0;
>
> MemorySSALazy::MemorySSALazy() : FunctionPass(ID) {
> Index: lib/Passes/PassRegistry.def
> ===================================================================
> --- lib/Passes/PassRegistry.def
> +++ lib/Passes/PassRegistry.def
> @@ -74,6 +74,7 @@
> FUNCTION_ANALYSIS("domfrontier", DominanceFrontierAnalysis())
> FUNCTION_ANALYSIS("loops", LoopAnalysis())
> FUNCTION_ANALYSIS("memdep", MemoryDependenceAnalysis())
> +FUNCTION_ANALYSIS("memoryssa", MemorySSALazyAnalysis())
> FUNCTION_ANALYSIS("regions", RegionInfoAnalysis())
> FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
> FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis())
> @@ -112,6 +113,7 @@
> FUNCTION_PASS("print<demanded-bits>", DemandedBitsPrinterPass(dbgs()))
> FUNCTION_PASS("print<domfrontier>", DominanceFrontierPrinterPass(dbgs()))
> FUNCTION_PASS("print<loops>", LoopPrinterPass(dbgs()))
> +FUNCTION_PASS("print<memoryssa>", MemorySSAPrinterPass(dbgs()))
> FUNCTION_PASS("print<regions>", RegionInfoPrinterPass(dbgs()))
> FUNCTION_PASS("print<scalar-evolution>", ScalarEvolutionPrinterPass(dbgs()))
> FUNCTION_PASS("reassociate", ReassociatePass())
> Index: lib/Passes/PassBuilder.cpp
> ===================================================================
> --- lib/Passes/PassBuilder.cpp
> +++ lib/Passes/PassBuilder.cpp
> @@ -62,6 +62,7 @@
> #include "llvm/Transforms/Scalar/SROA.h"
> #include "llvm/Transforms/Scalar/SimplifyCFG.h"
> #include "llvm/Transforms/Scalar/Sink.h"
> +#include "llvm/Transforms/Utils/MemorySSA.h"
> #include <type_traits>
>
> using namespace llvm;
> Index: include/llvm/Transforms/Utils/MemorySSA.h
> ===================================================================
> --- include/llvm/Transforms/Utils/MemorySSA.h
> +++ include/llvm/Transforms/Utils/MemorySSA.h
> @@ -561,7 +561,7 @@
> protected:
> // Used by Memory SSA annotater, dumpers, and wrapper pass
> friend class MemorySSAAnnotatedWriter;
> - friend class MemorySSAPrinterPass;
> + friend class MemorySSAPrinterLegacyPass;
> void verifyDefUses(Function &F) const;
> void verifyDomination(Function &F) const;
>
> @@ -599,28 +599,63 @@
>
> // This pass does eager building and then printing of MemorySSA. It is used by
> // the tests to be able to build, dump, and verify Memory SSA.
> -class MemorySSAPrinterPass : public FunctionPass {
> +class MemorySSAPrinterLegacyPass : public FunctionPass {
> public:
> - MemorySSAPrinterPass();
> + MemorySSAPrinterLegacyPass();
>
> static char ID;
> bool doInitialization(Module &M) override;
> bool runOnFunction(Function &) override;
> void releaseMemory() override;
> void getAnalysisUsage(AnalysisUsage &AU) const override;
> void print(raw_ostream &OS, const Module *M) const override;
> - static void registerOptions();
> MemorySSA &getMSSA() { return *MSSA; }
>
> private:
> - bool VerifyMemorySSA;
> -
> std::unique_ptr<MemorySSA> MSSA;
> // FIXME(gbiv): It seems that MemorySSA doesn't own the walker it returns?
> std::unique_ptr<MemorySSAWalker> Walker;
> Function *F;
> };
>
> +/// \brief Printer pass for the \c MemorySSA.
> +class MemorySSAPrinterPass
> + : public PassInfoMixin<MemorySSAPrinterPass> {
> + raw_ostream &OS;
> +
> +public:
> + explicit MemorySSAPrinterPass(raw_ostream &OS);
> + PreservedAnalyses run(Function &F, AnalysisManager<Function> &AM);
> +};
> +
> +class MemorySSALazyResults {
> +public:
> + MemorySSALazyResults(Function &F);
> +
> + MemorySSA &getMSSA() {
> + assert(MSSA);
> + return *MSSA;
> + }
> +
> +private:
> + std::unique_ptr<MemorySSA> MSSA;
> +};
I'm not convinced this is the right model in the new pass manager - it's
essentially giving us two layers of caching, since the new PM already
computes the analysis on demand (when you first call getResult) and
caches that until its invalidated.
> +
> +/// An analysis that produces \c MemorySSA for a function.
> +///
> +/// This is essentially a no-op because the results are computed entirely
> +/// lazily.
> +class MemorySSALazyAnalysis
> + : public AnalysisInfoMixin<MemorySSALazyAnalysis> {
> + friend AnalysisInfoMixin<MemorySSALazyAnalysis>;
> + static char PassID;
> +
> +public:
> + typedef MemorySSALazyResults Result;
> +
> + MemorySSALazyResults run(Function &F, AnalysisManager<Function> &AM);
> +};
> +
> class MemorySSALazy : public FunctionPass {
> public:
> MemorySSALazy();
> Index: include/llvm/InitializePasses.h
> ===================================================================
> --- include/llvm/InitializePasses.h
> +++ include/llvm/InitializePasses.h
> @@ -219,7 +219,7 @@
> void initializeMemDerefPrinterPass(PassRegistry&);
> void initializeMemoryDependenceWrapperPassPass(PassRegistry&);
> void initializeMemorySSALazyPass(PassRegistry&);
> -void initializeMemorySSAPrinterPassPass(PassRegistry&);
> +void initializeMemorySSAPrinterLegacyPassPass(PassRegistry&);
> void initializeMergedLoadStoreMotionPass(PassRegistry &);
> void initializeMetaRenamerPass(PassRegistry&);
> void initializeMergeFunctionsPass(PassRegistry&);
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list