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"
16*59630917Sserge-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
350b9a610aSKazu Hirata ICmpInst::Predicate 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
analyzeICmp(ScalarEvolution & SE,ICmpInst * ICmp,ConditionInfo & Cond,const Loop & L)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
calculateUpperBound(const Loop & L,ScalarEvolution & SE,ConditionInfo & Cond,bool IsExitCond)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
hasProcessableCondition(const Loop & L,ScalarEvolution & SE,ICmpInst * ICmp,ConditionInfo & Cond,bool IsExitCond)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
isProcessableCondBI(const ScalarEvolution & SE,const BranchInst * BI)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 ICmpInst::Predicate Pred;
164a2a0ac42SJingu Kang Value *LHS, *RHS;
165a2a0ac42SJingu Kang if (!match(BI, m_Br(m_ICmp(Pred, m_Value(LHS), m_Value(RHS)),
166a2a0ac42SJingu Kang m_BasicBlock(TrueSucc), m_BasicBlock(FalseSucc))))
167a2a0ac42SJingu Kang return false;
168a2a0ac42SJingu Kang
169a2a0ac42SJingu Kang if (!SE.isSCEVable(LHS->getType()))
170a2a0ac42SJingu Kang return false;
171a2a0ac42SJingu Kang assert(SE.isSCEVable(RHS->getType()) && "Expected RHS's type is SCEVable");
172a2a0ac42SJingu Kang
173a2a0ac42SJingu Kang if (TrueSucc == FalseSucc)
174a2a0ac42SJingu Kang return false;
175a2a0ac42SJingu Kang
176a2a0ac42SJingu Kang return true;
177a2a0ac42SJingu Kang }
178a2a0ac42SJingu Kang
canSplitLoopBound(const Loop & L,const DominatorTree & DT,ScalarEvolution & SE,ConditionInfo & Cond)179a2a0ac42SJingu Kang static bool canSplitLoopBound(const Loop &L, const DominatorTree &DT,
180a2a0ac42SJingu Kang ScalarEvolution &SE, ConditionInfo &Cond) {
181a2a0ac42SJingu Kang // Skip function with optsize.
182a2a0ac42SJingu Kang if (L.getHeader()->getParent()->hasOptSize())
183a2a0ac42SJingu Kang return false;
184a2a0ac42SJingu Kang
185a2a0ac42SJingu Kang // Split only innermost loop.
186a2a0ac42SJingu Kang if (!L.isInnermost())
187a2a0ac42SJingu Kang return false;
188a2a0ac42SJingu Kang
189a2a0ac42SJingu Kang // Check loop is in simplified form.
190a2a0ac42SJingu Kang if (!L.isLoopSimplifyForm())
191a2a0ac42SJingu Kang return false;
192a2a0ac42SJingu Kang
193a2a0ac42SJingu Kang // Check loop is in LCSSA form.
194a2a0ac42SJingu Kang if (!L.isLCSSAForm(DT))
195a2a0ac42SJingu Kang return false;
196a2a0ac42SJingu Kang
197a2a0ac42SJingu Kang // Skip loop that cannot be cloned.
198a2a0ac42SJingu Kang if (!L.isSafeToClone())
199a2a0ac42SJingu Kang return false;
200a2a0ac42SJingu Kang
201a2a0ac42SJingu Kang BasicBlock *ExitingBB = L.getExitingBlock();
202a2a0ac42SJingu Kang // Assumed only one exiting block.
203a2a0ac42SJingu Kang if (!ExitingBB)
204a2a0ac42SJingu Kang return false;
205a2a0ac42SJingu Kang
206a2a0ac42SJingu Kang BranchInst *ExitingBI = dyn_cast<BranchInst>(ExitingBB->getTerminator());
207a2a0ac42SJingu Kang if (!ExitingBI)
208a2a0ac42SJingu Kang return false;
209a2a0ac42SJingu Kang
210a2a0ac42SJingu Kang // Allowed only conditional branch with ICmp.
211a2a0ac42SJingu Kang if (!isProcessableCondBI(SE, ExitingBI))
212a2a0ac42SJingu Kang return false;
213a2a0ac42SJingu Kang
214a2a0ac42SJingu Kang // Check the condition is processable.
215a2a0ac42SJingu Kang ICmpInst *ICmp = cast<ICmpInst>(ExitingBI->getCondition());
216a2a0ac42SJingu Kang if (!hasProcessableCondition(L, SE, ICmp, Cond, /*IsExitCond*/ true))
217a2a0ac42SJingu Kang return false;
218a2a0ac42SJingu Kang
219a2a0ac42SJingu Kang Cond.BI = ExitingBI;
220a2a0ac42SJingu Kang return true;
221a2a0ac42SJingu Kang }
222a2a0ac42SJingu Kang
isProfitableToTransform(const Loop & L,const BranchInst * BI)223a2a0ac42SJingu Kang static bool isProfitableToTransform(const Loop &L, const BranchInst *BI) {
224a2a0ac42SJingu Kang // If the conditional branch splits a loop into two halves, we could
225a2a0ac42SJingu Kang // generally say it is profitable.
226a2a0ac42SJingu Kang //
227a2a0ac42SJingu Kang // ToDo: Add more profitable cases here.
228a2a0ac42SJingu Kang
229a2a0ac42SJingu Kang // Check this branch causes diamond CFG.
230a2a0ac42SJingu Kang BasicBlock *Succ0 = BI->getSuccessor(0);
231a2a0ac42SJingu Kang BasicBlock *Succ1 = BI->getSuccessor(1);
232a2a0ac42SJingu Kang
233a2a0ac42SJingu Kang BasicBlock *Succ0Succ = Succ0->getSingleSuccessor();
234a2a0ac42SJingu Kang BasicBlock *Succ1Succ = Succ1->getSingleSuccessor();
235a2a0ac42SJingu Kang if (!Succ0Succ || !Succ1Succ || Succ0Succ != Succ1Succ)
236a2a0ac42SJingu Kang return false;
237a2a0ac42SJingu Kang
238a2a0ac42SJingu Kang // ToDo: Calculate each successor's instruction cost.
239a2a0ac42SJingu Kang
240a2a0ac42SJingu Kang return true;
241a2a0ac42SJingu Kang }
242a2a0ac42SJingu Kang
findSplitCandidate(const Loop & L,ScalarEvolution & SE,ConditionInfo & ExitingCond,ConditionInfo & SplitCandidateCond)243a2a0ac42SJingu Kang static BranchInst *findSplitCandidate(const Loop &L, ScalarEvolution &SE,
244a2a0ac42SJingu Kang ConditionInfo &ExitingCond,
245a2a0ac42SJingu Kang ConditionInfo &SplitCandidateCond) {
246a2a0ac42SJingu Kang for (auto *BB : L.blocks()) {
247a2a0ac42SJingu Kang // Skip condition of backedge.
248a2a0ac42SJingu Kang if (L.getLoopLatch() == BB)
249a2a0ac42SJingu Kang continue;
250a2a0ac42SJingu Kang
251a2a0ac42SJingu Kang auto *BI = dyn_cast<BranchInst>(BB->getTerminator());
252a2a0ac42SJingu Kang if (!BI)
253a2a0ac42SJingu Kang continue;
254a2a0ac42SJingu Kang
255a2a0ac42SJingu Kang // Check conditional branch with ICmp.
256a2a0ac42SJingu Kang if (!isProcessableCondBI(SE, BI))
257a2a0ac42SJingu Kang continue;
258a2a0ac42SJingu Kang
259a2a0ac42SJingu Kang // Skip loop invariant condition.
260a2a0ac42SJingu Kang if (L.isLoopInvariant(BI->getCondition()))
261a2a0ac42SJingu Kang continue;
262a2a0ac42SJingu Kang
263a2a0ac42SJingu Kang // Check the condition is processable.
264a2a0ac42SJingu Kang ICmpInst *ICmp = cast<ICmpInst>(BI->getCondition());
265a2a0ac42SJingu Kang if (!hasProcessableCondition(L, SE, ICmp, SplitCandidateCond,
266a2a0ac42SJingu Kang /*IsExitCond*/ false))
267a2a0ac42SJingu Kang continue;
268a2a0ac42SJingu Kang
269a2a0ac42SJingu Kang if (ExitingCond.BoundSCEV->getType() !=
270a2a0ac42SJingu Kang SplitCandidateCond.BoundSCEV->getType())
271a2a0ac42SJingu Kang continue;
272a2a0ac42SJingu Kang
2732a26d47aSJingu Kang // After transformation, we assume the split condition of the pre-loop is
2742a26d47aSJingu Kang // always true. In order to guarantee it, we need to check the start value
2752a26d47aSJingu Kang // of the split cond AddRec satisfies the split condition.
2764288b652SJingu Kang if (!SE.isLoopEntryGuardedByCond(&L, SplitCandidateCond.Pred,
2774288b652SJingu Kang SplitCandidateCond.AddRecSCEV->getStart(),
2782a26d47aSJingu Kang SplitCandidateCond.BoundSCEV))
2792a26d47aSJingu Kang continue;
2802a26d47aSJingu Kang
281a2a0ac42SJingu Kang SplitCandidateCond.BI = BI;
282a2a0ac42SJingu Kang return BI;
283a2a0ac42SJingu Kang }
284a2a0ac42SJingu Kang
285a2a0ac42SJingu Kang return nullptr;
286a2a0ac42SJingu Kang }
287a2a0ac42SJingu Kang
splitLoopBound(Loop & L,DominatorTree & DT,LoopInfo & LI,ScalarEvolution & SE,LPMUpdater & U)288a2a0ac42SJingu Kang static bool splitLoopBound(Loop &L, DominatorTree &DT, LoopInfo &LI,
289a2a0ac42SJingu Kang ScalarEvolution &SE, LPMUpdater &U) {
290a2a0ac42SJingu Kang ConditionInfo SplitCandidateCond;
291a2a0ac42SJingu Kang ConditionInfo ExitingCond;
292a2a0ac42SJingu Kang
293a2a0ac42SJingu Kang // Check we can split this loop's bound.
294a2a0ac42SJingu Kang if (!canSplitLoopBound(L, DT, SE, ExitingCond))
295a2a0ac42SJingu Kang return false;
296a2a0ac42SJingu Kang
297a2a0ac42SJingu Kang if (!findSplitCandidate(L, SE, ExitingCond, SplitCandidateCond))
298a2a0ac42SJingu Kang return false;
299a2a0ac42SJingu Kang
300a2a0ac42SJingu Kang if (!isProfitableToTransform(L, SplitCandidateCond.BI))
301a2a0ac42SJingu Kang return false;
302a2a0ac42SJingu Kang
303a2a0ac42SJingu Kang // Now, we have a split candidate. Let's build a form as below.
304a2a0ac42SJingu Kang // +--------------------+
305a2a0ac42SJingu Kang // | preheader |
306a2a0ac42SJingu Kang // | set up newbound |
307a2a0ac42SJingu Kang // +--------------------+
308a2a0ac42SJingu Kang // | /----------------\
309a2a0ac42SJingu Kang // +--------v----v------+ |
310a2a0ac42SJingu Kang // | header |---\ |
311a2a0ac42SJingu Kang // | with true condition| | |
312a2a0ac42SJingu Kang // +--------------------+ | |
313a2a0ac42SJingu Kang // | | |
314a2a0ac42SJingu Kang // +--------v-----------+ | |
315a2a0ac42SJingu Kang // | if.then.BB | | |
316a2a0ac42SJingu Kang // +--------------------+ | |
317a2a0ac42SJingu Kang // | | |
318a2a0ac42SJingu Kang // +--------v-----------<---/ |
319a2a0ac42SJingu Kang // | latch >----------/
320a2a0ac42SJingu Kang // | with newbound |
321a2a0ac42SJingu Kang // +--------------------+
322a2a0ac42SJingu Kang // |
323a2a0ac42SJingu Kang // +--------v-----------+
324a2a0ac42SJingu Kang // | preheader2 |--------------\
325a2a0ac42SJingu Kang // | if (AddRec i != | |
326a2a0ac42SJingu Kang // | org bound) | |
327a2a0ac42SJingu Kang // +--------------------+ |
328a2a0ac42SJingu Kang // | /----------------\ |
329a2a0ac42SJingu Kang // +--------v----v------+ | |
330a2a0ac42SJingu Kang // | header2 |---\ | |
331a2a0ac42SJingu Kang // | conditional branch | | | |
332a2a0ac42SJingu Kang // |with false condition| | | |
333a2a0ac42SJingu Kang // +--------------------+ | | |
334a2a0ac42SJingu Kang // | | | |
335a2a0ac42SJingu Kang // +--------v-----------+ | | |
336a2a0ac42SJingu Kang // | if.then.BB2 | | | |
337a2a0ac42SJingu Kang // +--------------------+ | | |
338a2a0ac42SJingu Kang // | | | |
339a2a0ac42SJingu Kang // +--------v-----------<---/ | |
340a2a0ac42SJingu Kang // | latch2 >----------/ |
341a2a0ac42SJingu Kang // | with org bound | |
342a2a0ac42SJingu Kang // +--------v-----------+ |
343a2a0ac42SJingu Kang // | |
344a2a0ac42SJingu Kang // | +---------------+ |
345a2a0ac42SJingu Kang // +--> exit <-------/
346a2a0ac42SJingu Kang // +---------------+
347a2a0ac42SJingu Kang
348a2a0ac42SJingu Kang // Let's create post loop.
349a2a0ac42SJingu Kang SmallVector<BasicBlock *, 8> PostLoopBlocks;
350a2a0ac42SJingu Kang Loop *PostLoop;
351a2a0ac42SJingu Kang ValueToValueMapTy VMap;
352a2a0ac42SJingu Kang BasicBlock *PreHeader = L.getLoopPreheader();
353a2a0ac42SJingu Kang BasicBlock *SplitLoopPH = SplitEdge(PreHeader, L.getHeader(), &DT, &LI);
354a2a0ac42SJingu Kang PostLoop = cloneLoopWithPreheader(L.getExitBlock(), SplitLoopPH, &L, VMap,
355a2a0ac42SJingu Kang ".split", &LI, &DT, PostLoopBlocks);
356a2a0ac42SJingu Kang remapInstructionsInBlocks(PostLoopBlocks, VMap);
357a2a0ac42SJingu Kang
358a2a0ac42SJingu Kang BasicBlock *PostLoopPreHeader = PostLoop->getLoopPreheader();
3594c98070cSJingu Kang IRBuilder<> Builder(&PostLoopPreHeader->front());
3604c98070cSJingu Kang
3614c98070cSJingu Kang // Update phi nodes in header of post-loop.
3624c98070cSJingu Kang bool isExitingLatch =
3634c98070cSJingu Kang (L.getExitingBlock() == L.getLoopLatch()) ? true : false;
3644c98070cSJingu Kang Value *ExitingCondLCSSAPhi = nullptr;
3654c98070cSJingu Kang for (PHINode &PN : L.getHeader()->phis()) {
3664c98070cSJingu Kang // Create LCSSA phi node in preheader of post-loop.
3674c98070cSJingu Kang PHINode *LCSSAPhi =
3684c98070cSJingu Kang Builder.CreatePHI(PN.getType(), 1, PN.getName() + ".lcssa");
3694c98070cSJingu Kang LCSSAPhi->setDebugLoc(PN.getDebugLoc());
3704c98070cSJingu Kang // If the exiting block is loop latch, the phi does not have the update at
3714c98070cSJingu Kang // last iteration. In this case, update lcssa phi with value from backedge.
3724c98070cSJingu Kang LCSSAPhi->addIncoming(
3734c98070cSJingu Kang isExitingLatch ? PN.getIncomingValueForBlock(L.getLoopLatch()) : &PN,
3744c98070cSJingu Kang L.getExitingBlock());
3754c98070cSJingu Kang
3764c98070cSJingu Kang // Update the start value of phi node in post-loop with the LCSSA phi node.
3774c98070cSJingu Kang PHINode *PostLoopPN = cast<PHINode>(VMap[&PN]);
3784c98070cSJingu Kang PostLoopPN->setIncomingValueForBlock(PostLoopPreHeader, LCSSAPhi);
3794c98070cSJingu Kang
3804c98070cSJingu Kang // Find PHI with exiting condition from pre-loop. The PHI should be
3814c98070cSJingu Kang // SCEVAddRecExpr and have same incoming value from backedge with
3824c98070cSJingu Kang // ExitingCond.
3834c98070cSJingu Kang if (!SE.isSCEVable(PN.getType()))
3844c98070cSJingu Kang continue;
3854c98070cSJingu Kang
3864c98070cSJingu Kang const SCEVAddRecExpr *PhiSCEV = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(&PN));
3874c98070cSJingu Kang if (PhiSCEV && ExitingCond.NonPHIAddRecValue ==
3884c98070cSJingu Kang PN.getIncomingValueForBlock(L.getLoopLatch()))
3894c98070cSJingu Kang ExitingCondLCSSAPhi = LCSSAPhi;
3904c98070cSJingu Kang }
3914c98070cSJingu Kang
3924c98070cSJingu Kang // Add conditional branch to check we can skip post-loop in its preheader.
393a2a0ac42SJingu Kang Instruction *OrigBI = PostLoopPreHeader->getTerminator();
394a2a0ac42SJingu Kang ICmpInst::Predicate Pred = ICmpInst::ICMP_NE;
395a2a0ac42SJingu Kang Value *Cond =
3964c98070cSJingu Kang Builder.CreateICmp(Pred, ExitingCondLCSSAPhi, ExitingCond.BoundValue);
397a2a0ac42SJingu Kang Builder.CreateCondBr(Cond, PostLoop->getHeader(), PostLoop->getExitBlock());
398a2a0ac42SJingu Kang OrigBI->eraseFromParent();
399a2a0ac42SJingu Kang
400a2a0ac42SJingu Kang // Create new loop bound and add it into preheader of pre-loop.
401a2a0ac42SJingu Kang const SCEV *NewBoundSCEV = ExitingCond.BoundSCEV;
402a2a0ac42SJingu Kang const SCEV *SplitBoundSCEV = SplitCandidateCond.BoundSCEV;
403a2a0ac42SJingu Kang NewBoundSCEV = ICmpInst::isSigned(ExitingCond.Pred)
404a2a0ac42SJingu Kang ? SE.getSMinExpr(NewBoundSCEV, SplitBoundSCEV)
405a2a0ac42SJingu Kang : SE.getUMinExpr(NewBoundSCEV, SplitBoundSCEV);
406a2a0ac42SJingu Kang
407a2a0ac42SJingu Kang SCEVExpander Expander(
408a2a0ac42SJingu Kang SE, L.getHeader()->getParent()->getParent()->getDataLayout(), "split");
409a2a0ac42SJingu Kang Instruction *InsertPt = SplitLoopPH->getTerminator();
410a2a0ac42SJingu Kang Value *NewBoundValue =
411a2a0ac42SJingu Kang Expander.expandCodeFor(NewBoundSCEV, NewBoundSCEV->getType(), InsertPt);
412a2a0ac42SJingu Kang NewBoundValue->setName("new.bound");
413a2a0ac42SJingu Kang
414a2a0ac42SJingu Kang // Replace exiting bound value of pre-loop NewBound.
415a2a0ac42SJingu Kang ExitingCond.ICmp->setOperand(1, NewBoundValue);
416a2a0ac42SJingu Kang
417a2a0ac42SJingu Kang // Replace SplitCandidateCond.BI's condition of pre-loop by True.
418a2a0ac42SJingu Kang LLVMContext &Context = PreHeader->getContext();
419a2a0ac42SJingu Kang SplitCandidateCond.BI->setCondition(ConstantInt::getTrue(Context));
420a2a0ac42SJingu Kang
421a2a0ac42SJingu Kang // Replace cloned SplitCandidateCond.BI's condition in post-loop by False.
422a2a0ac42SJingu Kang BranchInst *ClonedSplitCandidateBI =
423a2a0ac42SJingu Kang cast<BranchInst>(VMap[SplitCandidateCond.BI]);
424a2a0ac42SJingu Kang ClonedSplitCandidateBI->setCondition(ConstantInt::getFalse(Context));
425a2a0ac42SJingu Kang
426a2a0ac42SJingu Kang // Replace exit branch target of pre-loop by post-loop's preheader.
427a2a0ac42SJingu Kang if (L.getExitBlock() == ExitingCond.BI->getSuccessor(0))
428a2a0ac42SJingu Kang ExitingCond.BI->setSuccessor(0, PostLoopPreHeader);
429a2a0ac42SJingu Kang else
430a2a0ac42SJingu Kang ExitingCond.BI->setSuccessor(1, PostLoopPreHeader);
431a2a0ac42SJingu Kang
432562521e2SJingu Kang // Update phi node in exit block of post-loop.
4334c98070cSJingu Kang Builder.SetInsertPoint(&PostLoopPreHeader->front());
434562521e2SJingu Kang for (PHINode &PN : PostLoop->getExitBlock()->phis()) {
435562521e2SJingu Kang for (auto i : seq<int>(0, PN.getNumOperands())) {
436562521e2SJingu Kang // Check incoming block is pre-loop's exiting block.
437562521e2SJingu Kang if (PN.getIncomingBlock(i) == L.getExitingBlock()) {
4384c98070cSJingu Kang Value *IncomingValue = PN.getIncomingValue(i);
4394c98070cSJingu Kang
4404c98070cSJingu Kang // Create LCSSA phi node for incoming value.
4414c98070cSJingu Kang PHINode *LCSSAPhi =
4424c98070cSJingu Kang Builder.CreatePHI(PN.getType(), 1, PN.getName() + ".lcssa");
4434c98070cSJingu Kang LCSSAPhi->setDebugLoc(PN.getDebugLoc());
4444c98070cSJingu Kang LCSSAPhi->addIncoming(IncomingValue, PN.getIncomingBlock(i));
4454c98070cSJingu Kang
446562521e2SJingu Kang // Replace pre-loop's exiting block by post-loop's preheader.
447562521e2SJingu Kang PN.setIncomingBlock(i, PostLoopPreHeader);
4484c98070cSJingu Kang // Replace incoming value by LCSSAPhi.
4494c98070cSJingu Kang PN.setIncomingValue(i, LCSSAPhi);
450562521e2SJingu Kang // Add a new incoming value with post-loop's exiting block.
4514c98070cSJingu Kang PN.addIncoming(VMap[IncomingValue], PostLoop->getExitingBlock());
452562521e2SJingu Kang }
453562521e2SJingu Kang }
454562521e2SJingu Kang }
455562521e2SJingu Kang
456a2a0ac42SJingu Kang // Update dominator tree.
457a2a0ac42SJingu Kang DT.changeImmediateDominator(PostLoopPreHeader, L.getExitingBlock());
458a2a0ac42SJingu Kang DT.changeImmediateDominator(PostLoop->getExitBlock(), PostLoopPreHeader);
459a2a0ac42SJingu Kang
460a2a0ac42SJingu Kang // Invalidate cached SE information.
461a2a0ac42SJingu Kang SE.forgetLoop(&L);
462a2a0ac42SJingu Kang
463a2a0ac42SJingu Kang // Canonicalize loops.
464a2a0ac42SJingu Kang simplifyLoop(&L, &DT, &LI, &SE, nullptr, nullptr, true);
465a2a0ac42SJingu Kang simplifyLoop(PostLoop, &DT, &LI, &SE, nullptr, nullptr, true);
466a2a0ac42SJingu Kang
467a2a0ac42SJingu Kang // Add new post-loop to loop pass manager.
468a2a0ac42SJingu Kang U.addSiblingLoops(PostLoop);
469a2a0ac42SJingu Kang
470a2a0ac42SJingu Kang return true;
471a2a0ac42SJingu Kang }
472a2a0ac42SJingu Kang
run(Loop & L,LoopAnalysisManager & AM,LoopStandardAnalysisResults & AR,LPMUpdater & U)473a2a0ac42SJingu Kang PreservedAnalyses LoopBoundSplitPass::run(Loop &L, LoopAnalysisManager &AM,
474a2a0ac42SJingu Kang LoopStandardAnalysisResults &AR,
475a2a0ac42SJingu Kang LPMUpdater &U) {
476a2a0ac42SJingu Kang Function &F = *L.getHeader()->getParent();
477a2a0ac42SJingu Kang (void)F;
478a2a0ac42SJingu Kang
479a2a0ac42SJingu Kang LLVM_DEBUG(dbgs() << "Spliting bound of loop in " << F.getName() << ": " << L
480a2a0ac42SJingu Kang << "\n");
481a2a0ac42SJingu Kang
482a2a0ac42SJingu Kang if (!splitLoopBound(L, AR.DT, AR.LI, AR.SE, U))
483a2a0ac42SJingu Kang return PreservedAnalyses::all();
484a2a0ac42SJingu Kang
485a2a0ac42SJingu Kang assert(AR.DT.verify(DominatorTree::VerificationLevel::Fast));
486a2a0ac42SJingu Kang AR.LI.verify(AR.DT);
487a2a0ac42SJingu Kang
488a2a0ac42SJingu Kang return getLoopPassPreservedAnalyses();
489a2a0ac42SJingu Kang }
490a2a0ac42SJingu Kang
491a2a0ac42SJingu Kang } // end namespace llvm
492