1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -o - -run-pass=block-placement -mcpu=gfx1010 -mattr=-inst-fwd-prefetch-bug -verify-machineinstrs %s | FileCheck -check-prefixes=GFX10 %s
3# RUN: llc -march=amdgcn -o - -run-pass=block-placement -mcpu=gfx1100 -mattr=-inst-fwd-prefetch-bug -verify-machineinstrs %s | FileCheck -check-prefixes=GFX11 %s
4
5# Used to fail with
6# Assertion `Out && "Header of loop has no predecessors from outside loop?"
7
8---
9name:            loop_header_nopred
10body:             |
11  ; GFX10-LABEL: name: loop_header_nopred
12  ; GFX10: bb.0:
13  ; GFX10-NEXT:   successors: %bb.2(0x80000000)
14  ; GFX10-NEXT: {{  $}}
15  ; GFX10-NEXT:   S_BRANCH %bb.2
16  ; GFX10-NEXT: {{  $}}
17  ; GFX10-NEXT: bb.1 (align 64):
18  ; GFX10-NEXT:   successors: %bb.7(0x04000000), %bb.2(0x7c000000)
19  ; GFX10-NEXT: {{  $}}
20  ; GFX10-NEXT:   S_CBRANCH_VCCNZ %bb.7, implicit $vcc_lo
21  ; GFX10-NEXT: {{  $}}
22  ; GFX10-NEXT: bb.2:
23  ; GFX10-NEXT:   successors: %bb.5(0x40000000), %bb.1(0x40000000)
24  ; GFX10-NEXT: {{  $}}
25  ; GFX10-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
26  ; GFX10-NEXT: {{  $}}
27  ; GFX10-NEXT: bb.5:
28  ; GFX10-NEXT:   successors: %bb.1(0x04000000), %bb.5(0x7c000000)
29  ; GFX10-NEXT: {{  $}}
30  ; GFX10-NEXT:   S_NOP 0
31  ; GFX10-NEXT:   S_NOP 0
32  ; GFX10-NEXT:   S_NOP 0
33  ; GFX10-NEXT:   S_NOP 0
34  ; GFX10-NEXT:   S_NOP 0
35  ; GFX10-NEXT:   S_NOP 0
36  ; GFX10-NEXT:   S_NOP 0
37  ; GFX10-NEXT:   S_NOP 0
38  ; GFX10-NEXT:   S_NOP 0
39  ; GFX10-NEXT:   S_NOP 0
40  ; GFX10-NEXT:   S_NOP 0
41  ; GFX10-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
42  ; GFX10-NEXT:   S_BRANCH %bb.1
43  ; GFX10-NEXT: {{  $}}
44  ; GFX10-NEXT: bb.7:
45  ; GFX10-NEXT:   S_ENDPGM 0
46  ; GFX11-LABEL: name: loop_header_nopred
47  ; GFX11: bb.0:
48  ; GFX11-NEXT:   successors: %bb.2(0x80000000)
49  ; GFX11-NEXT: {{  $}}
50  ; GFX11-NEXT:   S_BRANCH %bb.2
51  ; GFX11-NEXT: {{  $}}
52  ; GFX11-NEXT: bb.1:
53  ; GFX11-NEXT:   successors: %bb.7(0x04000000), %bb.2(0x7c000000)
54  ; GFX11-NEXT: {{  $}}
55  ; GFX11-NEXT:   S_CBRANCH_VCCNZ %bb.7, implicit $vcc_lo
56  ; GFX11-NEXT: {{  $}}
57  ; GFX11-NEXT: bb.2:
58  ; GFX11-NEXT:   successors: %bb.5(0x40000000), %bb.1(0x40000000)
59  ; GFX11-NEXT: {{  $}}
60  ; GFX11-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
61  ; GFX11-NEXT: {{  $}}
62  ; GFX11-NEXT: bb.5:
63  ; GFX11-NEXT:   successors: %bb.1(0x04000000), %bb.5(0x7c000000)
64  ; GFX11-NEXT: {{  $}}
65  ; GFX11-NEXT:   S_NOP 0
66  ; GFX11-NEXT:   S_NOP 0
67  ; GFX11-NEXT:   S_NOP 0
68  ; GFX11-NEXT:   S_NOP 0
69  ; GFX11-NEXT:   S_NOP 0
70  ; GFX11-NEXT:   S_NOP 0
71  ; GFX11-NEXT:   S_NOP 0
72  ; GFX11-NEXT:   S_NOP 0
73  ; GFX11-NEXT:   S_NOP 0
74  ; GFX11-NEXT:   S_NOP 0
75  ; GFX11-NEXT:   S_NOP 0
76  ; GFX11-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
77  ; GFX11-NEXT:   S_BRANCH %bb.1
78  ; GFX11-NEXT: {{  $}}
79  ; GFX11-NEXT: bb.7:
80  ; GFX11-NEXT:   S_ENDPGM 0
81  bb.0:
82    successors: %bb.1(0x80000000)
83
84  bb.1:
85    successors: %bb.2(0x40000000), %bb.3(0x40000000)
86
87    S_CBRANCH_VCCZ %bb.3, implicit $vcc
88    S_BRANCH %bb.2
89
90  bb.2:
91    successors: %bb.3(0x80000000)
92
93  bb.3:
94    successors: %bb.4(0x40000000), %bb.6(0x40000000)
95
96    S_CBRANCH_EXECZ %bb.6, implicit $exec
97    S_BRANCH %bb.4
98
99  bb.4:
100    successors: %bb.5(0x04000000), %bb.4(0x7c000000)
101
102    S_NOP 0
103    S_NOP 0
104    S_NOP 0
105    S_NOP 0
106    S_NOP 0
107    S_NOP 0
108    S_NOP 0
109    S_NOP 0
110    S_NOP 0
111    S_NOP 0
112    S_NOP 0
113    S_CBRANCH_EXECZ %bb.4, implicit $exec
114
115  bb.5:
116    successors: %bb.6(0x80000000)
117
118  bb.6:
119    successors: %bb.7(0x04000000), %bb.1(0x7c000000)
120
121    S_CBRANCH_VCCZ %bb.1, implicit $vcc
122
123  bb.7:
124    S_ENDPGM 0
125...
126