Skip to content

Commit 7ab43b6

Browse files
committed
[ValueTracking] Add tests for computing knownbits from (icmp upred (add/sub nuw X, Y), C); NFC
1 parent beded9b commit 7ab43b6

File tree

1 file changed

+225
-0
lines changed

1 file changed

+225
-0
lines changed

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

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,5 +630,230 @@ define i8 @or_ne_bits_must_be_unset2_fail(i8 %x, i8 %y) {
630630
ret i8 %r
631631
}
632632

633+
define i8 @test_icmp_add(i8 %n, i8 %n2, i8 %other) {
634+
; CHECK-LABEL: @test_icmp_add(
635+
; CHECK-NEXT: entry:
636+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
637+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 32
638+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
639+
; CHECK: if.then:
640+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
641+
; CHECK-NEXT: ret i8 [[R]]
642+
; CHECK: if.else:
643+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
644+
;
645+
entry:
646+
%n_add = add nuw i8 %n, %n2
647+
%cmp = icmp ult i8 %n_add, 32
648+
br i1 %cmp, label %if.then, label %if.else
649+
650+
if.then:
651+
%r = and i8 %n, 32
652+
ret i8 %r
653+
654+
if.else:
655+
ret i8 %other
656+
}
657+
658+
define i8 @test_icmp_add2(i8 %n, i8 %n2, i8 %other) {
659+
; CHECK-LABEL: @test_icmp_add2(
660+
; CHECK-NEXT: entry:
661+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
662+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 14
663+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
664+
; CHECK: if.then:
665+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
666+
; CHECK: if.else:
667+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
668+
; CHECK-NEXT: ret i8 [[R]]
669+
;
670+
entry:
671+
%n_add = add nuw i8 %n, %n2
672+
%cmp = icmp uge i8 %n_add, 15
673+
br i1 %cmp, label %if.then, label %if.else
674+
675+
if.then:
676+
ret i8 %other
677+
if.else:
678+
%r = and i8 %n, 32
679+
ret i8 %r
680+
681+
}
682+
683+
define i8 @test_icmp_add_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
684+
; CHECK-LABEL: @test_icmp_add_fail_bad_range(
685+
; CHECK-NEXT: entry:
686+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
687+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 33
688+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
689+
; CHECK: if.then:
690+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
691+
; CHECK-NEXT: ret i8 [[R]]
692+
; CHECK: if.else:
693+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
694+
;
695+
entry:
696+
%n_add = add nuw i8 %n, %n2
697+
%cmp = icmp ule i8 %n_add, 32
698+
br i1 %cmp, label %if.then, label %if.else
699+
700+
if.then:
701+
%r = and i8 %n, 32
702+
ret i8 %r
703+
704+
if.else:
705+
ret i8 %other
706+
}
707+
708+
define i8 @test_icmp_add_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
709+
; CHECK-LABEL: @test_icmp_add_fail_bad_pred(
710+
; CHECK-NEXT: entry:
711+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
712+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 32
713+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
714+
; CHECK: if.then:
715+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
716+
; CHECK-NEXT: ret i8 [[R]]
717+
; CHECK: if.else:
718+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
719+
;
720+
entry:
721+
%n_add = add nuw i8 %n, %n2
722+
%cmp = icmp ugt i8 %n_add, 32
723+
br i1 %cmp, label %if.then, label %if.else
724+
725+
if.then:
726+
%r = and i8 %n, 32
727+
ret i8 %r
728+
729+
if.else:
730+
ret i8 %other
731+
}
732+
733+
define i8 @test_icmp_sub(i8 %n, i8 %n2, i8 %other) {
734+
; CHECK-LABEL: @test_icmp_sub(
735+
; CHECK-NEXT: entry:
736+
; CHECK-NEXT: [[N_AND:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
737+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -33
738+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
739+
; CHECK: if.then:
740+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
741+
; CHECK-NEXT: ret i8 [[R]]
742+
; CHECK: if.else:
743+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
744+
;
745+
entry:
746+
%n_sub = sub nuw i8 %n, %n2
747+
%cmp = icmp ugt i8 %n_sub, 223
748+
br i1 %cmp, label %if.then, label %if.else
749+
750+
if.then:
751+
%r = and i8 %n, 32
752+
ret i8 %r
753+
754+
if.else:
755+
ret i8 %other
756+
}
757+
758+
define i8 @test_icmp_sub_fail_wrong_arg(i8 %n, i8 %n2, i8 %other) {
759+
; CHECK-LABEL: @test_icmp_sub_fail_wrong_arg(
760+
; CHECK-NEXT: entry:
761+
; CHECK-NEXT: [[N_AND:%.*]] = sub nuw i8 [[N1:%.*]], [[N:%.*]]
762+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -33
763+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
764+
; CHECK: if.then:
765+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
766+
; CHECK-NEXT: ret i8 [[R]]
767+
; CHECK: if.else:
768+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
769+
;
770+
entry:
771+
%n_sub = sub nuw i8 %n, %n2
772+
%cmp = icmp ugt i8 %n_sub, 223
773+
br i1 %cmp, label %if.then, label %if.else
774+
775+
if.then:
776+
%r = and i8 %n2, 32
777+
ret i8 %r
778+
779+
if.else:
780+
ret i8 %other
781+
}
782+
783+
define i8 @test_icmp_sub2(i8 %n, i8 %n2, i8 %other) {
784+
; CHECK-LABEL: @test_icmp_sub2(
785+
; CHECK-NEXT: entry:
786+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
787+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_SUB]], -31
788+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
789+
; CHECK: if.then:
790+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
791+
; CHECK: if.else:
792+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
793+
; CHECK-NEXT: ret i8 [[R]]
794+
;
795+
entry:
796+
%n_sub = sub nuw i8 %n, %n2
797+
%cmp = icmp ule i8 %n_sub, 224
798+
br i1 %cmp, label %if.then, label %if.else
799+
800+
if.then:
801+
ret i8 %other
802+
if.else:
803+
%r = and i8 %n, 32
804+
ret i8 %r
805+
806+
}
807+
808+
define i8 @test_icmp_sub_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
809+
; CHECK-LABEL: @test_icmp_sub_fail_bad_range(
810+
; CHECK-NEXT: entry:
811+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
812+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -34
813+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
814+
; CHECK: if.then:
815+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
816+
; CHECK-NEXT: ret i8 [[R]]
817+
; CHECK: if.else:
818+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
819+
;
820+
entry:
821+
%n_sub = sub nuw i8 %n, %n2
822+
%cmp = icmp uge i8 %n_sub, 223
823+
br i1 %cmp, label %if.then, label %if.else
824+
825+
if.then:
826+
%r = and i8 %n, 32
827+
ret i8 %r
828+
829+
if.else:
830+
ret i8 %other
831+
}
832+
833+
define i8 @test_icmp_sub_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
834+
; CHECK-LABEL: @test_icmp_sub_fail_bad_pred(
835+
; CHECK-NEXT: entry:
836+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
837+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[N_SUB]], 31
838+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
839+
; CHECK: if.then:
840+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
841+
; CHECK-NEXT: ret i8 [[R]]
842+
; CHECK: if.else:
843+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
844+
;
845+
entry:
846+
%n_sub = sub nuw i8 %n, %n2
847+
%cmp = icmp sge i8 %n_sub, 32
848+
br i1 %cmp, label %if.then, label %if.else
849+
850+
if.then:
851+
%r = and i8 %n, 32
852+
ret i8 %r
853+
854+
if.else:
855+
ret i8 %other
856+
}
857+
633858
declare void @use(i1)
634859
declare void @sink(i8)

0 commit comments

Comments
 (0)