[llvm] 36e495d - [VPlan] Use APSInt in CheckSentinel directly (NFC). (#190534)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 5 09:44:04 PDT 2026
Author: Florian Hahn
Date: 2026-04-05T16:43:59Z
New Revision: 36e495dd903cea000f6c4f51954554c22f39d7da
URL: https://github.com/llvm/llvm-project/commit/36e495dd903cea000f6c4f51954554c22f39d7da
DIFF: https://github.com/llvm/llvm-project/commit/36e495dd903cea000f6c4f51954554c22f39d7da.diff
LOG: [VPlan] Use APSInt in CheckSentinel directly (NFC). (#190534)
Simplify the sentinel checking logic by using APSInt and checking for
both a signed and unsigned sentinel in a single call.
Removes the IsSigned argument
Split off from approved
https://github.com/llvm/llvm-project/pull/183911/ as suggested.
Added:
Modified:
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index d1ec2031adaba..7bf80f8d2616a 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -5718,19 +5718,21 @@ void VPlanTransforms::optimizeFindIVReductions(VPlan &Plan,
ScalarEvolution &SE = *PSE.getSE();
VPRegionBlock *VectorLoopRegion = Plan.getVectorLoopRegion();
- // Helper lambda to check if the IV range excludes the sentinel value.
- auto CheckSentinel = [&SE](const SCEV *IVSCEV, bool UseMax,
- bool Signed) -> std::optional<APInt> {
+ // Helper lambda to check if the IV range excludes the sentinel value. Try
+ // signed first, then unsigned. Return an excluded sentinel if found,
+ // otherwise return std::nullopt.
+ auto CheckSentinel = [&SE](const SCEV *IVSCEV,
+ bool UseMax) -> std::optional<APSInt> {
unsigned BW = IVSCEV->getType()->getScalarSizeInBits();
- APInt Sentinel =
- UseMax
- ? (Signed ? APInt::getSignedMinValue(BW) : APInt::getMinValue(BW))
- : (Signed ? APInt::getSignedMaxValue(BW) : APInt::getMaxValue(BW));
-
- ConstantRange IVRange =
- Signed ? SE.getSignedRange(IVSCEV) : SE.getUnsignedRange(IVSCEV);
- if (!IVRange.contains(Sentinel))
- return Sentinel;
+ for (bool Signed : {true, false}) {
+ APSInt Sentinel = UseMax ? APSInt::getMinValue(BW, /*Unsigned=*/!Signed)
+ : APSInt::getMaxValue(BW, /*Unsigned=*/!Signed);
+
+ ConstantRange IVRange =
+ Signed ? SE.getSignedRange(IVSCEV) : SE.getUnsignedRange(IVSCEV);
+ if (!IVRange.contains(Sentinel))
+ return Sentinel;
+ }
return std::nullopt;
};
@@ -5778,13 +5780,8 @@ void VPlanTransforms::optimizeFindIVReductions(VPlan &Plan,
// Positive step means we need UMax/SMax to find the last IV value, and
// UMin/SMin otherwise.
bool UseMax = SE.isKnownPositive(Step);
- bool UseSigned = true;
- std::optional<APInt> SentinelVal =
- CheckSentinel(IVSCEV, UseMax, /*IsSigned=*/true);
- if (!SentinelVal) {
- SentinelVal = CheckSentinel(IVSCEV, UseMax, /*IsSigned=*/false);
- UseSigned = false;
- }
+ std::optional<APSInt> SentinelVal = CheckSentinel(IVSCEV, UseMax);
+ bool UseSigned = SentinelVal && SentinelVal->isSigned();
// If no sentinel was found, fall back to a boolean AnyOf reduction to track
// if the condition was ever true. Requires the IV to not wrap, otherwise we
More information about the llvm-commits
mailing list