xref: /llvm-project/llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp (revision 4a0d53a0b0a58a3c6980a7c551357ac71ba3db10)
1a2a0ac42SJingu Kang //===------- LoopBoundSplit.cpp - Split Loop Bound --------------*- C++ -*-===//
2a2a0ac42SJingu Kang //
3a2a0ac42SJingu Kang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a2a0ac42SJingu Kang // See https://llvm.org/LICENSE.txt for license information.
5a2a0ac42SJingu Kang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a2a0ac42SJingu Kang //
7a2a0ac42SJingu Kang //===----------------------------------------------------------------------===//
8a2a0ac42SJingu Kang 
9a2a0ac42SJingu Kang #include "llvm/Transforms/Scalar/LoopBoundSplit.h"
10562521e2SJingu Kang #include "llvm/ADT/Sequence.h"
11a2a0ac42SJingu Kang #include "llvm/Analysis/LoopAnalysisManager.h"
12a2a0ac42SJingu Kang #include "llvm/Analysis/LoopInfo.h"
13a2a0ac42SJingu Kang #include "llvm/Analysis/ScalarEvolution.h"
14a2a0ac42SJingu Kang #include "llvm/Analysis/ScalarEvolutionExpressions.h"
15a2a0ac42SJingu Kang #include "llvm/IR/PatternMatch.h"
1659630917Sserge-sans-paille #include "llvm/Transforms/Scalar/LoopPassManager.h"
17a2a0ac42SJingu Kang #include "llvm/Transforms/Utils/BasicBlockUtils.h"
18a2a0ac42SJingu Kang #include "llvm/Transforms/Utils/Cloning.h"
19a2a0ac42SJingu Kang #include "llvm/Transforms/Utils/LoopSimplify.h"
20a2a0ac42SJingu Kang #include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
21a2a0ac42SJingu Kang 
22a2a0ac42SJingu Kang #define DEBUG_TYPE "loop-bound-split"
23a2a0ac42SJingu Kang 
24a2a0ac42SJingu Kang namespace llvm {
25a2a0ac42SJingu Kang 
26a2a0ac42SJingu Kang using namespace PatternMatch;
27a2a0ac42SJingu Kang 
28a2a0ac42SJingu Kang namespace {
29a2a0ac42SJingu Kang struct ConditionInfo {
30a2a0ac42SJingu Kang   /// Branch instruction with this condition
310b9a610aSKazu Hirata   BranchInst *BI = nullptr;
32a2a0ac42SJingu Kang   /// ICmp instruction with this condition
330b9a610aSKazu Hirata   ICmpInst *ICmp = nullptr;
34a2a0ac42SJingu Kang   /// Preciate info
35*4a0d53a0SRamkumar Ramachandra   CmpPredicate Pred = ICmpInst::BAD_ICMP_PREDICATE;
36a2a0ac42SJingu Kang   /// AddRec llvm value
370b9a610aSKazu Hirata   Value *AddRecValue = nullptr;
384c98070cSJingu Kang   /// Non PHI AddRec llvm value
394c98070cSJingu Kang   Value *NonPHIAddRecValue;
40a2a0ac42SJingu Kang   /// Bound llvm value
410b9a610aSKazu Hirata   Value *BoundValue = nullptr;
42a2a0ac42SJingu Kang   /// AddRec SCEV
430b9a610aSKazu Hirata   const SCEVAddRecExpr *AddRecSCEV = nullptr;
44a2a0ac42SJingu Kang   /// Bound SCEV
450b9a610aSKazu Hirata   const SCEV *BoundSCEV = nullptr;
46a2a0ac42SJingu Kang 
470b9a610aSKazu Hirata   ConditionInfo() = default;
48a2a0ac42SJingu Kang };
49a2a0ac42SJingu Kang } // namespace
50a2a0ac42SJingu Kang 
51a2a0ac42SJingu Kang static void analyzeICmp(ScalarEvolution &SE, ICmpInst *ICmp,
524c98070cSJingu Kang                         ConditionInfo &Cond, const Loop &L) {
53a2a0ac42SJingu Kang   Cond.ICmp = ICmp;
54a2a0ac42SJingu Kang   if (match(ICmp, m_ICmp(Cond.Pred, m_Value(Cond.AddRecValue),
55a2a0ac42SJingu Kang                          m_Value(Cond.BoundValue)))) {
564288b652SJingu Kang     const SCEV *AddRecSCEV = SE.getSCEV(Cond.AddRecValue);
574288b652SJingu Kang     const SCEV *BoundSCEV = SE.getSCEV(Cond.BoundValue);
584288b652SJingu Kang     const SCEVAddRecExpr *LHSAddRecSCEV = dyn_cast<SCEVAddRecExpr>(AddRecSCEV);
594288b652SJingu Kang     const SCEVAddRecExpr *RHSAddRecSCEV = dyn_cast<SCEVAddRecExpr>(BoundSCEV);
60a2a0ac42SJingu Kang     // Locate AddRec in LHSSCEV and Bound in RHSSCEV.
614288b652SJingu Kang     if (!LHSAddRecSCEV && RHSAddRecSCEV) {
62a2a0ac42SJingu Kang       std::swap(Cond.AddRecValue, Cond.BoundValue);
634288b652SJingu Kang       std::swap(AddRecSCEV, BoundSCEV);
64a2a0ac42SJingu Kang       Cond.Pred = ICmpInst::getSwappedPredicate(Cond.Pred);
65a2a0ac42SJingu Kang     }
664288b652SJingu Kang 
674288b652SJingu Kang     Cond.AddRecSCEV = dyn_cast<SCEVAddRecExpr>(AddRecSCEV);
684288b652SJingu Kang     Cond.BoundSCEV = BoundSCEV;
694c98070cSJingu Kang     Cond.NonPHIAddRecValue = Cond.AddRecValue;
704c98070cSJingu Kang 
714c98070cSJingu Kang     // If the Cond.AddRecValue is PHI node, update Cond.NonPHIAddRecValue with
724c98070cSJingu Kang     // value from backedge.
734c98070cSJingu Kang     if (Cond.AddRecSCEV && isa<PHINode>(Cond.AddRecValue)) {
744c98070cSJingu Kang       PHINode *PN = cast<PHINode>(Cond.AddRecValue);
754c98070cSJingu Kang       Cond.NonPHIAddRecValue = PN->getIncomingValueForBlock(L.getLoopLatch());
764c98070cSJingu Kang     }
77a2a0ac42SJingu Kang   }
78a2a0ac42SJingu Kang }
79a2a0ac42SJingu Kang 
80a2a0ac42SJingu Kang static bool calculateUpperBound(const Loop &L, ScalarEvolution &SE,
81a2a0ac42SJingu Kang                                 ConditionInfo &Cond, bool IsExitCond) {
82a2a0ac42SJingu Kang   if (IsExitCond) {
83a2a0ac42SJingu Kang     const SCEV *ExitCount = SE.getExitCount(&L, Cond.ICmp->getParent());
84a2a0ac42SJingu Kang     if (isa<SCEVCouldNotCompute>(ExitCount))
85a2a0ac42SJingu Kang       return false;
86a2a0ac42SJingu Kang 
87a2a0ac42SJingu Kang     Cond.BoundSCEV = ExitCount;
88a2a0ac42SJingu Kang     return true;
89a2a0ac42SJingu Kang   }
90a2a0ac42SJingu Kang 
91a2a0ac42SJingu Kang   // For non-exit condtion, if pred is LT, keep existing bound.
92a2a0ac42SJingu Kang   if (Cond.Pred == ICmpInst::ICMP_SLT || Cond.Pred == ICmpInst::ICMP_ULT)
93a2a0ac42SJingu Kang     return true;
94a2a0ac42SJingu Kang 
95a2a0ac42SJingu Kang   // For non-exit condition, if pre is LE, try to convert it to LT.
96a2a0ac42SJingu Kang   //      Range                 Range
97a2a0ac42SJingu Kang   // AddRec <= Bound  -->  AddRec < Bound + 1
98a2a0ac42SJingu Kang   if (Cond.Pred != ICmpInst::ICMP_ULE && Cond.Pred != ICmpInst::ICMP_SLE)
99a2a0ac42SJingu Kang     return false;
100a2a0ac42SJingu Kang 
101a2a0ac42SJingu Kang   if (IntegerType *BoundSCEVIntType =
102a2a0ac42SJingu Kang           dyn_cast<IntegerType>(Cond.BoundSCEV->getType())) {
103a2a0ac42SJingu Kang     unsigned BitWidth = BoundSCEVIntType->getBitWidth();
104a2a0ac42SJingu Kang     APInt Max = ICmpInst::isSigned(Cond.Pred)
105a2a0ac42SJingu Kang                     ? APInt::getSignedMaxValue(BitWidth)
106a2a0ac42SJingu Kang                     : APInt::getMaxValue(BitWidth);
107a2a0ac42SJingu Kang     const SCEV *MaxSCEV = SE.getConstant(Max);
108a2a0ac42SJingu Kang     // Check Bound < INT_MAX
109a2a0ac42SJingu Kang     ICmpInst::Predicate Pred =
110a2a0ac42SJingu Kang         ICmpInst::isSigned(Cond.Pred) ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
111a2a0ac42SJingu Kang     if (SE.isKnownPredicate(Pred, Cond.BoundSCEV, MaxSCEV)) {
112a2a0ac42SJingu Kang       const SCEV *BoundPlusOneSCEV =
113a2a0ac42SJingu Kang           SE.getAddExpr(Cond.BoundSCEV, SE.getOne(BoundSCEVIntType));
114a2a0ac42SJingu Kang       Cond.BoundSCEV = BoundPlusOneSCEV;
115a2a0ac42SJingu Kang       Cond.Pred = Pred;
116a2a0ac42SJingu Kang       return true;
117a2a0ac42SJingu Kang     }
118a2a0ac42SJingu Kang   }
119a2a0ac42SJingu Kang 
120a2a0ac42SJingu Kang   // ToDo: Support ICMP_NE/EQ.
121a2a0ac42SJingu Kang 
122a2a0ac42SJingu Kang   return false;
123a2a0ac42SJingu Kang }
124a2a0ac42SJingu Kang 
125a2a0ac42SJingu Kang static bool hasProcessableCondition(const Loop &L, ScalarEvolution &SE,
126a2a0ac42SJingu Kang                                     ICmpInst *ICmp, ConditionInfo &Cond,
127a2a0ac42SJingu Kang                                     bool IsExitCond) {
1284c98070cSJingu Kang   analyzeICmp(SE, ICmp, Cond, L);
129a2a0ac42SJingu Kang 
130a2a0ac42SJingu Kang   // The BoundSCEV should be evaluated at loop entry.
131a2a0ac42SJingu Kang   if (!SE.isAvailableAtLoopEntry(Cond.BoundSCEV, &L))
132a2a0ac42SJingu Kang     return false;
133a2a0ac42SJingu Kang 
134a2a0ac42SJingu Kang   // Allowed AddRec as induction variable.
1354288b652SJingu Kang   if (!Cond.AddRecSCEV)
136a2a0ac42SJingu Kang     return false;
137a2a0ac42SJingu Kang 
1384288b652SJingu Kang   if (!Cond.AddRecSCEV->isAffine())
139a2a0ac42SJingu Kang     return false;
140a2a0ac42SJingu Kang 
1414288b652SJingu Kang   const SCEV *StepRecSCEV = Cond.AddRecSCEV->getStepRecurrence(SE);
142a2a0ac42SJingu Kang   // Allowed constant step.
143a2a0ac42SJingu Kang   if (!isa<SCEVConstant>(StepRecSCEV))
144a2a0ac42SJingu Kang     return false;
145a2a0ac42SJingu Kang 
146a2a0ac42SJingu Kang   ConstantInt *StepCI = cast<SCEVConstant>(StepRecSCEV)->getValue();
147a2a0ac42SJingu Kang   // Allowed positive step for now.
148a2a0ac42SJingu Kang   // TODO: Support negative step.
149a2a0ac42SJingu Kang   if (StepCI->isNegative() || StepCI->isZero())
150a2a0ac42SJingu Kang     return false;
151a2a0ac42SJingu Kang 
152a2a0ac42SJingu Kang   // Calculate upper bound.
153a2a0ac42SJingu Kang   if (!calculateUpperBound(L, SE, Cond, IsExitCond))
154a2a0ac42SJingu Kang     return false;
155a2a0ac42SJingu Kang 
156a2a0ac42SJingu Kang   return true;
157a2a0ac42SJingu Kang }
158a2a0ac42SJingu Kang 
159a2a0ac42SJingu Kang static bool isProcessableCondBI(const ScalarEvolution &SE,
160a2a0ac42SJingu Kang                                 const BranchInst *BI) {
161a2a0ac42SJingu Kang   BasicBlock *TrueSucc = nullptr;
162a2a0ac42SJingu Kang   BasicBlock *FalseSucc = nullptr;
163a2a0ac42SJingu Kang   Value *LHS, *RHS;
16462e9f409SYingwei Zheng   if (!match(BI, m_Br(m_ICmp(m_Value(LHS), m_Value(RHS)),
165a2a0ac42SJingu Kang                       m_BasicBlock(TrueSucc), m_BasicBlock(FalseSucc))))
166a2a0ac42SJingu Kang     return false;
167a2a0ac42SJingu Kang 
168a2a0ac42SJingu Kang   if (!SE.isSCEVable(LHS->getType()))
169a2a0ac42SJingu Kang     return false;
170a2a0ac42SJingu Kang   assert(SE.isSCEVable(RHS->getType()) && "Expected RHS's type is SCEVable");
171a2a0ac42SJingu Kang 
172a2a0ac42SJingu Kang   if (TrueSucc == FalseSucc)
173a2a0ac42SJingu Kang     return false;
174a2a0ac42SJingu Kang 
175a2a0ac42SJingu Kang   return true;
176a2a0ac42SJingu Kang }
177a2a0ac42SJingu Kang 
178a2a0ac42SJingu Kang static bool canSplitLoopBound(const Loop &L, const DominatorTree &DT,
179a2a0ac42SJingu Kang                               ScalarEvolution &SE, ConditionInfo &Cond) {
180a2a0ac42SJingu Kang   // Skip function with optsize.
181a2a0ac42SJingu Kang   if (L.getHeader()->getParent()->hasOptSize())
182a2a0ac42SJingu Kang     return false;
183a2a0ac42SJingu Kang 
184a2a0ac42SJingu Kang   // Split only innermost loop.
185a2a0ac42SJingu Kang   if (!L.isInnermost())
186a2a0ac42SJingu Kang     return false;
187a2a0ac42SJingu Kang 
188a2a0ac42SJingu Kang   // Check loop is in simplified form.
189a2a0ac42SJingu Kang   if (!L.isLoopSimplifyForm())
190a2a0ac42SJingu Kang     return false;
191a2a0ac42SJingu Kang 
192a2a0ac42SJingu Kang   // Check loop is in LCSSA form.
193a2a0ac42SJingu Kang   if (!L.isLCSSAForm(DT))
194a2a0ac42SJingu Kang     return false;
195a2a0ac42SJingu Kang 
196a2a0ac42SJingu Kang   // Skip loop that cannot be cloned.
197a2a0ac42SJingu Kang   if (!L.isSafeToClone())
198a2a0ac42SJingu Kang     return false;
199a2a0ac42SJingu Kang 
200a2a0ac42SJingu Kang   BasicBlock *ExitingBB = L.getExitingBlock();
201a2a0ac42SJingu Kang   // Assumed only one exiting block.
202a2a0ac42SJingu Kang   if (!ExitingBB)
203a2a0ac42SJingu Kang     return false;
204a2a0ac42SJingu Kang 
205a2a0ac42SJingu Kang   BranchInst *ExitingBI = dyn_cast<BranchInst>(ExitingBB->getTerminator());
206a2a0ac42SJingu Kang   if (!ExitingBI)
207a2a0ac42SJingu Kang     return false;
208a2a0ac42SJingu Kang 
209a2a0ac42SJingu Kang   // Allowed only conditional branch with ICmp.
210a2a0ac42SJingu Kang   if (!isProcessableCondBI(SE, ExitingBI))
211a2a0ac42SJingu Kang     return false;
212a2a0ac42SJingu Kang 
213a2a0ac42SJingu Kang   // Check the condition is processable.
214a2a0ac42SJingu Kang   ICmpInst *ICmp = cast<ICmpInst>(ExitingBI->getCondition());
215a2a0ac42SJingu Kang   if (!hasProcessableCondition(L, SE, ICmp, Cond, /*IsExitCond*/ true))
216a2a0ac42SJingu Kang     return false;
217a2a0ac42SJingu Kang 
218a2a0ac42SJingu Kang   Cond.BI = ExitingBI;
219a2a0ac42SJingu Kang   return true;
220a2a0ac42SJingu Kang }
221a2a0ac42SJingu Kang 
222a2a0ac42SJingu Kang static bool isProfitableToTransform(const Loop &L, const BranchInst *BI) {
223a2a0ac42SJingu Kang   // If the conditional branch splits a loop into two halves, we could
224a2a0ac42SJingu Kang   // generally say it is profitable.
225a2a0ac42SJingu Kang   //
226a2a0ac42SJingu Kang   // ToDo: Add more profitable cases here.
227a2a0ac42SJingu Kang 
228a2a0ac42SJingu Kang   // Check this branch causes diamond CFG.
229a2a0ac42SJingu Kang   BasicBlock *Succ0 = BI->getSuccessor(0);
230a2a0ac42SJingu Kang   BasicBlock *Succ1 = BI->getSuccessor(1);
231a2a0ac42SJingu Kang 
232a2a0ac42SJingu Kang   BasicBlock *Succ0Succ = Succ0->getSingleSuccessor();
233a2a0ac42SJingu Kang   BasicBlock *Succ1Succ = Succ1->getSingleSuccessor();
234a2a0ac42SJingu Kang   if (!Succ0Succ || !Succ1Succ || Succ0Succ != Succ1Succ)
235a2a0ac42SJingu Kang     return false;
236a2a0ac42SJingu Kang 
237a2a0ac42SJingu Kang   // ToDo: Calculate each successor's instruction cost.
238a2a0ac42SJingu Kang 
239a2a0ac42SJingu Kang   return true;
240a2a0ac42SJingu Kang }
241a2a0ac42SJingu Kang 
242a2a0ac42SJingu Kang static BranchInst *findSplitCandidate(const Loop &L, ScalarEvolution &SE,
243a2a0ac42SJingu Kang                                       ConditionInfo &ExitingCond,
244a2a0ac42SJingu Kang                                       ConditionInfo &SplitCandidateCond) {
245a2a0ac42SJingu Kang   for (auto *BB : L.blocks()) {
246a2a0ac42SJingu Kang     // Skip condition of backedge.
247a2a0ac42SJingu Kang     if (L.getLoopLatch() == BB)
248a2a0ac42SJingu Kang       continue;
249a2a0ac42SJingu Kang 
250a2a0ac42SJingu Kang     auto *BI = dyn_cast<BranchInst>(BB->getTerminator());
251a2a0ac42SJingu Kang     if (!BI)
252a2a0ac42SJingu Kang       continue;
253a2a0ac42SJingu Kang 
254a2a0ac42SJingu Kang     // Check conditional branch with ICmp.
255a2a0ac42SJingu Kang     if (!isProcessableCondBI(SE, BI))
256a2a0ac42SJingu Kang       continue;
257a2a0ac42SJingu Kang 
258a2a0ac42SJingu Kang     // Skip loop invariant condition.
259a2a0ac42SJingu Kang     if (L.isLoopInvariant(BI->getCondition()))
260a2a0ac42SJingu Kang       continue;
261a2a0ac42SJingu Kang 
262a2a0ac42SJingu Kang     // Check the condition is processable.
263a2a0ac42SJingu Kang     ICmpInst *ICmp = cast<ICmpInst>(BI->getCondition());
264a2a0ac42SJingu Kang     if (!hasProcessableCondition(L, SE, ICmp, SplitCandidateCond,
265a2a0ac42SJingu Kang                                  /*IsExitCond*/ false))
266a2a0ac42SJingu Kang       continue;
267a2a0ac42SJingu Kang 
268a2a0ac42SJingu Kang     if (ExitingCond.BoundSCEV->getType() !=
269a2a0ac42SJingu Kang         SplitCandidateCond.BoundSCEV->getType())
270a2a0ac42SJingu Kang       continue;
271a2a0ac42SJingu Kang 
2722a26d47aSJingu Kang     // After transformation, we assume the split condition of the pre-loop is
2732a26d47aSJingu Kang     // always true. In order to guarantee it, we need to check the start value
2742a26d47aSJingu Kang     // of the split cond AddRec satisfies the split condition.
2754288b652SJingu Kang     if (!SE.isLoopEntryGuardedByCond(&L, SplitCandidateCond.Pred,
2764288b652SJingu Kang                                      SplitCandidateCond.AddRecSCEV->getStart(),
2772a26d47aSJingu Kang                                      SplitCandidateCond.BoundSCEV))
2782a26d47aSJingu Kang       continue;
2792a26d47aSJingu Kang 
280a2a0ac42SJingu Kang     SplitCandidateCond.BI = BI;
281a2a0ac42SJingu Kang     return BI;
282a2a0ac42SJingu Kang   }
283a2a0ac42SJingu Kang 
284a2a0ac42SJingu Kang   return nullptr;
285a2a0ac42SJingu Kang }
286a2a0ac42SJingu Kang 
287a2a0ac42SJingu Kang static bool splitLoopBound(Loop &L, DominatorTree &DT, LoopInfo &LI,
288a2a0ac42SJingu Kang                            ScalarEvolution &SE, LPMUpdater &U) {
289a2a0ac42SJingu Kang   ConditionInfo SplitCandidateCond;
290a2a0ac42SJingu Kang   ConditionInfo ExitingCond;
291a2a0ac42SJingu Kang 
292a2a0ac42SJingu Kang   // Check we can split this loop's bound.
293a2a0ac42SJingu Kang   if (!canSplitLoopBound(L, DT, SE, ExitingCond))
294a2a0ac42SJingu Kang     return false;
295a2a0ac42SJingu Kang 
296a2a0ac42SJingu Kang   if (!findSplitCandidate(L, SE, ExitingCond, SplitCandidateCond))
297a2a0ac42SJingu Kang     return false;
298a2a0ac42SJingu Kang 
299a2a0ac42SJingu Kang   if (!isProfitableToTransform(L, SplitCandidateCond.BI))
300a2a0ac42SJingu Kang     return false;
301a2a0ac42SJingu Kang 
302a2a0ac42SJingu Kang   // Now, we have a split candidate. Let's build a form as below.
303a2a0ac42SJingu Kang   //    +--------------------+
304a2a0ac42SJingu Kang   //    |     preheader      |
305a2a0ac42SJingu Kang   //    |  set up newbound   |
306a2a0ac42SJingu Kang   //    +--------------------+
307a2a0ac42SJingu Kang   //             |     /----------------\
308a2a0ac42SJingu Kang   //    +--------v----v------+          |
309a2a0ac42SJingu Kang   //    |      header        |---\      |
310a2a0ac42SJingu Kang   //    | with true condition|   |      |
311a2a0ac42SJingu Kang   //    +--------------------+   |      |
312a2a0ac42SJingu Kang   //             |               |      |
313a2a0ac42SJingu Kang   //    +--------v-----------+   |      |
314a2a0ac42SJingu Kang   //    |     if.then.BB     |   |      |
315a2a0ac42SJingu Kang   //    +--------------------+   |      |
316a2a0ac42SJingu Kang   //             |               |      |
317a2a0ac42SJingu Kang   //    +--------v-----------<---/      |
318a2a0ac42SJingu Kang   //    |       latch        >----------/
319a2a0ac42SJingu Kang   //    |   with newbound    |
320a2a0ac42SJingu Kang   //    +--------------------+
321a2a0ac42SJingu Kang   //             |
322a2a0ac42SJingu Kang   //    +--------v-----------+
323a2a0ac42SJingu Kang   //    |     preheader2     |--------------\
324a2a0ac42SJingu Kang   //    | if (AddRec i !=    |              |
325a2a0ac42SJingu Kang   //    |     org bound)     |              |
326a2a0ac42SJingu Kang   //    +--------------------+              |
327a2a0ac42SJingu Kang   //             |     /----------------\   |
328a2a0ac42SJingu Kang   //    +--------v----v------+          |   |
329a2a0ac42SJingu Kang   //    |      header2       |---\      |   |
330a2a0ac42SJingu Kang   //    | conditional branch |   |      |   |
331a2a0ac42SJingu Kang   //    |with false condition|   |      |   |
332a2a0ac42SJingu Kang   //    +--------------------+   |      |   |
333a2a0ac42SJingu Kang   //             |               |      |   |
334a2a0ac42SJingu Kang   //    +--------v-----------+   |      |   |
335a2a0ac42SJingu Kang   //    |    if.then.BB2     |   |      |   |
336a2a0ac42SJingu Kang   //    +--------------------+   |      |   |
337a2a0ac42SJingu Kang   //             |               |      |   |
338a2a0ac42SJingu Kang   //    +--------v-----------<---/      |   |
339a2a0ac42SJingu Kang   //    |       latch2       >----------/   |
340a2a0ac42SJingu Kang   //    |   with org bound   |              |
341a2a0ac42SJingu Kang   //    +--------v-----------+              |
342a2a0ac42SJingu Kang   //             |                          |
343a2a0ac42SJingu Kang   //             |  +---------------+       |
344a2a0ac42SJingu Kang   //             +-->     exit      <-------/
345a2a0ac42SJingu Kang   //                +---------------+
346a2a0ac42SJingu Kang 
347a2a0ac42SJingu Kang   // Let's create post loop.
348a2a0ac42SJingu Kang   SmallVector<BasicBlock *, 8> PostLoopBlocks;
349a2a0ac42SJingu Kang   Loop *PostLoop;
350a2a0ac42SJingu Kang   ValueToValueMapTy VMap;
351a2a0ac42SJingu Kang   BasicBlock *PreHeader = L.getLoopPreheader();
352a2a0ac42SJingu Kang   BasicBlock *SplitLoopPH = SplitEdge(PreHeader, L.getHeader(), &DT, &LI);
353a2a0ac42SJingu Kang   PostLoop = cloneLoopWithPreheader(L.getExitBlock(), SplitLoopPH, &L, VMap,
354a2a0ac42SJingu Kang                                     ".split", &LI, &DT, PostLoopBlocks);
355a2a0ac42SJingu Kang   remapInstructionsInBlocks(PostLoopBlocks, VMap);
356a2a0ac42SJingu Kang 
357a2a0ac42SJingu Kang   BasicBlock *PostLoopPreHeader = PostLoop->getLoopPreheader();
3584c98070cSJingu Kang   IRBuilder<> Builder(&PostLoopPreHeader->front());
3594c98070cSJingu Kang 
3604c98070cSJingu Kang   // Update phi nodes in header of post-loop.
3614c98070cSJingu Kang   bool isExitingLatch =
3624c98070cSJingu Kang       (L.getExitingBlock() == L.getLoopLatch()) ? true : false;
3634c98070cSJingu Kang   Value *ExitingCondLCSSAPhi = nullptr;
3644c98070cSJingu Kang   for (PHINode &PN : L.getHeader()->phis()) {
3654c98070cSJingu Kang     // Create LCSSA phi node in preheader of post-loop.
3664c98070cSJingu Kang     PHINode *LCSSAPhi =
3674c98070cSJingu Kang         Builder.CreatePHI(PN.getType(), 1, PN.getName() + ".lcssa");
3684c98070cSJingu Kang     LCSSAPhi->setDebugLoc(PN.getDebugLoc());
3694c98070cSJingu Kang     // If the exiting block is loop latch, the phi does not have the update at
3704c98070cSJingu Kang     // last iteration. In this case, update lcssa phi with value from backedge.
3714c98070cSJingu Kang     LCSSAPhi->addIncoming(
3724c98070cSJingu Kang         isExitingLatch ? PN.getIncomingValueForBlock(L.getLoopLatch()) : &PN,
3734c98070cSJingu Kang         L.getExitingBlock());
3744c98070cSJingu Kang 
3754c98070cSJingu Kang     // Update the start value of phi node in post-loop with the LCSSA phi node.
3764c98070cSJingu Kang     PHINode *PostLoopPN = cast<PHINode>(VMap[&PN]);
3774c98070cSJingu Kang     PostLoopPN->setIncomingValueForBlock(PostLoopPreHeader, LCSSAPhi);
3784c98070cSJingu Kang 
3794c98070cSJingu Kang     // Find PHI with exiting condition from pre-loop. The PHI should be
3804c98070cSJingu Kang     // SCEVAddRecExpr and have same incoming value from backedge with
3814c98070cSJingu Kang     // ExitingCond.
3824c98070cSJingu Kang     if (!SE.isSCEVable(PN.getType()))
3834c98070cSJingu Kang       continue;
3844c98070cSJingu Kang 
3854c98070cSJingu Kang     const SCEVAddRecExpr *PhiSCEV = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(&PN));
3864c98070cSJingu Kang     if (PhiSCEV && ExitingCond.NonPHIAddRecValue ==
3874c98070cSJingu Kang                        PN.getIncomingValueForBlock(L.getLoopLatch()))
3884c98070cSJingu Kang       ExitingCondLCSSAPhi = LCSSAPhi;
3894c98070cSJingu Kang   }
3904c98070cSJingu Kang 
3914c98070cSJingu Kang   // Add conditional branch to check we can skip post-loop in its preheader.
392a2a0ac42SJingu Kang   Instruction *OrigBI = PostLoopPreHeader->getTerminator();
393a2a0ac42SJingu Kang   ICmpInst::Predicate Pred = ICmpInst::ICMP_NE;
394a2a0ac42SJingu Kang   Value *Cond =
3954c98070cSJingu Kang       Builder.CreateICmp(Pred, ExitingCondLCSSAPhi, ExitingCond.BoundValue);
396a2a0ac42SJingu Kang   Builder.CreateCondBr(Cond, PostLoop->getHeader(), PostLoop->getExitBlock());
397a2a0ac42SJingu Kang   OrigBI->eraseFromParent();
398a2a0ac42SJingu Kang 
399a2a0ac42SJingu Kang   // Create new loop bound and add it into preheader of pre-loop.
400a2a0ac42SJingu Kang   const SCEV *NewBoundSCEV = ExitingCond.BoundSCEV;
401a2a0ac42SJingu Kang   const SCEV *SplitBoundSCEV = SplitCandidateCond.BoundSCEV;
402a2a0ac42SJingu Kang   NewBoundSCEV = ICmpInst::isSigned(ExitingCond.Pred)
403a2a0ac42SJingu Kang                      ? SE.getSMinExpr(NewBoundSCEV, SplitBoundSCEV)
404a2a0ac42SJingu Kang                      : SE.getUMinExpr(NewBoundSCEV, SplitBoundSCEV);
405a2a0ac42SJingu Kang 
406a2a0ac42SJingu Kang   SCEVExpander Expander(
4079df71d76SNikita Popov       SE, L.getHeader()->getDataLayout(), "split");
408a2a0ac42SJingu Kang   Instruction *InsertPt = SplitLoopPH->getTerminator();
409a2a0ac42SJingu Kang   Value *NewBoundValue =
410a2a0ac42SJingu Kang       Expander.expandCodeFor(NewBoundSCEV, NewBoundSCEV->getType(), InsertPt);
411a2a0ac42SJingu Kang   NewBoundValue->setName("new.bound");
412a2a0ac42SJingu Kang 
413a2a0ac42SJingu Kang   // Replace exiting bound value of pre-loop NewBound.
414a2a0ac42SJingu Kang   ExitingCond.ICmp->setOperand(1, NewBoundValue);
415a2a0ac42SJingu Kang 
416a2a0ac42SJingu Kang   // Replace SplitCandidateCond.BI's condition of pre-loop by True.
417a2a0ac42SJingu Kang   LLVMContext &Context = PreHeader->getContext();
418a2a0ac42SJingu Kang   SplitCandidateCond.BI->setCondition(ConstantInt::getTrue(Context));
419a2a0ac42SJingu Kang 
420a2a0ac42SJingu Kang   // Replace cloned SplitCandidateCond.BI's condition in post-loop by False.
421a2a0ac42SJingu Kang   BranchInst *ClonedSplitCandidateBI =
422a2a0ac42SJingu Kang       cast<BranchInst>(VMap[SplitCandidateCond.BI]);
423a2a0ac42SJingu Kang   ClonedSplitCandidateBI->setCondition(ConstantInt::getFalse(Context));
424a2a0ac42SJingu Kang 
425a2a0ac42SJingu Kang   // Replace exit branch target of pre-loop by post-loop's preheader.
426a2a0ac42SJingu Kang   if (L.getExitBlock() == ExitingCond.BI->getSuccessor(0))
427a2a0ac42SJingu Kang     ExitingCond.BI->setSuccessor(0, PostLoopPreHeader);
428a2a0ac42SJingu Kang   else
429a2a0ac42SJingu Kang     ExitingCond.BI->setSuccessor(1, PostLoopPreHeader);
430a2a0ac42SJingu Kang 
431562521e2SJingu Kang   // Update phi node in exit block of post-loop.
432d75f9dd1SStephen Tozer   Builder.SetInsertPoint(PostLoopPreHeader, PostLoopPreHeader->begin());
433562521e2SJingu Kang   for (PHINode &PN : PostLoop->getExitBlock()->phis()) {
434562521e2SJingu Kang     for (auto i : seq<int>(0, PN.getNumOperands())) {
435562521e2SJingu Kang       // Check incoming block is pre-loop's exiting block.
436562521e2SJingu Kang       if (PN.getIncomingBlock(i) == L.getExitingBlock()) {
4374c98070cSJingu Kang         Value *IncomingValue = PN.getIncomingValue(i);
4384c98070cSJingu Kang 
4394c98070cSJingu Kang         // Create LCSSA phi node for incoming value.
4404c98070cSJingu Kang         PHINode *LCSSAPhi =
4414c98070cSJingu Kang             Builder.CreatePHI(PN.getType(), 1, PN.getName() + ".lcssa");
4424c98070cSJingu Kang         LCSSAPhi->setDebugLoc(PN.getDebugLoc());
4434c98070cSJingu Kang         LCSSAPhi->addIncoming(IncomingValue, PN.getIncomingBlock(i));
4444c98070cSJingu Kang 
445562521e2SJingu Kang         // Replace pre-loop's exiting block by post-loop's preheader.
446562521e2SJingu Kang         PN.setIncomingBlock(i, PostLoopPreHeader);
4474c98070cSJingu Kang         // Replace incoming value by LCSSAPhi.
4484c98070cSJingu Kang         PN.setIncomingValue(i, LCSSAPhi);
449562521e2SJingu Kang         // Add a new incoming value with post-loop's exiting block.
4504c98070cSJingu Kang         PN.addIncoming(VMap[IncomingValue], PostLoop->getExitingBlock());
451562521e2SJingu Kang       }
452562521e2SJingu Kang     }
453562521e2SJingu Kang   }
454562521e2SJingu Kang 
455a2a0ac42SJingu Kang   // Update dominator tree.
456a2a0ac42SJingu Kang   DT.changeImmediateDominator(PostLoopPreHeader, L.getExitingBlock());
457a2a0ac42SJingu Kang   DT.changeImmediateDominator(PostLoop->getExitBlock(), PostLoopPreHeader);
458a2a0ac42SJingu Kang 
459a2a0ac42SJingu Kang   // Invalidate cached SE information.
460a2a0ac42SJingu Kang   SE.forgetLoop(&L);
461a2a0ac42SJingu Kang 
462a2a0ac42SJingu Kang   // Canonicalize loops.
463a2a0ac42SJingu Kang   simplifyLoop(&L, &DT, &LI, &SE, nullptr, nullptr, true);
464a2a0ac42SJingu Kang   simplifyLoop(PostLoop, &DT, &LI, &SE, nullptr, nullptr, true);
465a2a0ac42SJingu Kang 
466a2a0ac42SJingu Kang   // Add new post-loop to loop pass manager.
467a2a0ac42SJingu Kang   U.addSiblingLoops(PostLoop);
468a2a0ac42SJingu Kang 
469a2a0ac42SJingu Kang   return true;
470a2a0ac42SJingu Kang }
471a2a0ac42SJingu Kang 
472a2a0ac42SJingu Kang PreservedAnalyses LoopBoundSplitPass::run(Loop &L, LoopAnalysisManager &AM,
473a2a0ac42SJingu Kang                                           LoopStandardAnalysisResults &AR,
474a2a0ac42SJingu Kang                                           LPMUpdater &U) {
475a2a0ac42SJingu Kang   Function &F = *L.getHeader()->getParent();
476a2a0ac42SJingu Kang   (void)F;
477a2a0ac42SJingu Kang 
478a2a0ac42SJingu Kang   LLVM_DEBUG(dbgs() << "Spliting bound of loop in " << F.getName() << ": " << L
479a2a0ac42SJingu Kang                     << "\n");
480a2a0ac42SJingu Kang 
481a2a0ac42SJingu Kang   if (!splitLoopBound(L, AR.DT, AR.LI, AR.SE, U))
482a2a0ac42SJingu Kang     return PreservedAnalyses::all();
483a2a0ac42SJingu Kang 
484a2a0ac42SJingu Kang   assert(AR.DT.verify(DominatorTree::VerificationLevel::Fast));
485a2a0ac42SJingu Kang   AR.LI.verify(AR.DT);
486a2a0ac42SJingu Kang 
487a2a0ac42SJingu Kang   return getLoopPassPreservedAnalyses();
488a2a0ac42SJingu Kang }
489a2a0ac42SJingu Kang 
490a2a0ac42SJingu Kang } // end namespace llvm
491