[llvm] [ConstraintElim] Use cond from header as upper bound on IV in exit BB. (PR #94610)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 7 01:59:48 PDT 2024


================
@@ -1031,6 +1031,27 @@ void State::addInfoForInductions(BasicBlock &BB) {
   WorkList.push_back(FactOrCheck::getConditionFact(
       DTN, CmpInst::ICMP_SLT, PN, B,
       ConditionTy(CmpInst::ICMP_SLE, StartValue, B)));
+
+  assert(!StepOffset.isNegative() && "induction must be increasing");
+  // Try to add condition from header to the unique exit block, if there is one.
+  // When exiting either with EQ or NE, we know that the induction value must be
+  // u<= B, as a different exit may exit earlier.
+  ConditionTy Precond;
+  if (!MonotonicallyIncreasingUnsigned)
+    Precond = {CmpInst::ICMP_ULE, StartValue, B};
+  if (Pred == CmpInst::ICMP_EQ) {
+    BasicBlock *EB = cast<BranchInst>(BB.getTerminator())->getSuccessor(0);
+    if (L->getUniqueExitBlock() == EB) {
+      WorkList.emplace_back(FactOrCheck::getConditionFact(
+          DT.getNode(EB), CmpInst::ICMP_ULE, A, B, Precond));
+    }
+  }
+  if (Pred == CmpInst::ICMP_NE) {
+    BasicBlock *EB = cast<BranchInst>(BB.getTerminator())->getSuccessor(1);
+    if (L->getUniqueExitBlock() == EB)
----------------
nikic wrote:

Why? Isn't the argument here that even if we go through another exit, it can only exit earlier than the header, so the condition still holds? Why would it matter whether the other exit has a direct edge to the header exit vs going there indirectly?

https://github.com/llvm/llvm-project/pull/94610


More information about the llvm-commits mailing list