Index: llvm/examples/IRTransforms/CMakeLists.txt =================================================================== --- llvm/examples/IRTransforms/CMakeLists.txt +++ llvm/examples/IRTransforms/CMakeLists.txt @@ -1,15 +1,20 @@ +if(LLVM_SIMPLIFYCFG_LINK_INTO_TOOLS) + message(WARNING "Setting LLVM_SIMPLIFYCFG_LINK_INTO_TOOLS=ON only makes sense for testing purpose") +endif() + + set(LLVM_LINK_COMPONENTS Analysis Core Support ) -add_llvm_example_library(ExampleIRTransforms - InitializePasses.cpp +add_llvm_pass_plugin(SimplifyCFG SimplifyCFG.cpp - ADDITIONAL_HEADER_DIRS - DEPENDS intrinsics_gen ) + +install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}") +set_target_properties(${name} PROPERTIES FOLDER "Examples") Index: llvm/examples/IRTransforms/InitializePasses.h =================================================================== --- llvm/examples/IRTransforms/InitializePasses.h +++ /dev/null @@ -1,23 +0,0 @@ -//===- InitializePasses.h - -------------------------------------*- C++ -*-===// -// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_EXAMPLES_IRTRANSFORMS_INITIALIZEPASSES__H -#define LLVM_EXAMPLES_IRTRANSFORMS_INITIALIZEPASSES__H - -#include "llvm/IR/PassManager.h" -#include "llvm/PassRegistry.h" - -namespace llvm { - -void initializeExampleIRTransforms(PassRegistry &Registry); -void initializeSimplifyCFGLegacyPassPass(PassRegistry &Registry); - -} // end namespace llvm - -#endif Index: llvm/examples/IRTransforms/InitializePasses.cpp =================================================================== --- llvm/examples/IRTransforms/InitializePasses.cpp +++ /dev/null @@ -1,21 +0,0 @@ -//===-- InitializePasses.cpp ----------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements implements the initialization hook for the example -// transforms. -// -//===----------------------------------------------------------------------===// - -#include "InitializePasses.h" -#include "llvm/PassRegistry.h" - -using namespace llvm; - -void initializeExampleIRTransforms(PassRegistry &Registry) { - initializeSimplifyCFGLegacyPassPass(Registry); -} Index: llvm/examples/IRTransforms/SimplifyCFG.h =================================================================== --- llvm/examples/IRTransforms/SimplifyCFG.h +++ /dev/null @@ -1,24 +0,0 @@ -//===- SimplifyCFG.h - Tutorial SimplifyCFG ---------------------*- C++ -*-===// -// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_EXAMPLES_IRTRANSFORMS_SIMPLIFYCFG__H -#define LLVM_EXAMPLES_IRTRANSFORMS_SIMPLIFYCFG__H - -#include "llvm/Pass.h" -#include "llvm/PassRegistry.h" - -namespace llvm { - -FunctionPass *createSimplifyCFGPass(); - -void initializeSimplifyCFGLegacyPassPass(PassRegistry &); - -} // end namespace llvm - -#endif // LLVM_EXAMPLES_IRTRANSFORMS_SIMPLIFYCFG__H Index: llvm/examples/IRTransforms/SimplifyCFG.cpp =================================================================== --- llvm/examples/IRTransforms/SimplifyCFG.cpp +++ llvm/examples/IRTransforms/SimplifyCFG.cpp @@ -27,14 +27,11 @@ // predecessor, if that block has a single successor. // // TODOs -// * Hook up pass to the new pass manager. // * Preserve LoopInfo. // * Add fixed point iteration to delete all dead blocks // * Add implementation using reachability to discover dead blocks. //===----------------------------------------------------------------------===// -#include "SimplifyCFG.h" -#include "InitializePasses.h" #include "llvm/Analysis/DomTreeUpdater.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" @@ -42,6 +39,9 @@ #include "llvm/IR/PatternMatch.h" #include "llvm/InitializePasses.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Pass.h" +#include "llvm/Passes/PassBuilder.h" +#include "llvm/Passes/PassPlugin.h" using namespace llvm; using namespace PatternMatch; @@ -369,46 +369,54 @@ } namespace { -struct SimplifyCFGLegacyPass : public FunctionPass { - static char ID; - SimplifyCFGLegacyPass() : FunctionPass(ID) { - initializeSimplifyCFGLegacyPassPass(*PassRegistry::getPassRegistry()); - } - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.addRequired(); - // Version 1 of the implementation does not preserve the dominator tree. - if (Version != V1) - AU.addPreserved(); - - FunctionPass::getAnalysisUsage(AU); - } - - bool runOnFunction(Function &F) override { - if (skipFunction(F)) - return false; - +struct SimplifyCFGPass : public PassInfoMixin { + PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) { switch (Version) { case V1: - return doSimplify_v1(F); + doSimplify_v1(F); + break; case V2: { - auto &DT = getAnalysis().getDomTree(); - return doSimplify_v2(F, DT); + DominatorTree &DT = FAM.getResult(F); + doSimplify_v2(F, DT); + break; } case V3: { - auto &DT = getAnalysis().getDomTree(); - return doSimplify_v3(F, DT); + DominatorTree &DT = FAM.getResult(F); + doSimplify_v3(F, DT); + break; } + default: + llvm_unreachable("Unsupported version"); } - llvm_unreachable("Unsupported version"); + return PreservedAnalyses::none(); } }; } // namespace -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) +/* 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; + }); + }}; +} + +#ifndef LLVM_SIMPLIFYCFG_LINK_INTO_TOOLS +extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo +llvmGetPassPluginInfo() { + return getSimplifyCFGPluginInfo(); +} +#endif