[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