[llvm] [VPlan] Use APSInt in CheckSentinel directly (NFC). (PR #190534)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 5 09:08:00 PDT 2026
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/190534
>From ad1b70435b68bd0aced245f8639ad252228989ba Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Sun, 5 Apr 2026 14:55:12 +0100
Subject: [PATCH] [VPlan] Use APSInt in CheckSentinel directly (NFC).
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.
---
.../Transforms/Vectorize/VPlanTransforms.cpp | 35 +++++++++----------
1 file changed, 16 insertions(+), 19 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 07b8aaa6c8831..206a3898af050 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