diff --git a/llvm/examples/IRTransforms/CMakeLists.txt b/llvm/examples/IRTransforms/CMakeLists.txt --- a/llvm/examples/IRTransforms/CMakeLists.txt +++ b/llvm/examples/IRTransforms/CMakeLists.txt @@ -4,7 +4,7 @@ Support ) -add_llvm_example_library(ExampleIRTransforms +add_llvm_pass_plugin(ExampleIRTransforms InitializePasses.cpp SimplifyCFG.cpp diff --git a/llvm/examples/IRTransforms/SimplifyCFG.h b/llvm/examples/IRTransforms/SimplifyCFG.h --- a/llvm/examples/IRTransforms/SimplifyCFG.h +++ b/llvm/examples/IRTransforms/SimplifyCFG.h @@ -10,6 +10,7 @@ #ifndef LLVM_EXAMPLES_IRTRANSFORMS_SIMPLIFYCFG__H #define LLVM_EXAMPLES_IRTRANSFORMS_SIMPLIFYCFG__H +#include "llvm/IR/PassManager.h" #include "llvm/Pass.h" #include "llvm/PassRegistry.h" diff --git a/llvm/examples/IRTransforms/SimplifyCFG.cpp b/llvm/examples/IRTransforms/SimplifyCFG.cpp --- a/llvm/examples/IRTransforms/SimplifyCFG.cpp +++ b/llvm/examples/IRTransforms/SimplifyCFG.cpp @@ -392,11 +392,11 @@ case V1: return doSimplify_v1(F); case V2: { - auto &DT = getAnalysis().getDomTree(); + DominatorTree &DT = getAnalysis().getDomTree(); return doSimplify_v2(F, DT); } case V3: { - auto &DT = getAnalysis().getDomTree(); + DominatorTree &DT = getAnalysis().getDomTree(); return doSimplify_v3(F, DT); } } @@ -404,11 +404,68 @@ llvm_unreachable("Unsupported version"); } }; + +struct SimplifyCFGPass : public PassInfoMixin { + PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) { + if (skipFunction(F)) + return false; + + bool PassExecuted = false; + + switch (Version) { + case V1: + PassExecuted = doSimplify_v1(F); + case V2: { + DominatorTree &DT = FAM.getResult(F); + PassExecuted = doSimplify_v2(F, DT); + } + case V3: { + DominatorTree &DT = FAM.getResult(F); + PassExecuted = doSimplify_v3(F, DT); + } + default: + llvm_unreachable("Unsupported version"); + } + + if (!PassExecuted) + return PreservedAnalyses::all(); + PreservedAnalyses PA; + PA.preserveSet(); + return PA; + } +}; } // namespace +/* New PM Registration */ +llvm::PassPluginLibraryInfo getSimplifyCFGPluginInfo() { + return {LLVM_PLUGIN_API_VERSION, "SimplifyCFG", LLVM_VERSION_STRING, + [](PassBuilder &PB) { + PB.registerVectorizerStartEPCallback( + [](llvm::FunctionPassManager &PM, OptimizationLevel Level) { + PM.addPass(SimplifyCFGPass()); + }); + PB.registerPipelineParsingCallback( + [](StringRef Name, llvm::FunctionPassManager &PM, + ArrayRef) { + if (Name == "tut-simplifycfg") { + PM.addPass(SimplifyCFGPass()); + return true; + } + return false; + }); + }}; +} + char SimplifyCFGLegacyPass::ID = 0; INITIALIZE_PASS_BEGIN(SimplifyCFGLegacyPass, DEBUG_TYPE, "Tutorial CFG simplification", false, false) INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) INITIALIZE_PASS_END(SimplifyCFGLegacyPass, DEBUG_TYPE, "Tutorial CFG simplifications", false, false) + +#ifndef LLVM_TUTSIMPLIFYCFG_LINK_INTO_TOOLS +extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo +llvmGetPassPluginInfo() { + return getSimplifyPluginInfo(); +} +#endif