Skip to content

Commit 3c8f139

Browse files
committed
[InstCombine] Add tests for icmp of select of cmp (NFC)
1 parent e1912a1 commit 3c8f139

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

llvm/test/Transforms/InstCombine/select-cmp.ll

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,4 +480,108 @@ define i1 @test_select_inverse_nonconst4(i64 %x, i64 %y, i64 %z, i1 %cond) {
480480
ret i1 %sel
481481
}
482482

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+
483586
declare void @use(i1)
587+
declare void @use.i8(i8)

0 commit comments

Comments
 (0)