[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