This is an automated email from the ASF dual-hosted git repository.
cbalint13 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 6790af8322 [LLVM] Fixes up to the latest LLVM21 (#18204)
6790af8322 is described below
commit 6790af832275d430b3f62f4645f15f0b380adcfb
Author: Balint Cristian <[email protected]>
AuthorDate: Tue Aug 12 04:59:23 2025 +0300
[LLVM] Fixes up to the latest LLVM21 (#18204)
This PR fix TVM use with the latest LLVM version 21.
- At this time LLVM21 is available as a release candidate.
- Double checks for backward compatibility down to LLVM10
---
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 ae859170d6..0cf2180543 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 8ea964b6d2..3d48f57513 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 21dd62efa9..4fe120e945 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 bcea45cfa7..a6b70ad39a 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 ebf9a754b1..e494a2bbf9 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 924f520082..a9e09652ee 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_);
@@ -638,7 +659,11 @@ static void LLVMReflectionRegister() {
// 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());
diff --git a/tests/cpp/target/parsers/aprofile_test.cc
b/tests/cpp/target/parsers/aprofile_test.cc
index 0a8aeb8326..26f52f4938 100644
--- a/tests/cpp/target/parsers/aprofile_test.cc
+++ b/tests/cpp/target/parsers/aprofile_test.cc
@@ -317,7 +317,7 @@ TEST_F(AProfileParser, DefaultSVESupportSVESupport) {
TargetJSON target = ParseTargetWithAttrs("", "aarch64-arm-none-eabi",
{arch_attr});
TargetFeatures features = Downcast<TargetFeatures>(target.at("features"));
EXPECT_TRUE(IsArch(target));
-#if TVM_LLVM_VERSION >= 190
+#if TVM_LLVM_VERSION >= 190 || (TVM_LLVM_VERSION / 10) == 13
// The generic aarch64 should not have SVE enabled
EXPECT_FALSE(Downcast<Bool>(features.at("has_sve")));
#else
@@ -364,7 +364,7 @@ TEST_F(AProfileParser, DefaultFP16Support) {
TargetJSON target = ParseTargetWithAttrs("", "aarch64-arm-none-eabi",
{arch_attr});
TargetFeatures features = Downcast<TargetFeatures>(target.at("features"));
EXPECT_TRUE(IsArch(target));
-#if TVM_LLVM_VERSION >= 190
+#if TVM_LLVM_VERSION >= 190 || (TVM_LLVM_VERSION / 10) == 13
// The generic aarch64 should not have FP16 enabled
EXPECT_FALSE(Downcast<Bool>(features.at("has_fp16_simd")));
#else