@@ -258,3 +258,191 @@ define i32 @neg_range_int(i32 %a, i32 %b, i32 %c) {
258
258
ret i32 %retval.0
259
259
}
260
260
261
+ ; (b > -(d | 1) && a < c)
262
+ define i32 @neg_range_int_comp (i32 %a , i32 %b , i32 %c , i32 %d ) {
263
+ ; CHECK-LABEL: neg_range_int_comp:
264
+ ; CHECK: // %bb.0:
265
+ ; CHECK-NEXT: orr w8, w3, #0x1
266
+ ; CHECK-NEXT: cmp w0, w2
267
+ ; CHECK-NEXT: neg w8, w8
268
+ ; CHECK-NEXT: ccmp w1, w8, #4, lt
269
+ ; CHECK-NEXT: csel w0, w1, w0, gt
270
+ ; CHECK-NEXT: ret
271
+ %dor = or i32 %d , 1
272
+ %negd = sub i32 0 , %dor
273
+ %cmp = icmp sgt i32 %b , %negd
274
+ %cmp1 = icmp slt i32 %a , %c
275
+ %or.cond = and i1 %cmp , %cmp1
276
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
277
+ ret i32 %retval.0
278
+ }
279
+
280
+ ; (b >u -(d | 1) && a < c)
281
+ define i32 @neg_range_int_comp_u (i32 %a , i32 %b , i32 %c , i32 %d ) {
282
+ ; CHECK-LABEL: neg_range_int_comp_u:
283
+ ; CHECK: // %bb.0:
284
+ ; CHECK-NEXT: orr w8, w3, #0x1
285
+ ; CHECK-NEXT: cmp w0, w2
286
+ ; CHECK-NEXT: neg w8, w8
287
+ ; CHECK-NEXT: ccmp w1, w8, #0, lt
288
+ ; CHECK-NEXT: csel w0, w1, w0, hi
289
+ ; CHECK-NEXT: ret
290
+ %dor = or i32 %d , 1
291
+ %negd = sub i32 0 , %dor
292
+ %cmp = icmp ugt i32 %b , %negd
293
+ %cmp1 = icmp slt i32 %a , %c
294
+ %or.cond = and i1 %cmp , %cmp1
295
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
296
+ ret i32 %retval.0
297
+ }
298
+
299
+ ; (b > -(d | 1) && a u < c)
300
+ define i32 @neg_range_int_comp_ua (i32 %a , i32 %b , i32 %c , i32 %d ) {
301
+ ; CHECK-LABEL: neg_range_int_comp_ua:
302
+ ; CHECK: // %bb.0:
303
+ ; CHECK-NEXT: orr w8, w3, #0x1
304
+ ; CHECK-NEXT: cmp w0, w2
305
+ ; CHECK-NEXT: neg w8, w8
306
+ ; CHECK-NEXT: ccmp w1, w8, #4, lo
307
+ ; CHECK-NEXT: csel w0, w1, w0, gt
308
+ ; CHECK-NEXT: ret
309
+ %dor = or i32 %d , 1
310
+ %negd = sub i32 0 , %dor
311
+ %cmp = icmp sgt i32 %b , %negd
312
+ %cmp1 = icmp ult i32 %a , %c
313
+ %or.cond = and i1 %cmp , %cmp1
314
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
315
+ ret i32 %retval.0
316
+ }
317
+
318
+ ; (b <= -3 && a > c)
319
+ define i32 @neg_range_int_2 (i32 %a , i32 %b , i32 %c ) {
320
+ ; SDISEL-LABEL: neg_range_int_2:
321
+ ; SDISEL: // %bb.0:
322
+ ; SDISEL-NEXT: cmp w0, w2
323
+ ; SDISEL-NEXT: ccmn w1, #4, #4, gt
324
+ ; SDISEL-NEXT: csel w0, w1, w0, gt
325
+ ; SDISEL-NEXT: ret
326
+ ;
327
+ ; GISEL-LABEL: neg_range_int_2:
328
+ ; GISEL: // %bb.0:
329
+ ; GISEL-NEXT: cmp w0, w2
330
+ ; GISEL-NEXT: ccmn w1, #3, #8, gt
331
+ ; GISEL-NEXT: csel w0, w1, w0, ge
332
+ ; GISEL-NEXT: ret
333
+ %cmp = icmp sge i32 %b , -3
334
+ %cmp1 = icmp sgt i32 %a , %c
335
+ %or.cond = and i1 %cmp , %cmp1
336
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
337
+ ret i32 %retval.0
338
+ }
339
+
340
+ ; (b < -(d | 1) && a >= c)
341
+ define i32 @neg_range_int_comp2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
342
+ ; CHECK-LABEL: neg_range_int_comp2:
343
+ ; CHECK: // %bb.0:
344
+ ; CHECK-NEXT: orr w8, w3, #0x1
345
+ ; CHECK-NEXT: cmp w0, w2
346
+ ; CHECK-NEXT: neg w8, w8
347
+ ; CHECK-NEXT: ccmp w1, w8, #0, ge
348
+ ; CHECK-NEXT: csel w0, w1, w0, lt
349
+ ; CHECK-NEXT: ret
350
+ %dor = or i32 %d , 1
351
+ %negd = sub i32 0 , %dor
352
+ %cmp = icmp slt i32 %b , %negd
353
+ %cmp1 = icmp sge i32 %a , %c
354
+ %or.cond = and i1 %cmp , %cmp1
355
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
356
+ ret i32 %retval.0
357
+ }
358
+
359
+ ; (b <u -(d | 1) && a > c)
360
+ define i32 @neg_range_int_comp_u2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
361
+ ; CHECK-LABEL: neg_range_int_comp_u2:
362
+ ; CHECK: // %bb.0:
363
+ ; CHECK-NEXT: orr w8, w3, #0x1
364
+ ; CHECK-NEXT: cmp w0, w2
365
+ ; CHECK-NEXT: neg w8, w8
366
+ ; CHECK-NEXT: ccmp w1, w8, #2, gt
367
+ ; CHECK-NEXT: csel w0, w1, w0, lo
368
+ ; CHECK-NEXT: ret
369
+ %dor = or i32 %d , 1
370
+ %negd = sub i32 0 , %dor
371
+ %cmp = icmp ult i32 %b , %negd
372
+ %cmp1 = icmp sgt i32 %a , %c
373
+ %or.cond = and i1 %cmp , %cmp1
374
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
375
+ ret i32 %retval.0
376
+ }
377
+
378
+ ; (b > -(d | 1) && a u > c)
379
+ define i32 @neg_range_int_comp_ua2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
380
+ ; CHECK-LABEL: neg_range_int_comp_ua2:
381
+ ; CHECK: // %bb.0:
382
+ ; CHECK-NEXT: orr w8, w3, #0x1
383
+ ; CHECK-NEXT: cmp w0, w2
384
+ ; CHECK-NEXT: neg w8, w8
385
+ ; CHECK-NEXT: ccmp w1, w8, #4, hi
386
+ ; CHECK-NEXT: csel w0, w1, w0, gt
387
+ ; CHECK-NEXT: ret
388
+ %dor = or i32 %d , 1
389
+ %negd = sub i32 0 , %dor
390
+ %cmp = icmp sgt i32 %b , %negd
391
+ %cmp1 = icmp ugt i32 %a , %c
392
+ %or.cond = and i1 %cmp , %cmp1
393
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
394
+ ret i32 %retval.0
395
+ }
396
+
397
+ ; (b > -(d | 1) && a u == c)
398
+ define i32 @neg_range_int_comp_ua3 (i32 %a , i32 %b , i32 %c , i32 %d ) {
399
+ ; CHECK-LABEL: neg_range_int_comp_ua3:
400
+ ; CHECK: // %bb.0:
401
+ ; CHECK-NEXT: orr w8, w3, #0x1
402
+ ; CHECK-NEXT: cmp w0, w2
403
+ ; CHECK-NEXT: neg w8, w8
404
+ ; CHECK-NEXT: ccmp w1, w8, #4, eq
405
+ ; CHECK-NEXT: csel w0, w1, w0, gt
406
+ ; CHECK-NEXT: ret
407
+ %dor = or i32 %d , 1
408
+ %negd = sub i32 0 , %dor
409
+ %cmp = icmp sgt i32 %b , %negd
410
+ %cmp1 = icmp eq i32 %a , %c
411
+ %or.cond = and i1 %cmp , %cmp1
412
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
413
+ ret i32 %retval.0
414
+ }
415
+
416
+ ; -(a | 1) > (b | 3) && a < c
417
+ define i32 @neg_range_int_c (i32 %a , i32 %b , i32 %c ) {
418
+ ; SDISEL-LABEL: neg_range_int_c:
419
+ ; SDISEL: // %bb.0: // %entry
420
+ ; SDISEL-NEXT: orr w8, w0, #0x1
421
+ ; SDISEL-NEXT: orr w9, w1, #0x3
422
+ ; SDISEL-NEXT: neg w8, w8
423
+ ; SDISEL-NEXT: cmp w9, w8
424
+ ; SDISEL-NEXT: ccmp w2, w0, #2, lo
425
+ ; SDISEL-NEXT: cset w0, lo
426
+ ; SDISEL-NEXT: ret
427
+ ;
428
+ ; GISEL-LABEL: neg_range_int_c:
429
+ ; GISEL: // %bb.0: // %entry
430
+ ; GISEL-NEXT: orr w8, w0, #0x1
431
+ ; GISEL-NEXT: orr w9, w1, #0x3
432
+ ; GISEL-NEXT: neg w8, w8
433
+ ; GISEL-NEXT: cmp w9, w8
434
+ ; GISEL-NEXT: cset w8, lo
435
+ ; GISEL-NEXT: cmp w2, w0
436
+ ; GISEL-NEXT: cset w9, lo
437
+ ; GISEL-NEXT: and w0, w8, w9
438
+ ; GISEL-NEXT: ret
439
+ entry:
440
+ %or = or i32 %a , 1
441
+ %sub = sub i32 0 , %or
442
+ %or1 = or i32 %b , 3
443
+ %cmp = icmp ult i32 %or1 , %sub
444
+ %cmp2 = icmp ult i32 %c , %a
445
+ %0 = and i1 %cmp , %cmp2
446
+ %land.ext = zext i1 %0 to i32
447
+ ret i32 %land.ext
448
+ }
0 commit comments