[llvm] [SPIR-V] Fix legalized store of single-element vector to vector (PR #222253)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 9 00:11:42 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-spir-v

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>

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

---
Full diff: https://github.com/llvm/llvm-project/pull/222253.diff


2 Files Affected:

- (modified) llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp (+1-3) 
- (modified) llvm/test/CodeGen/SPIRV/passes/SPIRVLegalizePointerCast.ll (+10) 


``````````diff
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

``````````

</details>


https://github.com/llvm/llvm-project/pull/222253


More information about the llvm-commits mailing list