[llvm] [SPIR-V] Tie Int64ImageEXT to R64i/R64ui image format, not sampled type (PR #203005)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 8 08:57:47 PDT 2026
https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/203005
>From 54ccc7cd7ab2829647e97ed5448cd72d24afefcb Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 10 Jun 2026 16:40:54 +0200
Subject: [PATCH 1/4] [SPIR-V] Tie Int64ImageEXT to R64i/R64ui image format,
not sampled type
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
---
llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 10 ----------
.../lib/Target/SPIRV/SPIRVSymbolicOperands.td | 4 +++-
.../SPV_EXT_shader_image_int64/image_int64.ll | 20 +++++++++++++++++++
.../bindless_images_generic.ll | 13 ++++++------
4 files changed, 30 insertions(+), 17 deletions(-)
create mode 100644 llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_shader_image_int64/image_int64.ll
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
>From 3c522abbd794a5d3a241d8b5586b5021ff46e0d2 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <gooddoog at student.su>
Date: Mon, 15 Jun 2026 14:29:51 +0200
Subject: [PATCH 2/4] Apply suggestion from @aobolensk
---
.../SPV_INTEL_bindless_images/bindless_images_generic.ll | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
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 5cc63f550f750..6138b9597a554 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,9 +1,6 @@
; 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 %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 %}
+; 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 %}
; CHECK-ERROR: LLVM ERROR: OpConvertHandleTo[Image/Sampler/SampledImage]INTEL instruction
; CHECK-ERROR-SAME: require the following SPIR-V extension: SPV_INTEL_bindless_images
>From d7c14a7cca6c2851fd989e09554a5666a12e860e Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Mon, 15 Jun 2026 18:17:30 +0200
Subject: [PATCH 3/4] Address review comment
---
llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
index 67886b2344065..59f1907764c0f 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], [Shader]>;
+defm Int64ImageEXT : CapabilityOperand<5016, 0, 0, [SPV_EXT_shader_image_int64], []>;
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]>;
>From 5533365205cb1008a6b18a4de6578f3fa2a95f99 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Tue, 30 Jun 2026 12:44:05 +0200
Subject: [PATCH 4/4] revert change
---
llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
index 59f1907764c0f..7da57bc1b2d47 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], []>;
+defm Int64ImageEXT : CapabilityOperand<5016, 0, 0, [SPV_EXT_shader_image_int64], [Int64]>;
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]>;
More information about the llvm-commits
mailing list