[llvm] [SPIR-V] Fix removeCapabilityIf not pruning MinimalCaps (PR #206478)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 29 06:06:11 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-spir-v

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>

removeCapabilityIf erased from AllCaps but not MinimalCaps, which is what the AsmPrinter iterates to emit OpCapability, so pruned capabilities were still emitted

---
Full diff: https://github.com/llvm/llvm-project/pull/206478.diff


3 Files Affected:

- (modified) llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp (+3-1) 
- (modified) llvm/unittests/Target/SPIRV/CMakeLists.txt (+1) 
- (added) llvm/unittests/Target/SPIRV/SPIRVModuleAnalysisTests.cpp (+42) 


``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index aed16fd785af8..be6e5c26b7bc7 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
@@ -939,8 +939,10 @@ void SPIRV::RequirementHandler::addAvailableCaps(const CapabilityList &ToAdd) {
 void SPIRV::RequirementHandler::removeCapabilityIf(
     const Capability::Capability ToRemove,
     const Capability::Capability IfPresent) {
-  if (AllCaps.contains(IfPresent))
+  if (AllCaps.contains(IfPresent)) {
     AllCaps.erase(ToRemove);
+    llvm::erase(MinimalCaps, ToRemove);
+  }
 }
 
 namespace llvm {
diff --git a/llvm/unittests/Target/SPIRV/CMakeLists.txt b/llvm/unittests/Target/SPIRV/CMakeLists.txt
index e20adc886106c..1c73c5c2ffce1 100644
--- a/llvm/unittests/Target/SPIRV/CMakeLists.txt
+++ b/llvm/unittests/Target/SPIRV/CMakeLists.txt
@@ -22,6 +22,7 @@ set(LLVM_LINK_COMPONENTS
 add_llvm_target_unittest(SPIRVTests
   SPIRVConvergenceRegionAnalysisTests.cpp
   SPIRVGlobalRegistryTests.cpp
+  SPIRVModuleAnalysisTests.cpp
   SPIRVSortBlocksTests.cpp
   SPIRVPartialOrderingVisitorTests.cpp
   SPIRVAPITest.cpp
diff --git a/llvm/unittests/Target/SPIRV/SPIRVModuleAnalysisTests.cpp b/llvm/unittests/Target/SPIRV/SPIRVModuleAnalysisTests.cpp
new file mode 100644
index 0000000000000..f0af1cc21e027
--- /dev/null
+++ b/llvm/unittests/Target/SPIRV/SPIRVModuleAnalysisTests.cpp
@@ -0,0 +1,42 @@
+//===- SPIRVModuleAnalysisTests.cpp ---------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "SPIRVModuleAnalysis.h"
+#include "llvm/ADT/STLExtras.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+// A capability pruned by removeCapabilityIf must be dropped from the minimal
+// capabilities too, since those are the ones the AsmPrinter emits as
+// OpCapability.
+TEST(SPIRVModuleAnalysisTest, RemoveCapabilityIfPrunesMinimalCaps) {
+  SPIRV::RequirementHandler Reqs;
+  Reqs.addCapability(SPIRV::Capability::BitInstructions);
+  Reqs.addCapability(SPIRV::Capability::Shader);
+
+  Reqs.removeCapabilityIf(SPIRV::Capability::BitInstructions,
+                          SPIRV::Capability::Shader);
+
+  EXPECT_FALSE(llvm::is_contained(Reqs.getMinimalCapabilities(),
+                                  SPIRV::Capability::BitInstructions));
+  EXPECT_TRUE(llvm::is_contained(Reqs.getMinimalCapabilities(),
+                                 SPIRV::Capability::Shader));
+}
+
+// When the guarding capability is absent, nothing is removed.
+TEST(SPIRVModuleAnalysisTest, RemoveCapabilityIfNoopWhenGuardAbsent) {
+  SPIRV::RequirementHandler Reqs;
+  Reqs.addCapability(SPIRV::Capability::BitInstructions);
+
+  Reqs.removeCapabilityIf(SPIRV::Capability::BitInstructions,
+                          SPIRV::Capability::Shader);
+
+  EXPECT_TRUE(llvm::is_contained(Reqs.getMinimalCapabilities(),
+                                 SPIRV::Capability::BitInstructions));
+}

``````````

</details>


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


More information about the llvm-commits mailing list