[llvm] [ConstraintElimination] Elide redundant bounds checks in canonical loops (PR #221028)
Alina Sbirlea via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 12 22:56:09 PDT 2026
================
@@ -2485,17 +2566,38 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT, LoopInfo &LI,
Pred = CB.Cond.Pred;
A = CB.Cond.Op0;
B = CB.Cond.Op1;
- if (CB.DoesHold.Pred != CmpInst::BAD_ICMP_PREDICATE &&
- !Info.doesHold(CB.DoesHold.Pred, CB.DoesHold.Op0, CB.DoesHold.Op1)) {
- LLVM_DEBUG({
- dbgs() << "Not adding fact ";
- dumpUnpackedICmp(dbgs(), Pred, A, B);
- dbgs() << " because precondition ";
- dumpUnpackedICmp(dbgs(), CB.DoesHold.Pred, CB.DoesHold.Op0,
- CB.DoesHold.Op1);
- dbgs() << " does not hold.\n";
- });
- continue;
+ if (CB.DoesHold.Pred != CmpInst::BAD_ICMP_PREDICATE) {
+ bool PrecondHolds =
+ Info.doesHold(CB.DoesHold.Pred, CB.DoesHold.Op0, CB.DoesHold.Op1);
+ if (!PrecondHolds && CB.DoesHold.Pred == CmpInst::ICMP_ULE &&
+ match(CB.DoesHold.Op0, m_One())) {
+ PrecondHolds = Info.doesHold(
+ CmpInst::ICMP_NE, CB.DoesHold.Op1,
+ Constant::getNullValue(CB.DoesHold.Op1->getType()));
+ }
+ if (!PrecondHolds && CB.DoesHold.Pred == CmpInst::ICMP_SLE &&
+ match(CB.DoesHold.Op0, m_Zero())) {
+ PrecondHolds = isKnownNonNegative(CB.DoesHold.Op1, F.getDataLayout());
+ }
+ if (!PrecondHolds &&
+ CB.DoesHold.Op0->getType() == CB.DoesHold.Op1->getType() &&
+ S.SE.isSCEVable(CB.DoesHold.Op0->getType()) &&
+ S.SE.isKnownPredicate(CB.DoesHold.Pred,
+ S.SE.getSCEV(CB.DoesHold.Op0),
+ S.SE.getSCEV(CB.DoesHold.Op1))) {
----------------
alinas wrote:
It does add some compile time, particularly for ThinLTO.
https://llvm-compile-time-tracker.com/compare.php?from=8c4bd7f8edf36232e2687be029ce4a9554139443&to=1c086cee63c8c615b2711cfd32f9e31f22dddcdb&stat=instructions:u
https://github.com/llvm/llvm-project/pull/221028
More information about the llvm-commits
mailing list