[llvm-branch-commits] [llvm] b395ca7 - [SPIR-V] Fix legalized load of single-element vector from array (#198330)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu May 28 00:00:55 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-05-26T19:16:58+02:00
New Revision: b395ca789219aedfe856fc89329840cbee9fae8d
URL: https://github.com/llvm/llvm-project/commit/b395ca789219aedfe856fc89329840cbee9fae8d
DIFF: https://github.com/llvm/llvm-project/commit/b395ca789219aedfe856fc89329840cbee9fae8d.diff
LOG: [SPIR-V] Fix legalized load of single-element vector from array (#198330)
Added:
Modified:
llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp
llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp b/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp
index 124c7d769254d..cb03dcae21ede 100644
--- a/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp
@@ -237,6 +237,16 @@ class SPIRVLegalizePointerCastImpl {
Value *
buildVectorFromLoadedElements(IRBuilder<> &B, FixedVectorType *TargetType,
SmallVector<Value *, 4> &LoadedElements) {
+ // <1 x T> shares the SPIR-V type with T, so emitting OpCompositeInsert on
+ // a scalar would be invalid. Bridge with spv_bitcast instead.
+ if (TargetType->getNumElements() == 1) {
+ Value *Scalar = LoadedElements[0];
+ Value *NewVector = B.CreateIntrinsic(
+ Intrinsic::spv_bitcast, {TargetType, Scalar->getType()}, {Scalar});
+ buildAssignType(B, TargetType, NewVector);
+ return NewVector;
+ }
+
// Build the vector from the loaded elements.
Value *NewVector = PoisonValue::get(TargetType);
buildAssignType(B, TargetType, NewVector);
diff --git a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll
index 3106d5d55ef77..3b746c68b97ff 100644
--- a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll
+++ b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll
@@ -93,13 +93,17 @@ define internal void @test_transpose_f32_4x1_to_1x4() {
}
; Test Transpose 1x1 float (Result is 1x1 float), should be a copy (scalar float)
-; TODO(171175): The SPIR-V backend does not seem to be legalizing single element vectors.
-; define internal void @test_transpose_f32_1x1() {
-; %1 = load <1 x float>, ptr addrspace(10) @private_v1f32
-; %2 = call <1 x float> @llvm.matrix.transpose.v1f32.i32(<1 x float> %1, i32 1, i32 1)
-; store <1 x float> %2, ptr addrspace(10) @private_v1f32
-; ret void
-; }
+; CHECK-LABEL: ; -- Begin function test_transpose_f32_1x1
+; CHECK: %[[AccessChain1x1:[0-9]+]] = OpAccessChain %[[_ptr_Float_ID]] %{{[0-9]+}} %{{[0-9]+}}
+; CHECK: %[[Load1x1:[0-9]+]] = OpLoad %[[Float_ID]] %[[AccessChain1x1]]
+; CHECK: %[[AccessChain1x1Store:[0-9]+]] = OpAccessChain %[[_ptr_Float_ID]] %{{[0-9]+}} %{{[0-9]+}}
+; CHECK: OpStore %[[AccessChain1x1Store]] %[[Load1x1]]
+define internal void @test_transpose_f32_1x1() {
+ %1 = load <1 x float>, ptr addrspace(10) @private_v1f32
+ %2 = call <1 x float> @llvm.matrix.transpose.v1f32.i32(<1 x float> %1, i32 1, i32 1)
+ store <1 x float> %2, ptr addrspace(10) @private_v1f32
+ ret void
+}
define void @main() #0 {
ret void
@@ -107,6 +111,6 @@ define void @main() #0 {
declare <4 x float> @llvm.matrix.transpose.v4f32.i32(<4 x float>, i32, i32)
declare <6 x float> @llvm.matrix.transpose.v6f32.i32(<6 x float>, i32, i32)
-; declare <1 x float> @llvm.matrix.transpose.v1f32.i32(<1 x float>, i32, i32)
+declare <1 x float> @llvm.matrix.transpose.v1f32.i32(<1 x float>, i32, i32)
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
More information about the llvm-branch-commits
mailing list