[LegacyPM] Port example pass SimplifyCFG to new PM

This is part of effort in removing -enable-new-pm flag.
As a prat of this effort one of example passes SimplifyCFG must
be ported to new PM which will allow to remove the flag
calls from the tests that are using this pass.

Reviewed By: aeubanks

Differential Revision: https://reviews.llvm.org/D137103
This commit is contained in:
Sebastian Peryt 2023-01-10 15:15:42 -08:00 committed by Arthur Eubanks
parent 5c126e35c1
commit d291f1fd09
18 changed files with 84 additions and 149 deletions

View File

@ -1,15 +1,19 @@
set(LLVM_LINK_COMPONENTS
Analysis
Core
Support
)
if(LLVM_EXAMPLEIRTRANSFORMS_LINK_INTO_TOOLS)
message(WARNING "Setting LLVM_EXAMPLEIRTRANSFORMS_LINK_INTO_TOOLS=ON only makes sense for testing purpose")
endif()
add_llvm_example_library(ExampleIRTransforms
InitializePasses.cpp
SimplifyCFG.cpp
# The plugin expects to not link against the Support and Core libraries,
# but expects them to exist in the process loading the plugin. This doesn't
# work with DLLs on Windows (where a shared library can't have undefined
# references), so just skip this example on Windows.
if (NOT WIN32)
add_llvm_pass_plugin(ExampleIRTransforms
SimplifyCFG.cpp
DEPENDS
intrinsics_gen
BUILDTREE_ONLY
)
ADDITIONAL_HEADER_DIRS
DEPENDS
intrinsics_gen
)
install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}")
set_target_properties(${name} PROPERTIES FOLDER "Examples")
endif()

View File

@ -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);
}

View File

@ -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

View File

@ -27,20 +27,18 @@
// 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"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/InitializePasses.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"
#include "llvm/Support/CommandLine.h"
using namespace llvm;
@ -369,46 +367,48 @@ static bool doSimplify_v3(Function &F, DominatorTree &DT) {
}
namespace {
struct SimplifyCFGLegacyPass : public FunctionPass {
static char ID;
SimplifyCFGLegacyPass() : FunctionPass(ID) {
initializeSimplifyCFGLegacyPassPass(*PassRegistry::getPassRegistry());
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<DominatorTreeWrapperPass>();
// Version 1 of the implementation does not preserve the dominator tree.
if (Version != V1)
AU.addPreserved<DominatorTreeWrapperPass>();
FunctionPass::getAnalysisUsage(AU);
}
bool runOnFunction(Function &F) override {
if (skipFunction(F))
return false;
struct SimplifyCFGPass : public PassInfoMixin<SimplifyCFGPass> {
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
switch (Version) {
case V1:
return doSimplify_v1(F);
doSimplify_v1(F);
break;
case V2: {
auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
return doSimplify_v2(F, DT);
DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
doSimplify_v2(F, DT);
break;
}
case V3: {
auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
return doSimplify_v3(F, DT);
DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
doSimplify_v3(F, DT);
break;
}
}
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 getExampleIRTransformsPluginInfo() {
return {LLVM_PLUGIN_API_VERSION, "SimplifyCFG", LLVM_VERSION_STRING,
[](PassBuilder &PB) {
PB.registerPipelineParsingCallback(
[](StringRef Name, llvm::FunctionPassManager &PM,
ArrayRef<llvm::PassBuilder::PipelineElement>) {
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 getExampleIRTransformsPluginInfo();
}
#endif

View File

@ -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

View File

@ -16,6 +16,7 @@ llvm_canonicalize_cmake_booleans(
LLVM_BUILD_EXAMPLES
LLVM_ENABLE_PLUGINS
LLVM_BYE_LINK_INTO_TOOLS
LLVM_EXAMPLEIRTRANSFORMS_LINK_INTO_TOOLS
LLVM_HAVE_TF_AOT
LLVM_HAVE_TFLITE
LLVM_INLINER_MODEL_AUTOGENERATED
@ -190,6 +191,7 @@ if(LLVM_BUILD_EXAMPLES)
if (NOT WIN32)
list(APPEND LLVM_TEST_DEPENDS
Bye
ExampleIRTransforms
)
endif()
endif()

View File

@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
define ptr @simp1(i32 %x) {
; CHECK-LABEL: @simp1(

View File

@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
define i32 @simp1() {
; CHECK-LABEL: @simp1(

View File

@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
define i32 @remove_dead_blocks() {
; CHECK-LABEL: @remove_dead_blocks(

View File

@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
define i32 @phi_cond_branch_eliminated() {
; CHECK-LABEL: @phi_cond_branch_eliminated(

View File

@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 < %s -enable-new-pm=0 -S -verify-dom-info | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 < %s -enable-new-pm=0 -S -verify-dom-info | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 < %s -enable-new-pm=0 -S -verify-dom-info | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 < %s -S -verify-dom-info | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 < %s -S -verify-dom-info | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 < %s -S -verify-dom-info | FileCheck %s
; Check that we do not crash when we remove edges multiple times in
; the DomTreeUpdater.

View File

@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 < %s -enable-new-pm=0 -S -verify-dom-info | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 < %s -enable-new-pm=0 -S -verify-dom-info | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 < %s -enable-new-pm=0 -S -verify-dom-info | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 < %s -S -verify-dom-info | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 < %s -S -verify-dom-info | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 < %s -S -verify-dom-info | FileCheck %s
define void @test() {
; CHECK-LABEL: @test(

View File

@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
define i32 @simp1() {
; CHECK-LABEL: @simp1(

View File

@ -288,6 +288,13 @@ else:
.format(config.llvm_shlib_dir,
config.llvm_shlib_ext)))
if config.linked_exampleirtransforms_extension:
config.substitutions.append(('%loadexampleirtransforms',''))
else:
config.substitutions.append(('%loadexampleirtransforms',
'-load-pass-plugin={}/ExampleIRTransforms{}'
.format(config.llvm_shlib_dir,
config.llvm_shlib_ext)))
# Static libraries are not built if BUILD_SHARED_LIBS is ON.
if not config.build_shared_libs and not config.link_llvm_dylib:

View File

@ -52,6 +52,7 @@ config.have_opt_viewer_modules = @LLVM_HAVE_OPT_VIEWER_MODULES@
config.libcxx_used = @LLVM_LIBCXX_USED@
config.has_plugins = @LLVM_ENABLE_PLUGINS@
config.linked_bye_extension = @LLVM_BYE_LINK_INTO_TOOLS@
config.linked_exampleirtransforms_extension = @LLVM_EXAMPLEIRTRANSFORMS_LINK_INTO_TOOLS@
config.have_tf_aot = @LLVM_HAVE_TF_AOT@
config.have_tflite = @LLVM_HAVE_TFLITE@
config.llvm_inliner_model_autogenerated = @LLVM_INLINER_MODEL_AUTOGENERATED@

View File

@ -40,7 +40,3 @@ add_llvm_tool(opt
SUPPORT_PLUGINS
)
export_executable_symbols_for_plugins(opt)
if(LLVM_BUILD_EXAMPLES)
target_link_libraries(opt PRIVATE ExampleIRTransforms)
endif(LLVM_BUILD_EXAMPLES)

View File

@ -314,10 +314,6 @@ static TargetMachine* GetTargetMachine(Triple TheTriple, StringRef CPUStr,
codegen::getExplicitCodeModel(), GetCodeGenOptLevel());
}
#ifdef BUILD_EXAMPLES
void initializeExampleIRTransforms(llvm::PassRegistry &Registry);
#endif
struct TimeTracerRAII {
TimeTracerRAII(StringRef ProgramName) {
if (TimeTrace)
@ -470,10 +466,6 @@ int main(int argc, char **argv) {
initializeReplaceWithVeclibLegacyPass(Registry);
initializeJMCInstrumenterPass(Registry);
#ifdef BUILD_EXAMPLES
initializeExampleIRTransforms(Registry);
#endif
SmallVector<PassPlugin, 1> PluginList;
PassPlugins.setCallback([&](const std::string &PluginPath) {
auto Plugin = PassPlugin::Load(PluginPath);

View File

@ -82,6 +82,7 @@ write_lit_config("lit_site_cfg") {
# No bindings are implemented in the GN build.
"LLVM_BINDINGS=",
"LLVM_BYE_LINK_INTO_TOOLS=0",
"LLVM_EXAMPLEIRTRANSFORMS_LINK_INTO_TOOLS=0",
"HAVE_OCAMLOPT=0",
"OCAMLFIND=OCAMLFIND-NOTFOUND",