[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