[llvm] [SPIR-V] Fix legalized store of single-element vector to vector (PR #222253)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 9 00:11:06 PDT 2026
https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/222253
A `<1 x T>` shares its SPIR-V type with the scalar T, so extracting from it emits OpCompositeExtract on a non-composite, which is rejected by spirv-val
>From 8fab640f7b9f9c093223dc86b257d2c99259efdd Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 9 Sep 2026 09:10:11 +0200
Subject: [PATCH] [SPIR-V] Fix legalized store of single-element vector to
vector
A `<1 x T>` shares its SPIR-V type with the scalar T, so extracting from it emits OpCompositeExtract on a non-composite, which is rejected by spirv-val
---
llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp | 4 +---
.../CodeGen/SPIRV/passes/SPIRVLegalizePointerCast.ll | 10 ++++++++++
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp b/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp
index 228e975a3711c..0addccdff4784 100644
--- a/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp
@@ -707,11 +707,9 @@ class SPIRVLegalizePointerCastImpl {
LI->setAlignment(Alignment);
Value *OldValues = LI;
buildAssignType(B, OldValues->getType(), OldValues);
- Value *NewValues = Src;
for (unsigned I = 0; I < SrcType->getNumElements(); ++I) {
- Value *Element =
- makeExtractElement(B, SrcType->getElementType(), NewValues, I);
+ Value *Element = extractScalarFromVector(B, Src, I);
OldValues = makeInsertElement(B, OldValues, Element, I);
}
diff --git a/llvm/test/CodeGen/SPIRV/passes/SPIRVLegalizePointerCast.ll b/llvm/test/CodeGen/SPIRV/passes/SPIRVLegalizePointerCast.ll
index 59171011d72b2..114c8938d9971 100644
--- a/llvm/test/CodeGen/SPIRV/passes/SPIRVLegalizePointerCast.ll
+++ b/llvm/test/CodeGen/SPIRV/passes/SPIRVLegalizePointerCast.ll
@@ -75,6 +75,16 @@ entry:
ret void
}
+define spir_func void @narrowStore(<1 x float> %v) #0 {
+; CHECK-LABEL: define spir_func void @narrowStore(
+; CHECK-NOT: call {{.*}}@llvm.spv.ptrcast
+; CHECK: call float @llvm.spv.bitcast.f32.v1f32(<1 x float>
+; CHECK: call <4 x float> @llvm.spv.insertelt.v4f32.v4f32.f32.i32(<4 x float>
+entry:
+ store <1 x float> %v, ptr addrspace(10) @OUTV, align 4
+ ret void
+}
+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
@.str = private unnamed_addr constant [4 x i8] c"Buf\00", align 1
More information about the llvm-commits
mailing list