1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
7 tracksRegLiveness: true
12 ; CHECK-LABEL: name: cmp_imm_32
15 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32sp = COPY $w0
16 ; CHECK-NEXT: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY]], 42, 0, implicit-def $nzcv
17 ; CHECK-NEXT: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
18 ; CHECK-NEXT: $w0 = COPY [[CSINCWr]]
19 ; CHECK-NEXT: RET_ReallyLR implicit $w0
20 %0:gpr(s32) = COPY $w0
21 %1:gpr(s32) = G_CONSTANT i32 42
22 %5:gpr(s32) = G_ICMP intpred(eq), %0(s32), %1
24 RET_ReallyLR implicit $w0
31 tracksRegLiveness: true
36 ; CHECK-LABEL: name: cmp_imm_64
39 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
40 ; CHECK-NEXT: [[SUBSXri:%[0-9]+]]:gpr64 = SUBSXri [[COPY]], 42, 0, implicit-def $nzcv
41 ; CHECK-NEXT: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
42 ; CHECK-NEXT: $w0 = COPY [[CSINCWr]]
43 ; CHECK-NEXT: RET_ReallyLR implicit $w0
44 %0:gpr(s64) = COPY $x0
45 %1:gpr(s64) = G_CONSTANT i64 42
46 %5:gpr(s32) = G_ICMP intpred(eq), %0(s64), %1
48 RET_ReallyLR implicit $w0
52 name: cmp_imm_out_of_range
55 tracksRegLiveness: true
60 ; CHECK-LABEL: name: cmp_imm_out_of_range
63 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
64 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 13132
65 ; CHECK-NEXT: [[SUBREG_TO_REG:%[0-9]+]]:gpr64 = SUBREG_TO_REG 0, [[MOVi32imm]], %subreg.sub_32
66 ; CHECK-NEXT: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr [[COPY]], [[SUBREG_TO_REG]], implicit-def $nzcv
67 ; CHECK-NEXT: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
68 ; CHECK-NEXT: $w0 = COPY [[CSINCWr]]
69 ; CHECK-NEXT: RET_ReallyLR implicit $w0
70 %0:gpr(s64) = COPY $x0
71 %1:gpr(s64) = G_CONSTANT i64 13132
72 %5:gpr(s32) = G_ICMP intpred(eq), %0(s64), %1
74 RET_ReallyLR implicit $w0
78 name: cmp_imm_lookthrough
81 tracksRegLiveness: true
85 ; CHECK-LABEL: name: cmp_imm_lookthrough
88 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32sp = COPY $w0
89 ; CHECK-NEXT: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY]], 42, 0, implicit-def $nzcv
90 ; CHECK-NEXT: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
91 ; CHECK-NEXT: $w0 = COPY [[CSINCWr]]
92 ; CHECK-NEXT: RET_ReallyLR implicit $w0
93 %0:gpr(s32) = COPY $w0
94 %1:gpr(s64) = G_CONSTANT i64 42
95 %2:gpr(s32) = G_TRUNC %1(s64)
96 %5:gpr(s32) = G_ICMP intpred(eq), %0(s32), %2
98 RET_ReallyLR implicit $w0
102 name: cmp_imm_lookthrough_bad_trunc
104 regBankSelected: true
105 tracksRegLiveness: true
109 ; CHECK-LABEL: name: cmp_imm_lookthrough_bad_trunc
110 ; CHECK: liveins: $w0
112 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32sp = COPY $w0
113 ; CHECK-NEXT: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY]], 0, 0, implicit-def $nzcv
114 ; CHECK-NEXT: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
115 ; CHECK-NEXT: $w0 = COPY [[CSINCWr]]
116 ; CHECK-NEXT: RET_ReallyLR implicit $w0
117 %0:gpr(s32) = COPY $w0
118 %1:gpr(s64) = G_CONSTANT i64 68719476736 ; 0x1000000000
119 %2:gpr(s32) = G_TRUNC %1(s64) ; Value truncates to 0
120 %5:gpr(s32) = G_ICMP intpred(eq), %0(s32), %2
122 RET_ReallyLR implicit $w0
128 regBankSelected: true
129 tracksRegLiveness: true
133 ; CHECK-LABEL: name: cmp_neg_imm_32
134 ; CHECK: liveins: $w0
136 ; CHECK-NEXT: %reg0:gpr32sp = COPY $w0
137 ; CHECK-NEXT: [[ADDSWri:%[0-9]+]]:gpr32 = ADDSWri %reg0, 10, 0, implicit-def $nzcv
138 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
139 ; CHECK-NEXT: $w0 = COPY %cmp
140 ; CHECK-NEXT: RET_ReallyLR implicit $w0
141 %reg0:gpr(s32) = COPY $w0
142 %cst:gpr(s32) = G_CONSTANT i32 -10
143 %cmp:gpr(s32) = G_ICMP intpred(eq), %reg0(s32), %cst
145 RET_ReallyLR implicit $w0
151 regBankSelected: true
152 tracksRegLiveness: true
156 ; CHECK-LABEL: name: cmp_neg_imm_64
157 ; CHECK: liveins: $x0
159 ; CHECK-NEXT: %reg0:gpr64sp = COPY $x0
160 ; CHECK-NEXT: [[ADDSXri:%[0-9]+]]:gpr64 = ADDSXri %reg0, 10, 0, implicit-def $nzcv
161 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
162 ; CHECK-NEXT: $w0 = COPY %cmp
163 ; CHECK-NEXT: RET_ReallyLR implicit $w0
164 %reg0:gpr(s64) = COPY $x0
165 %cst:gpr(s64) = G_CONSTANT i64 -10
166 %cmp:gpr(s32) = G_ICMP intpred(eq), %reg0(s64), %cst
168 RET_ReallyLR implicit $w0
172 name: cmp_neg_imm_invalid
174 regBankSelected: true
175 tracksRegLiveness: true
179 ; CHECK-LABEL: name: cmp_neg_imm_invalid
180 ; CHECK: liveins: $w0
182 ; CHECK-NEXT: %reg0:gpr32 = COPY $w0
183 ; CHECK-NEXT: %cst:gpr32 = MOVi32imm -5000
184 ; CHECK-NEXT: [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr %reg0, %cst, implicit-def $nzcv
185 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
186 ; CHECK-NEXT: $w0 = COPY %cmp
187 ; CHECK-NEXT: RET_ReallyLR implicit $w0
188 %reg0:gpr(s32) = COPY $w0
189 %cst:gpr(s32) = G_CONSTANT i32 -5000
190 %cmp:gpr(s32) = G_ICMP intpred(eq), %reg0(s32), %cst
192 RET_ReallyLR implicit $w0
195 name: cmp_arith_extended_s64
197 regBankSelected: true
198 tracksRegLiveness: true
203 ; CHECK-LABEL: name: cmp_arith_extended_s64
204 ; CHECK: liveins: $w0, $x1
206 ; CHECK-NEXT: %reg0:gpr32 = COPY $w0
207 ; CHECK-NEXT: %reg1:gpr64sp = COPY $x1
208 ; CHECK-NEXT: [[SUBSXrx:%[0-9]+]]:gpr64 = SUBSXrx %reg1, %reg0, 18, implicit-def $nzcv
209 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 9, implicit $nzcv
210 ; CHECK-NEXT: $w0 = COPY %cmp
211 ; CHECK-NEXT: RET_ReallyLR implicit $w0
212 %reg0:gpr(s32) = COPY $w0
213 %reg1:gpr(s64) = COPY $x1
214 %ext:gpr(s64) = G_ZEXT %reg0(s32)
215 %cst:gpr(s64) = G_CONSTANT i64 2
216 %shift:gpr(s64) = G_SHL %ext, %cst(s64)
217 %cmp:gpr(s32) = G_ICMP intpred(ugt), %reg1(s64), %shift
219 RET_ReallyLR implicit $w0
223 name: cmp_arith_extended_s32
225 regBankSelected: true
226 tracksRegLiveness: true
229 liveins: $w0, $w1, $h0
231 ; CHECK-LABEL: name: cmp_arith_extended_s32
232 ; CHECK: liveins: $w0, $w1, $h0
234 ; CHECK-NEXT: [[SUBREG_TO_REG:%[0-9]+]]:fpr32 = SUBREG_TO_REG 0, $h0, %subreg.hsub
235 ; CHECK-NEXT: %reg0:gpr32all = COPY [[SUBREG_TO_REG]]
236 ; CHECK-NEXT: %reg1:gpr32sp = COPY $w1
237 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY %reg0
238 ; CHECK-NEXT: [[SUBSWrx:%[0-9]+]]:gpr32 = SUBSWrx %reg1, [[COPY]], 10, implicit-def $nzcv
239 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 9, implicit $nzcv
240 ; CHECK-NEXT: $w0 = COPY %cmp
241 ; CHECK-NEXT: RET_ReallyLR implicit $w0
242 %reg0:gpr(s16) = COPY $h0
243 %reg1:gpr(s32) = COPY $w1
244 %ext:gpr(s32) = G_ZEXT %reg0(s16)
245 %cst:gpr(s32) = G_CONSTANT i32 2
246 %shift:gpr(s32) = G_SHL %ext, %cst(s32)
247 %cmp:gpr(s32) = G_ICMP intpred(ugt), %reg1(s32), %shift
249 RET_ReallyLR implicit $w0
253 name: cmp_arith_extended_shl_too_large
255 regBankSelected: true
256 tracksRegLiveness: true
261 ; The constant on the G_SHL is > 4, so we won't sleect SUBSXrx
263 ; CHECK-LABEL: name: cmp_arith_extended_shl_too_large
264 ; CHECK: liveins: $w0, $x1
266 ; CHECK-NEXT: %reg0:gpr32 = COPY $w0
267 ; CHECK-NEXT: %reg1:gpr64 = COPY $x1
268 ; CHECK-NEXT: [[ORRWrs:%[0-9]+]]:gpr32 = ORRWrs $wzr, %reg0, 0
269 ; CHECK-NEXT: %ext:gpr64 = SUBREG_TO_REG 0, [[ORRWrs]], %subreg.sub_32
270 ; CHECK-NEXT: [[SUBSXrs:%[0-9]+]]:gpr64 = SUBSXrs %reg1, %ext, 5, implicit-def $nzcv
271 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 9, implicit $nzcv
272 ; CHECK-NEXT: $w0 = COPY %cmp
273 ; CHECK-NEXT: RET_ReallyLR implicit $w0
274 %reg0:gpr(s32) = COPY $w0
275 %reg1:gpr(s64) = COPY $x1
276 %ext:gpr(s64) = G_ZEXT %reg0(s32)
277 %cst:gpr(s64) = G_CONSTANT i64 5
278 %shift:gpr(s64) = G_SHL %ext, %cst(s64)
279 %cmp:gpr(s32) = G_ICMP intpred(ugt), %reg1(s64), %shift
281 RET_ReallyLR implicit $w0
287 regBankSelected: true
288 tracksRegLiveness: true
289 machineFunctionInfo: {}
292 liveins: $w0, $w1, $w2
294 ; The CSINC should use the add's RHS.
296 ; CHECK-LABEL: name: cmp_add_rhs
297 ; CHECK: liveins: $w0, $w1, $w2
299 ; CHECK-NEXT: %cmp_lhs:gpr32 = COPY $w0
300 ; CHECK-NEXT: %cmp_rhs:gpr32 = COPY $w1
301 ; CHECK-NEXT: %add_rhs:gpr32 = COPY $w2
302 ; CHECK-NEXT: [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr %cmp_lhs, %cmp_rhs, implicit-def $nzcv
303 ; CHECK-NEXT: %add:gpr32 = CSINCWr %add_rhs, %add_rhs, 1, implicit $nzcv
304 ; CHECK-NEXT: $w0 = COPY %add
305 ; CHECK-NEXT: RET_ReallyLR implicit $w0
306 %cmp_lhs:gpr(s32) = COPY $w0
307 %cmp_rhs:gpr(s32) = COPY $w1
308 %add_rhs:gpr(s32) = COPY $w2
309 %cmp:gpr(s32) = G_ICMP intpred(eq), %cmp_lhs(s32), %cmp_rhs
310 %add:gpr(s32) = G_ADD %cmp, %add_rhs
312 RET_ReallyLR implicit $w0
318 regBankSelected: true
319 tracksRegLiveness: true
320 machineFunctionInfo: {}
323 liveins: $w0, $w1, $w2
325 ; The CSINC should use the add's LHS.
327 ; CHECK-LABEL: name: cmp_add_lhs
328 ; CHECK: liveins: $w0, $w1, $w2
330 ; CHECK-NEXT: %cmp_lhs:gpr32 = COPY $w0
331 ; CHECK-NEXT: %cmp_rhs:gpr32 = COPY $w1
332 ; CHECK-NEXT: %add_lhs:gpr32 = COPY $w2
333 ; CHECK-NEXT: [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr %cmp_lhs, %cmp_rhs, implicit-def $nzcv
334 ; CHECK-NEXT: %add:gpr32 = CSINCWr %add_lhs, %add_lhs, 1, implicit $nzcv
335 ; CHECK-NEXT: $w0 = COPY %add
336 ; CHECK-NEXT: RET_ReallyLR implicit $w0
337 %cmp_lhs:gpr(s32) = COPY $w0
338 %cmp_rhs:gpr(s32) = COPY $w1
339 %add_lhs:gpr(s32) = COPY $w2
340 %cmp:gpr(s32) = G_ICMP intpred(eq), %cmp_lhs(s32), %cmp_rhs
341 %add:gpr(s32) = G_ADD %add_lhs, %cmp
343 RET_ReallyLR implicit $w0
347 name: cmp_add_lhs_vector
349 regBankSelected: true
350 tracksRegLiveness: true
351 machineFunctionInfo: {}
354 liveins: $q0, $q1, $q2
356 ; We don't emit CSINC with vectors, so there should be no optimization here.
358 ; CHECK-LABEL: name: cmp_add_lhs_vector
359 ; CHECK: liveins: $q0, $q1, $q2
361 ; CHECK-NEXT: %cmp_lhs:fpr128 = COPY $q0
362 ; CHECK-NEXT: %cmp_rhs:fpr128 = COPY $q1
363 ; CHECK-NEXT: %add_lhs:fpr128 = COPY $q2
364 ; CHECK-NEXT: [[CMEQv4i32_:%[0-9]+]]:fpr128 = CMEQv4i32 %cmp_lhs, %cmp_rhs
365 ; CHECK-NEXT: %add:fpr128 = ADDv4i32 %add_lhs, [[CMEQv4i32_]]
366 ; CHECK-NEXT: $q0 = COPY %add
367 ; CHECK-NEXT: RET_ReallyLR implicit $q0
368 %cmp_lhs:fpr(<4 x s32>) = COPY $q0
369 %cmp_rhs:fpr(<4 x s32>) = COPY $q1
370 %add_lhs:fpr(<4 x s32>) = COPY $q2
371 %cmp:fpr(<4 x s32>) = G_ICMP intpred(eq), %cmp_lhs(<4 x s32>), %cmp_rhs
372 %add:fpr(<4 x s32>) = G_ADD %add_lhs, %cmp
373 $q0 = COPY %add(<4 x s32>)
374 RET_ReallyLR implicit $q0
380 regBankSelected: true
381 tracksRegLiveness: true
382 machineFunctionInfo: {}
385 liveins: $x0, $x1, $x2
387 ; The CSINC should use the add's RHS.
388 ; CHECK-LABEL: name: cmp_add_rhs_64
389 ; CHECK: liveins: $x0, $x1, $x2
391 ; CHECK-NEXT: %cmp_lhs:gpr64 = COPY $x0
392 ; CHECK-NEXT: %cmp_rhs:gpr64 = COPY $x1
393 ; CHECK-NEXT: %add_rhs:gpr64 = COPY $x2
394 ; CHECK-NEXT: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr %cmp_lhs, %cmp_rhs, implicit-def $nzcv
395 ; CHECK-NEXT: %add:gpr64 = CSINCXr %add_rhs, %add_rhs, 1, implicit $nzcv
396 ; CHECK-NEXT: $x0 = COPY %add
397 ; CHECK-NEXT: RET_ReallyLR implicit $x0
398 %cmp_lhs:gpr(s64) = COPY $x0
399 %cmp_rhs:gpr(s64) = COPY $x1
400 %add_rhs:gpr(s64) = COPY $x2
401 %cmp:gpr(s32) = G_ICMP intpred(eq), %cmp_lhs(s64), %cmp_rhs
402 %cmp_ext:gpr(s64) = G_ZEXT %cmp
403 %add:gpr(s64) = G_ADD %cmp_ext, %add_rhs
405 RET_ReallyLR implicit $x0
409 name: cmp_add_rhs_64_zext_multi_use
411 regBankSelected: true
412 tracksRegLiveness: true
413 machineFunctionInfo: {}
416 liveins: $x0, $x1, $x2
418 ; The ZExt is used more than once so don't fold.
419 ; CHECK-LABEL: name: cmp_add_rhs_64_zext_multi_use
420 ; CHECK: liveins: $x0, $x1, $x2
422 ; CHECK-NEXT: %cmp_lhs:gpr64 = COPY $x0
423 ; CHECK-NEXT: %cmp_rhs:gpr64 = COPY $x1
424 ; CHECK-NEXT: %add_rhs:gpr64 = COPY $x2
425 ; CHECK-NEXT: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr %cmp_lhs, %cmp_rhs, implicit-def $nzcv
426 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
427 ; CHECK-NEXT: [[ORRWrs:%[0-9]+]]:gpr32 = ORRWrs $wzr, %cmp, 0
428 ; CHECK-NEXT: %cmp_ext:gpr64 = SUBREG_TO_REG 0, [[ORRWrs]], %subreg.sub_32
429 ; CHECK-NEXT: %add:gpr64 = ADDXrr %cmp_ext, %add_rhs
430 ; CHECK-NEXT: %or:gpr64 = ORRXrr %add, %cmp_ext
431 ; CHECK-NEXT: $x0 = COPY %or
432 ; CHECK-NEXT: RET_ReallyLR implicit $x0
433 %cmp_lhs:gpr(s64) = COPY $x0
434 %cmp_rhs:gpr(s64) = COPY $x1
435 %add_rhs:gpr(s64) = COPY $x2
436 %cmp:gpr(s32) = G_ICMP intpred(eq), %cmp_lhs(s64), %cmp_rhs
437 %cmp_ext:gpr(s64) = G_ZEXT %cmp
438 %add:gpr(s64) = G_ADD %cmp_ext, %add_rhs
439 %or:gpr(s64) = G_OR %add, %cmp_ext
441 RET_ReallyLR implicit $x0
445 name: cmp_add_rhs_64_cmp_multi_use
447 regBankSelected: true
448 tracksRegLiveness: true
449 machineFunctionInfo: {}
452 liveins: $x0, $x1, $x2
454 ; The cmp is used more than once so don't fold.
455 ; CHECK-LABEL: name: cmp_add_rhs_64_cmp_multi_use
456 ; CHECK: liveins: $x0, $x1, $x2
458 ; CHECK-NEXT: %cmp_lhs:gpr64 = COPY $x0
459 ; CHECK-NEXT: %cmp_rhs:gpr64 = COPY $x1
460 ; CHECK-NEXT: %add_rhs:gpr64 = COPY $x2
461 ; CHECK-NEXT: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr %cmp_lhs, %cmp_rhs, implicit-def $nzcv
462 ; CHECK-NEXT: %cmp:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
463 ; CHECK-NEXT: [[ORRWrs:%[0-9]+]]:gpr32 = ORRWrs $wzr, %cmp, 0
464 ; CHECK-NEXT: %cmp_ext:gpr64 = SUBREG_TO_REG 0, [[ORRWrs]], %subreg.sub_32
465 ; CHECK-NEXT: %add:gpr64 = ADDXrr %cmp_ext, %add_rhs
466 ; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr64all = IMPLICIT_DEF
467 ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:gpr64 = INSERT_SUBREG [[DEF]], %cmp, %subreg.sub_32
468 ; CHECK-NEXT: %cmp_ext2:gpr64 = SBFMXri [[INSERT_SUBREG]], 0, 31
469 ; CHECK-NEXT: %or:gpr64 = ORRXrr %add, %cmp_ext2
470 ; CHECK-NEXT: $x0 = COPY %or
471 ; CHECK-NEXT: RET_ReallyLR implicit $x0
472 %cmp_lhs:gpr(s64) = COPY $x0
473 %cmp_rhs:gpr(s64) = COPY $x1
474 %add_rhs:gpr(s64) = COPY $x2
475 %cmp:gpr(s32) = G_ICMP intpred(eq), %cmp_lhs(s64), %cmp_rhs
476 %cmp_ext:gpr(s64) = G_ZEXT %cmp
477 %add:gpr(s64) = G_ADD %cmp_ext, %add_rhs
478 %cmp_ext2:gpr(s64) = G_SEXT %cmp
479 %or:gpr(s64) = G_OR %add, %cmp_ext2
481 RET_ReallyLR implicit $x0