[IndVars][NFC] Separate invariant condition creation and cond replacement
authorMax Kazantsev <mkazantsev@azul.com>
Mon, 12 Dec 2022 10:01:03 +0000 (17:01 +0700)
committerMax Kazantsev <mkazantsev@azul.com>
Mon, 12 Dec 2022 10:16:22 +0000 (17:16 +0700)
This separation is a preparatory step for further improvements in this code.
Also simplifies this function's API.

llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

index d4e247a3d522cb2f6f59f6aefcb667988e416774..9d666f76cb0cb699008d5e056fe2cfcf478799c5 100644 (file)
@@ -1346,21 +1346,21 @@ static void replaceLoopPHINodesWithPreheaderValues(
   }
 }
 
-static void replaceWithInvariantCond(
-    const Loop *L, BasicBlock *ExitingBB, ICmpInst::Predicate InvariantPred,
-    const SCEV *InvariantLHS, const SCEV *InvariantRHS, SCEVExpander &Rewriter,
-    SmallVectorImpl<WeakTrackingVH> &DeadInsts) {
+static Value *
+createInvariantCond(const Loop *L, BasicBlock *ExitingBB,
+                    const ScalarEvolution::LoopInvariantPredicate &LIP,
+                    SCEVExpander &Rewriter) {
+  ICmpInst::Predicate InvariantPred = LIP.Pred;
   BranchInst *BI = cast<BranchInst>(ExitingBB->getTerminator());
   Rewriter.setInsertPoint(BI);
-  auto *LHSV = Rewriter.expandCodeFor(InvariantLHS);
-  auto *RHSV = Rewriter.expandCodeFor(InvariantRHS);
+  auto *LHSV = Rewriter.expandCodeFor(LIP.LHS);
+  auto *RHSV = Rewriter.expandCodeFor(LIP.RHS);
   bool ExitIfTrue = !L->contains(*succ_begin(ExitingBB));
   if (ExitIfTrue)
     InvariantPred = ICmpInst::getInversePredicate(InvariantPred);
   IRBuilder<> Builder(BI);
-  auto *NewCond = Builder.CreateICmp(InvariantPred, LHSV, RHSV,
-                                     BI->getCondition()->getName());
-  replaceExitCond(BI, NewCond, DeadInsts);
+  return Builder.CreateICmp(InvariantPred, LHSV, RHSV,
+                            BI->getCondition()->getName());
 }
 
 static bool optimizeLoopExitWithUnknownExitCount(
@@ -1415,9 +1415,10 @@ static bool optimizeLoopExitWithUnknownExitCount(
   // Can we prove it to be trivially true?
   if (SE->isKnownPredicateAt(LIP->Pred, LIP->LHS, LIP->RHS, BI))
     foldExit(L, ExitingBB, /*IsTaken*/ false, DeadInsts);
-  else
-    replaceWithInvariantCond(L, ExitingBB, LIP->Pred, LIP->LHS, LIP->RHS,
-                             Rewriter, DeadInsts);
+  else {
+    auto *NewCond = createInvariantCond(L, ExitingBB, *LIP, Rewriter);
+    replaceExitCond(BI, NewCond, DeadInsts);
+  }
 
   return true;
 }