xref: /llvm-project/llvm/test/CodeGen/PowerPC/ctrloops64.mir (revision f034c98af000f9b1d260bee036ecf653062e1e90)
1# RUN: llc -ppc-asm-full-reg-names -mtriple=powerpc64le-unknown-linux-gnu \
2# RUN:   -run-pass=ppc-ctrloops %s -o - -verify-machineinstrs | FileCheck %s
3# RUN: llc -ppc-asm-full-reg-names -mtriple=powerpc64-ibm-aix-xcoff \
4# RUN:   -run-pass=ppc-ctrloops %s -o - -verify-machineinstrs | FileCheck %s
5
6---
7name:            test_success1
8# CHECK: test_success1
9
10tracksRegLiveness: true
11body:             |
12  bb.0.entry:
13
14    %0:g8rc = LI8 2048
15    ; CHECK: MTCTR8loop
16    ; CHECK: BDNZ8
17    ; CHECK-NOT: ADDI8
18    ; CHECK-NOT: CMPLDI
19    ; CHECK-NOT: BC
20    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
21
22  bb.1:
23
24    %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
25    BC killed %1:crbitrc, %bb.1
26    B %bb.2
27
28  bb.2:
29
30    BLR8 implicit $lr8, implicit $rm
31...
32---
33name:            test_fail_clobber
34# CHECK: test_fail_clobber
35tracksRegLiveness: true
36body:             |
37  bb.0.entry:
38
39    %0:g8rc = LI8 2048
40    ; CHECK-NOT: MTCTR8loop
41    ; CHECK-NOT: BDNZ8
42    ; CHECK: ADDI8
43    ; CHECK: CMPLDI
44    ; CHECK: BC
45    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
46
47  bb.1:
48
49    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8
50    %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
51    BC killed %1:crbitrc, %bb.1
52    B %bb.2
53
54  bb.2:
55
56    BLR8 implicit $lr8, implicit $rm
57...
58---
59name:            test_fail_use_in_loop
60# CHECK: test_fail_use_in_loop
61tracksRegLiveness: true
62body:             |
63  bb.0.entry:
64
65    %0:g8rc = LI8 2048
66    ; CHECK-NOT: MTCTR8loop
67    ; CHECK-NOT: BDNZ8
68    ; CHECK: ADDI8
69    ; CHECK: CMPLDI
70    ; CHECK: BC
71    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
72
73  bb.1:
74
75    %1:g8rc = MFCTR8 implicit $ctr8
76    %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
77    BC killed %2:crbitrc, %bb.1
78    B %bb.2
79
80  bb.2:
81
82    BLR8 implicit $lr8, implicit $rm
83...
84---
85name:            test_fail_call_in_preheader_after_mtctr
86# CHECK: test_fail_call_in_preheader_after_mtctr
87tracksRegLiveness: true
88body:             |
89  bb.0.entry:
90
91    %0:g8rc = LI8 2048
92    ; CHECK-NOT: MTCTR8
93    ; CHECK-NOT: BDNZ8
94    ; CHECK: ADDI8
95    ; CHECK: CMPLDI
96    ; CHECK: BC
97    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
98    BL8 @test_fail_use_in_loop, csr_ppc64, implicit-def dead $lr8, implicit $rm
99
100  bb.1:
101
102    %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
103    BC killed %1:crbitrc, %bb.1
104    B %bb.2
105
106  bb.2:
107
108    BLR8 implicit $lr8, implicit $rm
109...
110---
111name:            test_succ_call_in_preheader_before_mtctr
112# CHECK: test_succ_call_in_preheader_before_mtctr
113tracksRegLiveness: true
114body:             |
115  bb.0.entry:
116
117    %0:g8rc = LI8 2048
118    BL8 @test_fail_use_in_loop, csr_ppc64, implicit-def dead $lr8, implicit $rm
119    ; CHECK: MTCTR8
120    ; CHECK: BDNZ8
121    ; CHECK-NOT: ADDI8
122    ; CHECK-NOT: CMPLDI
123    ; CHECK-NOT: BC
124    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
125
126  bb.1:
127
128    %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
129    BC killed %1:crbitrc, %bb.1
130    B %bb.2
131
132  bb.2:
133
134    BLR8 implicit $lr8, implicit $rm
135...
136---
137name:            test_fail_call_in_loop
138# CHECK: test_fail_call_in_loop
139tracksRegLiveness: true
140body:             |
141  bb.0.entry:
142
143    %0:g8rc = LI8 2048
144    ; CHECK-NOT: MTCTR8
145    ; CHECK-NOT: BDNZ8
146    ; CHECK: ADDI8
147    ; CHECK: CMPLDI
148    ; CHECK: BC
149    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
150
151  bb.1:
152
153    BL8 @test_fail_use_in_loop, csr_ppc64, implicit-def dead $lr8, implicit $rm
154    %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
155    BC killed %1:crbitrc, %bb.1
156    B %bb.2
157
158  bb.2:
159
160    BLR8 implicit $lr8, implicit $rm
161...
162---
163name:            test_fail_indirect_call_in_loop
164# CHECK: test_fail_indirect_call_in_loop
165tracksRegLiveness: true
166body:             |
167  bb.0.entry:
168    liveins: $x3, $x4
169
170    %0:g8rc = LI8 2048
171    ; CHECK-NOT: MTCTR8
172    ; CHECK-NOT: BDNZ8
173    ; CHECK: ADDI8
174    ; CHECK: CMPLDI
175    ; CHECK: BC
176    renamable %1:crrc = CMPLD killed renamable $x3, killed renamable $x4
177    renamable %2:crbitrc = COPY %1.sub_gt
178    MTLR8 %0:g8rc, implicit-def $lr8
179    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
180
181  bb.1:
182
183    BCLRL renamable %2, implicit $lr, implicit $rm
184    %3:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
185    BC killed %3:crbitrc, %bb.1
186    B %bb.2
187
188  bb.2:
189
190    BLR8 implicit $lr8, implicit $rm
191...
192---
193name:            test_fail_livein_preheader
194# CHECK: test_fail_livein_preheader
195tracksRegLiveness: true
196body:             |
197  bb.0.entry:
198    liveins: $ctr8
199
200    %0:g8rc = LI8 2048
201    ; CHECK-NOT: MTCTR8loop
202    ; CHECK-NOT: BDNZ8
203    ; CHECK: ADDI8
204    ; CHECK: CMPLDI
205    ; CHECK: BC
206    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
207
208  bb.1:
209
210    %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
211    BC killed %1:crbitrc, %bb.1
212    B %bb.2
213
214  bb.2:
215
216    BLR8 implicit $lr8, implicit $rm
217...
218---
219name:            test_fail_def_preheader
220# CHECK: test_fail_def_preheader
221tracksRegLiveness: true
222body:             |
223  bb.0.entry:
224
225    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8
226    %0:g8rc = LI8 2048
227    ; CHECK-NOT: MTCTR8loop
228    ; CHECK-NOT: BDNZ8
229    ; CHECK: ADDI8
230    ; CHECK: CMPLDI
231    ; CHECK: BC
232    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
233
234  bb.1:
235
236    %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
237    BC killed %1:crbitrc, %bb.1
238    B %bb.2
239
240  bb.2:
241
242    BLR8 implicit $lr8, implicit $rm
243...
244---
245name:            test_success_only_use_preheader
246# CHECK: test_success_only_use_preheader
247tracksRegLiveness: true
248body:             |
249  bb.0.entry:
250
251    %0:g8rc = MFCTR8 implicit $ctr8
252    %1:g8rc = LI8 2048
253    ; CHECK: MTCTR8loop
254    ; CHECK: BDNZ8
255    ; CHECK-NOT: ADDI8
256    ; CHECK-NOT: CMPLDI
257    ; CHECK-NOT: BC
258    MTCTR8loop killed %1:g8rc, implicit-def dead $ctr8
259
260  bb.1:
261
262    %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
263    BC killed %2:crbitrc, %bb.1
264    B %bb.2
265
266  bb.2:
267
268    BLR8 implicit $lr8, implicit $rm
269...
270---
271name:            test_fail_use_after_mtctr
272# CHECK: test_fail_use_after_mtctr
273tracksRegLiveness: true
274body:             |
275  bb.0.entry:
276
277    %0:g8rc = LI8 2048
278    ; CHECK-NOT: MTCTR8loop
279    ; CHECK-NOT: BDNZ8
280    ; CHECK: ADDI8
281    ; CHECK: CMPLDI
282    ; CHECK: BC
283    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
284    %1:g8rc = MFCTR8 implicit $ctr8
285
286  bb.1:
287
288    %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
289    BC killed %2:crbitrc, %bb.1
290    B %bb.2
291
292  bb.2:
293
294    BLR8 implicit $lr8, implicit $rm
295...
296---
297name:            test_fail_def_after_mtctr
298# CHECK: test_fail_def_after_mtctr
299tracksRegLiveness: true
300body:             |
301  bb.0.entry:
302
303    %0:g8rc = LI8 2048
304    ; CHECK-NOT: MTCTR8loop
305    ; CHECK-NOT: BDNZ8
306    ; CHECK: ADDI8
307    ; CHECK: CMPLDI
308    ; CHECK: BC
309    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
310    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8
311
312  bb.1:
313
314    %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
315    BC killed %2:crbitrc, %bb.1
316    B %bb.2
317
318  bb.2:
319
320    BLR8 implicit $lr8, implicit $rm
321...
322---
323name:            test_success_def_after_loop
324# CHECK: test_success_def_after_loop
325tracksRegLiveness: true
326body:             |
327  bb.0.entry:
328
329    %0:g8rc = LI8 2048
330    ; CHECK: MTCTR8loop
331    ; CHECK: BDNZ8
332    ; CHECK-NOT: ADDI8
333    ; CHECK-NOT: CMPLDI
334    ; CHECK-NOT: BC
335    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
336
337  bb.1:
338
339    %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
340    BC killed %2:crbitrc, %bb.1
341    B %bb.2
342
343  bb.2:
344    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8
345
346    BLR8 implicit $lr8, implicit $rm
347...
348---
349name:            test_fail_dead_def_in_preheader
350# CHECK: test_fail_dead_def_in_preheader
351tracksRegLiveness: true
352body:             |
353  bb.0.entry:
354
355    %0:g8rc = LI8 2048
356    %1:g8rc = LI8 1024
357    MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8
358    MTCTR8 killed %1:g8rc, implicit-def dead $ctr8
359    ; CHECK-NOT: MTCTR8loop
360    ; CHECK-NOT: BDNZ8
361    ; CHECK: ADDI8
362    ; CHECK: CMPLDI
363    ; CHECK: BC
364
365  bb.1:
366
367    %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
368    BC killed %2:crbitrc, %bb.1
369    B %bb.2
370
371  bb.2:
372
373    BLR8 implicit $lr8, implicit $rm
374...
375