mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-04 16:26:46 +00:00
[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:
parent
5c126e35c1
commit
d291f1fd09
@ -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()
|
||||
|
@ -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);
|
||||
}
|
@ -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
|
@ -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
|
||||
|
@ -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
|
@ -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()
|
||||
|
@ -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(
|
||||
|
@ -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(
|
||||
|
@ -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(
|
||||
|
@ -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(
|
||||
|
@ -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.
|
||||
|
@ -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(
|
||||
|
@ -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(
|
||||
|
@ -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:
|
||||
|
@ -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@
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user