You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by ma...@apache.org on 2022/11/30 01:55:13 UTC
[tvm] branch main updated: [LLVM] Switch to using New Pass Manager (NPM) with LLVM 16+ (#13515)
This is an automated email from the ASF dual-hosted git repository.
masahi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 8dc8d248a1 [LLVM] Switch to using New Pass Manager (NPM) with LLVM 16+ (#13515)
8dc8d248a1 is described below
commit 8dc8d248a1c3af96a4496900983bb8152ee128ae
Author: Krzysztof Parzyszek <kp...@quicinc.com>
AuthorDate: Tue Nov 29 19:55:07 2022 -0600
[LLVM] Switch to using New Pass Manager (NPM) with LLVM 16+ (#13515)
LLVM 16 has removed support for the legacy pass manager, and the LLVM
codegen in TVM will no longer even compile.
---
src/target/llvm/codegen_amdgpu.cc | 3 ++
src/target/llvm/codegen_llvm.cc | 69 +++++++++++++++++++++++++++++++++++++--
src/target/llvm/codegen_llvm.h | 3 ++
src/target/llvm/codegen_nvptx.cc | 3 ++
4 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/src/target/llvm/codegen_amdgpu.cc b/src/target/llvm/codegen_amdgpu.cc
index 89b567b6b0..4e83e83ba7 100644
--- a/src/target/llvm/codegen_amdgpu.cc
+++ b/src/target/llvm/codegen_amdgpu.cc
@@ -202,9 +202,12 @@ class CodeGenAMDGPU : public CodeGenLLVM {
}
}
+#if TVM_LLVM_VERSION < 160
+ // This function only works with the legacy pass manager.
void InitPassManagerBuilder(llvm::PassManagerBuilder* builder) final {
// Additional optimization hook to tweak the builder.
}
+#endif
unsigned GetGlobalAddressSpace() const final { return 1; }
diff --git a/src/target/llvm/codegen_llvm.cc b/src/target/llvm/codegen_llvm.cc
index 87479ec742..dce7d0b82f 100644
--- a/src/target/llvm/codegen_llvm.cc
+++ b/src/target/llvm/codegen_llvm.cc
@@ -58,7 +58,6 @@
#include <llvm/IR/Instructions.h>
#include <llvm/IR/Intrinsics.h>
#include <llvm/IR/LLVMContext.h>
-#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/MDBuilder.h>
#include <llvm/IR/Metadata.h>
#include <llvm/IR/Module.h>
@@ -66,6 +65,14 @@
#include <llvm/IRReader/IRReader.h>
#include <llvm/Linker/Linker.h>
#include <llvm/Pass.h>
+#if TVM_LLVM_VERSION >= 160
+#include <llvm/IR/Verifier.h> // For VerifierPass
+#include <llvm/Passes/PassBuilder.h>
+#include <llvm/Passes/StandardInstrumentations.h>
+#else
+#include <llvm/IR/LegacyPassManager.h>
+#include <llvm/Transforms/IPO/PassManagerBuilder.h>
+#endif
#if TVM_LLVM_VERSION >= 100
#include <llvm/Support/Alignment.h>
#include <llvm/Support/TypeSize.h>
@@ -75,7 +82,6 @@
#include <llvm/Support/SourceMgr.h>
#include <llvm/Target/TargetMachine.h>
#include <llvm/Transforms/IPO.h>
-#include <llvm/Transforms/IPO/PassManagerBuilder.h>
#include <llvm/Transforms/Utils/ModuleUtils.h>
#include <tvm/runtime/c_runtime_api.h>
#include <tvm/runtime/crt/error_codes.h>
@@ -351,6 +357,64 @@ llvm::Value* CodeGenLLVM::CreateStorageSync(const CallNode* op) {
return nullptr;
}
+#if TVM_LLVM_VERSION >= 160
+
+// Use new pass manager
+
+void CodeGenLLVM::Optimize() {
+ llvm::TargetMachine* tm = llvm_target_->GetOrCreateTargetMachine();
+
+ bool debug_logging = false;
+ bool verify_each = false;
+
+ llvm::PipelineTuningOptions pto = llvm::PipelineTuningOptions();
+ llvm::PassInstrumentationCallbacks pic;
+ llvm::PassBuilder builder(tm, pto, llvm::None, &pic);
+
+ llvm::LoopAnalysisManager lam;
+ llvm::FunctionAnalysisManager fam;
+ llvm::CGSCCAnalysisManager cgam;
+ llvm::ModuleAnalysisManager mam;
+ builder.registerLoopAnalyses(lam);
+ builder.registerFunctionAnalyses(fam);
+ builder.registerCGSCCAnalyses(cgam);
+ builder.registerModuleAnalyses(mam);
+ builder.crossRegisterProxies(lam, fam, cgam, mam);
+
+ // Construct the default pass pipeline depending on the opt level.
+ std::string pipeline;
+ switch (llvm_target_->GetOptLevel()) {
+ case llvm::CodeGenOpt::Level::None:
+ pipeline = "default<O0>";
+ break;
+ case llvm::CodeGenOpt::Level::Less:
+ pipeline = "default<O1>";
+ break;
+ case llvm::CodeGenOpt::Level::Default:
+ pipeline = "default<O2>";
+ break;
+ default:
+ // CodeGenOpt::Level::Aggressive
+ pipeline = "default<O3>";
+ break;
+ }
+
+ llvm::StandardInstrumentations si(*llvm_target_->GetContext(), debug_logging, verify_each);
+ si.registerCallbacks(pic, &fam);
+ llvm::ModulePassManager mpass;
+ if (verify_each) {
+ mpass.addPass(llvm::VerifierPass());
+ }
+ if (auto err = builder.parsePassPipeline(mpass, pipeline)) {
+ LOG(FATAL) << "error parsing pass pipeline '" << pipeline
+ << "':" << llvm::toString(std::move(err)) << '\n';
+ }
+
+ mpass.run(*module_, mam);
+}
+
+#else // TVM_LLVM_VERSION
+
class FPassManager : public llvm::legacy::FunctionPassManager {
public:
explicit FPassManager(llvm::Module* m) : llvm::legacy::FunctionPassManager(m) {}
@@ -420,6 +484,7 @@ void CodeGenLLVM::Optimize() {
fpass.doFinalization();
mpass.run(*module_);
}
+#endif // TVM_LLVM_VERSION
int CodeGenLLVM::NativeVectorBits(const runtime::StorageScope& storage_scope) const {
return native_vector_bits_;
diff --git a/src/target/llvm/codegen_llvm.h b/src/target/llvm/codegen_llvm.h
index 7a8daf2e76..1ae9d14dc4 100644
--- a/src/target/llvm/codegen_llvm.h
+++ b/src/target/llvm/codegen_llvm.h
@@ -302,8 +302,11 @@ class CodeGenLLVM : public ExprFunctor<llvm::Value*(const PrimExpr&)>,
virtual llvm::Value* GetThreadIndex(const IterVar& iv);
// Get the corresponding thread index
virtual llvm::Value* CreateStorageSync(const CallNode* op);
+#if TVM_LLVM_VERSION < 160
+ // This function only works with the legacy pass manager.
// apply optimization on the module.
virtual void InitPassManagerBuilder(llvm::PassManagerBuilder* builder);
+#endif
// Scalarize by iterating elements of e.
// f is a callback that takes index and v.
void Scalarize(const PrimExpr& e, std::function<void(int i, llvm::Value* v)> f);
diff --git a/src/target/llvm/codegen_nvptx.cc b/src/target/llvm/codegen_nvptx.cc
index 2442d2ccba..ff330e52d3 100644
--- a/src/target/llvm/codegen_nvptx.cc
+++ b/src/target/llvm/codegen_nvptx.cc
@@ -183,9 +183,12 @@ class CodeGenNVPTX : public CodeGenLLVM {
}
}
+#if TVM_LLVM_VERSION < 160
+ // This function only works with the legacy pass manager.
void InitPassManagerBuilder(llvm::PassManagerBuilder* builder) final {
// Additional optimization hook to tweak the builder.
}
+#endif
void Optimize() final {
for (auto& f : *module_) {