[llvm] [SPIR-V] Tie Int64ImageEXT to R64i/R64ui image format, not sampled type (PR #203005)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 10 08:02:46 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>
The capability is required by the R64i/R64ui Image Format per SPV_EXT_shader_image_int64 spec, not by a 64-bit integer sampled type
Related SPIRV-LLVM-Translator PR that fixes this issue there: https://github.com/KhronosGroup/SPIRV-LLVM-Translator/pull/3773
---
Full diff: https://github.com/llvm/llvm-project/pull/203005.diff
4 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp (-10)
- (modified) llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td (+3-1)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_shader_image_int64/image_int64.ll (+20)
- (modified) llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_bindless_images/bindless_images_generic.ll (+7-6)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index bb6245778b2ea..65337fa0d2a31 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
@@ -1144,16 +1144,6 @@ static void addOpTypeImageReqs(const MachineInstr &MI,
break;
}
- // Check if the sampled type is a 64-bit integer, which requires
- // Int64ImageEXT capability.
- assert(MI.getOperand(1).isReg());
- const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
- SPIRVTypeInst SampledTypeDef = MRI.getVRegDef(MI.getOperand(1).getReg());
- if (SampledTypeDef.isTypeIntN(64)) {
- Reqs.addCapability(SPIRV::Capability::Int64ImageEXT);
- Reqs.addExtension(SPIRV::Extension::SPV_EXT_shader_image_int64);
- }
-
// Has optional access qualifier.
if (!ST.isShader()) {
if (MI.getNumOperands() > 8 &&
diff --git a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
index c38f9e2d0243a..67886b2344065 100644
--- a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
+++ b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
@@ -523,7 +523,7 @@ defm ImageGatherBiasLodAMD : CapabilityOperand<5009, 0, 0, [], [Shader]>;
defm FragmentMaskAMD : CapabilityOperand<5010, 0, 0, [], [Shader]>;
defm StencilExportEXT : CapabilityOperand<5013, 0, 0, [], [Shader]>;
defm ImageReadWriteLodAMD : CapabilityOperand<5015, 0, 0, [], [Shader]>;
-defm Int64ImageEXT : CapabilityOperand<5016, 0, 0, [SPV_EXT_shader_image_int64], [Int64]>;
+defm Int64ImageEXT : CapabilityOperand<5016, 0, 0, [SPV_EXT_shader_image_int64], [Shader]>;
defm ShaderClockKHR : CapabilityOperand<5055, 0, 0, [SPV_KHR_shader_clock], []>;
defm BFloat16TypeKHR : CapabilityOperand<5116, 0, 0, [SPV_KHR_bfloat16], []>;
defm SampleMaskOverrideCoverageNV : CapabilityOperand<5249, 0, 0, [], [SampleRateShading]>;
@@ -1054,6 +1054,8 @@ defm Rg16ui : ImageFormatOperand<36, [StorageImageExtendedFormats]>;
defm Rg8ui : ImageFormatOperand<37, [StorageImageExtendedFormats]>;
defm R16ui : ImageFormatOperand<38, [StorageImageExtendedFormats]>;
defm R8ui : ImageFormatOperand<39, [StorageImageExtendedFormats]>;
+defm R64ui : ImageFormatOperand<40, [Int64ImageEXT]>;
+defm R64i : ImageFormatOperand<41, [Int64ImageEXT]>;
//===----------------------------------------------------------------------===//
// Multiclass used to define ImageChannelOrder enum values and at the same time
diff --git a/llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_shader_image_int64/image_int64.ll b/llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_shader_image_int64/image_int64.ll
new file mode 100644
index 0000000000000..9bd5ded937e68
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_shader_image_int64/image_int64.ll
@@ -0,0 +1,20 @@
+; An OpTypeImage with an R64ui/R64i Image Format requires the Int64ImageEXT
+; capability and the SPV_EXT_shader_image_int64 extension.
+
+; RUN: llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_EXT_shader_image_int64 %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_EXT_shader_image_int64 %s -o - -filetype=obj | spirv-val %}
+
+; CHECK-DAG: OpCapability Int64ImageEXT
+; CHECK-DAG: OpExtension "SPV_EXT_shader_image_int64"
+; CHECK-DAG: %[[#Int64Ty:]] = OpTypeInt 64 0
+; R64ui Image Format is encoded as 40, R64i as 41.
+; CHECK-DAG: %[[#ImgUTy:]] = OpTypeImage %[[#Int64Ty]] 2D 0 0 0 2 R64ui ReadWrite
+; CHECK-DAG: %[[#ImgSTy:]] = OpTypeImage %[[#Int64Ty]] 2D 0 0 0 2 R64i ReadWrite
+
+define spir_func void @foo(target("spirv.Image", i64, 1, 0, 0, 0, 2, 40, 2) %img) {
+ ret void
+}
+
+define spir_func void @bar(target("spirv.Image", i64, 1, 0, 0, 0, 2, 41, 2) %img) {
+ ret void
+}
diff --git a/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_bindless_images/bindless_images_generic.ll b/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_bindless_images/bindless_images_generic.ll
index 6bca1b41bd2ea..5cc63f550f750 100644
--- a/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_bindless_images/bindless_images_generic.ll
+++ b/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_bindless_images/bindless_images_generic.ll
@@ -1,14 +1,15 @@
; RUN: not llc -O0 -mtriple=spirv64-unknown-unknown %s -o %t.spvt 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
-; RUN: llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bindless_images,+SPV_EXT_shader_image_int64 %s -o - | FileCheck %s
-; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bindless_images,+SPV_EXT_shader_image_int64 %s -o - -filetype=obj | spirv-val %}
+; RUN: llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bindless_images %s -o - | FileCheck %s
+; spirv-val behavior for Int64ImageEXT is not aligned with spec
+; error message is: Capability Int64ImageEXT is required when using Sampled Type of 64-bit int
+; but this requirement is not correct
+; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bindless_images,+SPV_EXT_shader_image_int64 %s -o - -filetype=obj | spirv-val %}
; CHECK-ERROR: LLVM ERROR: OpConvertHandleTo[Image/Sampler/SampledImage]INTEL instruction
; CHECK-ERROR-SAME: require the following SPIR-V extension: SPV_INTEL_bindless_images
-; CHECK-DAG: OpCapability BindlessImagesINTEL
-; CHECK-DAG: OpCapability Int64ImageEXT
-; CHECK-DAG: OpExtension "SPV_INTEL_bindless_images"
-; CHECK-DAG: OpExtension "SPV_EXT_shader_image_int64"
+; CHECK: OpCapability BindlessImagesINTEL
+; CHECK: OpExtension "SPV_INTEL_bindless_images"
; CHECK-DAG: %[[#VoidTy:]] = OpTypeVoid
; CHECK-DAG: %[[#Int64Ty:]] = OpTypeInt 64
``````````
</details>
https://github.com/llvm/llvm-project/pull/203005
More information about the llvm-commits
mailing list