[llvm] [Matrix][InstCombine] Collapse inverse Transposes (PR #224172)

Farzon Lotfi via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 17 10:10:24 PDT 2026


================
@@ -0,0 +1,50 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
+
+define <6 x float> @inverse_transposes_float(<6 x float> %matrix) {
+; CHECK-LABEL: define <6 x float> @inverse_transposes_float(
+; CHECK-SAME: <6 x float> [[MATRIX:%.*]]) {
+; CHECK-NEXT:    ret <6 x float> [[MATRIX]]
+;
+  %transpose = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> %matrix, i32 2, i32 3)
+  %result = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> %transpose, i32 3, i32 2)
+  ret <6 x float> %result
+}
+
+define <6 x i32> @inverse_transposes_integer(<6 x i32> %matrix) {
+; CHECK-LABEL: define <6 x i32> @inverse_transposes_integer(
+; CHECK-SAME: <6 x i32> [[MATRIX:%.*]]) {
+; CHECK-NEXT:    ret <6 x i32> [[MATRIX]]
+;
+  %transpose = call <6 x i32> @llvm.matrix.transpose.v6i32(<6 x i32> %matrix, i32 2, i32 3)
+  %result = call <6 x i32> @llvm.matrix.transpose.v6i32(<6 x i32> %transpose, i32 3, i32 2)
+  ret <6 x i32> %result
+}
+
+define <6 x float> @inverse_transposes_shared_inner_use(<6 x float> %matrix, ptr %ptr) {
+; CHECK-LABEL: define <6 x float> @inverse_transposes_shared_inner_use(
+; CHECK-SAME: <6 x float> [[MATRIX:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[TRANSPOSE:%.*]] = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> [[MATRIX]], i32 2, i32 3)
+; CHECK-NEXT:    store <6 x float> [[TRANSPOSE]], ptr [[PTR]], align 32
+; CHECK-NEXT:    ret <6 x float> [[MATRIX]]
+;
+  %transpose = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> %matrix, i32 2, i32 3)
+  store <6 x float> %transpose, ptr %ptr
+  %result = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> %transpose, i32 3, i32 2)
+  ret <6 x float> %result
+}
+
+define <6 x float> @non_inverse_transposes(<6 x float> %matrix) {
+; CHECK-LABEL: define <6 x float> @non_inverse_transposes(
+; CHECK-SAME: <6 x float> [[MATRIX:%.*]]) {
+; CHECK-NEXT:    [[TRANSPOSE:%.*]] = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> [[MATRIX]], i32 1, i32 6)
+; CHECK-NEXT:    [[RESULT:%.*]] = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> [[TRANSPOSE]], i32 3, i32 2)
+; CHECK-NEXT:    ret <6 x float> [[RESULT]]
+;
+  %transpose = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> %matrix, i32 1, i32 6)
+  %result = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> %transpose, i32 3, i32 2)
+  ret <6 x float> %result
+}
+
+declare <6 x float> @llvm.matrix.transpose.v6f32(<6 x float>, i32 immarg, i32 immarg)
+declare <6 x i32> @llvm.matrix.transpose.v6i32(<6 x i32>, i32 immarg, i32 immarg)
----------------
farzonl wrote:

but `utils/update_test_checks.py` is just going to add them back...

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


More information about the llvm-commits mailing list