@@ -630,3 +630,95 @@ define i64 @test_shl_nsw_at_use(i64 noundef %x) {
630
630
%res = select i1 %cmp , i64 %shr , i64 0
631
631
ret i64 %res
632
632
}
633
+
634
+ define i1 @test_icmp_mod (i64 noundef %x ) {
635
+ ; CHECK-LABEL: @test_icmp_mod(
636
+ ; CHECK-NEXT: entry:
637
+ ; CHECK-NEXT: [[REM:%.*]] = srem i64 [[X:%.*]], 86400
638
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[REM]], 0
639
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i64 86400, i64 0
640
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]
641
+ ; CHECK-NEXT: ret i1 false
642
+ ;
643
+ entry:
644
+ %rem = srem i64 %x , 86400
645
+ %cmp = icmp slt i64 %rem , 0
646
+ %cond = select i1 %cmp , i64 86400 , i64 0
647
+ %add = add nsw i64 %cond , %rem
648
+ %cmp1 = icmp ugt i64 %add , 86399
649
+ ret i1 %cmp1
650
+ }
651
+
652
+ define i1 @test_icmp_mod_commuted1 (i64 noundef %x ) {
653
+ ; CHECK-LABEL: @test_icmp_mod_commuted1(
654
+ ; CHECK-NEXT: entry:
655
+ ; CHECK-NEXT: [[REM:%.*]] = srem i64 [[X:%.*]], 86400
656
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[REM]], 0
657
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i64 86400, i64 0
658
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[REM]], [[COND]]
659
+ ; CHECK-NEXT: ret i1 false
660
+ ;
661
+ entry:
662
+ %rem = srem i64 %x , 86400
663
+ %cmp = icmp slt i64 %rem , 0
664
+ %cond = select i1 %cmp , i64 86400 , i64 0
665
+ %add = add nsw i64 %rem , %cond
666
+ %cmp1 = icmp ugt i64 %add , 86399
667
+ ret i1 %cmp1
668
+ }
669
+
670
+ define i1 @test_icmp_mod_commuted2 (i64 noundef %x ) {
671
+ ; CHECK-LABEL: @test_icmp_mod_commuted2(
672
+ ; CHECK-NEXT: entry:
673
+ ; CHECK-NEXT: [[REM:%.*]] = srem i64 [[X:%.*]], 86400
674
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[REM]], -1
675
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i64 0, i64 86400
676
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]
677
+ ; CHECK-NEXT: ret i1 false
678
+ ;
679
+ entry:
680
+ %rem = srem i64 %x , 86400
681
+ %cmp = icmp sgt i64 %rem , -1
682
+ %cond = select i1 %cmp , i64 0 , i64 86400
683
+ %add = add nsw i64 %cond , %rem
684
+ %cmp1 = icmp ugt i64 %add , 86399
685
+ ret i1 %cmp1
686
+ }
687
+
688
+ define i1 @test_icmp_mod_undef (i64 %x ) {
689
+ ; CHECK-LABEL: @test_icmp_mod_undef(
690
+ ; CHECK-NEXT: entry:
691
+ ; CHECK-NEXT: [[REM:%.*]] = srem i64 [[X:%.*]], 86400
692
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[REM]], 0
693
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i64 86400, i64 0
694
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]
695
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[ADD]], 86399
696
+ ; CHECK-NEXT: ret i1 [[CMP1]]
697
+ ;
698
+ entry:
699
+ %rem = srem i64 %x , 86400
700
+ %cmp = icmp slt i64 %rem , 0
701
+ %cond = select i1 %cmp , i64 86400 , i64 0
702
+ %add = add nsw i64 %cond , %rem
703
+ %cmp1 = icmp ugt i64 %add , 86399
704
+ ret i1 %cmp1
705
+ }
706
+
707
+ define i1 @test_icmp_mod_wrong_range (i64 noundef %x ) {
708
+ ; CHECK-LABEL: @test_icmp_mod_wrong_range(
709
+ ; CHECK-NEXT: entry:
710
+ ; CHECK-NEXT: [[REM:%.*]] = srem i64 [[X:%.*]], 86400
711
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[REM]], 0
712
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i64 86401, i64 0
713
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]
714
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i64 [[ADD]], 86399
715
+ ; CHECK-NEXT: ret i1 [[CMP1]]
716
+ ;
717
+ entry:
718
+ %rem = srem i64 %x , 86400
719
+ %cmp = icmp slt i64 %rem , 0
720
+ %cond = select i1 %cmp , i64 86401 , i64 0
721
+ %add = add nsw i64 %cond , %rem
722
+ %cmp1 = icmp ugt i64 %add , 86399
723
+ ret i1 %cmp1
724
+ }
0 commit comments