[llvm] [AArch64] Expand FORM_TRANSPOSED_REG_TUPLE to copies before regalloc (PR #207205)

Benjamin Maxwell via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 7 07:51:39 PDT 2026


================
@@ -0,0 +1,103 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -force-streaming -verify-machineinstrs -run-pass=aarch64-post-coalescer %s -o - | FileCheck %s
+# RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -enable-subreg-liveness -force-streaming -verify-machineinstrs -run-pass=aarch64-post-coalescer %s -o - | FileCheck %s
+
+---
+name:            expand_x4_tuples
+tracksRegLiveness: true
+isSSA: false
+body:             |
+  bb.0.entry:
+    ; CHECK-LABEL: name: expand_x4_tuples
+    ; CHECK: [[DEF:%[0-9]+]]:zpr4stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: [[DEF1:%[0-9]+]]:zpr4stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: [[DEF2:%[0-9]+]]:zpr4stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: [[DEF3:%[0-9]+]]:zpr4stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: undef [[COPY_INTO_TRANSPOSED_TUPLE:%[0-9]+]].zsub0:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub0, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE:%[0-9]+]].zsub1:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub0, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE:%[0-9]+]].zsub2:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF2]].zsub0, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE:%[0-9]+]].zsub3:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF3]].zsub0, 4
+    ; CHECK-NEXT: undef [[COPY_INTO_TRANSPOSED_TUPLE1:%[0-9]+]].zsub0:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub1, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE1:%[0-9]+]].zsub1:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub1, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE1:%[0-9]+]].zsub2:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF2]].zsub1, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE1:%[0-9]+]].zsub3:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF3]].zsub1, 4
+    ; CHECK-NEXT: undef [[COPY_INTO_TRANSPOSED_TUPLE2:%[0-9]+]].zsub0:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub2, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE2:%[0-9]+]].zsub1:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub2, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE2:%[0-9]+]].zsub2:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF2]].zsub2, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE2:%[0-9]+]].zsub3:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF3]].zsub2, 4
+    ; CHECK-NEXT: undef [[COPY_INTO_TRANSPOSED_TUPLE3:%[0-9]+]].zsub0:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub3, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE3:%[0-9]+]].zsub1:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub3, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE3:%[0-9]+]].zsub2:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF2]].zsub3, 4
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE3:%[0-9]+]].zsub3:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF3]].zsub3, 4
+    ; CHECK-NEXT: FAKE_USE implicit [[COPY_INTO_TRANSPOSED_TUPLE]], implicit [[COPY_INTO_TRANSPOSED_TUPLE1]], implicit [[COPY_INTO_TRANSPOSED_TUPLE2]], implicit [[COPY_INTO_TRANSPOSED_TUPLE3]]
+    ; CHECK-NEXT: RET_ReallyLR
+    %0:zpr4stridedorcontiguous = IMPLICIT_DEF
+    %1:zpr4stridedorcontiguous = IMPLICIT_DEF
+    %2:zpr4stridedorcontiguous = IMPLICIT_DEF
+    %3:zpr4stridedorcontiguous = IMPLICIT_DEF
+
+    %4:zpr4mul4 = FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO %0.zsub0, %1.zsub0, %2.zsub0, %3.zsub0
+    %5:zpr4mul4 = FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO %0.zsub1, %1.zsub1, %2.zsub1, %3.zsub1
+    %6:zpr4mul4 = FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO %0.zsub2, %1.zsub2, %2.zsub2, %3.zsub2
+    %7:zpr4mul4 = FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO %0.zsub3, %1.zsub3, %2.zsub3, %3.zsub3
+
+    FAKE_USE implicit %4, implicit %5, implicit %6, implicit %7
+    RET_ReallyLR
+...
+---
+name:            expand_x2_tuples
+tracksRegLiveness: true
+isSSA: false
+body:             |
+  bb.0.entry:
+    ; CHECK-LABEL: name: expand_x2_tuples
+    ; CHECK: [[DEF:%[0-9]+]]:zpr2stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: [[DEF1:%[0-9]+]]:zpr2stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: undef [[COPY_INTO_TRANSPOSED_TUPLE:%[0-9]+]].zsub0:zpr2 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub0, 2
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE:%[0-9]+]].zsub1:zpr2 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub0, 2
+    ; CHECK-NEXT: undef [[COPY_INTO_TRANSPOSED_TUPLE1:%[0-9]+]].zsub0:zpr2 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub1, 2
+    ; CHECK-NEXT: [[COPY_INTO_TRANSPOSED_TUPLE1:%[0-9]+]].zsub1:zpr2 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub1, 2
+    ; CHECK-NEXT: FAKE_USE implicit [[COPY_INTO_TRANSPOSED_TUPLE]], implicit [[COPY_INTO_TRANSPOSED_TUPLE1]]
+    ; CHECK-NEXT: RET_ReallyLR
+    %0:zpr2stridedorcontiguous = IMPLICIT_DEF
+    %1:zpr2stridedorcontiguous = IMPLICIT_DEF
+
+    %4:zpr2 = FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO %0.zsub0, %1.zsub0
+    %5:zpr2 = FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO %0.zsub1, %1.zsub1
+
+    FAKE_USE implicit %4, implicit %5
+    RET_ReallyLR
+...
+---
+name:            expand_tuple_set_kill_flag_on_last_copy
+tracksRegLiveness: true
+isSSA: false
+body:             |
+  bb.0.entry:
+    ; CHECK-LABEL: name: expand_tuple_set_kill_flag_on_last_copy
+    ; CHECK: [[DEF:%[0-9]+]]:zpr4stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: [[DEF1:%[0-9]+]]:zpr4stridedorcontiguous = IMPLICIT_DEF
+    ; CHECK-NEXT: undef %all_killed.zsub0:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub0, 4
+    ; CHECK-NEXT: %all_killed.zsub1:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub1, 4
+    ; CHECK-NEXT: %all_killed.zsub2:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF]].zsub2, 4
+    ; CHECK-NEXT: %all_killed.zsub3:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE killed [[DEF]].zsub3, 4
+    ; CHECK-NEXT: undef %first_killed.zsub0:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub0, 4
+    ; CHECK-NEXT: %first_killed.zsub1:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub1, 4
+    ; CHECK-NEXT: %first_killed.zsub2:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE [[DEF1]].zsub2, 4
+    ; CHECK-NEXT: %first_killed.zsub3:zpr4mul4 = COPY_INTO_TRANSPOSED_TUPLE killed [[DEF1]].zsub3, 4
+    ; CHECK-NEXT: FAKE_USE implicit %all_killed
+    ; CHECK-NEXT: RET_ReallyLR
+    %0:zpr4stridedorcontiguous = IMPLICIT_DEF
+    %1:zpr4stridedorcontiguous = IMPLICIT_DEF
+
+    ; Reuses %0 multiple times. All uses are marked as "killed".
+    ; Only the last copy in the expansion should have the "killed" flag.
+    %all_killed:zpr4mul4 = FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO killed %0.zsub0, killed %0.zsub1, killed %0.zsub2, killed %0.zsub3
+
+    ; Reuses %1 multiple times. Only the first use is marked as "killed".
+    ; Only the last copy in the expansion should have the "killed" flag.
+    %first_killed:zpr4mul4 = FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO killed %1.zsub0, %1.zsub1, %1.zsub2, %1.zsub3
+
+    FAKE_USE implicit %all_killed
+    RET_ReallyLR
+...
----------------
MacDue wrote:

Do you mean test flags other than `killed` are propagated? 

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


More information about the llvm-commits mailing list