[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