* Release notes: https://github.com/apache/tvm/releases/tag/v0.21.0 - Skipped 0.20.0: * Release notes: https://github.com/apache/tvm/releases/tag/v0.20.0 - Backport upstream patch to fix build with llvm21: * 18204_backported.patch - Refresh patch: * lib-finder-python-cmake.patch - Remove unneeded patch: * tvm-fix-openblas.patch OBS-URL: https://build.opensuse.org/package/show/science:machinelearning/tvm?expand=0&rev=79
196 lines
8.1 KiB
Diff
196 lines
8.1 KiB
Diff
From 5cf6a84dcbb665b09a3e00947465a5381a3a7cda Mon Sep 17 00:00:00 2001
|
|
From: Balint Cristian <cristian.balint@gmail.com>
|
|
Date: Mon, 11 Aug 2025 17:56:41 +0300
|
|
Subject: [PATCH] [LLVM] Fixes up to the latest LLVM21
|
|
|
|
---
|
|
src/target/llvm/codegen_amdgpu.cc | 4 ++++
|
|
src/target/llvm/codegen_blob.cc | 4 ++++
|
|
src/target/llvm/codegen_llvm.cc | 8 +++++++
|
|
src/target/llvm/codegen_nvptx.cc | 8 +++++++
|
|
src/target/llvm/llvm_instance.cc | 4 ++++
|
|
src/target/llvm/llvm_module.cc | 27 ++++++++++++++++++++++-
|
|
tests/cpp/target/parsers/aprofile_test.cc | 4 ++--
|
|
7 files changed, 56 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/target/llvm/codegen_amdgpu.cc b/src/target/llvm/codegen_amdgpu.cc
|
|
index ae859170d664..0cf218054320 100644
|
|
--- a/src/target/llvm/codegen_amdgpu.cc
|
|
+++ b/src/target/llvm/codegen_amdgpu.cc
|
|
@@ -284,7 +284,11 @@ runtime::Module BuildAMDGPU(IRModule mod, Target target) {
|
|
|
|
for (auto& bitcode_path : bitcode_files) {
|
|
std::unique_ptr<llvm::Module> mlib = llvm_instance.LoadIR(bitcode_path);
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ mlib->setTargetTriple(llvm::Triple(llvm_target->GetTargetTriple()));
|
|
+#else
|
|
mlib->setTargetTriple(llvm_target->GetTargetTriple());
|
|
+#endif
|
|
mlib->setDataLayout(tm->createDataLayout());
|
|
|
|
for (llvm::Function& f : mlib->functions()) {
|
|
diff --git a/src/target/llvm/codegen_blob.cc b/src/target/llvm/codegen_blob.cc
|
|
index 8ea964b6d2d9..3d48f57513d0 100644
|
|
--- a/src/target/llvm/codegen_blob.cc
|
|
+++ b/src/target/llvm/codegen_blob.cc
|
|
@@ -69,7 +69,11 @@ std::unique_ptr<llvm::Module> CodeGenBlob(const std::string& data, bool system_l
|
|
llvm::LLVMContext* ctx = llvm_target->GetContext();
|
|
std::string module_name = c_symbol_prefix + "devc";
|
|
auto module = std::make_unique<llvm::Module>(module_name, *ctx);
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ module->setTargetTriple(triple);
|
|
+#else
|
|
module->setTargetTriple(triple.str());
|
|
+#endif
|
|
llvm_target->SetTargetMetadata(module.get());
|
|
module->setDataLayout(tm->createDataLayout());
|
|
auto* blob_value = llvm::ConstantDataArray::getString(*ctx, data, false);
|
|
diff --git a/src/target/llvm/codegen_llvm.cc b/src/target/llvm/codegen_llvm.cc
|
|
index 21dd62efa9b7..4fe120e945b9 100644
|
|
--- a/src/target/llvm/codegen_llvm.cc
|
|
+++ b/src/target/llvm/codegen_llvm.cc
|
|
@@ -168,7 +168,11 @@ void CodeGenLLVM::SetFastMathFlags(llvm::FastMathFlags fmf) { builder_->setFastM
|
|
|
|
void CodeGenLLVM::InitTarget() {
|
|
llvm::TargetMachine* tm = llvm_target_->GetOrCreateTargetMachine();
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ module_->setTargetTriple(tm->getTargetTriple());
|
|
+#else
|
|
module_->setTargetTriple(tm->getTargetTriple().str());
|
|
+#endif
|
|
module_->setDataLayout(tm->createDataLayout());
|
|
#if TVM_LLVM_VERSION >= 200
|
|
data_layout_.reset(new llvm::DataLayout(module_.get()->getDataLayout()));
|
|
@@ -374,7 +378,11 @@ void CodeGenLLVM::HandleImport(const std::string& code) {
|
|
mlib = llvm_target_->GetInstance().ParseIR(code);
|
|
}
|
|
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ mlib->setTargetTriple(llvm::Triple(llvm_target_->GetTargetTriple()));
|
|
+#else
|
|
mlib->setTargetTriple(llvm_target_->GetTargetTriple());
|
|
+#endif
|
|
mlib->setDataLayout(llvm_target_->GetOrCreateTargetMachine()->createDataLayout());
|
|
// mark all the functions as force inline
|
|
for (llvm::Function& f : mlib->functions()) {
|
|
diff --git a/src/target/llvm/codegen_nvptx.cc b/src/target/llvm/codegen_nvptx.cc
|
|
index bcea45cfa70e..a6b70ad39a32 100644
|
|
--- a/src/target/llvm/codegen_nvptx.cc
|
|
+++ b/src/target/llvm/codegen_nvptx.cc
|
|
@@ -189,7 +189,11 @@ class CodeGenNVPTX : public CodeGenLLVM {
|
|
} else if (sync == "shared" || sync == "shared.dyn") {
|
|
#if TVM_LLVM_VERSION >= 200
|
|
llvm::Function* f = llvm::cast<llvm::Function>(llvm::Intrinsic::getOrInsertDeclaration(
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ module_.get(), llvm::Intrinsic::nvvm_barrier_cta_sync_aligned_all, {}));
|
|
+#else
|
|
module_.get(), llvm::Intrinsic::nvvm_barrier0, {}));
|
|
+#endif
|
|
#else
|
|
llvm::Function* f =
|
|
llvm::Intrinsic::getDeclaration(module_.get(), llvm::Intrinsic::nvvm_barrier0);
|
|
@@ -335,7 +339,11 @@ runtime::Module BuildNVPTX(IRModule mod, Target target) {
|
|
std::string path = (*flibdevice_path)(compute_ver).cast<std::string>();
|
|
if (path.length() != 0) {
|
|
std::unique_ptr<llvm::Module> mlib = llvm_instance.LoadIR(path);
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ mlib->setTargetTriple(llvm::Triple(llvm_target->GetTargetTriple()));
|
|
+#else
|
|
mlib->setTargetTriple(llvm_target->GetTargetTriple());
|
|
+#endif
|
|
mlib->setDataLayout(tm->createDataLayout());
|
|
cg->AddLinkModule(std::move(mlib));
|
|
}
|
|
diff --git a/src/target/llvm/llvm_instance.cc b/src/target/llvm/llvm_instance.cc
|
|
index ebf9a754b101..e494a2bbf9e9 100644
|
|
--- a/src/target/llvm/llvm_instance.cc
|
|
+++ b/src/target/llvm/llvm_instance.cc
|
|
@@ -981,7 +981,11 @@ std::string LLVMTarget::GetTargetMetadata(const llvm::Module& module) {
|
|
return meta.str();
|
|
}
|
|
}
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ return "llvm -mtriple " + module.getTargetTriple().str();
|
|
+#else
|
|
return "llvm -mtriple " + module.getTargetTriple();
|
|
+#endif
|
|
}
|
|
|
|
void LLVMTarget::SetTargetMetadata(llvm::Module* module) const {
|
|
diff --git a/src/target/llvm/llvm_module.cc b/src/target/llvm/llvm_module.cc
|
|
index 924f520082fd..a9e09652eec0 100644
|
|
--- a/src/target/llvm/llvm_module.cc
|
|
+++ b/src/target/llvm/llvm_module.cc
|
|
@@ -429,7 +429,11 @@ void LLVMModuleNode::InitMCJIT() {
|
|
// create MCJIT
|
|
mcjit_ee_ = builder.create(tm.release());
|
|
ICHECK(mcjit_ee_ != nullptr) << "Failed to initialize LLVM MCJIT engine for "
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ << module_->getTargetTriple().str();
|
|
+#else
|
|
<< module_->getTargetTriple();
|
|
+#endif
|
|
|
|
VLOG(2) << "LLVM MCJIT execute " << module_->getModuleIdentifier() << " for triple `"
|
|
<< llvm_target->GetTargetTriple() << "`"
|
|
@@ -503,8 +507,13 @@ void LLVMModuleNode::InitORCJIT() {
|
|
#if TVM_LLVM_VERSION >= 130
|
|
// linker
|
|
const auto linkerBuilder =
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ [&](llvm::orc::ExecutionSession& session)
|
|
+ -> llvm::Expected<std::unique_ptr<llvm::orc::ObjectLayer>> {
|
|
+#else
|
|
[&](llvm::orc::ExecutionSession& session,
|
|
const llvm::Triple& triple) -> std::unique_ptr<llvm::orc::ObjectLayer> {
|
|
+#endif
|
|
#if _WIN32
|
|
auto GetMemMgr = []() { return std::make_unique<llvm::SectionMemoryManager>(); };
|
|
auto ObjLinkingLayer =
|
|
@@ -512,12 +521,20 @@ void LLVMModuleNode::InitORCJIT() {
|
|
#else
|
|
auto ObjLinkingLayer = std::make_unique<llvm::orc::ObjectLinkingLayer>(session);
|
|
#endif
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ if (tm_builder.getTargetTriple().isOSBinFormatCOFF()) {
|
|
+#else
|
|
if (triple.isOSBinFormatCOFF()) {
|
|
+#endif
|
|
ObjLinkingLayer->setOverrideObjectFlagsWithResponsibilityFlags(true);
|
|
ObjLinkingLayer->setAutoClaimResponsibilityForObjectSymbols(true);
|
|
}
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ return llvm::Expected<std::unique_ptr<llvm::orc::ObjectLayer>>(std::move(ObjLinkingLayer));
|
|
+#else
|
|
return ObjLinkingLayer;
|
|
- };
|
|
+#endif
|
|
+ }; // NOLINT(readability/braces)
|
|
#endif
|
|
|
|
// create LLJIT
|
|
@@ -532,7 +549,11 @@ void LLVMModuleNode::InitORCJIT() {
|
|
.create());
|
|
|
|
ICHECK(orcjit_ee_ != nullptr) << "Failed to initialize LLVM ORCJIT engine for "
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ << module_->getTargetTriple().str();
|
|
+#else
|
|
<< module_->getTargetTriple();
|
|
+#endif
|
|
|
|
// store ctors
|
|
auto ctors = llvm::orc::getConstructors(*module_);
|
|
@@ -635,7 +656,11 @@ TVM_FFI_REGISTER_GLOBAL("codegen.LLVMMod
|
|
// Generate a LLVM module from an input target string
|
|
auto module = std::make_unique<llvm::Module>(module_name, *llvm_target->GetContext());
|
|
llvm_target->SetTargetMetadata(module.get());
|
|
+#if TVM_LLVM_VERSION >= 210
|
|
+ module->setTargetTriple(llvm::Triple(llvm_target->GetTargetTriple()));
|
|
+#else
|
|
module->setTargetTriple(llvm_target->GetTargetTriple());
|
|
+#endif
|
|
module->setDataLayout(llvm_target->GetOrCreateTargetMachine()->createDataLayout());
|
|
n->Init(std::move(module), std::move(llvm_instance));
|
|
n->SetJITEngine(llvm_target->GetJITEngine());
|