[llvm] b320772 - [NFCI][SCEV] `computeExitLimitFromCondFromBinOp()`: rely on `getSequentialMinMaxExpr()` constant relaxation
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 14 06:08:01 PST 2022
Author: Roman Lebedev
Date: 2022-01-14T17:07:48+03:00
New Revision: b32077234b1affbab9a641628c417a9fb1601414
URL: https://github.com/llvm/llvm-project/commit/b32077234b1affbab9a641628c417a9fb1601414
DIFF: https://github.com/llvm/llvm-project/commit/b32077234b1affbab9a641628c417a9fb1601414.diff
LOG: [NFCI][SCEV] `computeExitLimitFromCondFromBinOp()`: rely on `getSequentialMinMaxExpr()` constant relaxation
`getSequentialMinMaxExpr()` has been taught to perform this relaxation,
so rely on that now. Not sure this can be tested.
Added:
Modified:
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 19eaf174885b..beba8c3a4c01 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8369,26 +8369,11 @@ ScalarEvolution::computeExitLimitFromCondFromBinOp(
if (EitherMayExit) {
// Both conditions must be same for the loop to continue executing.
// Choose the less conservative count.
- // If ExitCond is a short-circuit form (select), using
- // umin(EL0.ExactNotTaken, EL1.ExactNotTaken) is unsafe in general.
- // To see the detailed examples, please see
- // test/Analysis/ScalarEvolution/exit-count-select.ll
- bool PoisonSafe = isa<BinaryOperator>(ExitCond);
- if (!PoisonSafe)
- // Even if ExitCond is select, we can safely derive BECount using both
- // EL0 and EL1 in these cases:
- // (1) EL0.ExactNotTaken is non-zero
- // (2) EL1.ExactNotTaken is non-poison
- // (3) EL0.ExactNotTaken is zero (BECount should be simply zero and
- // it cannot be umin(0, ..))
- // The PoisonSafe assignment below is simplified and the assertion after
- // BECount calculation fully guarantees the condition (3).
- PoisonSafe = isa<SCEVConstant>(EL0.ExactNotTaken) ||
- isa<SCEVConstant>(EL1.ExactNotTaken);
if (EL0.ExactNotTaken != getCouldNotCompute() &&
EL1.ExactNotTaken != getCouldNotCompute()) {
- BECount = getUMinFromMismatchedTypes(EL0.ExactNotTaken, EL1.ExactNotTaken,
- /*Sequential=*/!PoisonSafe);
+ BECount = getUMinFromMismatchedTypes(
+ EL0.ExactNotTaken, EL1.ExactNotTaken,
+ /*Sequential=*/!isa<BinaryOperator>(ExitCond));
// If EL0.ExactNotTaken was zero and ExitCond was a short-circuit form,
// it should have been simplified to zero (see the condition (3) above)
More information about the llvm-commits
mailing list