[Mlir-commits] [mlir] [MLIR][XeVM] Update XeVM target (PR #179557)

Sang Ik Lee llvmlistbot at llvm.org
Wed Feb 18 10:25:33 PST 2026


================
@@ -265,27 +276,102 @@ void SPIRVSerializer::init() {
   });
 }
 
-FailureOr<SmallVector<char, 0>>
-SPIRVSerializer::moduleToObject(llvm::Module &llvmModule) {
+static const std::vector<std::string> getDefaultSPIRVExtensions() {
+  return {
+      "SPV_EXT_relaxed_printf_string_address_space",
+      "SPV_INTEL_cache_controls",
+      "SPV_INTEL_variable_length_array",
+  };
+}
+
+std::optional<SmallVector<char, 0>> SPIRVSerializer::run() {
+  // Translate the module to LLVM IR.
+  llvm::LLVMContext llvmContext;
+  std::unique_ptr<llvm::Module> llvmModule = translateToLLVMIR(llvmContext);
+  if (!llvmModule) {
+    getOperation().emitError() << "Failed creating the llvm::Module.";
+    return std::nullopt;
+  }
+
 #define DEBUG_TYPE "serialize-to-llvm"
   LLVM_DEBUG({
     llvm::dbgs() << "LLVM IR for module: " << getGPUModuleOp().getNameAttr()
                  << "\n";
-    llvm::dbgs() << llvmModule << "\n";
+    llvm::dbgs() << *llvmModule << "\n";
     llvm::dbgs().flush();
   });
 #undef DEBUG_TYPE
 
   // Return LLVM IR if the compilation target is `offload`.
   if (targetOptions.getCompilationTarget() == gpu::CompilationTarget::Offload)
-    return SerializeGPUModuleBase::moduleToObject(llvmModule);
+    return SerializeGPUModuleBase::moduleToObject(*llvmModule);
 
-#if !LLVM_HAS_SPIRV_TARGET
-  return getGPUModuleOp()->emitError(
-      "The `SPIRV` target was not built. Please enable "
-      "it when building LLVM.");
+#if LLVM_HAS_SPIRV_TARGET
+  setDataLayoutAndTriple(*llvmModule);
+
+  // Create the target machine.
+  FailureOr<llvm::TargetMachine *> targetMachine = getOrCreateTargetMachine();
+  if (failed(targetMachine)) {
+    getOperation().emitError()
+        << "Target Machine unavailable for triple " << triple
+        << ", can't output compilation target.\n";
+    return std::nullopt;
+  }
+  // Setup allowed SPIR-V extensions.
+  std::set<llvm::SPIRV::Extension::Extension> AllowedExtIds;
+  llvm::StringRef UnknownExt = llvm::SPIRVExtensionsParser::checkExtensions(
+      getDefaultSPIRVExtensions(), AllowedExtIds);
+  if (!UnknownExt.empty()) {
+    std::string ErrMsg{"Unknown SPIR-V extension: "};
+    ErrMsg.append(UnknownExt.str());
+    getOperation().emitError() << ErrMsg;
+    return std::nullopt;
+  }
+
+  llvm::SPIRVTargetMachine *STM =
+      static_cast<llvm::SPIRVTargetMachine *>(*targetMachine);
+  const_cast<llvm::SPIRVSubtarget *>(STM->getSubtargetImpl())
+      ->initAvailableExtensions(AllowedExtIds);
+
+  // Disable optimizations
+  (*targetMachine)->setOptLevel(llvm::CodeGenOptLevel::None);
----------------
silee2 wrote:

Forgot to remove those lines. Thanks for pointing out.

https://github.com/llvm/llvm-project/pull/179557


More information about the Mlir-commits mailing list