[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