[llvm] [SPIR-V] Lower 1xN/Nx1 matrix transpose to a copy (PR #201332)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 3 04:52:42 PDT 2026
https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/201332
None
>From a6d0bcfdc1a249be654245d51d2c786e5810e1f0 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 3 Jun 2026 13:52:08 +0200
Subject: [PATCH] [SPIR-V] Lower 1xN/Nx1 matrix transpose to a copy
---
llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 3 ++-
.../CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll | 8 ++++++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 279c9e438f6a8..c774b873b95a5 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -227,7 +227,8 @@ void SPIRVCombinerHelper::applyMatrixTranspose(MachineInstr &MI) const {
Builder.setInstrAndDebugLoc(MI);
- if (Rows == 1 && Cols == 1) {
+ // A 1xN or Nx1 transpose is a pure reshape.
+ if (Rows == 1 || Cols == 1) {
Builder.buildCopy(ResReg, InReg);
MI.eraseFromParent();
return;
diff --git a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll
index 3b746c68b97ff..23479a7f4f9c4 100644
--- a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll
+++ b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/matrix-transpose.ll
@@ -74,7 +74,9 @@ define internal void @test_transpose_f32_2x3() {
; Test Transpose 1x4 float (Result is 4x1 float), should be a copy (vector of 4 floats)
; CHECK-LABEL: ; -- Begin function test_transpose_f32_1x4_to_4x1
-; CHECK: %[[Shuffle:[0-9]+]] = OpVectorShuffle %[[V4F32_ID]] {{.*}} 0 1 2 3
+; CHECK-COUNT-4: OpCompositeInsert %[[V4F32_ID]]
+; CHECK-NOT: OpVectorShuffle
+; CHECK-COUNT-4: OpCompositeExtract %[[Float_ID]]
define internal void @test_transpose_f32_1x4_to_4x1() {
%1 = load <4 x float>, ptr addrspace(10) @private_v4f32
%2 = call <4 x float> @llvm.matrix.transpose.v4f32.i32(<4 x float> %1, i32 1, i32 4)
@@ -84,7 +86,9 @@ define internal void @test_transpose_f32_1x4_to_4x1() {
; Test Transpose 4x1 float (Result is 1x4 float), should be a copy (vector of 4 floats)
; CHECK-LABEL: ; -- Begin function test_transpose_f32_4x1_to_1x4
-; CHECK: %[[Shuffle:[0-9]+]] = OpVectorShuffle %[[V4F32_ID]] {{.*}} 0 1 2 3
+; CHECK-COUNT-4: OpCompositeInsert %[[V4F32_ID]]
+; CHECK-NOT: OpVectorShuffle
+; CHECK-COUNT-4: OpCompositeExtract %[[Float_ID]]
define internal void @test_transpose_f32_4x1_to_1x4() {
%1 = load <4 x float>, ptr addrspace(10) @private_v4f32
%2 = call <4 x float> @llvm.matrix.transpose.v4f32.i32(<4 x float> %1, i32 4, i32 1)
More information about the llvm-commits
mailing list