Revert "[AArch64] Add DAG combine for extract extend pattern"
[oota-llvm.git] / test / CodeGen / AArch64 / aarch64-fix-cortex-a53-835769.ll
1 ; REQUIRES: asserts
2 ; The regression tests need to test for order of emitted instructions, and
3 ; therefore, the tests are a bit fragile/reliant on instruction scheduling. The
4 ; test cases have been minimized as much as possible, but still most of the test
5 ; cases could break if instruction scheduling heuristics for cortex-a53 change
6 ; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=1 -stats 2>&1 \
7 ; RUN:  | FileCheck %s --check-prefix CHECK
8 ; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=0 -stats 2>&1 \
9 ; RUN:  | FileCheck %s --check-prefix CHECK-NOWORKAROUND
10 ; The following run lines are just to verify whether or not this pass runs by
11 ; default for given CPUs. Given the fragility of the tests, this is only run on
12 ; a test case where the scheduler has not freedom at all to reschedule the
13 ; instructions, so the potentially massively different scheduling heuristics
14 ; will not break the test case.
15 ; RUN: llc < %s -mcpu=generic    | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
16 ; RUN: llc < %s -mcpu=cortex-a53 | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
17 ; RUN: llc < %s -mcpu=cortex-a57 | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
18 ; RUN: llc < %s -mcpu=cyclone    | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
19
20 target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
21 target triple = "aarch64--linux-gnu"
22
23 define i64 @f_load_madd_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 {
24 entry:
25   %0 = load i64, i64* %c, align 8
26   %mul = mul nsw i64 %0, %b
27   %add = add nsw i64 %mul, %a
28   ret i64 %add
29 }
30 ; CHECK-LABEL: f_load_madd_64:
31 ; CHECK:        ldr
32 ; CHECK-NEXT:   nop
33 ; CHECK-NEXT:   madd
34 ; CHECK-NOWORKAROUND-LABEL: f_load_madd_64:
35 ; CHECK-NOWORKAROUND:   ldr
36 ; CHECK-NOWORKAROUND-NEXT:      madd
37 ; CHECK-BASIC-PASS-DISABLED-LABEL: f_load_madd_64:
38 ; CHECK-BASIC-PASS-DISABLED:  ldr
39 ; CHECK-BASIC-PASS-DISABLED-NEXT:  madd
40
41
42 define i32 @f_load_madd_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 {
43 entry:
44   %0 = load i32, i32* %c, align 4
45   %mul = mul nsw i32 %0, %b
46   %add = add nsw i32 %mul, %a
47   ret i32 %add
48 }
49 ; CHECK-LABEL: f_load_madd_32:
50 ; CHECK:        ldr
51 ; CHECK-NEXT:   madd
52 ; CHECK-NOWORKAROUND-LABEL: f_load_madd_32:
53 ; CHECK-NOWORKAROUND:   ldr
54 ; CHECK-NOWORKAROUND-NEXT:      madd
55
56
57 define i64 @f_load_msub_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 {
58 entry:
59   %0 = load i64, i64* %c, align 8
60   %mul = mul nsw i64 %0, %b
61   %sub = sub nsw i64 %a, %mul
62   ret i64 %sub
63 }
64 ; CHECK-LABEL: f_load_msub_64:
65 ; CHECK:        ldr
66 ; CHECK-NEXT:   nop
67 ; CHECK-NEXT:   msub
68 ; CHECK-NOWORKAROUND-LABEL: f_load_msub_64:
69 ; CHECK-NOWORKAROUND:   ldr
70 ; CHECK-NOWORKAROUND-NEXT:      msub
71
72
73 define i32 @f_load_msub_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 {
74 entry:
75   %0 = load i32, i32* %c, align 4
76   %mul = mul nsw i32 %0, %b
77   %sub = sub nsw i32 %a, %mul
78   ret i32 %sub
79 }
80 ; CHECK-LABEL: f_load_msub_32:
81 ; CHECK:        ldr
82 ; CHECK-NEXT:   msub
83 ; CHECK-NOWORKAROUND-LABEL: f_load_msub_32:
84 ; CHECK-NOWORKAROUND:   ldr
85 ; CHECK-NOWORKAROUND-NEXT:      msub
86
87
88 define i64 @f_load_mul_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 {
89 entry:
90   %0 = load i64, i64* %c, align 8
91   %mul = mul nsw i64 %0, %b
92   ret i64 %mul
93 }
94 ; CHECK-LABEL: f_load_mul_64:
95 ; CHECK:        ldr
96 ; CHECK-NEXT:   mul
97 ; CHECK-NOWORKAROUND-LABEL: f_load_mul_64:
98 ; CHECK-NOWORKAROUND:   ldr
99 ; CHECK-NOWORKAROUND-NEXT:      mul
100
101
102 define i32 @f_load_mul_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 {
103 entry:
104   %0 = load i32, i32* %c, align 4
105   %mul = mul nsw i32 %0, %b
106   ret i32 %mul
107 }
108 ; CHECK-LABEL: f_load_mul_32:
109 ; CHECK:        ldr
110 ; CHECK-NEXT:   mul
111 ; CHECK-NOWORKAROUND-LABEL: f_load_mul_32:
112 ; CHECK-NOWORKAROUND:   ldr
113 ; CHECK-NOWORKAROUND-NEXT:      mul
114
115
116 define i64 @f_load_mneg_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 {
117 entry:
118   %0 = load i64, i64* %c, align 8
119   %mul = sub i64 0, %b
120   %sub = mul i64 %0, %mul
121   ret i64 %sub
122 }
123 ; CHECK-LABEL: f_load_mneg_64:
124 ; CHECK-NOWORKAROUND-LABEL: f_load_mneg_64:
125 ; FIXME: only add further checks here once LLVM actually produces
126 ;        neg instructions
127 ; FIXME-CHECK: ldr
128 ; FIXME-CHECK-NEXT: nop
129 ; FIXME-CHECK-NEXT: mneg
130 ; FIXME-CHECK-NOWORKAROUND: ldr
131 ; FIXME-CHECK-NOWORKAROUND-NEXT: mneg
132
133
134 define i32 @f_load_mneg_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 {
135 entry:
136   %0 = load i32, i32* %c, align 4
137   %mul = sub i32 0, %b
138   %sub = mul i32 %0, %mul
139   ret i32 %sub
140 }
141 ; CHECK-LABEL: f_load_mneg_32:
142 ; CHECK-NOWORKAROUND-LABEL: f_load_mneg_32:
143 ; FIXME: only add further checks here once LLVM actually produces
144 ;        neg instructions
145 ; FIXME-CHECK: ldr
146 ; FIXME-CHECK-NEXT: mneg
147 ; FIXME-CHECK-NOWORKAROUND: ldr
148 ; FIXME-CHECK-NOWORKAROUND-NEXT: mneg
149
150
151 define i64 @f_load_smaddl(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
152 entry:
153   %conv = sext i32 %b to i64
154   %conv1 = sext i32 %c to i64
155   %mul = mul nsw i64 %conv1, %conv
156   %add = add nsw i64 %mul, %a
157   %0 = load i32, i32* %d, align 4
158   %conv2 = sext i32 %0 to i64
159   %add3 = add nsw i64 %add, %conv2
160   ret i64 %add3
161 }
162 ; CHECK-LABEL: f_load_smaddl:
163 ; CHECK:        ldrsw
164 ; CHECK-NEXT:   nop
165 ; CHECK-NEXT:   smaddl
166 ; CHECK-NOWORKAROUND-LABEL: f_load_smaddl:
167 ; CHECK-NOWORKAROUND:   ldrsw
168 ; CHECK-NOWORKAROUND-NEXT:      smaddl
169
170
171 define i64 @f_load_smsubl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
172 entry:
173   %conv = sext i32 %b to i64
174   %conv1 = sext i32 %c to i64
175   %mul = mul nsw i64 %conv1, %conv
176   %sub = sub i64 %a, %mul
177   %0 = load i32, i32* %d, align 4
178   %conv2 = sext i32 %0 to i64
179   %add = add nsw i64 %sub, %conv2
180   ret i64 %add
181 }
182 ; CHECK-LABEL: f_load_smsubl_64:
183 ; CHECK:        ldrsw
184 ; CHECK-NEXT:   nop
185 ; CHECK-NEXT:   smsubl
186 ; CHECK-NOWORKAROUND-LABEL: f_load_smsubl_64:
187 ; CHECK-NOWORKAROUND:   ldrsw
188 ; CHECK-NOWORKAROUND-NEXT:      smsubl
189
190
191 define i64 @f_load_smull(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
192 entry:
193   %conv = sext i32 %b to i64
194   %conv1 = sext i32 %c to i64
195   %mul = mul nsw i64 %conv1, %conv
196   %0 = load i32, i32* %d, align 4
197   %conv2 = sext i32 %0 to i64
198   %div = sdiv i64 %mul, %conv2
199   ret i64 %div
200 }
201 ; CHECK-LABEL: f_load_smull:
202 ; CHECK:        ldrsw
203 ; CHECK-NEXT:   smull
204 ; CHECK-NOWORKAROUND-LABEL: f_load_smull:
205 ; CHECK-NOWORKAROUND:   ldrsw
206 ; CHECK-NOWORKAROUND-NEXT:      smull
207
208
209 define i64 @f_load_smnegl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
210 entry:
211   %conv = sext i32 %b to i64
212   %conv1 = sext i32 %c to i64
213   %mul = sub nsw i64 0, %conv
214   %sub = mul i64 %conv1, %mul
215   %0 = load i32, i32* %d, align 4
216   %conv2 = sext i32 %0 to i64
217   %div = sdiv i64 %sub, %conv2
218   ret i64 %div
219 }
220 ; CHECK-LABEL: f_load_smnegl_64:
221 ; CHECK-NOWORKAROUND-LABEL: f_load_smnegl_64:
222 ; FIXME: only add further checks here once LLVM actually produces
223 ;        smnegl instructions
224
225
226 define i64 @f_load_umaddl(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
227 entry:
228   %conv = zext i32 %b to i64
229   %conv1 = zext i32 %c to i64
230   %mul = mul i64 %conv1, %conv
231   %add = add i64 %mul, %a
232   %0 = load i32, i32* %d, align 4
233   %conv2 = zext i32 %0 to i64
234   %add3 = add i64 %add, %conv2
235   ret i64 %add3
236 }
237 ; CHECK-LABEL: f_load_umaddl:
238 ; CHECK:        ldr
239 ; CHECK-NEXT:   nop
240 ; CHECK-NEXT:   umaddl
241 ; CHECK-NOWORKAROUND-LABEL: f_load_umaddl:
242 ; CHECK-NOWORKAROUND:   ldr
243 ; CHECK-NOWORKAROUND-NEXT:      umaddl
244
245
246 define i64 @f_load_umsubl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
247 entry:
248   %conv = zext i32 %b to i64
249   %conv1 = zext i32 %c to i64
250   %mul = mul i64 %conv1, %conv
251   %sub = sub i64 %a, %mul
252   %0 = load i32, i32* %d, align 4
253   %conv2 = zext i32 %0 to i64
254   %add = add i64 %sub, %conv2
255   ret i64 %add
256 }
257 ; CHECK-LABEL: f_load_umsubl_64:
258 ; CHECK:        ldr
259 ; CHECK-NEXT:   nop
260 ; CHECK-NEXT:   umsubl
261 ; CHECK-NOWORKAROUND-LABEL: f_load_umsubl_64:
262 ; CHECK-NOWORKAROUND:   ldr
263 ; CHECK-NOWORKAROUND-NEXT:      umsubl
264
265
266 define i64 @f_load_umull(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
267 entry:
268   %conv = zext i32 %b to i64
269   %conv1 = zext i32 %c to i64
270   %mul = mul i64 %conv1, %conv
271   %0 = load i32, i32* %d, align 4
272   %conv2 = zext i32 %0 to i64
273   %div = udiv i64 %mul, %conv2
274   ret i64 %div
275 }
276 ; CHECK-LABEL: f_load_umull:
277 ; CHECK:        ldr
278 ; CHECK-NEXT:   umull
279 ; CHECK-NOWORKAROUND-LABEL: f_load_umull:
280 ; CHECK-NOWORKAROUND:   ldr
281 ; CHECK-NOWORKAROUND-NEXT:      umull
282
283
284 define i64 @f_load_umnegl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 {
285 entry:
286   %conv = zext i32 %b to i64
287   %conv1 = zext i32 %c to i64
288   %mul = sub nsw i64 0, %conv
289   %sub = mul i64 %conv1, %mul
290   %0 = load i32, i32* %d, align 4
291   %conv2 = zext i32 %0 to i64
292   %div = udiv i64 %sub, %conv2
293   ret i64 %div
294 }
295 ; CHECK-LABEL: f_load_umnegl_64:
296 ; CHECK-NOWORKAROUND-LABEL: f_load_umnegl_64:
297 ; FIXME: only add further checks here once LLVM actually produces
298 ;        umnegl instructions
299
300
301 define i64 @f_store_madd_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 {
302 entry:
303   %0 = load i64, i64* %cp, align 8
304   store i64 %a, i64* %e, align 8
305   %mul = mul nsw i64 %0, %b
306   %add = add nsw i64 %mul, %a
307   ret i64 %add
308 }
309 ; CHECK-LABEL: f_store_madd_64:
310 ; CHECK:        str
311 ; CHECK-NEXT:   nop
312 ; CHECK-NEXT:   madd
313 ; CHECK-NOWORKAROUND-LABEL: f_store_madd_64:
314 ; CHECK-NOWORKAROUND:   str
315 ; CHECK-NOWORKAROUND-NEXT:      madd
316
317
318 define i32 @f_store_madd_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 {
319 entry:
320   %0 = load i32, i32* %cp, align 4
321   store i32 %a, i32* %e, align 4
322   %mul = mul nsw i32 %0, %b
323   %add = add nsw i32 %mul, %a
324   ret i32 %add
325 }
326 ; CHECK-LABEL: f_store_madd_32:
327 ; CHECK:        str
328 ; CHECK-NEXT:   madd
329 ; CHECK-NOWORKAROUND-LABEL: f_store_madd_32:
330 ; CHECK-NOWORKAROUND:   str
331 ; CHECK-NOWORKAROUND-NEXT:      madd
332
333
334 define i64 @f_store_msub_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 {
335 entry:
336   %0 = load i64, i64* %cp, align 8
337   store i64 %a, i64* %e, align 8
338   %mul = mul nsw i64 %0, %b
339   %sub = sub nsw i64 %a, %mul
340   ret i64 %sub
341 }
342 ; CHECK-LABEL: f_store_msub_64:
343 ; CHECK:        str
344 ; CHECK-NEXT:   nop
345 ; CHECK-NEXT:   msub
346 ; CHECK-NOWORKAROUND-LABEL: f_store_msub_64:
347 ; CHECK-NOWORKAROUND:   str
348 ; CHECK-NOWORKAROUND-NEXT:      msub
349
350
351 define i32 @f_store_msub_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 {
352 entry:
353   %0 = load i32, i32* %cp, align 4
354   store i32 %a, i32* %e, align 4
355   %mul = mul nsw i32 %0, %b
356   %sub = sub nsw i32 %a, %mul
357   ret i32 %sub
358 }
359 ; CHECK-LABEL: f_store_msub_32:
360 ; CHECK:        str
361 ; CHECK-NEXT:   msub
362 ; CHECK-NOWORKAROUND-LABEL: f_store_msub_32:
363 ; CHECK-NOWORKAROUND:   str
364 ; CHECK-NOWORKAROUND-NEXT:      msub
365
366
367 define i64 @f_store_mul_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 {
368 entry:
369   %0 = load i64, i64* %cp, align 8
370   store i64 %a, i64* %e, align 8
371   %mul = mul nsw i64 %0, %b
372   ret i64 %mul
373 }
374 ; CHECK-LABEL: f_store_mul_64:
375 ; CHECK:        str
376 ; CHECK-NEXT:   mul
377 ; CHECK-NOWORKAROUND-LABEL: f_store_mul_64:
378 ; CHECK-NOWORKAROUND:   str
379 ; CHECK-NOWORKAROUND-NEXT:      mul
380
381
382 define i32 @f_store_mul_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 {
383 entry:
384   %0 = load i32, i32* %cp, align 4
385   store i32 %a, i32* %e, align 4
386   %mul = mul nsw i32 %0, %b
387   ret i32 %mul
388 }
389 ; CHECK-LABEL: f_store_mul_32:
390 ; CHECK:        str
391 ; CHECK-NEXT:   mul
392 ; CHECK-NOWORKAROUND-LABEL: f_store_mul_32:
393 ; CHECK-NOWORKAROUND:   str
394 ; CHECK-NOWORKAROUND-NEXT:      mul
395
396
397 define i64 @f_prefetch_madd_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 {
398 entry:
399   %0 = load i64, i64* %cp, align 8
400   %1 = bitcast i64* %e to i8*
401   tail call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1)
402   %mul = mul nsw i64 %0, %b
403   %add = add nsw i64 %mul, %a
404   ret i64 %add
405 }
406 ; CHECK-LABEL: f_prefetch_madd_64:
407 ; CHECK:        prfm
408 ; CHECK-NEXT:   nop
409 ; CHECK-NEXT:   madd
410 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_madd_64:
411 ; CHECK-NOWORKAROUND:   prfm
412 ; CHECK-NOWORKAROUND-NEXT:      madd
413
414 declare void @llvm.prefetch(i8* nocapture, i32, i32, i32) #2
415
416 define i32 @f_prefetch_madd_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 {
417 entry:
418   %0 = load i32, i32* %cp, align 4
419   %1 = bitcast i32* %e to i8*
420   tail call void @llvm.prefetch(i8* %1, i32 1, i32 0, i32 1)
421   %mul = mul nsw i32 %0, %b
422   %add = add nsw i32 %mul, %a
423   ret i32 %add
424 }
425 ; CHECK-LABEL: f_prefetch_madd_32:
426 ; CHECK:        prfm
427 ; CHECK-NEXT:   madd
428 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_madd_32:
429 ; CHECK-NOWORKAROUND:   prfm
430 ; CHECK-NOWORKAROUND-NEXT:      madd
431
432 define i64 @f_prefetch_msub_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 {
433 entry:
434   %0 = load i64, i64* %cp, align 8
435   %1 = bitcast i64* %e to i8*
436   tail call void @llvm.prefetch(i8* %1, i32 0, i32 1, i32 1)
437   %mul = mul nsw i64 %0, %b
438   %sub = sub nsw i64 %a, %mul
439   ret i64 %sub
440 }
441 ; CHECK-LABEL: f_prefetch_msub_64:
442 ; CHECK:        prfm
443 ; CHECK-NEXT:   nop
444 ; CHECK-NEXT:   msub
445 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_msub_64:
446 ; CHECK-NOWORKAROUND:   prfm
447 ; CHECK-NOWORKAROUND-NEXT:      msub
448
449 define i32 @f_prefetch_msub_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 {
450 entry:
451   %0 = load i32, i32* %cp, align 4
452   %1 = bitcast i32* %e to i8*
453   tail call void @llvm.prefetch(i8* %1, i32 1, i32 1, i32 1)
454   %mul = mul nsw i32 %0, %b
455   %sub = sub nsw i32 %a, %mul
456   ret i32 %sub
457 }
458 ; CHECK-LABEL: f_prefetch_msub_32:
459 ; CHECK:        prfm
460 ; CHECK-NEXT:   msub
461 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_msub_32:
462 ; CHECK-NOWORKAROUND:   prfm
463 ; CHECK-NOWORKAROUND-NEXT:      msub
464
465 define i64 @f_prefetch_mul_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 {
466 entry:
467   %0 = load i64, i64* %cp, align 8
468   %1 = bitcast i64* %e to i8*
469   tail call void @llvm.prefetch(i8* %1, i32 0, i32 3, i32 1)
470   %mul = mul nsw i64 %0, %b
471   ret i64 %mul
472 }
473 ; CHECK-LABEL: f_prefetch_mul_64:
474 ; CHECK:        prfm
475 ; CHECK-NEXT:   mul
476 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_mul_64:
477 ; CHECK-NOWORKAROUND:   prfm
478 ; CHECK-NOWORKAROUND-NEXT:      mul
479
480 define i32 @f_prefetch_mul_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 {
481 entry:
482   %0 = load i32, i32* %cp, align 4
483   %1 = bitcast i32* %e to i8*
484   tail call void @llvm.prefetch(i8* %1, i32 1, i32 3, i32 1)
485   %mul = mul nsw i32 %0, %b
486   ret i32 %mul
487 }
488 ; CHECK-LABEL: f_prefetch_mul_32:
489 ; CHECK:        prfm
490 ; CHECK-NEXT:   mul
491 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_mul_32:
492 ; CHECK-NOWORKAROUND:   prfm
493 ; CHECK-NOWORKAROUND-NEXT:      mul
494
495 define i64 @fall_through(i64 %a, i64 %b, i64* nocapture readonly %c) #0 {
496 entry:
497   %0 = load i64, i64* %c, align 8
498   br label %block1
499
500 block1:
501   %mul = mul nsw i64 %0, %b
502   %add = add nsw i64 %mul, %a
503   %tmp = ptrtoint i8* blockaddress(@fall_through, %block1) to i64
504   %ret = add nsw i64 %tmp, %add
505   ret i64 %ret
506 }
507 ; CHECK-LABEL:  fall_through
508 ; CHECK:        ldr
509 ; CHECK-NEXT:   nop
510 ; CHECK-NEXT:   .Ltmp
511 ; CHECK-NEXT:   BB
512 ; CHECK-NEXT:   madd
513 ; CHECK-NOWORKAROUND-LABEL:     fall_through
514 ; CHECK-NOWORKAROUND:   ldr
515 ; CHECK-NOWORKAROUND-NEXT:      .Ltmp
516 ; CHECK-NOWORKAROUND-NEXT:      BB
517 ; CHECK-NOWORKAROUND-NEXT:      madd
518
519 ; No checks for this, just check it doesn't crash
520 define i32 @crash_check(i8** nocapture readnone %data) #0 {
521 entry:
522   br label %while.cond
523
524 while.cond:
525   br label %while.cond
526 }
527
528 attributes #0 = { nounwind readonly "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
529 attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
530 attributes #2 = { nounwind }
531
532
533 ; CHECK-LABEL: ... Statistics Collected ...
534 ; CHECK: 11 aarch64-fix-cortex-a53-835769 - Number of Nops added to work around erratum 835769