[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