@@ -463,9 +463,12 @@ define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch(ptr %dst, i64 %N
463463; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch(
464464; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
465465; CHECK-NEXT: entry:
466+ ; CHECK-NEXT: [[TMP9:%.*]] = freeze i64 [[N]]
467+ ; CHECK-NEXT: [[TMP10:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP9]], i64 1)
468+ ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[TMP10]]
469+ ; CHECK-NEXT: [[TMP8:%.*]] = freeze i64 [[TMP0]]
466470; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
467- ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[N]]
468- ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[SMAX]], i64 [[TMP0]])
471+ ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP8]], i64 [[SMAX]])
469472; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i64 [[UMIN]], 1
470473; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP1]], 4
471474; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
@@ -529,7 +532,9 @@ define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_different_bounds
529532; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch_different_bounds(
530533; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]], i64 [[M:%.*]]) {
531534; CHECK-NEXT: entry:
532- ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[M]]
535+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[M]]
536+ ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP0]], i64 1)
537+ ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[TMP1]]
533538; CHECK-NEXT: [[TMP3:%.*]] = freeze i64 [[TMP2]]
534539; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
535540; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP3]], i64 [[SMAX]])
@@ -598,9 +603,12 @@ define i64 @multi_exit_4_exit_count_with_udiv_by_frozen_value_in_latch(ptr %dst,
598603; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
599604; CHECK-NEXT: entry:
600605; CHECK-NEXT: [[FR_N:%.*]] = freeze i64 [[N]]
601- ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
602- ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[FR_N]]
603- ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP2]], i64 [[TMP0]])
606+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[FR_N]]
607+ ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP0]], i64 1)
608+ ; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 42, [[TMP1]]
609+ ; CHECK-NEXT: [[TMP10:%.*]] = freeze i64 [[TMP2]]
610+ ; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
611+ ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP10]], i64 [[SMAX]])
604612; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[UMIN]], 1
605613; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP3]], 4
606614; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
@@ -786,12 +794,15 @@ define i64 @multi_exit_4_exit_count_with_urem_by_value_in_latch(ptr %dst, i64 %N
786794; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_urem_by_value_in_latch(
787795; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
788796; CHECK-NEXT: entry:
789- ; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
790- ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[N]]
797+ ; CHECK-NEXT: [[TMP11:%.*]] = freeze i64 [[N]]
798+ ; CHECK-NEXT: [[TMP12:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP11]], i64 1)
799+ ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[TMP12]]
791800; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i64 [[N]], [[TMP0]]
792801; CHECK-NEXT: [[TMP2:%.*]] = sub i64 42, [[TMP1]]
793802; CHECK-NEXT: [[SMAX1:%.*]] = call i64 @llvm.smax.i64(i64 [[TMP2]], i64 0)
794- ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[SMAX]], i64 [[SMAX1]])
803+ ; CHECK-NEXT: [[TMP10:%.*]] = freeze i64 [[SMAX1]]
804+ ; CHECK-NEXT: [[SMAX2:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
805+ ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP10]], i64 [[SMAX2]])
795806; CHECK-NEXT: [[TMP3:%.*]] = add nuw i64 [[UMIN]], 1
796807; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP3]], 4
797808; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
@@ -1004,9 +1015,12 @@ define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch1(ptr %dst, i64 %
10041015; CHECK-LABEL: define i64 @multi_exit_4_exit_count_with_udiv_by_value_in_latch1(
10051016; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
10061017; CHECK-NEXT: entry:
1018+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[N]]
1019+ ; CHECK-NEXT: [[TMP8:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP0]], i64 1)
1020+ ; CHECK-NEXT: [[TMP9:%.*]] = udiv i64 42, [[TMP8]]
1021+ ; CHECK-NEXT: [[TMP10:%.*]] = freeze i64 [[TMP9]]
10071022; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[N]], i64 0)
1008- ; CHECK-NEXT: [[TMP0:%.*]] = udiv i64 42, [[N]]
1009- ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[SMAX]], i64 [[TMP0]])
1023+ ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP10]], i64 [[SMAX]])
10101024; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i64 [[UMIN]], 1
10111025; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP1]], 4
10121026; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
0 commit comments