[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