18fb3d57eSArtur Pilipenko //===-- LoopPredication.cpp - Guard based loop predication pass -----------===// 28fb3d57eSArtur Pilipenko // 38fb3d57eSArtur Pilipenko // The LLVM Compiler Infrastructure 48fb3d57eSArtur Pilipenko // 58fb3d57eSArtur Pilipenko // This file is distributed under the University of Illinois Open Source 68fb3d57eSArtur Pilipenko // License. See LICENSE.TXT for details. 78fb3d57eSArtur Pilipenko // 88fb3d57eSArtur Pilipenko //===----------------------------------------------------------------------===// 98fb3d57eSArtur Pilipenko // 108fb3d57eSArtur Pilipenko // The LoopPredication pass tries to convert loop variant range checks to loop 118fb3d57eSArtur Pilipenko // invariant by widening checks across loop iterations. For example, it will 128fb3d57eSArtur Pilipenko // convert 138fb3d57eSArtur Pilipenko // 148fb3d57eSArtur Pilipenko // for (i = 0; i < n; i++) { 158fb3d57eSArtur Pilipenko // guard(i < len); 168fb3d57eSArtur Pilipenko // ... 178fb3d57eSArtur Pilipenko // } 188fb3d57eSArtur Pilipenko // 198fb3d57eSArtur Pilipenko // to 208fb3d57eSArtur Pilipenko // 218fb3d57eSArtur Pilipenko // for (i = 0; i < n; i++) { 228fb3d57eSArtur Pilipenko // guard(n - 1 < len); 238fb3d57eSArtur Pilipenko // ... 248fb3d57eSArtur Pilipenko // } 258fb3d57eSArtur Pilipenko // 268fb3d57eSArtur Pilipenko // After this transformation the condition of the guard is loop invariant, so 278fb3d57eSArtur Pilipenko // loop-unswitch can later unswitch the loop by this condition which basically 288fb3d57eSArtur Pilipenko // predicates the loop by the widened condition: 298fb3d57eSArtur Pilipenko // 308fb3d57eSArtur Pilipenko // if (n - 1 < len) 318fb3d57eSArtur Pilipenko // for (i = 0; i < n; i++) { 328fb3d57eSArtur Pilipenko // ... 338fb3d57eSArtur Pilipenko // } 348fb3d57eSArtur Pilipenko // else 358fb3d57eSArtur Pilipenko // deoptimize 368fb3d57eSArtur Pilipenko // 37889dc1e3SArtur Pilipenko // It's tempting to rely on SCEV here, but it has proven to be problematic. 38889dc1e3SArtur Pilipenko // Generally the facts SCEV provides about the increment step of add 39889dc1e3SArtur Pilipenko // recurrences are true if the backedge of the loop is taken, which implicitly 40889dc1e3SArtur Pilipenko // assumes that the guard doesn't fail. Using these facts to optimize the 41889dc1e3SArtur Pilipenko // guard results in a circular logic where the guard is optimized under the 42889dc1e3SArtur Pilipenko // assumption that it never fails. 43889dc1e3SArtur Pilipenko // 44889dc1e3SArtur Pilipenko // For example, in the loop below the induction variable will be marked as nuw 45889dc1e3SArtur Pilipenko // basing on the guard. Basing on nuw the guard predicate will be considered 46889dc1e3SArtur Pilipenko // monotonic. Given a monotonic condition it's tempting to replace the induction 47889dc1e3SArtur Pilipenko // variable in the condition with its value on the last iteration. But this 48889dc1e3SArtur Pilipenko // transformation is not correct, e.g. e = 4, b = 5 breaks the loop. 49889dc1e3SArtur Pilipenko // 50889dc1e3SArtur Pilipenko // for (int i = b; i != e; i++) 51889dc1e3SArtur Pilipenko // guard(i u< len) 52889dc1e3SArtur Pilipenko // 53889dc1e3SArtur Pilipenko // One of the ways to reason about this problem is to use an inductive proof 54889dc1e3SArtur Pilipenko // approach. Given the loop: 55889dc1e3SArtur Pilipenko // 56*8aadc643SArtur Pilipenko // if (B(0)) { 57889dc1e3SArtur Pilipenko // do { 58*8aadc643SArtur Pilipenko // I = PHI(0, I.INC) 59889dc1e3SArtur Pilipenko // I.INC = I + Step 60889dc1e3SArtur Pilipenko // guard(G(I)); 61*8aadc643SArtur Pilipenko // } while (B(I)); 62889dc1e3SArtur Pilipenko // } 63889dc1e3SArtur Pilipenko // 64889dc1e3SArtur Pilipenko // where B(x) and G(x) are predicates that map integers to booleans, we want a 65889dc1e3SArtur Pilipenko // loop invariant expression M such the following program has the same semantics 66889dc1e3SArtur Pilipenko // as the above: 67889dc1e3SArtur Pilipenko // 68*8aadc643SArtur Pilipenko // if (B(0)) { 69889dc1e3SArtur Pilipenko // do { 70*8aadc643SArtur Pilipenko // I = PHI(0, I.INC) 71889dc1e3SArtur Pilipenko // I.INC = I + Step 72*8aadc643SArtur Pilipenko // guard(G(0) && M); 73*8aadc643SArtur Pilipenko // } while (B(I)); 74889dc1e3SArtur Pilipenko // } 75889dc1e3SArtur Pilipenko // 76*8aadc643SArtur Pilipenko // One solution for M is M = forall X . (G(X) && B(X)) => G(X + Step) 77889dc1e3SArtur Pilipenko // 78889dc1e3SArtur Pilipenko // Informal proof that the transformation above is correct: 79889dc1e3SArtur Pilipenko // 80889dc1e3SArtur Pilipenko // By the definition of guards we can rewrite the guard condition to: 81*8aadc643SArtur Pilipenko // G(I) && G(0) && M 82889dc1e3SArtur Pilipenko // 83889dc1e3SArtur Pilipenko // Let's prove that for each iteration of the loop: 84*8aadc643SArtur Pilipenko // G(0) && M => G(I) 85889dc1e3SArtur Pilipenko // And the condition above can be simplified to G(Start) && M. 86889dc1e3SArtur Pilipenko // 87889dc1e3SArtur Pilipenko // Induction base. 88*8aadc643SArtur Pilipenko // G(0) && M => G(0) 89889dc1e3SArtur Pilipenko // 90*8aadc643SArtur Pilipenko // Induction step. Assuming G(0) && M => G(I) on the subsequent 91889dc1e3SArtur Pilipenko // iteration: 92889dc1e3SArtur Pilipenko // 93*8aadc643SArtur Pilipenko // B(I) is true because it's the backedge condition. 94889dc1e3SArtur Pilipenko // G(I) is true because the backedge is guarded by this condition. 95889dc1e3SArtur Pilipenko // 96*8aadc643SArtur Pilipenko // So M = forall X . (G(X) && B(X)) => G(X + Step) implies G(I + Step). 97889dc1e3SArtur Pilipenko // 98889dc1e3SArtur Pilipenko // Note that we can use anything stronger than M, i.e. any condition which 99889dc1e3SArtur Pilipenko // implies M. 100889dc1e3SArtur Pilipenko // 101889dc1e3SArtur Pilipenko // For now the transformation is limited to the following case: 102b4527e1cSArtur Pilipenko // * The loop has a single latch with the condition of the form: 103*8aadc643SArtur Pilipenko // B(X) = latchStart + X <pred> latchLimit, 104*8aadc643SArtur Pilipenko // where <pred> is u<, u<=, s<, or s<=. 105889dc1e3SArtur Pilipenko // * The step of the IV used in the latch condition is 1. 106*8aadc643SArtur Pilipenko // * The guard condition is of the form 107*8aadc643SArtur Pilipenko // G(X) = guardStart + X u< guardLimit 108889dc1e3SArtur Pilipenko // 109b4527e1cSArtur Pilipenko // For the ult latch comparison case M is: 110*8aadc643SArtur Pilipenko // forall X . guardStart + X u< guardLimit && latchStart + X <u latchLimit => 111*8aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 112889dc1e3SArtur Pilipenko // 113889dc1e3SArtur Pilipenko // The only way the antecedent can be true and the consequent can be false is 114889dc1e3SArtur Pilipenko // if 115*8aadc643SArtur Pilipenko // X == guardLimit - 1 - guardStart 116889dc1e3SArtur Pilipenko // (and guardLimit is non-zero, but we won't use this latter fact). 117*8aadc643SArtur Pilipenko // If X == guardLimit - 1 - guardStart then the second half of the antecedent is 118*8aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u< latchLimit 119889dc1e3SArtur Pilipenko // and its negation is 120*8aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u>= latchLimit 121889dc1e3SArtur Pilipenko // 122*8aadc643SArtur Pilipenko // In other words, if 123*8aadc643SArtur Pilipenko // latchLimit u<= latchStart + guardLimit - 1 - guardStart 124*8aadc643SArtur Pilipenko // then: 125889dc1e3SArtur Pilipenko // (the ranges below are written in ConstantRange notation, where [A, B) is the 126889dc1e3SArtur Pilipenko // set for (I = A; I != B; I++ /*maywrap*/) yield(I);) 127889dc1e3SArtur Pilipenko // 128*8aadc643SArtur Pilipenko // forall X . guardStart + X u< guardLimit && 129*8aadc643SArtur Pilipenko // latchStart + X u< latchLimit => 130*8aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 131*8aadc643SArtur Pilipenko // == forall X . guardStart + X u< guardLimit && 132*8aadc643SArtur Pilipenko // latchStart + X u< latchStart + guardLimit - 1 - guardStart => 133*8aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 134*8aadc643SArtur Pilipenko // == forall X . (guardStart + X) in [0, guardLimit) && 135*8aadc643SArtur Pilipenko // (latchStart + X) in [0, latchStart + guardLimit - 1 - guardStart) => 136*8aadc643SArtur Pilipenko // (guardStart + X + 1) in [0, guardLimit) 137*8aadc643SArtur Pilipenko // == forall X . X in [-guardStart, guardLimit - guardStart) && 138*8aadc643SArtur Pilipenko // X in [-latchStart, guardLimit - 1 - guardStart) => 139*8aadc643SArtur Pilipenko // X in [-guardStart - 1, guardLimit - guardStart - 1) 140889dc1e3SArtur Pilipenko // == true 141889dc1e3SArtur Pilipenko // 142889dc1e3SArtur Pilipenko // So the widened condition is: 143*8aadc643SArtur Pilipenko // guardStart u< guardLimit && 144*8aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u>= latchLimit 145*8aadc643SArtur Pilipenko // Similarly for ule condition the widened condition is: 146*8aadc643SArtur Pilipenko // guardStart u< guardLimit && 147*8aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u> latchLimit 148*8aadc643SArtur Pilipenko // For slt condition the widened condition is: 149*8aadc643SArtur Pilipenko // guardStart u< guardLimit && 150*8aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart s>= latchLimit 151*8aadc643SArtur Pilipenko // For sle condition the widened condition is: 152*8aadc643SArtur Pilipenko // guardStart u< guardLimit && 153*8aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart s> latchLimit 154889dc1e3SArtur Pilipenko // 1558fb3d57eSArtur Pilipenko //===----------------------------------------------------------------------===// 1568fb3d57eSArtur Pilipenko 1578fb3d57eSArtur Pilipenko #include "llvm/Transforms/Scalar/LoopPredication.h" 1588fb3d57eSArtur Pilipenko #include "llvm/Analysis/LoopInfo.h" 1598fb3d57eSArtur Pilipenko #include "llvm/Analysis/LoopPass.h" 1608fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolution.h" 1618fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolutionExpander.h" 1628fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolutionExpressions.h" 1638fb3d57eSArtur Pilipenko #include "llvm/IR/Function.h" 1648fb3d57eSArtur Pilipenko #include "llvm/IR/GlobalValue.h" 1658fb3d57eSArtur Pilipenko #include "llvm/IR/IntrinsicInst.h" 1668fb3d57eSArtur Pilipenko #include "llvm/IR/Module.h" 1678fb3d57eSArtur Pilipenko #include "llvm/IR/PatternMatch.h" 1686bda14b3SChandler Carruth #include "llvm/Pass.h" 1698fb3d57eSArtur Pilipenko #include "llvm/Support/Debug.h" 1708fb3d57eSArtur Pilipenko #include "llvm/Transforms/Scalar.h" 1718fb3d57eSArtur Pilipenko #include "llvm/Transforms/Utils/LoopUtils.h" 1728fb3d57eSArtur Pilipenko 1738fb3d57eSArtur Pilipenko #define DEBUG_TYPE "loop-predication" 1748fb3d57eSArtur Pilipenko 1758fb3d57eSArtur Pilipenko using namespace llvm; 1768fb3d57eSArtur Pilipenko 1778fb3d57eSArtur Pilipenko namespace { 1788fb3d57eSArtur Pilipenko class LoopPredication { 179a6c27804SArtur Pilipenko /// Represents an induction variable check: 180a6c27804SArtur Pilipenko /// icmp Pred, <induction variable>, <loop invariant limit> 181a6c27804SArtur Pilipenko struct LoopICmp { 182a6c27804SArtur Pilipenko ICmpInst::Predicate Pred; 183a6c27804SArtur Pilipenko const SCEVAddRecExpr *IV; 184a6c27804SArtur Pilipenko const SCEV *Limit; 185c488dfabSArtur Pilipenko LoopICmp(ICmpInst::Predicate Pred, const SCEVAddRecExpr *IV, 186c488dfabSArtur Pilipenko const SCEV *Limit) 187a6c27804SArtur Pilipenko : Pred(Pred), IV(IV), Limit(Limit) {} 188a6c27804SArtur Pilipenko LoopICmp() {} 189a6c27804SArtur Pilipenko }; 190c488dfabSArtur Pilipenko 191c488dfabSArtur Pilipenko ScalarEvolution *SE; 192c488dfabSArtur Pilipenko 193c488dfabSArtur Pilipenko Loop *L; 194c488dfabSArtur Pilipenko const DataLayout *DL; 195c488dfabSArtur Pilipenko BasicBlock *Preheader; 196889dc1e3SArtur Pilipenko LoopICmp LatchCheck; 197c488dfabSArtur Pilipenko 198889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopICmp(ICmpInst *ICI) { 199889dc1e3SArtur Pilipenko return parseLoopICmp(ICI->getPredicate(), ICI->getOperand(0), 200889dc1e3SArtur Pilipenko ICI->getOperand(1)); 201889dc1e3SArtur Pilipenko } 202889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopICmp(ICmpInst::Predicate Pred, Value *LHS, 203889dc1e3SArtur Pilipenko Value *RHS); 204889dc1e3SArtur Pilipenko 205889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopLatchICmp(); 206a6c27804SArtur Pilipenko 2076780ba65SArtur Pilipenko Value *expandCheck(SCEVExpander &Expander, IRBuilder<> &Builder, 2086780ba65SArtur Pilipenko ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS, 2096780ba65SArtur Pilipenko Instruction *InsertAt); 2106780ba65SArtur Pilipenko 2118fb3d57eSArtur Pilipenko Optional<Value *> widenICmpRangeCheck(ICmpInst *ICI, SCEVExpander &Expander, 2128fb3d57eSArtur Pilipenko IRBuilder<> &Builder); 2138fb3d57eSArtur Pilipenko bool widenGuardConditions(IntrinsicInst *II, SCEVExpander &Expander); 2148fb3d57eSArtur Pilipenko 2158fb3d57eSArtur Pilipenko public: 2168fb3d57eSArtur Pilipenko LoopPredication(ScalarEvolution *SE) : SE(SE){}; 2178fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L); 2188fb3d57eSArtur Pilipenko }; 2198fb3d57eSArtur Pilipenko 2208fb3d57eSArtur Pilipenko class LoopPredicationLegacyPass : public LoopPass { 2218fb3d57eSArtur Pilipenko public: 2228fb3d57eSArtur Pilipenko static char ID; 2238fb3d57eSArtur Pilipenko LoopPredicationLegacyPass() : LoopPass(ID) { 2248fb3d57eSArtur Pilipenko initializeLoopPredicationLegacyPassPass(*PassRegistry::getPassRegistry()); 2258fb3d57eSArtur Pilipenko } 2268fb3d57eSArtur Pilipenko 2278fb3d57eSArtur Pilipenko void getAnalysisUsage(AnalysisUsage &AU) const override { 2288fb3d57eSArtur Pilipenko getLoopAnalysisUsage(AU); 2298fb3d57eSArtur Pilipenko } 2308fb3d57eSArtur Pilipenko 2318fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L, LPPassManager &LPM) override { 2328fb3d57eSArtur Pilipenko if (skipLoop(L)) 2338fb3d57eSArtur Pilipenko return false; 2348fb3d57eSArtur Pilipenko auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); 2358fb3d57eSArtur Pilipenko LoopPredication LP(SE); 2368fb3d57eSArtur Pilipenko return LP.runOnLoop(L); 2378fb3d57eSArtur Pilipenko } 2388fb3d57eSArtur Pilipenko }; 2398fb3d57eSArtur Pilipenko 2408fb3d57eSArtur Pilipenko char LoopPredicationLegacyPass::ID = 0; 2418fb3d57eSArtur Pilipenko } // end namespace llvm 2428fb3d57eSArtur Pilipenko 2438fb3d57eSArtur Pilipenko INITIALIZE_PASS_BEGIN(LoopPredicationLegacyPass, "loop-predication", 2448fb3d57eSArtur Pilipenko "Loop predication", false, false) 2458fb3d57eSArtur Pilipenko INITIALIZE_PASS_DEPENDENCY(LoopPass) 2468fb3d57eSArtur Pilipenko INITIALIZE_PASS_END(LoopPredicationLegacyPass, "loop-predication", 2478fb3d57eSArtur Pilipenko "Loop predication", false, false) 2488fb3d57eSArtur Pilipenko 2498fb3d57eSArtur Pilipenko Pass *llvm::createLoopPredicationPass() { 2508fb3d57eSArtur Pilipenko return new LoopPredicationLegacyPass(); 2518fb3d57eSArtur Pilipenko } 2528fb3d57eSArtur Pilipenko 2538fb3d57eSArtur Pilipenko PreservedAnalyses LoopPredicationPass::run(Loop &L, LoopAnalysisManager &AM, 2548fb3d57eSArtur Pilipenko LoopStandardAnalysisResults &AR, 2558fb3d57eSArtur Pilipenko LPMUpdater &U) { 2568fb3d57eSArtur Pilipenko LoopPredication LP(&AR.SE); 2578fb3d57eSArtur Pilipenko if (!LP.runOnLoop(&L)) 2588fb3d57eSArtur Pilipenko return PreservedAnalyses::all(); 2598fb3d57eSArtur Pilipenko 2608fb3d57eSArtur Pilipenko return getLoopPassPreservedAnalyses(); 2618fb3d57eSArtur Pilipenko } 2628fb3d57eSArtur Pilipenko 263a6c27804SArtur Pilipenko Optional<LoopPredication::LoopICmp> 264889dc1e3SArtur Pilipenko LoopPredication::parseLoopICmp(ICmpInst::Predicate Pred, Value *LHS, 265889dc1e3SArtur Pilipenko Value *RHS) { 266a6c27804SArtur Pilipenko const SCEV *LHSS = SE->getSCEV(LHS); 267a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(LHSS)) 268a6c27804SArtur Pilipenko return None; 269a6c27804SArtur Pilipenko const SCEV *RHSS = SE->getSCEV(RHS); 270a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(RHSS)) 271a6c27804SArtur Pilipenko return None; 272a6c27804SArtur Pilipenko 273a6c27804SArtur Pilipenko // Canonicalize RHS to be loop invariant bound, LHS - a loop computable IV 274a6c27804SArtur Pilipenko if (SE->isLoopInvariant(LHSS, L)) { 275a6c27804SArtur Pilipenko std::swap(LHS, RHS); 276a6c27804SArtur Pilipenko std::swap(LHSS, RHSS); 277a6c27804SArtur Pilipenko Pred = ICmpInst::getSwappedPredicate(Pred); 278a6c27804SArtur Pilipenko } 279a6c27804SArtur Pilipenko 280a6c27804SArtur Pilipenko const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(LHSS); 281a6c27804SArtur Pilipenko if (!AR || AR->getLoop() != L) 282a6c27804SArtur Pilipenko return None; 283a6c27804SArtur Pilipenko 284a6c27804SArtur Pilipenko return LoopICmp(Pred, AR, RHSS); 285a6c27804SArtur Pilipenko } 286a6c27804SArtur Pilipenko 2876780ba65SArtur Pilipenko Value *LoopPredication::expandCheck(SCEVExpander &Expander, 2886780ba65SArtur Pilipenko IRBuilder<> &Builder, 2896780ba65SArtur Pilipenko ICmpInst::Predicate Pred, const SCEV *LHS, 2906780ba65SArtur Pilipenko const SCEV *RHS, Instruction *InsertAt) { 291889dc1e3SArtur Pilipenko // TODO: we can check isLoopEntryGuardedByCond before emitting the check 292889dc1e3SArtur Pilipenko 2936780ba65SArtur Pilipenko Type *Ty = LHS->getType(); 2946780ba65SArtur Pilipenko assert(Ty == RHS->getType() && "expandCheck operands have different types?"); 295ead69ee4SArtur Pilipenko 296ead69ee4SArtur Pilipenko if (SE->isLoopEntryGuardedByCond(L, Pred, LHS, RHS)) 297ead69ee4SArtur Pilipenko return Builder.getTrue(); 298ead69ee4SArtur Pilipenko 2996780ba65SArtur Pilipenko Value *LHSV = Expander.expandCodeFor(LHS, Ty, InsertAt); 3006780ba65SArtur Pilipenko Value *RHSV = Expander.expandCodeFor(RHS, Ty, InsertAt); 3016780ba65SArtur Pilipenko return Builder.CreateICmp(Pred, LHSV, RHSV); 3026780ba65SArtur Pilipenko } 3036780ba65SArtur Pilipenko 3048fb3d57eSArtur Pilipenko /// If ICI can be widened to a loop invariant condition emits the loop 3058fb3d57eSArtur Pilipenko /// invariant condition in the loop preheader and return it, otherwise 3068fb3d57eSArtur Pilipenko /// returns None. 3078fb3d57eSArtur Pilipenko Optional<Value *> LoopPredication::widenICmpRangeCheck(ICmpInst *ICI, 3088fb3d57eSArtur Pilipenko SCEVExpander &Expander, 3098fb3d57eSArtur Pilipenko IRBuilder<> &Builder) { 3108fb3d57eSArtur Pilipenko DEBUG(dbgs() << "Analyzing ICmpInst condition:\n"); 3118fb3d57eSArtur Pilipenko DEBUG(ICI->dump()); 3128fb3d57eSArtur Pilipenko 313889dc1e3SArtur Pilipenko // parseLoopStructure guarantees that the latch condition is: 314b4527e1cSArtur Pilipenko // ++i <pred> latchLimit, where <pred> is u<, u<=, s<, or s<=. 315889dc1e3SArtur Pilipenko // We are looking for the range checks of the form: 316889dc1e3SArtur Pilipenko // i u< guardLimit 317a6c27804SArtur Pilipenko auto RangeCheck = parseLoopICmp(ICI); 318edee2515SArtur Pilipenko if (!RangeCheck) { 319edee2515SArtur Pilipenko DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 3208fb3d57eSArtur Pilipenko return None; 321edee2515SArtur Pilipenko } 322889dc1e3SArtur Pilipenko if (RangeCheck->Pred != ICmpInst::ICMP_ULT) { 323889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Unsupported range check predicate(" << RangeCheck->Pred 324889dc1e3SArtur Pilipenko << ")!\n"); 325889dc1e3SArtur Pilipenko return None; 326889dc1e3SArtur Pilipenko } 327889dc1e3SArtur Pilipenko auto *RangeCheckIV = RangeCheck->IV; 328*8aadc643SArtur Pilipenko auto *Ty = RangeCheckIV->getType(); 329*8aadc643SArtur Pilipenko if (Ty != LatchCheck.IV->getType()) { 330*8aadc643SArtur Pilipenko DEBUG(dbgs() << "Type mismatch between range check and latch IVs!\n"); 331889dc1e3SArtur Pilipenko return None; 332889dc1e3SArtur Pilipenko } 333*8aadc643SArtur Pilipenko if (!RangeCheckIV->isAffine()) { 334*8aadc643SArtur Pilipenko DEBUG(dbgs() << "Range check IV is not affine!\n"); 335*8aadc643SArtur Pilipenko return None; 336*8aadc643SArtur Pilipenko } 337*8aadc643SArtur Pilipenko auto *Step = RangeCheckIV->getStepRecurrence(*SE); 338*8aadc643SArtur Pilipenko if (Step != LatchCheck.IV->getStepRecurrence(*SE)) { 339*8aadc643SArtur Pilipenko DEBUG(dbgs() << "Range check and latch have IVs different steps!\n"); 340*8aadc643SArtur Pilipenko return None; 341*8aadc643SArtur Pilipenko } 342*8aadc643SArtur Pilipenko assert(Step->isOne() && "must be one"); 3438fb3d57eSArtur Pilipenko 344b4527e1cSArtur Pilipenko // Generate the widened condition: 345*8aadc643SArtur Pilipenko // guardStart u< guardLimit && 346*8aadc643SArtur Pilipenko // latchLimit <pred> guardLimit - 1 - guardStart + latchStart 347b4527e1cSArtur Pilipenko // where <pred> depends on the latch condition predicate. See the file 348b4527e1cSArtur Pilipenko // header comment for the reasoning. 349*8aadc643SArtur Pilipenko const SCEV *GuardStart = RangeCheckIV->getStart(); 350*8aadc643SArtur Pilipenko const SCEV *GuardLimit = RangeCheck->Limit; 351*8aadc643SArtur Pilipenko const SCEV *LatchStart = LatchCheck.IV->getStart(); 352*8aadc643SArtur Pilipenko const SCEV *LatchLimit = LatchCheck.Limit; 353*8aadc643SArtur Pilipenko 354*8aadc643SArtur Pilipenko // guardLimit - guardStart + latchStart - 1 355*8aadc643SArtur Pilipenko const SCEV *RHS = 356*8aadc643SArtur Pilipenko SE->getAddExpr(SE->getMinusSCEV(GuardLimit, GuardStart), 357*8aadc643SArtur Pilipenko SE->getMinusSCEV(LatchStart, SE->getOne(Ty))); 358*8aadc643SArtur Pilipenko 359b4527e1cSArtur Pilipenko ICmpInst::Predicate LimitCheckPred; 360b4527e1cSArtur Pilipenko switch (LatchCheck.Pred) { 361b4527e1cSArtur Pilipenko case ICmpInst::ICMP_ULT: 362b4527e1cSArtur Pilipenko LimitCheckPred = ICmpInst::ICMP_ULE; 363b4527e1cSArtur Pilipenko break; 364b4527e1cSArtur Pilipenko case ICmpInst::ICMP_ULE: 365b4527e1cSArtur Pilipenko LimitCheckPred = ICmpInst::ICMP_ULT; 366b4527e1cSArtur Pilipenko break; 367b4527e1cSArtur Pilipenko case ICmpInst::ICMP_SLT: 368b4527e1cSArtur Pilipenko LimitCheckPred = ICmpInst::ICMP_SLE; 369b4527e1cSArtur Pilipenko break; 370b4527e1cSArtur Pilipenko case ICmpInst::ICMP_SLE: 371b4527e1cSArtur Pilipenko LimitCheckPred = ICmpInst::ICMP_SLT; 372b4527e1cSArtur Pilipenko break; 373b4527e1cSArtur Pilipenko default: 374b4527e1cSArtur Pilipenko llvm_unreachable("Unsupported loop latch!"); 375b4527e1cSArtur Pilipenko } 376aab28666SArtur Pilipenko 377*8aadc643SArtur Pilipenko DEBUG(dbgs() << "LHS: " << *LatchLimit << "\n"); 378*8aadc643SArtur Pilipenko DEBUG(dbgs() << "RHS: " << *RHS << "\n"); 379*8aadc643SArtur Pilipenko DEBUG(dbgs() << "Pred: " << LimitCheckPred << "\n"); 380*8aadc643SArtur Pilipenko 381aab28666SArtur Pilipenko auto CanExpand = [this](const SCEV *S) { 382aab28666SArtur Pilipenko return SE->isLoopInvariant(S, L) && isSafeToExpand(S, *SE); 383aab28666SArtur Pilipenko }; 384*8aadc643SArtur Pilipenko if (!CanExpand(GuardStart) || !CanExpand(GuardLimit) || 385*8aadc643SArtur Pilipenko !CanExpand(LatchLimit) || !CanExpand(RHS)) { 386*8aadc643SArtur Pilipenko DEBUG(dbgs() << "Can't expand limit check!\n"); 3878fb3d57eSArtur Pilipenko return None; 388*8aadc643SArtur Pilipenko } 3898fb3d57eSArtur Pilipenko 3900860bfc6SArtur Pilipenko Instruction *InsertAt = Preheader->getTerminator(); 391*8aadc643SArtur Pilipenko auto *LimitCheck = 392*8aadc643SArtur Pilipenko expandCheck(Expander, Builder, LimitCheckPred, LatchLimit, RHS, InsertAt); 393ead69ee4SArtur Pilipenko auto *FirstIterationCheck = expandCheck(Expander, Builder, RangeCheck->Pred, 394*8aadc643SArtur Pilipenko GuardStart, GuardLimit, InsertAt); 395889dc1e3SArtur Pilipenko return Builder.CreateAnd(FirstIterationCheck, LimitCheck); 3968fb3d57eSArtur Pilipenko } 3978fb3d57eSArtur Pilipenko 3988fb3d57eSArtur Pilipenko bool LoopPredication::widenGuardConditions(IntrinsicInst *Guard, 3998fb3d57eSArtur Pilipenko SCEVExpander &Expander) { 4008fb3d57eSArtur Pilipenko DEBUG(dbgs() << "Processing guard:\n"); 4018fb3d57eSArtur Pilipenko DEBUG(Guard->dump()); 4028fb3d57eSArtur Pilipenko 4038fb3d57eSArtur Pilipenko IRBuilder<> Builder(cast<Instruction>(Preheader->getTerminator())); 4048fb3d57eSArtur Pilipenko 4058fb3d57eSArtur Pilipenko // The guard condition is expected to be in form of: 4068fb3d57eSArtur Pilipenko // cond1 && cond2 && cond3 ... 4078fb3d57eSArtur Pilipenko // Iterate over subconditions looking for for icmp conditions which can be 4088fb3d57eSArtur Pilipenko // widened across loop iterations. Widening these conditions remember the 4098fb3d57eSArtur Pilipenko // resulting list of subconditions in Checks vector. 4108fb3d57eSArtur Pilipenko SmallVector<Value *, 4> Worklist(1, Guard->getOperand(0)); 4118fb3d57eSArtur Pilipenko SmallPtrSet<Value *, 4> Visited; 4128fb3d57eSArtur Pilipenko 4138fb3d57eSArtur Pilipenko SmallVector<Value *, 4> Checks; 4148fb3d57eSArtur Pilipenko 4158fb3d57eSArtur Pilipenko unsigned NumWidened = 0; 4168fb3d57eSArtur Pilipenko do { 4178fb3d57eSArtur Pilipenko Value *Condition = Worklist.pop_back_val(); 4188fb3d57eSArtur Pilipenko if (!Visited.insert(Condition).second) 4198fb3d57eSArtur Pilipenko continue; 4208fb3d57eSArtur Pilipenko 4218fb3d57eSArtur Pilipenko Value *LHS, *RHS; 4228fb3d57eSArtur Pilipenko using namespace llvm::PatternMatch; 4238fb3d57eSArtur Pilipenko if (match(Condition, m_And(m_Value(LHS), m_Value(RHS)))) { 4248fb3d57eSArtur Pilipenko Worklist.push_back(LHS); 4258fb3d57eSArtur Pilipenko Worklist.push_back(RHS); 4268fb3d57eSArtur Pilipenko continue; 4278fb3d57eSArtur Pilipenko } 4288fb3d57eSArtur Pilipenko 4298fb3d57eSArtur Pilipenko if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) { 4308fb3d57eSArtur Pilipenko if (auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander, Builder)) { 4318fb3d57eSArtur Pilipenko Checks.push_back(NewRangeCheck.getValue()); 4328fb3d57eSArtur Pilipenko NumWidened++; 4338fb3d57eSArtur Pilipenko continue; 4348fb3d57eSArtur Pilipenko } 4358fb3d57eSArtur Pilipenko } 4368fb3d57eSArtur Pilipenko 4378fb3d57eSArtur Pilipenko // Save the condition as is if we can't widen it 4388fb3d57eSArtur Pilipenko Checks.push_back(Condition); 4398fb3d57eSArtur Pilipenko } while (Worklist.size() != 0); 4408fb3d57eSArtur Pilipenko 4418fb3d57eSArtur Pilipenko if (NumWidened == 0) 4428fb3d57eSArtur Pilipenko return false; 4438fb3d57eSArtur Pilipenko 4448fb3d57eSArtur Pilipenko // Emit the new guard condition 4458fb3d57eSArtur Pilipenko Builder.SetInsertPoint(Guard); 4468fb3d57eSArtur Pilipenko Value *LastCheck = nullptr; 4478fb3d57eSArtur Pilipenko for (auto *Check : Checks) 4488fb3d57eSArtur Pilipenko if (!LastCheck) 4498fb3d57eSArtur Pilipenko LastCheck = Check; 4508fb3d57eSArtur Pilipenko else 4518fb3d57eSArtur Pilipenko LastCheck = Builder.CreateAnd(LastCheck, Check); 4528fb3d57eSArtur Pilipenko Guard->setOperand(0, LastCheck); 4538fb3d57eSArtur Pilipenko 4548fb3d57eSArtur Pilipenko DEBUG(dbgs() << "Widened checks = " << NumWidened << "\n"); 4558fb3d57eSArtur Pilipenko return true; 4568fb3d57eSArtur Pilipenko } 4578fb3d57eSArtur Pilipenko 458889dc1e3SArtur Pilipenko Optional<LoopPredication::LoopICmp> LoopPredication::parseLoopLatchICmp() { 459889dc1e3SArtur Pilipenko using namespace PatternMatch; 460889dc1e3SArtur Pilipenko 461889dc1e3SArtur Pilipenko BasicBlock *LoopLatch = L->getLoopLatch(); 462889dc1e3SArtur Pilipenko if (!LoopLatch) { 463889dc1e3SArtur Pilipenko DEBUG(dbgs() << "The loop doesn't have a single latch!\n"); 464889dc1e3SArtur Pilipenko return None; 465889dc1e3SArtur Pilipenko } 466889dc1e3SArtur Pilipenko 467889dc1e3SArtur Pilipenko ICmpInst::Predicate Pred; 468889dc1e3SArtur Pilipenko Value *LHS, *RHS; 469889dc1e3SArtur Pilipenko BasicBlock *TrueDest, *FalseDest; 470889dc1e3SArtur Pilipenko 471889dc1e3SArtur Pilipenko if (!match(LoopLatch->getTerminator(), 472889dc1e3SArtur Pilipenko m_Br(m_ICmp(Pred, m_Value(LHS), m_Value(RHS)), TrueDest, 473889dc1e3SArtur Pilipenko FalseDest))) { 474889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Failed to match the latch terminator!\n"); 475889dc1e3SArtur Pilipenko return None; 476889dc1e3SArtur Pilipenko } 477889dc1e3SArtur Pilipenko assert((TrueDest == L->getHeader() || FalseDest == L->getHeader()) && 478889dc1e3SArtur Pilipenko "One of the latch's destinations must be the header"); 479889dc1e3SArtur Pilipenko if (TrueDest != L->getHeader()) 480889dc1e3SArtur Pilipenko Pred = ICmpInst::getInversePredicate(Pred); 481889dc1e3SArtur Pilipenko 482889dc1e3SArtur Pilipenko auto Result = parseLoopICmp(Pred, LHS, RHS); 483889dc1e3SArtur Pilipenko if (!Result) { 484889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 485889dc1e3SArtur Pilipenko return None; 486889dc1e3SArtur Pilipenko } 487889dc1e3SArtur Pilipenko 488889dc1e3SArtur Pilipenko if (Result->Pred != ICmpInst::ICMP_ULT && 489b4527e1cSArtur Pilipenko Result->Pred != ICmpInst::ICMP_SLT && 490b4527e1cSArtur Pilipenko Result->Pred != ICmpInst::ICMP_ULE && 491b4527e1cSArtur Pilipenko Result->Pred != ICmpInst::ICMP_SLE) { 492889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Unsupported loop latch predicate(" << Result->Pred 493889dc1e3SArtur Pilipenko << ")!\n"); 494889dc1e3SArtur Pilipenko return None; 495889dc1e3SArtur Pilipenko } 496889dc1e3SArtur Pilipenko 497889dc1e3SArtur Pilipenko // Check affine first, so if it's not we don't try to compute the step 498889dc1e3SArtur Pilipenko // recurrence. 499889dc1e3SArtur Pilipenko if (!Result->IV->isAffine()) { 500889dc1e3SArtur Pilipenko DEBUG(dbgs() << "The induction variable is not affine!\n"); 501889dc1e3SArtur Pilipenko return None; 502889dc1e3SArtur Pilipenko } 503889dc1e3SArtur Pilipenko 504889dc1e3SArtur Pilipenko auto *Step = Result->IV->getStepRecurrence(*SE); 505889dc1e3SArtur Pilipenko if (!Step->isOne()) { 506889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Unsupported loop stride(" << *Step << ")!\n"); 507889dc1e3SArtur Pilipenko return None; 508889dc1e3SArtur Pilipenko } 509889dc1e3SArtur Pilipenko 510889dc1e3SArtur Pilipenko return Result; 511889dc1e3SArtur Pilipenko } 512889dc1e3SArtur Pilipenko 5138fb3d57eSArtur Pilipenko bool LoopPredication::runOnLoop(Loop *Loop) { 5148fb3d57eSArtur Pilipenko L = Loop; 5158fb3d57eSArtur Pilipenko 5168fb3d57eSArtur Pilipenko DEBUG(dbgs() << "Analyzing "); 5178fb3d57eSArtur Pilipenko DEBUG(L->dump()); 5188fb3d57eSArtur Pilipenko 5198fb3d57eSArtur Pilipenko Module *M = L->getHeader()->getModule(); 5208fb3d57eSArtur Pilipenko 5218fb3d57eSArtur Pilipenko // There is nothing to do if the module doesn't use guards 5228fb3d57eSArtur Pilipenko auto *GuardDecl = 5238fb3d57eSArtur Pilipenko M->getFunction(Intrinsic::getName(Intrinsic::experimental_guard)); 5248fb3d57eSArtur Pilipenko if (!GuardDecl || GuardDecl->use_empty()) 5258fb3d57eSArtur Pilipenko return false; 5268fb3d57eSArtur Pilipenko 5278fb3d57eSArtur Pilipenko DL = &M->getDataLayout(); 5288fb3d57eSArtur Pilipenko 5298fb3d57eSArtur Pilipenko Preheader = L->getLoopPreheader(); 5308fb3d57eSArtur Pilipenko if (!Preheader) 5318fb3d57eSArtur Pilipenko return false; 5328fb3d57eSArtur Pilipenko 533889dc1e3SArtur Pilipenko auto LatchCheckOpt = parseLoopLatchICmp(); 534889dc1e3SArtur Pilipenko if (!LatchCheckOpt) 535889dc1e3SArtur Pilipenko return false; 536889dc1e3SArtur Pilipenko LatchCheck = *LatchCheckOpt; 537889dc1e3SArtur Pilipenko 5388fb3d57eSArtur Pilipenko // Collect all the guards into a vector and process later, so as not 5398fb3d57eSArtur Pilipenko // to invalidate the instruction iterator. 5408fb3d57eSArtur Pilipenko SmallVector<IntrinsicInst *, 4> Guards; 5418fb3d57eSArtur Pilipenko for (const auto BB : L->blocks()) 5428fb3d57eSArtur Pilipenko for (auto &I : *BB) 5438fb3d57eSArtur Pilipenko if (auto *II = dyn_cast<IntrinsicInst>(&I)) 5448fb3d57eSArtur Pilipenko if (II->getIntrinsicID() == Intrinsic::experimental_guard) 5458fb3d57eSArtur Pilipenko Guards.push_back(II); 5468fb3d57eSArtur Pilipenko 54746c4e0a4SArtur Pilipenko if (Guards.empty()) 54846c4e0a4SArtur Pilipenko return false; 54946c4e0a4SArtur Pilipenko 5508fb3d57eSArtur Pilipenko SCEVExpander Expander(*SE, *DL, "loop-predication"); 5518fb3d57eSArtur Pilipenko 5528fb3d57eSArtur Pilipenko bool Changed = false; 5538fb3d57eSArtur Pilipenko for (auto *Guard : Guards) 5548fb3d57eSArtur Pilipenko Changed |= widenGuardConditions(Guard, Expander); 5558fb3d57eSArtur Pilipenko 5568fb3d57eSArtur Pilipenko return Changed; 5578fb3d57eSArtur Pilipenko } 558