@@ -459,12 +459,12 @@ exit:
459
459
ret i64 %p
460
460
}
461
461
462
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
463
462
define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch (ptr %dst , i64 %N ) {
464
463
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch(
465
464
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
466
465
; CHECK-NEXT: entry:
467
- ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[N]]
466
+ ; CHECK-NEXT: [[TMP10:%.*]] = call i64 @llvm.umax.i64(i64 [[N]], i64 1)
467
+ ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[TMP10]]
468
468
; CHECK-NEXT: [[TMP8:%.*]] = freeze i64 [[TMP0]]
469
469
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
470
470
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP8]], i64 [[SMAX]])
@@ -529,13 +529,14 @@ exit:
529
529
530
530
declare void @foo ()
531
531
532
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
533
532
define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_call_before_loop (ptr %dst , i64 %N ) {
534
533
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_call_before_loop(
535
534
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
536
535
; CHECK-NEXT: entry:
537
536
; CHECK-NEXT: call void @foo()
538
- ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[N]]
537
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[N]]
538
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP0]], i64 1)
539
+ ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[TMP1]]
539
540
; CHECK-NEXT: [[TMP3:%.*]] = freeze i64 [[TMP2]]
540
541
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
541
542
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP3]], i64 [[SMAX]])
@@ -599,14 +600,15 @@ exit:
599
600
ret i64 %p
600
601
}
601
602
602
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
603
603
define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_loop_may_not_execute (ptr %dst , i64 %N , i1 %c ) {
604
604
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_loop_may_not_execute(
605
605
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]], i1 [[C:%.*]]) {
606
606
; CHECK-NEXT: entry:
607
607
; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER_PREHEADER:%.*]], label [[EXIT:%.*]]
608
608
; CHECK: loop.header.preheader:
609
- ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[N]]
609
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[N]]
610
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP0]], i64 1)
611
+ ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[TMP1]]
610
612
; CHECK-NEXT: [[TMP3:%.*]] = freeze i64 [[TMP2]]
611
613
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
612
614
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP3]], i64 [[SMAX]])
@@ -672,12 +674,13 @@ exit:
672
674
ret i64 %p
673
675
}
674
676
675
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
676
677
define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_different_bounds (ptr %dst , i64 %N , i64 %M ) {
677
678
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_different_bounds(
678
679
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]], i64 [[M:%.*]]) {
679
680
; CHECK-NEXT: entry:
680
- ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[M]]
681
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[M]]
682
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP0]], i64 1)
683
+ ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[TMP1]]
681
684
; CHECK-NEXT: [[TMP3:%.*]] = freeze i64 [[TMP2]]
682
685
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
683
686
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP3]], i64 [[SMAX]])
@@ -740,13 +743,13 @@ exit:
740
743
ret i64 %p
741
744
}
742
745
743
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
744
746
define i64 @multi_exit_4_exit_count_with_udiv_by_frozen_value_in_latch (ptr %dst , i64 %N ) {
745
747
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_frozen_value_in_latch(
746
748
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
747
749
; CHECK-NEXT: entry:
748
750
; CHECK-NEXT: [[FR_N:%.*]] = freeze i64 [[N]]
749
- ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[FR_N]]
751
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.umax.i64(i64 [[FR_N]], i64 1)
752
+ ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[TMP1]]
750
753
; CHECK-NEXT: [[TMP10:%.*]] = freeze i64 [[TMP2]]
751
754
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
752
755
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP10]], i64 [[SMAX]])
@@ -931,12 +934,12 @@ exit:
931
934
ret void
932
935
}
933
936
934
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
935
937
define i64 @multi_exit_4_exit_count_with_urem_by_value_in_latch (ptr %dst , i64 %N ) {
936
938
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_urem_by_value_in_latch(
937
939
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
938
940
; CHECK-NEXT: entry:
939
- ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[N]]
941
+ ; CHECK-NEXT: [[TMP12:%.*]] = call i64 @llvm.umax.i64(i64 [[N]], i64 1)
942
+ ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[TMP12]]
940
943
; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i64 [[N]], [[TMP0]]
941
944
; CHECK-NEXT: [[TMP2:%.*]] = sub i64 42, [[TMP1]]
942
945
; CHECK-NEXT: [[SMAX1:%.*]] = call i64 @llvm.smax.i64(i64 [[TMP2]], i64 0)
@@ -1002,7 +1005,6 @@ exit:
1002
1005
ret i64 %p
1003
1006
}
1004
1007
1005
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
1006
1008
define i64 @multi_exit_4_exit_count_with_urem_by_constant_in_latch (ptr %dst , i64 %N ) {
1007
1009
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_urem_by_constant_in_latch(
1008
1010
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
@@ -1156,7 +1158,8 @@ define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch1(ptr %dst, i64 %
1156
1158
; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch1(
1157
1159
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
1158
1160
; CHECK-NEXT: entry:
1159
- ; CHECK-NEXT: [[TMP9:%.*]] = udiv i64 42, [[N]]
1161
+ ; CHECK-NEXT: [[TMP8:%.*]] = call i64 @llvm.umax.i64(i64 [[N]], i64 1)
1162
+ ; CHECK-NEXT: [[TMP9:%.*]] = udiv i64 42, [[TMP8]]
1160
1163
; CHECK-NEXT: [[TMP10:%.*]] = freeze i64 [[TMP9]]
1161
1164
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
1162
1165
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP10]], i64 [[SMAX]])
@@ -1262,13 +1265,14 @@ exit:
1262
1265
ret i64 %p
1263
1266
}
1264
1267
1265
- ; FIXME: currently the expansion of the loop bounds may introduce UB through the division.
1266
1268
define i64 @multi_exit_count_with_udiv_by_value_in_latch_different_bounds_divisor_non_zero_may_be_poison (ptr %dst , i64 %N , i64 %M ) {
1267
1269
; CHECK-LABEL: define i64 @multi_exit_count_with_udiv_by_value_in_latch_different_bounds_divisor_non_zero_may_be_poison(
1268
1270
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]], i64 [[M:%.*]]) {
1269
1271
; CHECK-NEXT: entry:
1270
1272
; CHECK-NEXT: [[M_1:%.*]] = call i64 @llvm.umax.i64(i64 [[M]], i64 1)
1271
- ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[M_1]]
1273
+ ; CHECK-NEXT: [[TMP9:%.*]] = freeze i64 [[M_1]]
1274
+ ; CHECK-NEXT: [[TMP10:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP9]], i64 1)
1275
+ ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[TMP10]]
1272
1276
; CHECK-NEXT: [[TMP1:%.*]] = freeze i64 [[TMP0]]
1273
1277
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
1274
1278
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP1]], i64 [[SMAX]])
0 commit comments