Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / lower-control-flow-live-intervals.mir
blobf6233ab45c9f82296581daa889b6978b325a3f74
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2 # RUN: llc -run-pass=liveintervals -run-pass=si-lower-control-flow -mtriple=amdgcn--amdpal -mcpu=gfx1030 -verify-machineinstrs -o - %s | FileCheck %s
4 # Check that verifier passes for the following.
6 # Caused: Live segment doesn't end at a valid instruction
7 ---
8 name:            _amdgpu_cs_main1
9 tracksRegLiveness: true
10 body:             |
11   ; CHECK-LABEL: name: _amdgpu_cs_main1
12   ; CHECK: bb.0:
13   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
14   ; CHECK-NEXT:   liveins: $vgpr0
15   ; CHECK-NEXT: {{  $}}
16   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
17   ; CHECK-NEXT:   [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_32 = V_CMP_NE_U32_e64 0, [[COPY]], implicit $exec
18   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_32 = COPY $exec_lo, implicit-def $exec_lo
19   ; CHECK-NEXT:   [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY1]], [[V_CMP_NE_U32_e64_]], implicit-def dead $scc
20   ; CHECK-NEXT:   [[S_XOR_B32_:%[0-9]+]]:sreg_32 = S_XOR_B32 [[S_AND_B32_]], [[COPY1]], implicit-def dead $scc
21   ; CHECK-NEXT:   $exec_lo = S_MOV_B32_term [[S_AND_B32_]]
22   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
23   ; CHECK-NEXT:   S_BRANCH %bb.2
24   ; CHECK-NEXT: {{  $}}
25   ; CHECK-NEXT: bb.1:
26   ; CHECK-NEXT:   $exec_lo = S_OR_B32 $exec_lo, %3, implicit-def $scc
27   ; CHECK-NEXT:   S_ENDPGM 0
28   ; CHECK-NEXT: {{  $}}
29   ; CHECK-NEXT: bb.2:
30   ; CHECK-NEXT:   successors: %bb.3(0x80000000)
31   ; CHECK-NEXT: {{  $}}
32   ; CHECK-NEXT: {{  $}}
33   ; CHECK-NEXT: bb.3:
34   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.1(0x40000000)
35   ; CHECK-NEXT: {{  $}}
36   ; CHECK-NEXT:   [[S_OR_SAVEEXEC_B32_:%[0-9]+]]:sreg_32 = S_OR_SAVEEXEC_B32 [[S_XOR_B32_]], implicit-def $exec, implicit-def $scc, implicit $exec
37   ; CHECK-NEXT:   [[S_AND_B32_1:%[0-9]+]]:sreg_32 = S_AND_B32 $exec_lo, [[S_OR_SAVEEXEC_B32_]], implicit-def $scc
38   ; CHECK-NEXT:   $exec_lo = S_XOR_B32_term $exec_lo, [[S_AND_B32_1]], implicit-def $scc
39   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
40   ; CHECK-NEXT:   S_BRANCH %bb.4
41   ; CHECK-NEXT: {{  $}}
42   ; CHECK-NEXT: bb.4:
43   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
44   ; CHECK-NEXT: {{  $}}
45   ; CHECK-NEXT:   S_BRANCH %bb.1
46   bb.0:
47     successors: %bb.2(0x40000000), %bb.3(0x40000000)
48     liveins: $vgpr0
50     %2:vgpr_32 = COPY killed $vgpr0
51     %6:sreg_32 = V_CMP_NE_U32_e64 0, killed %2, implicit $exec
52     %0:sreg_32 = SI_IF killed %6, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
53     S_BRANCH %bb.2
55   bb.1:
56     SI_END_CF killed %1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
57     S_ENDPGM 0
59   bb.2:
60     successors: %bb.3(0x80000000)
63   bb.3:
64     successors: %bb.4(0x40000000), %bb.1(0x40000000)
66     %1:sreg_32 = SI_ELSE killed %0, %bb.1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
67     S_BRANCH %bb.4
69   bb.4:
70     successors: %bb.1(0x80000000)
72     S_BRANCH %bb.1
74 ...
76 # Caused: Assertion `itr != mi2iMap.end() && "Instruction not in maps."' failed.
77 ---
78 name:            _amdgpu_cs_main2
79 tracksRegLiveness: true
80 body:             |
81   ; CHECK-LABEL: name: _amdgpu_cs_main2
82   ; CHECK: bb.0:
83   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
84   ; CHECK-NEXT:   liveins: $vgpr0
85   ; CHECK-NEXT: {{  $}}
86   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
87   ; CHECK-NEXT:   [[V_CMP_GT_I32_e64_:%[0-9]+]]:sreg_32 = V_CMP_GT_I32_e64 1, [[COPY]], implicit $exec
88   ; CHECK-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 0
89   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_32 = COPY [[S_MOV_B32_]]
90   ; CHECK-NEXT: {{  $}}
91   ; CHECK-NEXT: bb.1:
92   ; CHECK-NEXT:   successors: %bb.2(0x04000000), %bb.1(0x7c000000)
93   ; CHECK-NEXT: {{  $}}
94   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:sreg_32 = COPY [[COPY1]]
95   ; CHECK-NEXT:   [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 $exec_lo, [[V_CMP_GT_I32_e64_]], implicit-def $scc
96   ; CHECK-NEXT:   [[S_OR_B32_:%[0-9]+]]:sreg_32 = S_OR_B32 [[S_AND_B32_]], [[COPY2]], implicit-def $scc
97   ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:sreg_32 = COPY [[S_OR_B32_]]
98   ; CHECK-NEXT:   $exec_lo = S_ANDN2_B32_term $exec_lo, [[S_OR_B32_]], implicit-def $scc
99   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
100   ; CHECK-NEXT:   S_BRANCH %bb.2
101   ; CHECK-NEXT: {{  $}}
102   ; CHECK-NEXT: bb.2:
103   ; CHECK-NEXT:   $exec_lo = S_OR_B32 $exec_lo, [[S_OR_B32_]], implicit-def $scc
104   ; CHECK-NEXT:   S_ENDPGM 0
105   bb.0:
106     successors: %bb.1(0x80000000)
107     liveins: $vgpr0
109     %4:vgpr_32 = COPY killed $vgpr0
110     %8:sreg_32 = V_CMP_GT_I32_e64 1, killed %4, implicit $exec
111     %6:sreg_32 = S_MOV_B32 0
112     %10:sreg_32 = COPY killed %6
114   bb.1:
115     successors: %bb.2(0x04000000), %bb.1(0x7c000000)
117     %1:sreg_32 = COPY killed %10
118     %2:sreg_32 = SI_IF_BREAK %8, killed %1, implicit-def dead $scc
119     %10:sreg_32 = COPY %2
120     SI_LOOP %2, %bb.1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
121     S_BRANCH %bb.2
123   bb.2:
124     SI_END_CF killed %2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
125     S_ENDPGM 0
129 # Caused: Live range continues after kill flag
131 name:            _amdgpu_cs_main3
132 tracksRegLiveness: true
133 body:             |
134   ; CHECK-LABEL: name: _amdgpu_cs_main3
135   ; CHECK: bb.0:
136   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
137   ; CHECK-NEXT:   liveins: $vgpr0
138   ; CHECK-NEXT: {{  $}}
139   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
140   ; CHECK-NEXT:   [[V_CMP_NGT_F32_e64_:%[0-9]+]]:sreg_32 = nofpexcept V_CMP_NGT_F32_e64 0, 0, 0, [[COPY]], 0, implicit $mode, implicit $exec
141   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_32 = COPY $exec_lo, implicit-def $exec_lo
142   ; CHECK-NEXT:   [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY1]], [[V_CMP_NGT_F32_e64_]], implicit-def dead $scc
143   ; CHECK-NEXT:   $exec_lo = S_MOV_B32_term [[S_AND_B32_]]
144   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
145   ; CHECK-NEXT:   S_BRANCH %bb.1
146   ; CHECK-NEXT: {{  $}}
147   ; CHECK-NEXT: bb.1:
148   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)
149   ; CHECK-NEXT: {{  $}}
150   ; CHECK-NEXT:   [[V_CMP_NLT_F32_e64_:%[0-9]+]]:sreg_32 = nofpexcept V_CMP_NLT_F32_e64 0, 0, 0, [[COPY]], 0, implicit $mode, implicit $exec
151   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:sreg_32 = COPY $exec_lo, implicit-def $exec_lo
152   ; CHECK-NEXT:   [[S_AND_B32_1:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY2]], [[V_CMP_NLT_F32_e64_]], implicit-def dead $scc
153   ; CHECK-NEXT:   $exec_lo = S_MOV_B32_term [[S_AND_B32_1]]
154   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
155   ; CHECK-NEXT:   S_BRANCH %bb.2
156   ; CHECK-NEXT: {{  $}}
157   ; CHECK-NEXT: bb.2:
158   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
159   ; CHECK-NEXT: {{  $}}
160   ; CHECK-NEXT: {{  $}}
161   ; CHECK-NEXT: bb.4:
162   ; CHECK-NEXT:   $exec_lo = S_OR_B32 $exec_lo, [[COPY1]], implicit-def $scc
163   ; CHECK-NEXT:   S_ENDPGM 0
164   bb.0:
165     successors: %bb.1(0x40000000), %bb.4(0x40000000)
166     liveins: $vgpr0
168     %2:vgpr_32 = COPY killed $vgpr0
169     %5:sreg_32 = nofpexcept V_CMP_NGT_F32_e64 0, 0, 0, %2, 0, implicit $mode, implicit $exec
170     %0:sreg_32 = SI_IF killed %5, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
171     S_BRANCH %bb.1
173   bb.1:
174     successors: %bb.2(0x40000000), %bb.3(0x40000000)
176     %7:sreg_32 = nofpexcept V_CMP_NLT_F32_e64 0, 0, 0, killed %2, 0, implicit $mode, implicit $exec
177     %1:sreg_32 = SI_IF killed %7, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
178     S_BRANCH %bb.2
180   bb.2:
181     successors: %bb.3(0x80000000)
184   bb.3:
185     successors: %bb.4(0x80000000)
187     SI_END_CF killed %1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
189   bb.4:
190     SI_END_CF killed %0, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
191     S_ENDPGM 0
195 # Caused: Live range continues after dead def flag
197 name:            _amdgpu_cs_main4
198 tracksRegLiveness: true
199 body:             |
200   ; CHECK-LABEL: name: _amdgpu_cs_main4
201   ; CHECK: bb.0:
202   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.5(0x40000000)
203   ; CHECK-NEXT:   liveins: $vgpr0
204   ; CHECK-NEXT: {{  $}}
205   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
206   ; CHECK-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 0
207   ; CHECK-NEXT:   [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_32 = V_CMP_NE_U32_e64 0, [[COPY]], implicit $exec
208   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_32 = COPY $exec_lo, implicit-def $exec_lo
209   ; CHECK-NEXT:   [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY1]], [[V_CMP_NE_U32_e64_]], implicit-def dead $scc
210   ; CHECK-NEXT:   $exec_lo = S_MOV_B32_term [[S_AND_B32_]]
211   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
212   ; CHECK-NEXT:   S_BRANCH %bb.1
213   ; CHECK-NEXT: {{  $}}
214   ; CHECK-NEXT: bb.1:
215   ; CHECK-NEXT:   successors: %bb.6(0x80000000)
216   ; CHECK-NEXT: {{  $}}
217   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:sreg_32 = COPY $exec_lo
218   ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:sreg_32 = COPY [[COPY2]]
219   ; CHECK-NEXT:   [[COPY4:%[0-9]+]]:sreg_32 = COPY [[S_MOV_B32_]]
220   ; CHECK-NEXT:   [[COPY5:%[0-9]+]]:sreg_32 = COPY [[COPY3]]
221   ; CHECK-NEXT:   S_BRANCH %bb.6
222   ; CHECK-NEXT: {{  $}}
223   ; CHECK-NEXT: bb.2:
224   ; CHECK-NEXT:   successors: %bb.5(0x80000000)
225   ; CHECK-NEXT: {{  $}}
226   ; CHECK-NEXT:   [[REG_SEQUENCE:%[0-9]+]]:sgpr_128 = REG_SEQUENCE %9, %subreg.sub0, %9, %subreg.sub1, %9, %subreg.sub2, %9, %subreg.sub3
227   ; CHECK-NEXT:   [[COPY6:%[0-9]+]]:vgpr_32 = COPY %11
228   ; CHECK-NEXT:   BUFFER_ATOMIC_ADD_OFFSET [[COPY6]], [[REG_SEQUENCE]], 0, 0, 0, implicit $exec :: (volatile dereferenceable load store (s32), align 1, addrspace 8)
229   ; CHECK-NEXT:   S_BRANCH %bb.5
230   ; CHECK-NEXT: {{  $}}
231   ; CHECK-NEXT: bb.4:
232   ; CHECK-NEXT:   S_ENDPGM 0
233   ; CHECK-NEXT: {{  $}}
234   ; CHECK-NEXT: bb.5:
235   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
236   ; CHECK-NEXT: {{  $}}
237   ; CHECK-NEXT:   $exec_lo = S_OR_B32 $exec_lo, [[COPY1]], implicit-def $scc
238   ; CHECK-NEXT:   S_BRANCH %bb.4
239   ; CHECK-NEXT: {{  $}}
240   ; CHECK-NEXT: bb.6:
241   ; CHECK-NEXT:   successors: %bb.7(0x04000000), %bb.6(0x7c000000)
242   ; CHECK-NEXT: {{  $}}
243   ; CHECK-NEXT:   [[COPY7:%[0-9]+]]:sreg_32 = COPY [[COPY4]]
244   ; CHECK-NEXT:   [[COPY8:%[0-9]+]]:sreg_32 = COPY [[COPY5]]
245   ; CHECK-NEXT:   [[S_FF1_I32_B32_:%[0-9]+]]:sreg_32 = S_FF1_I32_B32 [[COPY8]]
246   ; CHECK-NEXT:   [[V_READLANE_B32_:%[0-9]+]]:sreg_32 = V_READLANE_B32 [[COPY]], [[S_FF1_I32_B32_]]
247   ; CHECK-NEXT:   [[S_ADD_I32_:%[0-9]+]]:sreg_32 = S_ADD_I32 [[COPY7]], [[V_READLANE_B32_]], implicit-def dead $scc
248   ; CHECK-NEXT:   [[S_LSHL_B32_:%[0-9]+]]:sreg_32 = S_LSHL_B32 1, [[S_FF1_I32_B32_]], implicit-def dead $scc
249   ; CHECK-NEXT:   [[S_ANDN2_B32_:%[0-9]+]]:sreg_32 = S_ANDN2_B32 [[COPY8]], [[S_LSHL_B32_]], implicit-def dead $scc
250   ; CHECK-NEXT:   S_CMP_LG_U32 [[S_ANDN2_B32_]], 0, implicit-def $scc
251   ; CHECK-NEXT:   [[COPY9:%[0-9]+]]:sreg_32 = COPY [[S_ADD_I32_]]
252   ; CHECK-NEXT:   [[COPY9:%[0-9]+]]:sreg_32 = COPY [[S_ANDN2_B32_]]
253   ; CHECK-NEXT:   S_CBRANCH_SCC1 %bb.6, implicit killed $scc
254   ; CHECK-NEXT:   S_BRANCH %bb.7
255   ; CHECK-NEXT: {{  $}}
256   ; CHECK-NEXT: bb.7:
257   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
258   ; CHECK-NEXT: {{  $}}
259   ; CHECK-NEXT:   [[S_MOV_B32_1:%[0-9]+]]:sreg_32 = S_MOV_B32 0
260   ; CHECK-NEXT:   [[V_MBCNT_LO_U32_B32_e64_:%[0-9]+]]:vgpr_32 = V_MBCNT_LO_U32_B32_e64 [[COPY2]], 0, implicit $exec
261   ; CHECK-NEXT:   [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_32 = V_CMP_EQ_U32_e64 0, [[V_MBCNT_LO_U32_B32_e64_]], implicit $exec
262   ; CHECK-NEXT:   [[COPY9:%[0-9]+]]:sreg_32 = COPY $exec_lo, implicit-def $exec_lo
263   ; CHECK-NEXT:   [[S_AND_B32_1:%[0-9]+]]:sreg_32 = S_AND_B32 [[COPY9]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc
264   ; CHECK-NEXT:   dead [[S_XOR_B32_:%[0-9]+]]:sreg_32 = S_XOR_B32 [[S_AND_B32_1]], [[COPY9]], implicit-def dead $scc
265   ; CHECK-NEXT:   $exec_lo = S_MOV_B32_term [[S_AND_B32_1]]
266   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
267   ; CHECK-NEXT:   S_BRANCH %bb.2
268   bb.0:
269     successors: %bb.1(0x40000000), %bb.5(0x40000000)
270     liveins: $vgpr0
272     %8:vgpr_32 = COPY killed $vgpr0
273     %10:sreg_32 = S_MOV_B32 0
274     %11:sreg_32 = V_CMP_NE_U32_e64 0, %8, implicit $exec
275     %0:sreg_32 = SI_IF killed %11, %bb.5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
276     S_BRANCH %bb.1
278   bb.1:
279     successors: %bb.6(0x80000000)
281     %13:sreg_32 = COPY $exec_lo
282     %1:sreg_32 = COPY %13
283     %25:sreg_32 = COPY killed %10
284     %26:sreg_32 = COPY killed %1
285     S_BRANCH %bb.6
287   bb.2:
288     successors: %bb.3(0x80000000)
290     %23:sgpr_128 = REG_SEQUENCE killed %19, %subreg.sub0, %19, %subreg.sub1, %19, %subreg.sub2, %19, %subreg.sub3
291     %24:vgpr_32 = COPY killed %4
292     BUFFER_ATOMIC_ADD_OFFSET killed %24, killed %23, 0, 0, 0, implicit $exec :: (volatile dereferenceable load store (s32), align 1, addrspace 8)
294   bb.3:
295     successors: %bb.5(0x80000000)
297     SI_END_CF killed %7, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
298     S_BRANCH %bb.5
300   bb.4:
301     S_ENDPGM 0
303   bb.5:
304     successors: %bb.4(0x80000000)
306     SI_END_CF killed %0, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
307     S_BRANCH %bb.4
309   bb.6:
310     successors: %bb.7(0x04000000), %bb.6(0x7c000000)
312     %2:sreg_32 = COPY killed %25
313     %3:sreg_32 = COPY killed %26
314     %14:sreg_32 = S_FF1_I32_B32 %3
315     %15:sreg_32 = V_READLANE_B32 %8, %14
316     %4:sreg_32 = S_ADD_I32 killed %2, killed %15, implicit-def dead $scc
317     %17:sreg_32 = S_LSHL_B32 1, killed %14, implicit-def dead $scc
318     %5:sreg_32 = S_ANDN2_B32 killed %3, killed %17, implicit-def dead $scc
319     S_CMP_LG_U32 %5, 0, implicit-def $scc
320     %25:sreg_32 = COPY %4
321     %26:sreg_32 = COPY killed %5
322     S_CBRANCH_SCC1 %bb.6, implicit killed $scc
323     S_BRANCH %bb.7
325   bb.7:
326     successors: %bb.2(0x40000000), %bb.3(0x40000000)
328     %19:sreg_32 = S_MOV_B32 0
329     %20:vgpr_32 = V_MBCNT_LO_U32_B32_e64 killed %13, 0, implicit $exec
330     %21:sreg_32 = V_CMP_EQ_U32_e64 0, killed %20, implicit $exec
331     %7:sreg_32 = SI_IF killed %21, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
332     S_BRANCH %bb.2