[llvm] 6a726e9 - [SCEV] Add more tests for MUL/UDIV folds.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 17 05:08:44 PDT 2025
Author: Florian Hahn
Date: 2025-09-17T13:05:49+01:00
New Revision: 6a726e9a4d3d05f9aecf366fb6488d63135f04f3
URL: https://github.com/llvm/llvm-project/commit/6a726e9a4d3d05f9aecf366fb6488d63135f04f3
DIFF: https://github.com/llvm/llvm-project/commit/6a726e9a4d3d05f9aecf366fb6488d63135f04f3.diff
LOG: [SCEV] Add more tests for MUL/UDIV folds.
Add additional test coverage for
https://github.com/llvm/llvm-project/pull/157656 covering cases where
the dividend is not a multiple of the divisor, causing the revert of
70012fda631.
Added:
Modified:
llvm/test/Analysis/ScalarEvolution/mul-udiv-folds.ll
llvm/test/Transforms/LoopStrengthReduce/duplicated-phis.ll
Removed:
################################################################################
diff --git a/llvm/test/Analysis/ScalarEvolution/mul-udiv-folds.ll b/llvm/test/Analysis/ScalarEvolution/mul-udiv-folds.ll
index 8dd8ec47e7090..56d375ca27077 100644
--- a/llvm/test/Analysis/ScalarEvolution/mul-udiv-folds.ll
+++ b/llvm/test/Analysis/ScalarEvolution/mul-udiv-folds.ll
@@ -123,3 +123,68 @@ loop:
exit:
ret void
}
+
+declare void @use.i64(i64)
+
+define void @dividend_not_known_multiple_of_divisor(i64 %x) {
+; CHECK-LABEL: 'dividend_not_known_multiple_of_divisor'
+; CHECK-NEXT: Classifying expressions for: @dividend_not_known_multiple_of_divisor
+; CHECK-NEXT: %mul.2 = shl i64 %x, 1
+; CHECK-NEXT: --> (2 * %x) U: [0,-1) S: [-9223372036854775808,9223372036854775807)
+; CHECK-NEXT: %div.16 = lshr exact i64 %mul.2, 4
+; CHECK-NEXT: --> ((2 * %x) /u 16) U: [0,1152921504606846976) S: [0,1152921504606846976)
+; CHECK-NEXT: %m2 = and i64 %div.16, 1152921504606846974
+; CHECK-NEXT: --> (2 * ((2 * %x) /u 32))<nuw><nsw> U: [0,1152921504606846975) S: [0,1152921504606846975)
+; CHECK-NEXT: %m3 = mul i64 %div.16, 2
+; CHECK-NEXT: --> (2 * ((2 * %x) /u 16))<nuw><nsw> U: [0,2305843009213693951) S: [0,2305843009213693951)
+; CHECK-NEXT: %m4 = udiv i64 %m3, 4
+; CHECK-NEXT: --> ((2 * ((2 * %x) /u 16))<nuw><nsw> /u 4) U: [0,576460752303423488) S: [0,576460752303423488)
+; CHECK-NEXT: Determining loop execution counts for: @dividend_not_known_multiple_of_divisor
+;
+entry:
+ %mul.2 = shl i64 %x, 1
+ %div.16 = lshr exact i64 %mul.2, 4
+ %m2 = and i64 %div.16, 1152921504606846974
+ call void @use.i64(i64 %m2)
+
+ %m3 = mul i64 %div.16, 2
+ %m4 = udiv i64 %m3, 4
+ call void @use.i64(i64 %m4)
+ ret void
+}
+
+define void @btc_depends_on_div_mul(i64 %x) {
+; CHECK-LABEL: 'btc_depends_on_div_mul'
+; CHECK-NEXT: Classifying expressions for: @btc_depends_on_div_mul
+; CHECK-NEXT: %mul.2 = shl i64 %x, 1
+; CHECK-NEXT: --> (2 * %x) U: [0,-1) S: [-9223372036854775808,9223372036854775807)
+; CHECK-NEXT: %div.16 = lshr exact i64 %mul.2, 4
+; CHECK-NEXT: --> ((2 * %x) /u 16) U: [0,1152921504606846976) S: [0,1152921504606846976)
+; CHECK-NEXT: %masked = and i64 %div.16, 1152921504606846974
+; CHECK-NEXT: --> (2 * ((2 * %x) /u 32))<nuw><nsw> U: [0,1152921504606846975) S: [0,1152921504606846975)
+; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: (-2 + (2 * ((2 * %x) /u 32))<nuw><nsw>)<nsw> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: %iv.next = add i64 %iv, 2
+; CHECK-NEXT: --> {2,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: (2 * ((2 * %x) /u 32))<nuw><nsw> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: Determining loop execution counts for: @btc_depends_on_div_mul
+; CHECK-NEXT: Loop %loop: backedge-taken count is ((-2 + (2 * ((2 * %x) /u 32))<nuw><nsw>)<nsw> /u 2)
+; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 9223372036854775807
+; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2 + (2 * ((2 * %x) /u 32))<nuw><nsw>)<nsw> /u 2)
+; CHECK-NEXT: Loop %loop: Trip multiple is 1
+;
+entry:
+ %mul.2 = shl i64 %x, 1
+ %div.16 = lshr exact i64 %mul.2, 4
+ %masked = and i64 %div.16, 1152921504606846974
+ br label %loop
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ call void @use.i64(i64 %iv)
+ %iv.next = add i64 %iv, 2
+ %ec = icmp eq i64 %iv.next, %masked
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret void
+}
diff --git a/llvm/test/Transforms/LoopStrengthReduce/duplicated-phis.ll b/llvm/test/Transforms/LoopStrengthReduce/duplicated-phis.ll
index cee8c8abdb450..668631395716e 100644
--- a/llvm/test/Transforms/LoopStrengthReduce/duplicated-phis.ll
+++ b/llvm/test/Transforms/LoopStrengthReduce/duplicated-phis.ll
@@ -84,3 +84,41 @@ for.end:
%res.0.lcssa = phi i64 [ 0, %entry ], [ %spec.select, %for.end.loopexit.unr-lcssa ]
ret i64 %res.0.lcssa
}
+
+define i64 @duplicated_phis_compare_uses_mul_udiv(i64 %x) {
+; CHECK-LABEL: define i64 @duplicated_phis_compare_uses_mul_udiv(
+; CHECK-SAME: i64 [[X:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[MUL_2:%.*]] = shl i64 [[X]], 1
+; CHECK-NEXT: [[DIV_16:%.*]] = lshr i64 [[MUL_2]], 4
+; CHECK-NEXT: [[MASKED:%.*]] = and i64 [[DIV_16]], 1152921504606846974
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV_1:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
+; CHECK-NEXT: call void @clobber()
+; CHECK-NEXT: [[IV_1_NEXT]] = add i64 [[IV_1]], 2
+; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[MASKED]], [[IV_1_NEXT]]
+; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret i64 [[IV_1_NEXT]]
+;
+entry:
+ %mul.2 = shl i64 %x, 1
+ %div.16 = lshr exact i64 %mul.2, 4
+ %masked = and i64 %div.16, 1152921504606846974
+ br label %loop
+
+loop:
+ %iv.1 = phi i64 [ 0, %entry ], [ %iv.1.next, %loop ]
+ %iv.2 = phi i64 [ 0, %entry ], [ %iv.2.next, %loop ]
+ call void @clobber()
+ %iv.1.next = add i64 %iv.1, 2
+ %iv.2.next = add i64 %iv.2, 2
+ %ec = icmp eq i64 %iv.2.next, %masked
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret i64 %iv.1.next
+}
+
+declare void @clobber()
More information about the llvm-commits
mailing list