[llvm] 2f79efa - [SPIR-V] Tie Int64ImageEXT to R64i/R64ui image format, not sampled type (#203005)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 9 08:08:06 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-07-09T17:08:01+02:00
New Revision: 2f79efa26e25e31f99baf4c860d8d58e833cb161

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

LOG: [SPIR-V] Tie Int64ImageEXT to R64i/R64ui image format, not sampled type (#203005)

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

Added: 
    llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_shader_image_int64/image_int64.ll

Modified: 
    llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
    llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
    llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_bindless_images/bindless_images_generic.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index 20df17214c876..2836a2cc43ef0 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
@@ -1172,16 +1172,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..7da57bc1b2d47 100644
--- a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
+++ b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
@@ -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..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,14 +1,12 @@
 ; 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: llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bindless_images %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 %}
 
 ; 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


        


More information about the llvm-commits mailing list