Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / coalescer-early-clobber-subreg.mir
blob45c8a98f3dcbc336dc3c03338f630670d42a9ca4
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -march=amdgcn -verify-machineinstrs -run-pass=register-coalescer -o - %s | FileCheck %s
4 # Test used to crash with message:
5 # JoinVals::computeAssignment(unsigned int, (anonymous namespace)::JoinVals &): Assertion `Assignments[ValNo] != -1 && "Bad recursion?"' failed.
7 # The issue was with processing two operands are parts of the same reg and are
8 # used in the same instruction (e.g. inline asm): first is "def early-clobber",
9 # while the other is just "def".
10 # Register coalescer ran in bad recursion if the early clobbered subreg is
11 # second in the following sequence of COPYs.
13 ---
14 name:            foo1
15 tracksRegLiveness: true
16 body:             |
17   bb.0:
18     liveins: $vgpr0_vgpr1
20     ; CHECK-LABEL: name: foo1
21     ; CHECK: liveins: $vgpr0_vgpr1
22     ; CHECK-NEXT: {{  $}}
23     ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef %2.sub0, 1835019 /* regdef-ec:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef early-clobber %2.sub1
24     ; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
25     ; CHECK-NEXT: S_ENDPGM 0
26     INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VGPR_32 */, def %0:vgpr_32, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %1:vgpr_32
27     undef %2.sub0:vreg_64 = COPY killed %0
28     %2.sub1:vreg_64 = COPY killed %1
29     FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
30     S_ENDPGM 0
32 ...
34 ---
35 name:            foo2
36 tracksRegLiveness: true
37 body:             |
38   bb.0:
39     liveins: $vgpr0_vgpr1
41     ; CHECK-LABEL: name: foo2
42     ; CHECK: liveins: $vgpr0_vgpr1
43     ; CHECK-NEXT: {{  $}}
44     ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef early-clobber %2.sub1, 1835018 /* regdef:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef %2.sub0
45     ; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
46     ; CHECK-NEXT: S_ENDPGM 0
47     INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %1:vgpr_32, 1835018 /* regdef:VGPR_32 */, def %0:vgpr_32
48     undef %2.sub0:vreg_64 = COPY killed %0
49     %2.sub1:vreg_64 = COPY killed %1
50     FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
51     S_ENDPGM 0
53 ...
55 ---
56 name:            foo3
57 tracksRegLiveness: true
58 body:             |
59   bb.0:
60     liveins: $vgpr0_vgpr1
62     ; CHECK-LABEL: name: foo3
63     ; CHECK: liveins: $vgpr0_vgpr1
64     ; CHECK-NEXT: {{  $}}
65     ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef %2.sub0, 1835019 /* regdef-ec:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef early-clobber %2.sub1
66     ; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
67     ; CHECK-NEXT: S_ENDPGM 0
68     INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VGPR_32 */, def %1:vgpr_32, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %0:vgpr_32
69     undef %2.sub0:vreg_64 = COPY killed %1
70     %2.sub1:vreg_64 = COPY killed %0
71     FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
72     S_ENDPGM 0
74 ...
76 ---
77 name:            foo4
78 tracksRegLiveness: true
79 body:             |
80   bb.0:
81     liveins: $vgpr0_vgpr1
83     ; CHECK-LABEL: name: foo4
84     ; CHECK: liveins: $vgpr0_vgpr1
85     ; CHECK-NEXT: {{  $}}
86     ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef early-clobber %2.sub1, 1835018 /* regdef:VS_16_and_SReg_1_with_lo16_in_TTMP_LO16 */, def undef %2.sub0
87     ; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
88     ; CHECK-NEXT: S_ENDPGM 0
89     INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %0:vgpr_32, 1835018 /* regdef:VGPR_32 */, def %1:vgpr_32
90     undef %2.sub0:vreg_64 = COPY killed %1
91     %2.sub1:vreg_64 = COPY killed %0
92     FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
93     S_ENDPGM 0
95 ...