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

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 30 03:18:09 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-06-30T12:18:05+02:00
New Revision: b74fc87d30d8f87c94c3838111ff6a25f86c3e64

URL: https://github.com/llvm/llvm-project/commit/b74fc87d30d8f87c94c3838111ff6a25f86c3e64
DIFF: https://github.com/llvm/llvm-project/commit/b74fc87d30d8f87c94c3838111ff6a25f86c3e64.diff

LOG: [SPIR-V] Fix removeCapabilityIf not pruning MinimalCaps (#206478)

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

Added: 
    llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_remove_cap_if.ll
    llvm/unittests/Target/SPIRV/SPIRVModuleAnalysisTests.cpp

Modified: 
    llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
    llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_no_extension.ll
    llvm/unittests/Target/SPIRV/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index 2e87a0195a314..d98e115df4a2c 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/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_no_extension.ll b/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_no_extension.ll
index 452df0a64c063..b7c491b9a8ad6 100644
--- a/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_no_extension.ll
+++ b/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_no_extension.ll
@@ -3,7 +3,7 @@
 
 
 ; CHECK-NO-EXTENSION:     OpCapability Shader
-; CHECK-NO-EXTENSION-NOT: OpCabilitity BitInstructions
+; CHECK-NO-EXTENSION-NOT: OpCapability BitInstructions
 ; CHECK-NO-EXTENSION-NOT: OpExtension "SPV_KHR_bit_instructions"
 ; CHECK-NO-EXTENSION: %[[#int:]] = OpTypeInt 32
 ; CHECK-NO-EXTENSION: OpBitReverse %[[#int]]

diff  --git a/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_remove_cap_if.ll b/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_remove_cap_if.ll
new file mode 100644
index 0000000000000..cec59cd4fd21c
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bit_instructions_remove_cap_if.ll
@@ -0,0 +1,20 @@
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s --spirv-ext=+SPV_KHR_bit_instructions -o - | FileCheck %s
+
+; CHECK: OpCapability Shader
+; CHECK-NOT: OpCapability BitInstructions
+; CHECK: OpExtension "SPV_KHR_bit_instructions"
+; CHECK: OpBitReverse
+
+define spir_func i32 @testBitRev(i32 %a) {
+entry:
+  %call = call i32 @llvm.bitreverse.i32(i32 %a)
+  ret i32 %call
+}
+
+define void @main() #0 {
+  ret void
+}
+
+declare i32 @llvm.bitreverse.i32(i32)
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }

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));
+}


        


More information about the llvm-commits mailing list