[llvm] [SPIRV] Only emit MaxByteOffset decoration for SPIR-V 1.1 or later (PR #228973)
Alexander Shaposhnikov via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 4 21:54:01 PDT 2026
https://github.com/alexander-shaposhnikov created https://github.com/llvm/llvm-project/pull/228973
The MaxByteOffset decoration (45) was introduced in SPIR-V 1.1.
Guard the MaxByteOffset decoration emission in lowerFormalArguments on ST->isAtLeastSPIRVVer(VersionTuple(1, 1)), matching SPIRV-LLVM-Translator.
>From de5bbf150d27f7dc46c57c1cb58ee933137b4d87 Mon Sep 17 00:00:00 2001
From: Alexander Shaposhnikov <ashaposhnikov at google.com>
Date: Sun, 4 Oct 2026 21:44:33 -0700
Subject: [PATCH] [SPIRV] Only emit MaxByteOffset decoration for SPIR-V 1.1 or
later
The MaxByteOffset decoration (45) was introduced in SPIR-V 1.1. Emitting
it for dereferenceable pointer arguments when targeting SPIR-V 1.0
produces modules rejected by spirv-val with:
2nd operand of Decorate: operand MaxByteOffset(45) requires SPIR-V version 1.1 or later
Guard the MaxByteOffset decoration emission in lowerFormalArguments on
ST->isAtLeastSPIRVVer(VersionTuple(1, 1)), matching SPIRV-LLVM-Translator.
---
llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 2 +-
.../SPIRV/transcoding/DecorationMaxByteOffset.ll | 11 ++++++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
index 330704d0f885779..f46c7c663999def 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
@@ -268,7 +268,7 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
buildOpName(VRegs[i][0], Arg.getName(), MIRBuilder);
if (isPointerTyOrWrapper(Arg.getType())) {
auto DerefBytes = static_cast<unsigned>(Arg.getDereferenceableBytes());
- if (DerefBytes != 0)
+ if (DerefBytes != 0 && ST->isAtLeastSPIRVVer(VersionTuple(1, 1)))
buildOpDecorate(VRegs[i][0], MIRBuilder,
SPIRV::Decoration::MaxByteOffset, {DerefBytes});
}
diff --git a/llvm/test/CodeGen/SPIRV/transcoding/DecorationMaxByteOffset.ll b/llvm/test/CodeGen/SPIRV/transcoding/DecorationMaxByteOffset.ll
index fec55c5c89a713f..cfc4127a7458db7 100644
--- a/llvm/test/CodeGen/SPIRV/transcoding/DecorationMaxByteOffset.ll
+++ b/llvm/test/CodeGen/SPIRV/transcoding/DecorationMaxByteOffset.ll
@@ -1,5 +1,11 @@
-; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64v1.1-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64v1.1-unknown-unknown %s -o - -filetype=obj | spirv-val --target-env spv1.1 %}
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32v1.0-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV_1_0
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32v1.0-unknown-unknown %s -o - -filetype=obj | spirv-val --target-env spv1.0 %}
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64v1.0-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV_1_0
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64v1.0-unknown-unknown %s -o - -filetype=obj | spirv-val --target-env spv1.0 %}
; CHECK-SPIRV: OpName %[[#PTR_ID:]] "ptr"
; CHECK-SPIRV: OpName %[[#PTR2_ID:]] "ptr2"
@@ -10,6 +16,9 @@
; CHECK-SPIRV: %[[#PTR_ID]] = OpFunctionParameter %[[#CHAR_PTR_T]]
; CHECK-SPIRV: %[[#PTR2_ID]] = OpFunctionParameter %[[#CHAR_PTR_T]]
+; CHECK-SPIRV_1_0-NOT: MaxByteOffset
+; CHECK-SPIRV_1_0: OpFunctionParameter
+
define spir_kernel void @worker(ptr addrspace(3) dereferenceable(12) %ptr) {
entry:
%ptr.addr = alloca ptr addrspace(3), align 4
More information about the llvm-commits
mailing list