1# RUN: llc -ppc-asm-full-reg-names -mtriple=powerpc-ibm-aix-xcoff \
2# RUN:   -run-pass=ppc-ctrloops %s -o - -verify-machineinstrs | FileCheck %s
3
4---
5name:            test_success1
6# CHECK: test_success1
7
8tracksRegLiveness: true
9body:             |
10  bb.0.entry:
11
12    %0:gprc = LI 2048
13    ; CHECK: MTCTR
14    ; CHECK: BDNZ
15    ; CHECK-NOT: ADDI
16    ; CHECK-NOT: CMPLWI
17    ; CHECK-NOT: BC
18    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
19
20  bb.1:
21
22    %1:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
23    BC killed %1:crbitrc, %bb.1
24    B %bb.2
25
26  bb.2:
27
28    BLR implicit $lr, implicit $rm
29...
30---
31name:            test_fail_clobber
32# CHECK: test_fail_clobber
33tracksRegLiveness: true
34body:             |
35  bb.0.entry:
36
37    %0:gprc = LI 2048
38    ; CHECK-NOT: MTCTR
39    ; CHECK-NOT: BDNZ
40    ; CHECK: ADDI
41    ; CHECK: CMPLWI
42    ; CHECK: BC
43    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
44
45  bb.1:
46
47    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr
48    %1:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
49    BC killed %1:crbitrc, %bb.1
50    B %bb.2
51
52  bb.2:
53
54    BLR implicit $lr, implicit $rm
55...
56---
57name:            test_fail_use_in_loop
58# CHECK: test_fail_use_in_loop
59tracksRegLiveness: true
60body:             |
61  bb.0.entry:
62
63    %0:gprc = LI 2048
64    ; CHECK-NOT: MTCTR
65    ; CHECK-NOT: BDNZ
66    ; CHECK: ADDI
67    ; CHECK: CMPLWI
68    ; CHECK: BC
69    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
70
71  bb.1:
72
73    %1:gprc = MFCTR implicit $ctr
74    %2:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
75    BC killed %2:crbitrc, %bb.1
76    B %bb.2
77
78  bb.2:
79
80    BLR implicit $lr, implicit $rm
81...
82---
83name:            test_fail_call_in_loop
84# CHECK: test_fail_call_in_loop
85tracksRegLiveness: true
86body:             |
87  bb.0.entry:
88
89    %0:gprc = LI 2048
90    ; CHECK-NOT: MTCTR
91    ; CHECK-NOT: BDNZ
92    ; CHECK: ADDI
93    ; CHECK: CMPLWI
94    ; CHECK: BC
95    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
96
97  bb.1:
98
99    BL @test_fail_use_in_loop, csr_aix32, implicit-def dead $lr, implicit $rm
100    %1:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
101    BC killed %1:crbitrc, %bb.1
102    B %bb.2
103
104  bb.2:
105
106    BLR implicit $lr, implicit $rm
107...
108---
109name:            test_fail_indirect_call_in_loop
110# CHECK: test_fail_indirect_call_in_loop
111tracksRegLiveness: true
112body:             |
113  bb.0.entry:
114   liveins: $r3, $r4
115
116    %0:gprc = LI 2048
117    ; CHECK-NOT: MTCTR
118    ; CHECK-NOT: BDNZ
119    ; CHECK: ADDI
120    ; CHECK: CMPLWI
121    ; CHECK: BC
122    renamable %1:crrc = CMPLW killed renamable $r3, killed renamable $r4
123    renamable %2:crbitrc = COPY %1.sub_gt
124    MTLR %0:gprc, implicit-def $lr
125    MTCTRPseudo %0:gprc, implicit-def dead $ctr
126
127  bb.1:
128
129    BCLRL renamable %2, implicit $lr, implicit $rm
130    %3:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
131    BC killed %3:crbitrc, %bb.1
132    B %bb.2
133
134  bb.2:
135
136    BLR implicit $lr, implicit $rm
137...
138---
139name:            test_fail_livein_preheader
140# CHECK: test_fail_livein_preheader
141tracksRegLiveness: true
142body:             |
143  bb.0.entry:
144    liveins: $ctr
145
146    %0:gprc = LI 2048
147    ; CHECK-NOT: MTCTR
148    ; CHECK-NOT: BDNZ
149    ; CHECK: ADDI
150    ; CHECK: CMPLWI
151    ; CHECK: BC
152    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
153
154  bb.1:
155
156    %1:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
157    BC killed %1:crbitrc, %bb.1
158    B %bb.2
159
160  bb.2:
161
162    BLR implicit $lr, implicit $rm
163...
164---
165name:            test_fail_def_preheader
166# CHECK: test_fail_def_preheader
167tracksRegLiveness: true
168body:             |
169  bb.0.entry:
170
171    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr
172    %0:gprc = LI 2048
173    ; CHECK2-NOT: MTCTR
174    ; CHECK-NOT: BDNZ
175    ; CHECK: ADDI
176    ; CHECK: CMPLWI
177    ; CHECK: BC
178    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
179
180  bb.1:
181
182    %1:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
183    BC killed %1:crbitrc, %bb.1
184    B %bb.2
185
186  bb.2:
187
188    BLR implicit $lr, implicit $rm
189...
190---
191name:            test_success_only_use_preheader
192# CHECK: test_success_only_use_preheader
193tracksRegLiveness: true
194body:             |
195  bb.0.entry:
196
197    %0:gprc = MFCTR implicit $ctr
198    %1:gprc = LI 2048
199    ; CHECK: MTCTR
200    ; CHECK: BDNZ
201    ; CHECK-NOT: ADDI
202    ; CHECK-NOT: CMPLWI
203    ; CHECK-NOT: BC
204    MTCTRPseudo killed %1:gprc, implicit-def dead $ctr
205
206  bb.1:
207
208    %2:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
209    BC killed %2:crbitrc, %bb.1
210    B %bb.2
211
212  bb.2:
213
214    BLR implicit $lr, implicit $rm
215...
216---
217name:            test_fail_use_after_mtctr
218# CHECK: test_fail_use_after_mtctr
219tracksRegLiveness: true
220body:             |
221  bb.0.entry:
222
223    %0:gprc = LI 2048
224    ; CHECK-NOT: MTCTR
225    ; CHECK-NOT: BDNZ
226    ; CHECK: ADDI
227    ; CHECK: CMPLWI
228    ; CHECK: BC
229    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
230    %1:gprc = MFCTR implicit $ctr
231
232  bb.1:
233
234    %2:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
235    BC killed %2:crbitrc, %bb.1
236    B %bb.2
237
238  bb.2:
239
240    BLR implicit $lr, implicit $rm
241...
242---
243name:            test_fail_def_after_mtctr
244# CHECK: test_fail_def_after_mtctr
245tracksRegLiveness: true
246body:             |
247  bb.0.entry:
248
249    %0:gprc = LI 2048
250    ; CHECK-NOT: MTCTR
251    ; CHECK-NOT: BDNZ
252    ; CHECK: ADDI
253    ; CHECK: CMPLWI
254    ; CHECK: BC
255    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
256    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr
257
258  bb.1:
259
260    %2:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
261    BC killed %2:crbitrc, %bb.1
262    B %bb.2
263
264  bb.2:
265
266    BLR implicit $lr, implicit $rm
267...
268---
269name:            test_success_def_after_loop
270# CHECK: test_success_def_after_loop
271tracksRegLiveness: true
272body:             |
273  bb.0.entry:
274
275    %0:gprc = LI 2048
276    ; CHECK: MTCTR
277    ; CHECK: BDNZ
278    ; CHECK-NOT: ADDI
279    ; CHECK-NOT: CMPLWI
280    ; CHECK-NOT: BC
281    MTCTRPseudo killed %0:gprc, implicit-def dead $ctr
282
283  bb.1:
284
285    %2:crbitrc = DecreaseCTRPseudo 1, implicit-def dead $ctr, implicit $ctr
286    BC killed %2:crbitrc, %bb.1
287    B %bb.2
288
289  bb.2:
290    INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr
291
292    BLR implicit $lr, implicit $rm
293...
294