1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s
3# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-greedy | FileCheck %s
4
5---
6name: brcond_vcc_cond
7legalized: true
8body:             |
9  ; CHECK-LABEL: name: brcond_vcc_cond
10  ; CHECK: bb.0.entry:
11  ; CHECK:   successors: %bb.1(0x80000000)
12  ; CHECK:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
13  ; CHECK:   [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
14  ; CHECK:   [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
15  ; CHECK:   G_BRCOND [[ICMP]](s1), %bb.1
16  ; CHECK: bb.1:
17  bb.0.entry:
18    successors: %bb.1
19    liveins: $vgpr0, $vgpr1
20    %0:_(s32) = COPY $vgpr0
21    %1:_(s32) = COPY $vgpr1
22    %2:_(s1) = G_ICMP intpred(ne), %0, %1
23    G_BRCOND %2, %bb.1
24
25  bb.1:
26...
27
28---
29name: brcond_scc_cond
30legalized: true
31body:             |
32  ; CHECK-LABEL: name: brcond_scc_cond
33  ; CHECK: bb.0.entry:
34  ; CHECK:   successors: %bb.1(0x80000000)
35  ; CHECK:   [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
36  ; CHECK:   [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
37  ; CHECK:   [[ICMP:%[0-9]+]]:sgpr(s32) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
38  ; CHECK:   [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[ICMP]](s32)
39  ; CHECK:   [[ZEXT:%[0-9]+]]:sgpr(s32) = G_ZEXT [[TRUNC]](s1)
40  ; CHECK:   G_BRCOND [[ZEXT]](s32), %bb.1
41  ; CHECK: bb.1:
42  bb.0.entry:
43    successors: %bb.1
44    liveins: $sgpr0, $sgpr1
45    %0:_(s32) = COPY $sgpr0
46    %1:_(s32) = COPY $sgpr1
47    %2:_(s1) = G_ICMP intpred(ne), %0, %1
48    G_BRCOND %2, %bb.1
49
50  bb.1:
51...
52
53---
54name: brcond_sgpr_cond
55legalized: true
56body:             |
57  ; CHECK-LABEL: name: brcond_sgpr_cond
58  ; CHECK: bb.0.entry:
59  ; CHECK:   successors: %bb.1(0x80000000)
60  ; CHECK:   [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
61  ; CHECK:   [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32)
62  ; CHECK:   [[ZEXT:%[0-9]+]]:sgpr(s32) = G_ZEXT [[TRUNC]](s1)
63  ; CHECK:   G_BRCOND [[ZEXT]](s32), %bb.1
64  ; CHECK: bb.1:
65  bb.0.entry:
66    successors: %bb.1
67    liveins: $sgpr0
68    %0:_(s32) = COPY $sgpr0
69    %1:_(s1) = G_TRUNC %0
70    G_BRCOND %1, %bb.1
71
72  bb.1:
73...
74
75---
76name: brcond_vgpr_cond
77legalized: true
78body:             |
79  ; CHECK-LABEL: name: brcond_vgpr_cond
80  ; CHECK: bb.0.entry:
81  ; CHECK:   successors: %bb.1(0x80000000)
82  ; CHECK:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
83  ; CHECK:   [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32)
84  ; CHECK:   [[COPY1:%[0-9]+]]:vcc(s1) = COPY [[TRUNC]](s1)
85  ; CHECK:   G_BRCOND [[COPY1]](s1), %bb.1
86  ; CHECK: bb.1:
87  bb.0.entry:
88    successors: %bb.1
89    liveins: $vgpr0
90    %0:_(s32) = COPY $vgpr0
91    %1:_(s1) = G_TRUNC %0
92    G_BRCOND %1, %bb.1
93
94  bb.1:
95...
96
97
98# The terminator that needs handling is the only instruction in the
99# block.
100
101---
102name: empty_block_vgpr_brcond
103legalized: true
104body:             |
105  ; CHECK-LABEL: name: empty_block_vgpr_brcond
106  ; CHECK: bb.0.entry:
107  ; CHECK:   successors: %bb.1(0x80000000)
108  ; CHECK:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
109  ; CHECK:   [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32)
110  ; CHECK: bb.1:
111  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
112  ; CHECK:   [[COPY1:%[0-9]+]]:vcc(s1) = COPY [[TRUNC]](s1)
113  ; CHECK:   G_BRCOND [[COPY1]](s1), %bb.1
114  ; CHECK: bb.2:
115  bb.0.entry:
116    successors: %bb.1
117    liveins: $vgpr0
118    %0:_(s32) = COPY $vgpr0
119    %1:_(s1) = G_TRUNC %0
120
121  bb.1:
122    G_BRCOND %1, %bb.1
123
124  bb.2:
125...
126
127
128# Make sure the first instruction in the block isn't skipped.
129---
130name: copy_first_inst_brcond
131legalized: true
132body:             |
133  ; CHECK-LABEL: name: copy_first_inst_brcond
134  ; CHECK: bb.0.entry:
135  ; CHECK:   successors: %bb.1(0x80000000)
136  ; CHECK:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
137  ; CHECK: bb.1:
138  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
139  ; CHECK:   [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32)
140  ; CHECK:   [[COPY1:%[0-9]+]]:vcc(s1) = COPY [[TRUNC]](s1)
141  ; CHECK:   G_BRCOND [[COPY1]](s1), %bb.1
142  ; CHECK: bb.2:
143  bb.0.entry:
144    successors: %bb.1
145    liveins: $vgpr0
146    %0:_(s32) = COPY $vgpr0
147
148  bb.1:
149    %1:_(s1) = G_TRUNC %0
150    G_BRCOND %1, %bb.1
151
152  bb.2:
153...
154
155# Extra instruction separates brcond from the condition def
156---
157name: copy_middle_inst_brcond
158legalized: true
159body:             |
160  ; CHECK-LABEL: name: copy_middle_inst_brcond
161  ; CHECK: bb.0.entry:
162  ; CHECK:   successors: %bb.1(0x80000000)
163  ; CHECK:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
164  ; CHECK: bb.1:
165  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
166  ; CHECK:   [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32)
167  ; CHECK:   S_NOP 0
168  ; CHECK:   [[COPY1:%[0-9]+]]:vcc(s1) = COPY [[TRUNC]](s1)
169  ; CHECK:   G_BRCOND [[COPY1]](s1), %bb.1
170  ; CHECK: bb.2:
171  bb.0.entry:
172    successors: %bb.1
173    liveins: $vgpr0
174    %0:_(s32) = COPY $vgpr0
175
176  bb.1:
177    %1:_(s1) = G_TRUNC %0
178    S_NOP 0
179    G_BRCOND %1, %bb.1
180
181  bb.2:
182...
183