[clang-tidy][modernize-use-starts-ends-with] Fix operator rewriting false negative...
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / br.ll
blob8b909e3314d642aa928f40a7e12f4bca71a371de
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefixes=ALL,LA32
3 ; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefixes=ALL,LA64
5 define void @foo() noreturn nounwind {
6 ; ALL-LABEL: foo:
7 ; ALL:       # %bb.0: # %entry
8 ; ALL-NEXT:    .p2align 4, , 16
9 ; ALL-NEXT:  .LBB0_1: # %loop
10 ; ALL-NEXT:    # =>This Inner Loop Header: Depth=1
11 ; ALL-NEXT:    b .LBB0_1
12 entry:
13   br label %loop
14 loop:
15   br label %loop
18 define void @foo_br_eq(i32 %a, ptr %b) nounwind {
19 ; LA32-LABEL: foo_br_eq:
20 ; LA32:       # %bb.0:
21 ; LA32-NEXT:    ld.w $a2, $a1, 0
22 ; LA32-NEXT:    beq $a2, $a0, .LBB1_2
23 ; LA32-NEXT:  # %bb.1: # %test
24 ; LA32-NEXT:    ld.w $zero, $a1, 0
25 ; LA32-NEXT:  .LBB1_2: # %end
26 ; LA32-NEXT:    ret
28 ; LA64-LABEL: foo_br_eq:
29 ; LA64:       # %bb.0:
30 ; LA64-NEXT:    ld.w $a2, $a1, 0
31 ; LA64-NEXT:    addi.w $a0, $a0, 0
32 ; LA64-NEXT:    beq $a2, $a0, .LBB1_2
33 ; LA64-NEXT:  # %bb.1: # %test
34 ; LA64-NEXT:    ld.w $zero, $a1, 0
35 ; LA64-NEXT:  .LBB1_2: # %end
36 ; LA64-NEXT:    ret
37   %val = load volatile i32, ptr %b
38   %cc = icmp eq i32 %val, %a
39   br i1 %cc, label %end, label %test
40 test:
41   %tmp = load volatile i32, ptr %b
42   br label %end
44 end:
45   ret void
48 define void @foo_br_ne(i32 %a, ptr %b) nounwind {
49 ; LA32-LABEL: foo_br_ne:
50 ; LA32:       # %bb.0:
51 ; LA32-NEXT:    ld.w $a2, $a1, 0
52 ; LA32-NEXT:    bne $a2, $a0, .LBB2_2
53 ; LA32-NEXT:  # %bb.1: # %test
54 ; LA32-NEXT:    ld.w $zero, $a1, 0
55 ; LA32-NEXT:  .LBB2_2: # %end
56 ; LA32-NEXT:    ret
58 ; LA64-LABEL: foo_br_ne:
59 ; LA64:       # %bb.0:
60 ; LA64-NEXT:    ld.w $a2, $a1, 0
61 ; LA64-NEXT:    addi.w $a0, $a0, 0
62 ; LA64-NEXT:    bne $a2, $a0, .LBB2_2
63 ; LA64-NEXT:  # %bb.1: # %test
64 ; LA64-NEXT:    ld.w $zero, $a1, 0
65 ; LA64-NEXT:  .LBB2_2: # %end
66 ; LA64-NEXT:    ret
67   %val = load volatile i32, ptr %b
68   %cc = icmp ne i32 %val, %a
69   br i1 %cc, label %end, label %test
70 test:
71   %tmp = load volatile i32, ptr %b
72   br label %end
74 end:
75   ret void
78 define void @foo_br_slt(i32 %a, ptr %b) nounwind {
79 ; LA32-LABEL: foo_br_slt:
80 ; LA32:       # %bb.0:
81 ; LA32-NEXT:    ld.w $a2, $a1, 0
82 ; LA32-NEXT:    blt $a2, $a0, .LBB3_2
83 ; LA32-NEXT:  # %bb.1: # %test
84 ; LA32-NEXT:    ld.w $zero, $a1, 0
85 ; LA32-NEXT:  .LBB3_2: # %end
86 ; LA32-NEXT:    ret
88 ; LA64-LABEL: foo_br_slt:
89 ; LA64:       # %bb.0:
90 ; LA64-NEXT:    ld.w $a2, $a1, 0
91 ; LA64-NEXT:    addi.w $a0, $a0, 0
92 ; LA64-NEXT:    blt $a2, $a0, .LBB3_2
93 ; LA64-NEXT:  # %bb.1: # %test
94 ; LA64-NEXT:    ld.w $zero, $a1, 0
95 ; LA64-NEXT:  .LBB3_2: # %end
96 ; LA64-NEXT:    ret
97   %val = load volatile i32, ptr %b
98   %cc = icmp slt i32 %val, %a
99   br i1 %cc, label %end, label %test
100 test:
101   %tmp = load volatile i32, ptr %b
102   br label %end
104 end:
105   ret void
108 define void @foo_br_sge(i32 %a, ptr %b) nounwind {
109 ; LA32-LABEL: foo_br_sge:
110 ; LA32:       # %bb.0:
111 ; LA32-NEXT:    ld.w $a2, $a1, 0
112 ; LA32-NEXT:    bge $a2, $a0, .LBB4_2
113 ; LA32-NEXT:  # %bb.1: # %test
114 ; LA32-NEXT:    ld.w $zero, $a1, 0
115 ; LA32-NEXT:  .LBB4_2: # %end
116 ; LA32-NEXT:    ret
118 ; LA64-LABEL: foo_br_sge:
119 ; LA64:       # %bb.0:
120 ; LA64-NEXT:    ld.w $a2, $a1, 0
121 ; LA64-NEXT:    addi.w $a0, $a0, 0
122 ; LA64-NEXT:    bge $a2, $a0, .LBB4_2
123 ; LA64-NEXT:  # %bb.1: # %test
124 ; LA64-NEXT:    ld.w $zero, $a1, 0
125 ; LA64-NEXT:  .LBB4_2: # %end
126 ; LA64-NEXT:    ret
127   %val = load volatile i32, ptr %b
128   %cc = icmp sge i32 %val, %a
129   br i1 %cc, label %end, label %test
130 test:
131   %tmp = load volatile i32, ptr %b
132   br label %end
134 end:
135   ret void
138 define void @foo_br_ult(i32 %a, ptr %b) nounwind {
139 ; LA32-LABEL: foo_br_ult:
140 ; LA32:       # %bb.0:
141 ; LA32-NEXT:    ld.w $a2, $a1, 0
142 ; LA32-NEXT:    bltu $a2, $a0, .LBB5_2
143 ; LA32-NEXT:  # %bb.1: # %test
144 ; LA32-NEXT:    ld.w $zero, $a1, 0
145 ; LA32-NEXT:  .LBB5_2: # %end
146 ; LA32-NEXT:    ret
148 ; LA64-LABEL: foo_br_ult:
149 ; LA64:       # %bb.0:
150 ; LA64-NEXT:    ld.w $a2, $a1, 0
151 ; LA64-NEXT:    addi.w $a0, $a0, 0
152 ; LA64-NEXT:    bltu $a2, $a0, .LBB5_2
153 ; LA64-NEXT:  # %bb.1: # %test
154 ; LA64-NEXT:    ld.w $zero, $a1, 0
155 ; LA64-NEXT:  .LBB5_2: # %end
156 ; LA64-NEXT:    ret
157   %val = load volatile i32, ptr %b
158   %cc = icmp ult i32 %val, %a
159   br i1 %cc, label %end, label %test
160 test:
161   %tmp = load volatile i32, ptr %b
162   br label %end
164 end:
165   ret void
168 define void @foo_br_uge(i32 %a, ptr %b) nounwind {
169 ; LA32-LABEL: foo_br_uge:
170 ; LA32:       # %bb.0:
171 ; LA32-NEXT:    ld.w $a2, $a1, 0
172 ; LA32-NEXT:    bgeu $a2, $a0, .LBB6_2
173 ; LA32-NEXT:  # %bb.1: # %test
174 ; LA32-NEXT:    ld.w $zero, $a1, 0
175 ; LA32-NEXT:  .LBB6_2: # %end
176 ; LA32-NEXT:    ret
178 ; LA64-LABEL: foo_br_uge:
179 ; LA64:       # %bb.0:
180 ; LA64-NEXT:    ld.w $a2, $a1, 0
181 ; LA64-NEXT:    addi.w $a0, $a0, 0
182 ; LA64-NEXT:    bgeu $a2, $a0, .LBB6_2
183 ; LA64-NEXT:  # %bb.1: # %test
184 ; LA64-NEXT:    ld.w $zero, $a1, 0
185 ; LA64-NEXT:  .LBB6_2: # %end
186 ; LA64-NEXT:    ret
187   %val = load volatile i32, ptr %b
188   %cc = icmp uge i32 %val, %a
189   br i1 %cc, label %end, label %test
190 test:
191   %tmp = load volatile i32, ptr %b
192   br label %end
194 end:
195   ret void
198 ;; Check for condition codes that don't have a matching instruction.
199 define void @foo_br_sgt(i32 %a, ptr %b) nounwind {
200 ; LA32-LABEL: foo_br_sgt:
201 ; LA32:       # %bb.0:
202 ; LA32-NEXT:    ld.w $a2, $a1, 0
203 ; LA32-NEXT:    blt $a0, $a2, .LBB7_2
204 ; LA32-NEXT:  # %bb.1: # %test
205 ; LA32-NEXT:    ld.w $zero, $a1, 0
206 ; LA32-NEXT:  .LBB7_2: # %end
207 ; LA32-NEXT:    ret
209 ; LA64-LABEL: foo_br_sgt:
210 ; LA64:       # %bb.0:
211 ; LA64-NEXT:    ld.w $a2, $a1, 0
212 ; LA64-NEXT:    addi.w $a0, $a0, 0
213 ; LA64-NEXT:    blt $a0, $a2, .LBB7_2
214 ; LA64-NEXT:  # %bb.1: # %test
215 ; LA64-NEXT:    ld.w $zero, $a1, 0
216 ; LA64-NEXT:  .LBB7_2: # %end
217 ; LA64-NEXT:    ret
218   %val = load volatile i32, ptr %b
219   %cc = icmp sgt i32 %val, %a
220   br i1 %cc, label %end, label %test
221 test:
222   %tmp = load volatile i32, ptr %b
223   br label %end
225 end:
226   ret void
229 define void @foo_br_sle(i32 %a, ptr %b) nounwind {
230 ; LA32-LABEL: foo_br_sle:
231 ; LA32:       # %bb.0:
232 ; LA32-NEXT:    ld.w $a2, $a1, 0
233 ; LA32-NEXT:    bge $a0, $a2, .LBB8_2
234 ; LA32-NEXT:  # %bb.1: # %test
235 ; LA32-NEXT:    ld.w $zero, $a1, 0
236 ; LA32-NEXT:  .LBB8_2: # %end
237 ; LA32-NEXT:    ret
239 ; LA64-LABEL: foo_br_sle:
240 ; LA64:       # %bb.0:
241 ; LA64-NEXT:    ld.w $a2, $a1, 0
242 ; LA64-NEXT:    addi.w $a0, $a0, 0
243 ; LA64-NEXT:    bge $a0, $a2, .LBB8_2
244 ; LA64-NEXT:  # %bb.1: # %test
245 ; LA64-NEXT:    ld.w $zero, $a1, 0
246 ; LA64-NEXT:  .LBB8_2: # %end
247 ; LA64-NEXT:    ret
248   %val = load volatile i32, ptr %b
249   %cc = icmp sle i32 %val, %a
250   br i1 %cc, label %end, label %test
251 test:
252   %tmp = load volatile i32, ptr %b
253   br label %end
255 end:
256   ret void
259 define void @foo_br_ugt(i32 %a, ptr %b) nounwind {
260 ; LA32-LABEL: foo_br_ugt:
261 ; LA32:       # %bb.0:
262 ; LA32-NEXT:    ld.w $a2, $a1, 0
263 ; LA32-NEXT:    bltu $a0, $a2, .LBB9_2
264 ; LA32-NEXT:  # %bb.1: # %test
265 ; LA32-NEXT:    ld.w $zero, $a1, 0
266 ; LA32-NEXT:  .LBB9_2: # %end
267 ; LA32-NEXT:    ret
269 ; LA64-LABEL: foo_br_ugt:
270 ; LA64:       # %bb.0:
271 ; LA64-NEXT:    ld.w $a2, $a1, 0
272 ; LA64-NEXT:    addi.w $a0, $a0, 0
273 ; LA64-NEXT:    bltu $a0, $a2, .LBB9_2
274 ; LA64-NEXT:  # %bb.1: # %test
275 ; LA64-NEXT:    ld.w $zero, $a1, 0
276 ; LA64-NEXT:  .LBB9_2: # %end
277 ; LA64-NEXT:    ret
278   %val = load volatile i32, ptr %b
279   %cc = icmp ugt i32 %val, %a
280   br i1 %cc, label %end, label %test
281 test:
282   %tmp = load volatile i32, ptr %b
283   br label %end
285 end:
286   ret void
289 define void @foo_br_ule(i32 %a, ptr %b) nounwind {
290 ; LA32-LABEL: foo_br_ule:
291 ; LA32:       # %bb.0:
292 ; LA32-NEXT:    ld.w $a2, $a1, 0
293 ; LA32-NEXT:    bgeu $a0, $a2, .LBB10_2
294 ; LA32-NEXT:  # %bb.1: # %test
295 ; LA32-NEXT:    ld.w $zero, $a1, 0
296 ; LA32-NEXT:  .LBB10_2: # %end
297 ; LA32-NEXT:    ret
299 ; LA64-LABEL: foo_br_ule:
300 ; LA64:       # %bb.0:
301 ; LA64-NEXT:    ld.w $a2, $a1, 0
302 ; LA64-NEXT:    addi.w $a0, $a0, 0
303 ; LA64-NEXT:    bgeu $a0, $a2, .LBB10_2
304 ; LA64-NEXT:  # %bb.1: # %test
305 ; LA64-NEXT:    ld.w $zero, $a1, 0
306 ; LA64-NEXT:  .LBB10_2: # %end
307 ; LA64-NEXT:    ret
308   %val = load volatile i32, ptr %b
309   %cc = icmp ule i32 %val, %a
310   br i1 %cc, label %end, label %test
311 test:
312   %tmp = load volatile i32, ptr %b
313   br label %end
315 end:
316   ret void
319 ;; Check the case of a branch where the condition was generated in another
320 ;; function.
321 define void @foo_br_cc(ptr %a, i1 %cc) nounwind {
322 ; ALL-LABEL: foo_br_cc:
323 ; ALL:       # %bb.0:
324 ; ALL-NEXT:    ld.w $zero, $a0, 0
325 ; ALL-NEXT:    andi $a1, $a1, 1
326 ; ALL-NEXT:    bnez $a1, .LBB11_2
327 ; ALL-NEXT:  # %bb.1: # %test
328 ; ALL-NEXT:    ld.w $zero, $a0, 0
329 ; ALL-NEXT:  .LBB11_2: # %end
330 ; ALL-NEXT:    ret
331   %val = load volatile i32, ptr %a
332   br i1 %cc, label %end, label %test
333 test:
334   %tmp = load volatile i32, ptr %a
335   br label %end
337 end:
338   ret void