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