[Mlir-commits] [mlir] [mlir][spirv] Fix UpdateVCEPass pass to deduce the correct version (PR #151192)

Mohammadreza Ameri Mahabadian llvmlistbot at llvm.org
Wed Jul 30 01:02:07 PDT 2025


https://github.com/mahabadm updated https://github.com/llvm/llvm-project/pull/151192

>From 7183cf11cfa4f1a6b154f669c7bfbbf0c3732b4c Mon Sep 17 00:00:00 2001
From: Mohammadreza Ameri Mahabadian <mohammadreza.amerimahabadian at arm.com>
Date: Wed, 23 Jul 2025 09:43:09 +0100
Subject: [PATCH 1/2] [mlir][spirv] Fix UpdateVCEPass pass to deduce the
 correct version

UpdateVCEPass currently deduces the required version based on vrsion requirement of ops. This fix adds a check to update the minimum required version based on capabilities as well.

Signed-off-by: Mohammadreza Ameri Mahabadian <mohammadreza.amerimahabadian at arm.com>
---
 .../Dialect/SPIRV/Transforms/UpdateVCEPass.cpp   | 16 ++++++++++++++++
 .../Dialect/SPIRV/Transforms/vce-deduction.mlir  |  2 +-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp b/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp
index 6a9b951ca61d6..e5ceb7fde0b0c 100644
--- a/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp
+++ b/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp
@@ -174,6 +174,22 @@ void UpdateVCEPass::runOnOperation() {
   if (walkResult.wasInterrupted())
     return signalPassFailure();
 
+  // Update min version requirement for capabilities after deducing them
+  for (auto &cap : deducedCapabilities) {
+    std::optional<spirv::Version> minVersion = spirv::getMinVersion(cap);
+    if (minVersion) {
+      deducedVersion = std::max(deducedVersion, *minVersion);
+      if (deducedVersion > allowedVersion) {
+        module.emitError("Capability '")
+            << spirv::stringifyCapability(cap) << "' requires min version "
+            << spirv::stringifyVersion(deducedVersion)
+            << " but target environment allows up to "
+            << spirv::stringifyVersion(allowedVersion);
+        return signalPassFailure();
+      }
+    }
+  }
+
   // TODO: verify that the deduced version is consistent with
   // SPIR-V ops' maximal version requirements.
 
diff --git a/mlir/test/Dialect/SPIRV/Transforms/vce-deduction.mlir b/mlir/test/Dialect/SPIRV/Transforms/vce-deduction.mlir
index 2b237665ffc4a..8d7f3da4007cd 100644
--- a/mlir/test/Dialect/SPIRV/Transforms/vce-deduction.mlir
+++ b/mlir/test/Dialect/SPIRV/Transforms/vce-deduction.mlir
@@ -178,7 +178,7 @@ spirv.module Logical GLSL450 attributes {
 // Vulkan memory model requires SPV_KHR_vulkan_memory_model, which is enabled
 // implicitly by v1.5.
 
-// CHECK: requires #spirv.vce<v1.0, [VulkanMemoryModel], [SPV_KHR_vulkan_memory_model]>
+// CHECK: requires #spirv.vce<v1.5, [VulkanMemoryModel], [SPV_KHR_vulkan_memory_model]>
 spirv.module Logical Vulkan attributes {
   spirv.target_env = #spirv.target_env<
     #spirv.vce<v1.5, [Shader, VulkanMemoryModel], []>, #spirv.resource_limits<>>

>From 31d82fc6eb8fe17dc407dcc1be061de80b1a1711 Mon Sep 17 00:00:00 2001
From: Mohammadreza Ameri Mahabadian <mohammadreza.amerimahabadian at arm.com>
Date: Wed, 30 Jul 2025 08:57:11 +0100
Subject: [PATCH 2/2] Addressing code review comments

Signed-off-by: Mohammadreza Ameri Mahabadian <mohammadreza.amerimahabadian at arm.com>
---
 mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp b/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp
index e5ceb7fde0b0c..a53d0a7e4c44b 100644
--- a/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp
+++ b/mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp
@@ -174,10 +174,9 @@ void UpdateVCEPass::runOnOperation() {
   if (walkResult.wasInterrupted())
     return signalPassFailure();
 
-  // Update min version requirement for capabilities after deducing them
-  for (auto &cap : deducedCapabilities) {
-    std::optional<spirv::Version> minVersion = spirv::getMinVersion(cap);
-    if (minVersion) {
+  // Update min version requirement for capabilities after deducing them.
+  for (spirv::Capability cap : deducedCapabilities) {
+    if (std::optional<spirv::Version> minVersion = spirv::getMinVersion(cap)) {
       deducedVersion = std::max(deducedVersion, *minVersion);
       if (deducedVersion > allowedVersion) {
         module.emitError("Capability '")



More information about the Mlir-commits mailing list