@@ -436,6 +436,107 @@ define <3 x i2> @scmp_unary_shuffle_ops(<3 x i8> %x, <3 x i8> %y) {
436
436
ret <3 x i2 > %r
437
437
}
438
438
439
+ define i32 @scmp_ashr (i32 %a ) {
440
+ ; CHECK-LABEL: define i32 @scmp_ashr(
441
+ ; CHECK-SAME: i32 [[A:%.*]]) {
442
+ ; CHECK-NEXT: [[A_LOBIT:%.*]] = ashr i32 [[A]], 31
443
+ ; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt i32 [[A]], 1
444
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP_INV]], i32 [[A_LOBIT]], i32 1
445
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
446
+ ;
447
+ %a.lobit = ashr i32 %a , 31
448
+ %cmp.inv = icmp slt i32 %a , 1
449
+ %retval.0 = select i1 %cmp.inv , i32 %a.lobit , i32 1
450
+ ret i32 %retval.0
451
+ }
452
+
453
+ define i32 @scmp_sgt_slt (i32 %a ) {
454
+ ; CHECK-LABEL: define i32 @scmp_sgt_slt(
455
+ ; CHECK-SAME: i32 [[A:%.*]]) {
456
+ ; CHECK-NEXT: [[A_LOBIT:%.*]] = ashr i32 [[A]], 31
457
+ ; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt i32 [[A]], 1
458
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP_INV]], i32 [[A_LOBIT]], i32 1
459
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
460
+ ;
461
+ %cmp = icmp sgt i32 %a , 0
462
+ %cmp1 = icmp slt i32 %a , 0
463
+ %. = select i1 %cmp1 , i32 -1 , i32 0
464
+ %retval.0 = select i1 %cmp , i32 1 , i32 %.
465
+ ret i32 %retval.0
466
+ }
467
+
468
+ define i32 @scmp_zero_slt (i32 %a ) {
469
+ ; CHECK-LABEL: define i32 @scmp_zero_slt(
470
+ ; CHECK-SAME: i32 [[A:%.*]]) {
471
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A]], 0
472
+ ; CHECK-NEXT: [[CMP1_INV:%.*]] = icmp slt i32 [[A]], 1
473
+ ; CHECK-NEXT: [[DOT:%.*]] = select i1 [[CMP1_INV]], i32 -1, i32 1
474
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i32 0, i32 [[DOT]]
475
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
476
+ ;
477
+ %cmp = icmp eq i32 %a , 0
478
+ %cmp1.inv = icmp slt i32 %a , 1
479
+ %. = select i1 %cmp1.inv , i32 -1 , i32 1
480
+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
481
+ ret i32 %retval.0
482
+ }
483
+
484
+ define i32 @scmp_zero_sgt (i32 %a ) {
485
+ ; CHECK-LABEL: define i32 @scmp_zero_sgt(
486
+ ; CHECK-SAME: i32 [[A:%.*]]) {
487
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A]], 0
488
+ ; CHECK-NEXT: [[CMP1_INV:%.*]] = icmp sgt i32 [[A]], -1
489
+ ; CHECK-NEXT: [[DOT:%.*]] = select i1 [[CMP1_INV]], i32 1, i32 -1
490
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i32 0, i32 [[DOT]]
491
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
492
+ ;
493
+ %cmp = icmp eq i32 %a , 0
494
+ %cmp1.inv = icmp sgt i32 %a , -1
495
+ %. = select i1 %cmp1.inv , i32 1 , i32 -1
496
+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
497
+ ret i32 %retval.0
498
+ }
499
+
500
+
501
+ define i32 @scmp_sgt_slt_ab (i32 %a , i32 %b ) {
502
+ ; CHECK-LABEL: define i32 @scmp_sgt_slt_ab(
503
+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
504
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[A]], i32 [[B]])
505
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
506
+ ;
507
+ %cmp = icmp sgt i32 %a , %b
508
+ %cmp1 = icmp slt i32 %a , %b
509
+ %. = select i1 %cmp1 , i32 -1 , i32 0
510
+ %retval.0 = select i1 %cmp , i32 1 , i32 %.
511
+ ret i32 %retval.0
512
+ }
513
+
514
+ define i32 @scmp_zero_slt_ab (i32 %a , i32 %b ) {
515
+ ; CHECK-LABEL: define i32 @scmp_zero_slt_ab(
516
+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
517
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[A]], i32 [[B]])
518
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
519
+ ;
520
+ %cmp = icmp eq i32 %a , %b
521
+ %cmp1.inv = icmp slt i32 %a , %b
522
+ %. = select i1 %cmp1.inv , i32 -1 , i32 1
523
+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
524
+ ret i32 %retval.0
525
+ }
526
+
527
+ define i32 @scmp_zero_sgt_ab (i32 %a , i32 %b ) {
528
+ ; CHECK-LABEL: define i32 @scmp_zero_sgt_ab(
529
+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
530
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[A]], i32 [[B]])
531
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
532
+ ;
533
+ %cmp = icmp eq i32 %a , %b
534
+ %cmp1.inv = icmp sgt i32 %a , %b
535
+ %. = select i1 %cmp1.inv , i32 1 , i32 -1
536
+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
537
+ ret i32 %retval.0
538
+ }
539
+
439
540
; Negative test: true value of outer select is not zero
440
541
define i8 @scmp_from_select_eq_and_gt_neg1 (i32 %x , i32 %y ) {
441
542
; CHECK-LABEL: define i8 @scmp_from_select_eq_and_gt_neg1(
0 commit comments