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

Reply via email to