[llvm] [SPIR-V] Fix division by zero on byte addressing GEP into a subbyte array (PR #202593)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 9 05:37:03 PDT 2026
https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/202593
walkLogicalAccessChainConstant divided the byte offset by the element size which is zero for sub-byte element types ([N x i1])
>From e7891de25c4ee39fd99d9291e16254482626dde1 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Tue, 9 Jun 2026 14:35:22 +0200
Subject: [PATCH] [SPIR-V] Fix division by zero on byte addressing GEP into a
subbyte array
walkLogicalAccessChainConstant divided the byte offset by the element size which is zero for sub-byte element types ([N x i1])
---
llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp | 5 ++++-
.../pointers/getelementptr-subbyte-array.ll | 19 +++++++++++++++++++
2 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/SPIRV/pointers/getelementptr-subbyte-array.ll
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index 180084a65d5b0..1bb85dea2a546 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -790,7 +790,10 @@ bool SPIRVEmitIntrinsics::walkLogicalAccessChainConstant(
do {
if (ArrayType *AT = dyn_cast<ArrayType>(CurType)) {
- uint32_t EltTypeSize = DL.getTypeSizeInBits(AT->getElementType()) / 8;
+ TypeSize EltSizeBits = DL.getTypeSizeInBits(AT->getElementType());
+ if (EltSizeBits % 8 != 0)
+ return true;
+ uint32_t EltTypeSize = EltSizeBits / 8;
assert(Offset < AT->getNumElements() * EltTypeSize);
uint64_t Index = Offset / EltTypeSize;
Offset = Offset - (Index * EltTypeSize);
diff --git a/llvm/test/CodeGen/SPIRV/pointers/getelementptr-subbyte-array.ll b/llvm/test/CodeGen/SPIRV/pointers/getelementptr-subbyte-array.ll
new file mode 100644
index 0000000000000..2d6e1504cc85c
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/pointers/getelementptr-subbyte-array.ll
@@ -0,0 +1,19 @@
+; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+; CHECK-DAG: %[[#bool:]] = OpTypeBool
+; CHECK-DAG: %[[#int32:]] = OpTypeInt 32 0
+; CHECK-DAG: %[[#size:]] = OpConstant %[[#int32]] 8
+; CHECK-DAG: %[[#arr:]] = OpTypeArray %[[#bool]] %[[#size]]
+; CHECK-DAG: %[[#ptr:]] = OpTypePointer Function %[[#arr]]
+
+; CHECK: OpFunction
+; CHECK: OpVariable %[[#ptr]] Function
+
+ at global = internal global [8 x i1] zeroinitializer
+
+define void @foo() {
+entry:
+ %gep = getelementptr inbounds i8, ptr @global, i32 1
+ ret void
+}
More information about the llvm-commits
mailing list