@@ -630,3 +630,41 @@ 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: [[CMP1:%.*]] = icmp ugt i64 [[ADD]], 86399
642+ ; CHECK-NEXT: ret i1 [[CMP1]]
643+ ;
644+ entry:
645+ %rem = srem i64 %x , 86400
646+ %cmp = icmp slt i64 %rem , 0
647+ %cond = select i1 %cmp , i64 86400 , i64 0
648+ %add = add nsw i64 %cond , %rem
649+ %cmp1 = icmp ugt i64 %add , 86399
650+ ret i1 %cmp1
651+ }
652+
653+ define i1 @test_icmp_mod_undef (i64 %x ) {
654+ ; CHECK-LABEL: @test_icmp_mod_undef(
655+ ; CHECK-NEXT: entry:
656+ ; CHECK-NEXT: [[REM:%.*]] = srem i64 [[X:%.*]], 86400
657+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[REM]], 0
658+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i64 86400, i64 0
659+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]
660+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[ADD]], 86399
661+ ; CHECK-NEXT: ret i1 [[CMP1]]
662+ ;
663+ entry:
664+ %rem = srem i64 %x , 86400
665+ %cmp = icmp slt i64 %rem , 0
666+ %cond = select i1 %cmp , i64 86400 , i64 0
667+ %add = add nsw i64 %cond , %rem
668+ %cmp1 = icmp ugt i64 %add , 86399
669+ ret i1 %cmp1
670+ }
0 commit comments