@@ -480,4 +480,108 @@ define i1 @test_select_inverse_nonconst4(i64 %x, i64 %y, i64 %z, i1 %cond) {
480
480
ret i1 %sel
481
481
}
482
482
483
+ define i1 @sel_icmp_two_cmp (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 ) {
484
+ ; CHECK-LABEL: @sel_icmp_two_cmp(
485
+ ; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
486
+ ; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])
487
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]
488
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1
489
+ ; CHECK-NEXT: ret i1 [[CMP]]
490
+ ;
491
+ %v1 = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
492
+ %v2 = call i8 @llvm.scmp (i32 %a3 , i32 %a4 )
493
+ %sel = select i1 %c , i8 %v1 , i8 %v2
494
+ %cmp = icmp sle i8 %sel , 0
495
+ ret i1 %cmp
496
+ }
497
+
498
+ define i1 @sel_icmp_two_cmp_extra_use1 (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 ) {
499
+ ; CHECK-LABEL: @sel_icmp_two_cmp_extra_use1(
500
+ ; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
501
+ ; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])
502
+ ; CHECK-NEXT: call void @use.i8(i8 [[V1]])
503
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]
504
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1
505
+ ; CHECK-NEXT: ret i1 [[CMP]]
506
+ ;
507
+ %v1 = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
508
+ %v2 = call i8 @llvm.scmp (i32 %a3 , i32 %a4 )
509
+ call void @use.i8 (i8 %v1 )
510
+ %sel = select i1 %c , i8 %v1 , i8 %v2
511
+ %cmp = icmp sle i8 %sel , 0
512
+ ret i1 %cmp
513
+ }
514
+
515
+ define i1 @sel_icmp_two_cmp_extra_use2 (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 ) {
516
+ ; CHECK-LABEL: @sel_icmp_two_cmp_extra_use2(
517
+ ; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
518
+ ; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])
519
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]
520
+ ; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
521
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1
522
+ ; CHECK-NEXT: ret i1 [[CMP]]
523
+ ;
524
+ %v1 = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
525
+ %v2 = call i8 @llvm.scmp (i32 %a3 , i32 %a4 )
526
+ %sel = select i1 %c , i8 %v1 , i8 %v2
527
+ call void @use.i8 (i8 %sel )
528
+ %cmp = icmp sle i8 %sel , 0
529
+ ret i1 %cmp
530
+ }
531
+
532
+ define i1 @sel_icmp_two_cmp_not_const (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 , i8 %b ) {
533
+ ; CHECK-LABEL: @sel_icmp_two_cmp_not_const(
534
+ ; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
535
+ ; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])
536
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]
537
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[SEL]], [[B:%.*]]
538
+ ; CHECK-NEXT: ret i1 [[CMP]]
539
+ ;
540
+ %v1 = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
541
+ %v2 = call i8 @llvm.scmp (i32 %a3 , i32 %a4 )
542
+ %sel = select i1 %c , i8 %v1 , i8 %v2
543
+ %cmp = icmp sle i8 %sel , %b
544
+ ret i1 %cmp
545
+ }
546
+
547
+ define i1 @sel_icmp_cmp_and_simplify (i1 %c , i32 %a1 , i32 %a2 ) {
548
+ ; CHECK-LABEL: @sel_icmp_cmp_and_simplify(
549
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]
550
+ ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true
551
+ ; CHECK-NEXT: [[CMP:%.*]] = select i1 [[NOT_C]], i1 true, i1 [[CMP1]]
552
+ ; CHECK-NEXT: ret i1 [[CMP]]
553
+ ;
554
+ %v = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
555
+ %sel = select i1 %c , i8 %v , i8 0
556
+ %cmp = icmp sle i8 %sel , 0
557
+ ret i1 %cmp
558
+ }
559
+
560
+ define i1 @sel_icmp_cmp_and_no_simplify (i1 %c , i32 %a1 , i32 %a2 , i8 %b ) {
561
+ ; CHECK-LABEL: @sel_icmp_cmp_and_no_simplify(
562
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
563
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V]], i8 [[B:%.*]]
564
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1
565
+ ; CHECK-NEXT: ret i1 [[CMP]]
566
+ ;
567
+ %v = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
568
+ %sel = select i1 %c , i8 %v , i8 %b
569
+ %cmp = icmp sle i8 %sel , 0
570
+ ret i1 %cmp
571
+ }
572
+
573
+ define i1 @sel_icmp_cmp_and_no_simplify_comm (i1 %c , i32 %a1 , i32 %a2 , i8 %b ) {
574
+ ; CHECK-LABEL: @sel_icmp_cmp_and_no_simplify_comm(
575
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
576
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[B:%.*]], i8 [[V]]
577
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1
578
+ ; CHECK-NEXT: ret i1 [[CMP]]
579
+ ;
580
+ %v = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
581
+ %sel = select i1 %c , i8 %b , i8 %v
582
+ %cmp = icmp sle i8 %sel , 0
583
+ ret i1 %cmp
584
+ }
585
+
483
586
declare void @use (i1 )
587
+ declare void @use.i8 (i8 )
0 commit comments