Skip to content

Commit b4de15c

Browse files
committed
[ValueTracking] Add tests for computing knownbits from (icmp upred X (and/or X, Y)); NFC
1 parent 3d409e5 commit b4de15c

File tree

1 file changed

+199
-0
lines changed

1 file changed

+199
-0
lines changed

llvm/test/Transforms/InstCombine/known-bits.ll

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,205 @@ if.else:
532532
ret i1 %other
533533
}
534534

535+
define i8 @test_icmp_or(i8 %n, i8 %n2, i8 %other) {
536+
; CHECK-LABEL: @test_icmp_or(
537+
; CHECK-NEXT: entry:
538+
; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
539+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_OR]], 32
540+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
541+
; CHECK: if.then:
542+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
543+
; CHECK-NEXT: ret i8 [[R]]
544+
; CHECK: if.else:
545+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
546+
;
547+
entry:
548+
%n_or = or i8 %n, %n2
549+
%cmp = icmp ult i8 %n_or, 32
550+
br i1 %cmp, label %if.then, label %if.else
551+
552+
if.then:
553+
%r = and i8 %n, 32
554+
ret i8 %r
555+
556+
if.else:
557+
ret i8 %other
558+
}
559+
560+
define i8 @test_icmp_or2(i8 %n, i8 %n2, i8 %other) {
561+
; CHECK-LABEL: @test_icmp_or2(
562+
; CHECK-NEXT: entry:
563+
; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
564+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_OR]], 14
565+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
566+
; CHECK: if.then:
567+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
568+
; CHECK: if.else:
569+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
570+
; CHECK-NEXT: ret i8 [[R]]
571+
;
572+
entry:
573+
%n_or = or i8 %n, %n2
574+
%cmp = icmp uge i8 %n_or, 15
575+
br i1 %cmp, label %if.then, label %if.else
576+
577+
if.then:
578+
ret i8 %other
579+
if.else:
580+
%r = and i8 %n, 32
581+
ret i8 %r
582+
583+
}
584+
585+
define i8 @test_icmp_or_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
586+
; CHECK-LABEL: @test_icmp_or_fail_bad_range(
587+
; CHECK-NEXT: entry:
588+
; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
589+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_OR]], 33
590+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
591+
; CHECK: if.then:
592+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
593+
; CHECK-NEXT: ret i8 [[R]]
594+
; CHECK: if.else:
595+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
596+
;
597+
entry:
598+
%n_or = or i8 %n, %n2
599+
%cmp = icmp ule i8 %n_or, 32
600+
br i1 %cmp, label %if.then, label %if.else
601+
602+
if.then:
603+
%r = and i8 %n, 32
604+
ret i8 %r
605+
606+
if.else:
607+
ret i8 %other
608+
}
609+
610+
define i8 @test_icmp_or_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
611+
; CHECK-LABEL: @test_icmp_or_fail_bad_pred(
612+
; CHECK-NEXT: entry:
613+
; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
614+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_OR]], 32
615+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
616+
; CHECK: if.then:
617+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
618+
; CHECK-NEXT: ret i8 [[R]]
619+
; CHECK: if.else:
620+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
621+
;
622+
entry:
623+
%n_or = or i8 %n, %n2
624+
%cmp = icmp ugt i8 %n_or, 32
625+
br i1 %cmp, label %if.then, label %if.else
626+
627+
if.then:
628+
%r = and i8 %n, 32
629+
ret i8 %r
630+
631+
if.else:
632+
ret i8 %other
633+
}
634+
635+
define i8 @test_icmp_and(i8 %n, i8 %n2, i8 %other) {
636+
; CHECK-LABEL: @test_icmp_and(
637+
; CHECK-NEXT: entry:
638+
; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
639+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -33
640+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
641+
; CHECK: if.then:
642+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
643+
; CHECK-NEXT: ret i8 [[R]]
644+
; CHECK: if.else:
645+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
646+
;
647+
entry:
648+
%n_and = and i8 %n, %n2
649+
%cmp = icmp ugt i8 %n_and, 223
650+
br i1 %cmp, label %if.then, label %if.else
651+
652+
if.then:
653+
%r = and i8 %n, 32
654+
ret i8 %r
655+
656+
if.else:
657+
ret i8 %other
658+
}
659+
660+
define i8 @test_icmp_and2(i8 %n, i8 %n2, i8 %other) {
661+
; CHECK-LABEL: @test_icmp_and2(
662+
; CHECK-NEXT: entry:
663+
; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
664+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_AND]], -31
665+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
666+
; CHECK: if.then:
667+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
668+
; CHECK: if.else:
669+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
670+
; CHECK-NEXT: ret i8 [[R]]
671+
;
672+
entry:
673+
%n_and = and i8 %n, %n2
674+
%cmp = icmp ule i8 %n_and, 224
675+
br i1 %cmp, label %if.then, label %if.else
676+
677+
if.then:
678+
ret i8 %other
679+
if.else:
680+
%r = and i8 %n, 32
681+
ret i8 %r
682+
683+
}
684+
685+
define i8 @test_icmp_and_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
686+
; CHECK-LABEL: @test_icmp_and_fail_bad_range(
687+
; CHECK-NEXT: entry:
688+
; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
689+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -34
690+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
691+
; CHECK: if.then:
692+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
693+
; CHECK-NEXT: ret i8 [[R]]
694+
; CHECK: if.else:
695+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
696+
;
697+
entry:
698+
%n_and = and i8 %n, %n2
699+
%cmp = icmp uge i8 %n_and, 223
700+
br i1 %cmp, label %if.then, label %if.else
701+
702+
if.then:
703+
%r = and i8 %n, 32
704+
ret i8 %r
705+
706+
if.else:
707+
ret i8 %other
708+
}
709+
710+
define i8 @test_icmp_and_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
711+
; CHECK-LABEL: @test_icmp_and_fail_bad_pred(
712+
; CHECK-NEXT: entry:
713+
; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
714+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[N_AND]], 32
715+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
716+
; CHECK: if.then:
717+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
718+
; CHECK-NEXT: ret i8 [[R]]
719+
; CHECK: if.else:
720+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
721+
;
722+
entry:
723+
%n_and = and i8 %n, %n2
724+
%cmp = icmp eq i8 %n_and, 32
725+
br i1 %cmp, label %if.then, label %if.else
726+
727+
if.then:
728+
%r = and i8 %n, 32
729+
ret i8 %r
730+
731+
if.else:
732+
ret i8 %other
733+
}
535734

536735

537736
declare void @use(i1)

0 commit comments

Comments
 (0)