@@ -630,3 +630,95 @@ define i64 @test_shl_nsw_at_use(i64 noundef %x) {
630630 %res = select i1 %cmp , i64 %shr , i64 0
631631 ret i64 %res
632632}
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