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 // 568aadc643SArtur Pilipenko // if (B(0)) { 57889dc1e3SArtur Pilipenko // do { 588aadc643SArtur Pilipenko // I = PHI(0, I.INC) 59889dc1e3SArtur Pilipenko // I.INC = I + Step 60889dc1e3SArtur Pilipenko // guard(G(I)); 618aadc643SArtur 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 // 688aadc643SArtur Pilipenko // if (B(0)) { 69889dc1e3SArtur Pilipenko // do { 708aadc643SArtur Pilipenko // I = PHI(0, I.INC) 71889dc1e3SArtur Pilipenko // I.INC = I + Step 728aadc643SArtur Pilipenko // guard(G(0) && M); 738aadc643SArtur Pilipenko // } while (B(I)); 74889dc1e3SArtur Pilipenko // } 75889dc1e3SArtur Pilipenko // 768aadc643SArtur 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: 818aadc643SArtur Pilipenko // G(I) && G(0) && M 82889dc1e3SArtur Pilipenko // 83889dc1e3SArtur Pilipenko // Let's prove that for each iteration of the loop: 848aadc643SArtur 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. 888aadc643SArtur Pilipenko // G(0) && M => G(0) 89889dc1e3SArtur Pilipenko // 908aadc643SArtur Pilipenko // Induction step. Assuming G(0) && M => G(I) on the subsequent 91889dc1e3SArtur Pilipenko // iteration: 92889dc1e3SArtur Pilipenko // 938aadc643SArtur 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 // 968aadc643SArtur 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 // 1017b360434SAnna Thomas // When S = 1 (i.e. forward iterating loop), the transformation is supported 1027b360434SAnna Thomas // when: 103b4527e1cSArtur Pilipenko // * The loop has a single latch with the condition of the form: 1048aadc643SArtur Pilipenko // B(X) = latchStart + X <pred> latchLimit, 1058aadc643SArtur Pilipenko // where <pred> is u<, u<=, s<, or s<=. 1068aadc643SArtur Pilipenko // * The guard condition is of the form 1078aadc643SArtur Pilipenko // G(X) = guardStart + X u< guardLimit 108889dc1e3SArtur Pilipenko // 109b4527e1cSArtur Pilipenko // For the ult latch comparison case M is: 1108aadc643SArtur Pilipenko // forall X . guardStart + X u< guardLimit && latchStart + X <u latchLimit => 1118aadc643SArtur 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 1158aadc643SArtur Pilipenko // X == guardLimit - 1 - guardStart 116889dc1e3SArtur Pilipenko // (and guardLimit is non-zero, but we won't use this latter fact). 1178aadc643SArtur Pilipenko // If X == guardLimit - 1 - guardStart then the second half of the antecedent is 1188aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u< latchLimit 119889dc1e3SArtur Pilipenko // and its negation is 1208aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u>= latchLimit 121889dc1e3SArtur Pilipenko // 1228aadc643SArtur Pilipenko // In other words, if 1238aadc643SArtur Pilipenko // latchLimit u<= latchStart + guardLimit - 1 - guardStart 1248aadc643SArtur 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 // 1288aadc643SArtur Pilipenko // forall X . guardStart + X u< guardLimit && 1298aadc643SArtur Pilipenko // latchStart + X u< latchLimit => 1308aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 1318aadc643SArtur Pilipenko // == forall X . guardStart + X u< guardLimit && 1328aadc643SArtur Pilipenko // latchStart + X u< latchStart + guardLimit - 1 - guardStart => 1338aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 1348aadc643SArtur Pilipenko // == forall X . (guardStart + X) in [0, guardLimit) && 1358aadc643SArtur Pilipenko // (latchStart + X) in [0, latchStart + guardLimit - 1 - guardStart) => 1368aadc643SArtur Pilipenko // (guardStart + X + 1) in [0, guardLimit) 1378aadc643SArtur Pilipenko // == forall X . X in [-guardStart, guardLimit - guardStart) && 1388aadc643SArtur Pilipenko // X in [-latchStart, guardLimit - 1 - guardStart) => 1398aadc643SArtur Pilipenko // X in [-guardStart - 1, guardLimit - guardStart - 1) 140889dc1e3SArtur Pilipenko // == true 141889dc1e3SArtur Pilipenko // 142889dc1e3SArtur Pilipenko // So the widened condition is: 1438aadc643SArtur Pilipenko // guardStart u< guardLimit && 1448aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u>= latchLimit 1458aadc643SArtur Pilipenko // Similarly for ule condition the widened condition is: 1468aadc643SArtur Pilipenko // guardStart u< guardLimit && 1478aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u> latchLimit 1488aadc643SArtur Pilipenko // For slt condition the widened condition is: 1498aadc643SArtur Pilipenko // guardStart u< guardLimit && 1508aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart s>= latchLimit 1518aadc643SArtur Pilipenko // For sle condition the widened condition is: 1528aadc643SArtur Pilipenko // guardStart u< guardLimit && 1538aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart s> latchLimit 154889dc1e3SArtur Pilipenko // 1557b360434SAnna Thomas // When S = -1 (i.e. reverse iterating loop), the transformation is supported 1567b360434SAnna Thomas // when: 1577b360434SAnna Thomas // * The loop has a single latch with the condition of the form: 158*c8016e7aSSerguei Katkov // B(X) = X <pred> latchLimit, where <pred> is u>, u>=, s>, or s>=. 1597b360434SAnna Thomas // * The guard condition is of the form 1607b360434SAnna Thomas // G(X) = X - 1 u< guardLimit 1617b360434SAnna Thomas // 1627b360434SAnna Thomas // For the ugt latch comparison case M is: 1637b360434SAnna Thomas // forall X. X-1 u< guardLimit and X u> latchLimit => X-2 u< guardLimit 1647b360434SAnna Thomas // 1657b360434SAnna Thomas // The only way the antecedent can be true and the consequent can be false is if 1667b360434SAnna Thomas // X == 1. 1677b360434SAnna Thomas // If X == 1 then the second half of the antecedent is 1687b360434SAnna Thomas // 1 u> latchLimit, and its negation is latchLimit u>= 1. 1697b360434SAnna Thomas // 1707b360434SAnna Thomas // So the widened condition is: 1717b360434SAnna Thomas // guardStart u< guardLimit && latchLimit u>= 1. 1727b360434SAnna Thomas // Similarly for sgt condition the widened condition is: 1737b360434SAnna Thomas // guardStart u< guardLimit && latchLimit s>= 1. 174*c8016e7aSSerguei Katkov // For uge condition the widened condition is: 175*c8016e7aSSerguei Katkov // guardStart u< guardLimit && latchLimit u> 1. 176*c8016e7aSSerguei Katkov // For sge condition the widened condition is: 177*c8016e7aSSerguei Katkov // guardStart u< guardLimit && latchLimit s> 1. 1788fb3d57eSArtur Pilipenko //===----------------------------------------------------------------------===// 1798fb3d57eSArtur Pilipenko 1808fb3d57eSArtur Pilipenko #include "llvm/Transforms/Scalar/LoopPredication.h" 1818fb3d57eSArtur Pilipenko #include "llvm/Analysis/LoopInfo.h" 1828fb3d57eSArtur Pilipenko #include "llvm/Analysis/LoopPass.h" 1838fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolution.h" 1848fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolutionExpander.h" 1858fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolutionExpressions.h" 1868fb3d57eSArtur Pilipenko #include "llvm/IR/Function.h" 1878fb3d57eSArtur Pilipenko #include "llvm/IR/GlobalValue.h" 1888fb3d57eSArtur Pilipenko #include "llvm/IR/IntrinsicInst.h" 1898fb3d57eSArtur Pilipenko #include "llvm/IR/Module.h" 1908fb3d57eSArtur Pilipenko #include "llvm/IR/PatternMatch.h" 1916bda14b3SChandler Carruth #include "llvm/Pass.h" 1928fb3d57eSArtur Pilipenko #include "llvm/Support/Debug.h" 1938fb3d57eSArtur Pilipenko #include "llvm/Transforms/Scalar.h" 1948fb3d57eSArtur Pilipenko #include "llvm/Transforms/Utils/LoopUtils.h" 1958fb3d57eSArtur Pilipenko 1968fb3d57eSArtur Pilipenko #define DEBUG_TYPE "loop-predication" 1978fb3d57eSArtur Pilipenko 1988fb3d57eSArtur Pilipenko using namespace llvm; 1998fb3d57eSArtur Pilipenko 2001d02b13eSAnna Thomas static cl::opt<bool> EnableIVTruncation("loop-predication-enable-iv-truncation", 2011d02b13eSAnna Thomas cl::Hidden, cl::init(true)); 2021d02b13eSAnna Thomas 2037b360434SAnna Thomas static cl::opt<bool> EnableCountDownLoop("loop-predication-enable-count-down-loop", 2047b360434SAnna Thomas cl::Hidden, cl::init(true)); 2058fb3d57eSArtur Pilipenko namespace { 2068fb3d57eSArtur Pilipenko class LoopPredication { 207a6c27804SArtur Pilipenko /// Represents an induction variable check: 208a6c27804SArtur Pilipenko /// icmp Pred, <induction variable>, <loop invariant limit> 209a6c27804SArtur Pilipenko struct LoopICmp { 210a6c27804SArtur Pilipenko ICmpInst::Predicate Pred; 211a6c27804SArtur Pilipenko const SCEVAddRecExpr *IV; 212a6c27804SArtur Pilipenko const SCEV *Limit; 213c488dfabSArtur Pilipenko LoopICmp(ICmpInst::Predicate Pred, const SCEVAddRecExpr *IV, 214c488dfabSArtur Pilipenko const SCEV *Limit) 215a6c27804SArtur Pilipenko : Pred(Pred), IV(IV), Limit(Limit) {} 216a6c27804SArtur Pilipenko LoopICmp() {} 21768797214SAnna Thomas void dump() { 21868797214SAnna Thomas dbgs() << "LoopICmp Pred = " << Pred << ", IV = " << *IV 21968797214SAnna Thomas << ", Limit = " << *Limit << "\n"; 22068797214SAnna Thomas } 221a6c27804SArtur Pilipenko }; 222c488dfabSArtur Pilipenko 223c488dfabSArtur Pilipenko ScalarEvolution *SE; 224c488dfabSArtur Pilipenko 225c488dfabSArtur Pilipenko Loop *L; 226c488dfabSArtur Pilipenko const DataLayout *DL; 227c488dfabSArtur Pilipenko BasicBlock *Preheader; 228889dc1e3SArtur Pilipenko LoopICmp LatchCheck; 229c488dfabSArtur Pilipenko 23068797214SAnna Thomas bool isSupportedStep(const SCEV* Step); 231889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopICmp(ICmpInst *ICI) { 232889dc1e3SArtur Pilipenko return parseLoopICmp(ICI->getPredicate(), ICI->getOperand(0), 233889dc1e3SArtur Pilipenko ICI->getOperand(1)); 234889dc1e3SArtur Pilipenko } 235889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopICmp(ICmpInst::Predicate Pred, Value *LHS, 236889dc1e3SArtur Pilipenko Value *RHS); 237889dc1e3SArtur Pilipenko 238889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopLatchICmp(); 239a6c27804SArtur Pilipenko 24068797214SAnna Thomas bool CanExpand(const SCEV* S); 2416780ba65SArtur Pilipenko Value *expandCheck(SCEVExpander &Expander, IRBuilder<> &Builder, 2426780ba65SArtur Pilipenko ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS, 2436780ba65SArtur Pilipenko Instruction *InsertAt); 2446780ba65SArtur Pilipenko 2458fb3d57eSArtur Pilipenko Optional<Value *> widenICmpRangeCheck(ICmpInst *ICI, SCEVExpander &Expander, 2468fb3d57eSArtur Pilipenko IRBuilder<> &Builder); 24768797214SAnna Thomas Optional<Value *> widenICmpRangeCheckIncrementingLoop(LoopICmp LatchCheck, 24868797214SAnna Thomas LoopICmp RangeCheck, 24968797214SAnna Thomas SCEVExpander &Expander, 25068797214SAnna Thomas IRBuilder<> &Builder); 2517b360434SAnna Thomas Optional<Value *> widenICmpRangeCheckDecrementingLoop(LoopICmp LatchCheck, 2527b360434SAnna Thomas LoopICmp RangeCheck, 2537b360434SAnna Thomas SCEVExpander &Expander, 2547b360434SAnna Thomas IRBuilder<> &Builder); 2558fb3d57eSArtur Pilipenko bool widenGuardConditions(IntrinsicInst *II, SCEVExpander &Expander); 2568fb3d57eSArtur Pilipenko 2571d02b13eSAnna Thomas // When the IV type is wider than the range operand type, we can still do loop 2581d02b13eSAnna Thomas // predication, by generating SCEVs for the range and latch that are of the 2591d02b13eSAnna Thomas // same type. We achieve this by generating a SCEV truncate expression for the 2601d02b13eSAnna Thomas // latch IV. This is done iff truncation of the IV is a safe operation, 2611d02b13eSAnna Thomas // without loss of information. 2621d02b13eSAnna Thomas // Another way to achieve this is by generating a wider type SCEV for the 2631d02b13eSAnna Thomas // range check operand, however, this needs a more involved check that 2641d02b13eSAnna Thomas // operands do not overflow. This can lead to loss of information when the 2651d02b13eSAnna Thomas // range operand is of the form: add i32 %offset, %iv. We need to prove that 2661d02b13eSAnna Thomas // sext(x + y) is same as sext(x) + sext(y). 2671d02b13eSAnna Thomas // This function returns true if we can safely represent the IV type in 2681d02b13eSAnna Thomas // the RangeCheckType without loss of information. 2691d02b13eSAnna Thomas bool isSafeToTruncateWideIVType(Type *RangeCheckType); 2701d02b13eSAnna Thomas // Return the loopLatchCheck corresponding to the RangeCheckType if safe to do 2711d02b13eSAnna Thomas // so. 2721d02b13eSAnna Thomas Optional<LoopICmp> generateLoopLatchCheck(Type *RangeCheckType); 273ebc9031bSSerguei Katkov 274ebc9031bSSerguei Katkov // Returns the latch predicate for guard. SGT -> SGE, UGT -> UGE, SGE -> SGT, 275ebc9031bSSerguei Katkov // UGE -> UGT, etc. 276ebc9031bSSerguei Katkov ICmpInst::Predicate getLatchPredicateForGuard(ICmpInst::Predicate Pred); 277ebc9031bSSerguei Katkov 2788fb3d57eSArtur Pilipenko public: 2798fb3d57eSArtur Pilipenko LoopPredication(ScalarEvolution *SE) : SE(SE){}; 2808fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L); 2818fb3d57eSArtur Pilipenko }; 2828fb3d57eSArtur Pilipenko 2838fb3d57eSArtur Pilipenko class LoopPredicationLegacyPass : public LoopPass { 2848fb3d57eSArtur Pilipenko public: 2858fb3d57eSArtur Pilipenko static char ID; 2868fb3d57eSArtur Pilipenko LoopPredicationLegacyPass() : LoopPass(ID) { 2878fb3d57eSArtur Pilipenko initializeLoopPredicationLegacyPassPass(*PassRegistry::getPassRegistry()); 2888fb3d57eSArtur Pilipenko } 2898fb3d57eSArtur Pilipenko 2908fb3d57eSArtur Pilipenko void getAnalysisUsage(AnalysisUsage &AU) const override { 2918fb3d57eSArtur Pilipenko getLoopAnalysisUsage(AU); 2928fb3d57eSArtur Pilipenko } 2938fb3d57eSArtur Pilipenko 2948fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L, LPPassManager &LPM) override { 2958fb3d57eSArtur Pilipenko if (skipLoop(L)) 2968fb3d57eSArtur Pilipenko return false; 2978fb3d57eSArtur Pilipenko auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); 2988fb3d57eSArtur Pilipenko LoopPredication LP(SE); 2998fb3d57eSArtur Pilipenko return LP.runOnLoop(L); 3008fb3d57eSArtur Pilipenko } 3018fb3d57eSArtur Pilipenko }; 3028fb3d57eSArtur Pilipenko 3038fb3d57eSArtur Pilipenko char LoopPredicationLegacyPass::ID = 0; 3048fb3d57eSArtur Pilipenko } // end namespace llvm 3058fb3d57eSArtur Pilipenko 3068fb3d57eSArtur Pilipenko INITIALIZE_PASS_BEGIN(LoopPredicationLegacyPass, "loop-predication", 3078fb3d57eSArtur Pilipenko "Loop predication", false, false) 3088fb3d57eSArtur Pilipenko INITIALIZE_PASS_DEPENDENCY(LoopPass) 3098fb3d57eSArtur Pilipenko INITIALIZE_PASS_END(LoopPredicationLegacyPass, "loop-predication", 3108fb3d57eSArtur Pilipenko "Loop predication", false, false) 3118fb3d57eSArtur Pilipenko 3128fb3d57eSArtur Pilipenko Pass *llvm::createLoopPredicationPass() { 3138fb3d57eSArtur Pilipenko return new LoopPredicationLegacyPass(); 3148fb3d57eSArtur Pilipenko } 3158fb3d57eSArtur Pilipenko 3168fb3d57eSArtur Pilipenko PreservedAnalyses LoopPredicationPass::run(Loop &L, LoopAnalysisManager &AM, 3178fb3d57eSArtur Pilipenko LoopStandardAnalysisResults &AR, 3188fb3d57eSArtur Pilipenko LPMUpdater &U) { 3198fb3d57eSArtur Pilipenko LoopPredication LP(&AR.SE); 3208fb3d57eSArtur Pilipenko if (!LP.runOnLoop(&L)) 3218fb3d57eSArtur Pilipenko return PreservedAnalyses::all(); 3228fb3d57eSArtur Pilipenko 3238fb3d57eSArtur Pilipenko return getLoopPassPreservedAnalyses(); 3248fb3d57eSArtur Pilipenko } 3258fb3d57eSArtur Pilipenko 326a6c27804SArtur Pilipenko Optional<LoopPredication::LoopICmp> 327889dc1e3SArtur Pilipenko LoopPredication::parseLoopICmp(ICmpInst::Predicate Pred, Value *LHS, 328889dc1e3SArtur Pilipenko Value *RHS) { 329a6c27804SArtur Pilipenko const SCEV *LHSS = SE->getSCEV(LHS); 330a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(LHSS)) 331a6c27804SArtur Pilipenko return None; 332a6c27804SArtur Pilipenko const SCEV *RHSS = SE->getSCEV(RHS); 333a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(RHSS)) 334a6c27804SArtur Pilipenko return None; 335a6c27804SArtur Pilipenko 336a6c27804SArtur Pilipenko // Canonicalize RHS to be loop invariant bound, LHS - a loop computable IV 337a6c27804SArtur Pilipenko if (SE->isLoopInvariant(LHSS, L)) { 338a6c27804SArtur Pilipenko std::swap(LHS, RHS); 339a6c27804SArtur Pilipenko std::swap(LHSS, RHSS); 340a6c27804SArtur Pilipenko Pred = ICmpInst::getSwappedPredicate(Pred); 341a6c27804SArtur Pilipenko } 342a6c27804SArtur Pilipenko 343a6c27804SArtur Pilipenko const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(LHSS); 344a6c27804SArtur Pilipenko if (!AR || AR->getLoop() != L) 345a6c27804SArtur Pilipenko return None; 346a6c27804SArtur Pilipenko 347a6c27804SArtur Pilipenko return LoopICmp(Pred, AR, RHSS); 348a6c27804SArtur Pilipenko } 349a6c27804SArtur Pilipenko 3506780ba65SArtur Pilipenko Value *LoopPredication::expandCheck(SCEVExpander &Expander, 3516780ba65SArtur Pilipenko IRBuilder<> &Builder, 3526780ba65SArtur Pilipenko ICmpInst::Predicate Pred, const SCEV *LHS, 3536780ba65SArtur Pilipenko const SCEV *RHS, Instruction *InsertAt) { 354889dc1e3SArtur Pilipenko // TODO: we can check isLoopEntryGuardedByCond before emitting the check 355889dc1e3SArtur Pilipenko 3566780ba65SArtur Pilipenko Type *Ty = LHS->getType(); 3576780ba65SArtur Pilipenko assert(Ty == RHS->getType() && "expandCheck operands have different types?"); 358ead69ee4SArtur Pilipenko 359ead69ee4SArtur Pilipenko if (SE->isLoopEntryGuardedByCond(L, Pred, LHS, RHS)) 360ead69ee4SArtur Pilipenko return Builder.getTrue(); 361ead69ee4SArtur Pilipenko 3626780ba65SArtur Pilipenko Value *LHSV = Expander.expandCodeFor(LHS, Ty, InsertAt); 3636780ba65SArtur Pilipenko Value *RHSV = Expander.expandCodeFor(RHS, Ty, InsertAt); 3646780ba65SArtur Pilipenko return Builder.CreateICmp(Pred, LHSV, RHSV); 3656780ba65SArtur Pilipenko } 3666780ba65SArtur Pilipenko 3671d02b13eSAnna Thomas Optional<LoopPredication::LoopICmp> 3681d02b13eSAnna Thomas LoopPredication::generateLoopLatchCheck(Type *RangeCheckType) { 3691d02b13eSAnna Thomas 3701d02b13eSAnna Thomas auto *LatchType = LatchCheck.IV->getType(); 3711d02b13eSAnna Thomas if (RangeCheckType == LatchType) 3721d02b13eSAnna Thomas return LatchCheck; 3731d02b13eSAnna Thomas // For now, bail out if latch type is narrower than range type. 3741d02b13eSAnna Thomas if (DL->getTypeSizeInBits(LatchType) < DL->getTypeSizeInBits(RangeCheckType)) 3751d02b13eSAnna Thomas return None; 3761d02b13eSAnna Thomas if (!isSafeToTruncateWideIVType(RangeCheckType)) 3771d02b13eSAnna Thomas return None; 3781d02b13eSAnna Thomas // We can now safely identify the truncated version of the IV and limit for 3791d02b13eSAnna Thomas // RangeCheckType. 3801d02b13eSAnna Thomas LoopICmp NewLatchCheck; 3811d02b13eSAnna Thomas NewLatchCheck.Pred = LatchCheck.Pred; 3821d02b13eSAnna Thomas NewLatchCheck.IV = dyn_cast<SCEVAddRecExpr>( 3831d02b13eSAnna Thomas SE->getTruncateExpr(LatchCheck.IV, RangeCheckType)); 3841d02b13eSAnna Thomas if (!NewLatchCheck.IV) 3851d02b13eSAnna Thomas return None; 3861d02b13eSAnna Thomas NewLatchCheck.Limit = SE->getTruncateExpr(LatchCheck.Limit, RangeCheckType); 3871d02b13eSAnna Thomas DEBUG(dbgs() << "IV of type: " << *LatchType 3881d02b13eSAnna Thomas << "can be represented as range check type:" << *RangeCheckType 3891d02b13eSAnna Thomas << "\n"); 3901d02b13eSAnna Thomas DEBUG(dbgs() << "LatchCheck.IV: " << *NewLatchCheck.IV << "\n"); 3911d02b13eSAnna Thomas DEBUG(dbgs() << "LatchCheck.Limit: " << *NewLatchCheck.Limit << "\n"); 3921d02b13eSAnna Thomas return NewLatchCheck; 3931d02b13eSAnna Thomas } 3941d02b13eSAnna Thomas 39568797214SAnna Thomas bool LoopPredication::isSupportedStep(const SCEV* Step) { 3967b360434SAnna Thomas return Step->isOne() || (Step->isAllOnesValue() && EnableCountDownLoop); 3971d02b13eSAnna Thomas } 3988fb3d57eSArtur Pilipenko 39968797214SAnna Thomas bool LoopPredication::CanExpand(const SCEV* S) { 40068797214SAnna Thomas return SE->isLoopInvariant(S, L) && isSafeToExpand(S, *SE); 40168797214SAnna Thomas } 40268797214SAnna Thomas 403ebc9031bSSerguei Katkov ICmpInst::Predicate 404ebc9031bSSerguei Katkov LoopPredication::getLatchPredicateForGuard(ICmpInst::Predicate Pred) { 405ebc9031bSSerguei Katkov switch (LatchCheck.Pred) { 406ebc9031bSSerguei Katkov case ICmpInst::ICMP_ULT: 407ebc9031bSSerguei Katkov return ICmpInst::ICMP_ULE; 408ebc9031bSSerguei Katkov case ICmpInst::ICMP_ULE: 409ebc9031bSSerguei Katkov return ICmpInst::ICMP_ULT; 410ebc9031bSSerguei Katkov case ICmpInst::ICMP_SLT: 411ebc9031bSSerguei Katkov return ICmpInst::ICMP_SLE; 412ebc9031bSSerguei Katkov case ICmpInst::ICMP_SLE: 413ebc9031bSSerguei Katkov return ICmpInst::ICMP_SLT; 414ebc9031bSSerguei Katkov case ICmpInst::ICMP_UGT: 415ebc9031bSSerguei Katkov return ICmpInst::ICMP_UGE; 416ebc9031bSSerguei Katkov case ICmpInst::ICMP_UGE: 417ebc9031bSSerguei Katkov return ICmpInst::ICMP_UGT; 418ebc9031bSSerguei Katkov case ICmpInst::ICMP_SGT: 419ebc9031bSSerguei Katkov return ICmpInst::ICMP_SGE; 420ebc9031bSSerguei Katkov case ICmpInst::ICMP_SGE: 421ebc9031bSSerguei Katkov return ICmpInst::ICMP_SGT; 422ebc9031bSSerguei Katkov default: 423ebc9031bSSerguei Katkov llvm_unreachable("Unsupported loop latch!"); 424ebc9031bSSerguei Katkov } 425ebc9031bSSerguei Katkov } 426ebc9031bSSerguei Katkov 42768797214SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheckIncrementingLoop( 42868797214SAnna Thomas LoopPredication::LoopICmp LatchCheck, LoopPredication::LoopICmp RangeCheck, 42968797214SAnna Thomas SCEVExpander &Expander, IRBuilder<> &Builder) { 43068797214SAnna Thomas auto *Ty = RangeCheck.IV->getType(); 43168797214SAnna Thomas // Generate the widened condition for the forward loop: 4328aadc643SArtur Pilipenko // guardStart u< guardLimit && 4338aadc643SArtur Pilipenko // latchLimit <pred> guardLimit - 1 - guardStart + latchStart 434b4527e1cSArtur Pilipenko // where <pred> depends on the latch condition predicate. See the file 435b4527e1cSArtur Pilipenko // header comment for the reasoning. 43668797214SAnna Thomas // guardLimit - guardStart + latchStart - 1 43768797214SAnna Thomas const SCEV *GuardStart = RangeCheck.IV->getStart(); 43868797214SAnna Thomas const SCEV *GuardLimit = RangeCheck.Limit; 43968797214SAnna Thomas const SCEV *LatchStart = LatchCheck.IV->getStart(); 44068797214SAnna Thomas const SCEV *LatchLimit = LatchCheck.Limit; 4418aadc643SArtur Pilipenko 4428aadc643SArtur Pilipenko // guardLimit - guardStart + latchStart - 1 4438aadc643SArtur Pilipenko const SCEV *RHS = 4448aadc643SArtur Pilipenko SE->getAddExpr(SE->getMinusSCEV(GuardLimit, GuardStart), 4458aadc643SArtur Pilipenko SE->getMinusSCEV(LatchStart, SE->getOne(Ty))); 44668797214SAnna Thomas if (!CanExpand(GuardStart) || !CanExpand(GuardLimit) || 44768797214SAnna Thomas !CanExpand(LatchLimit) || !CanExpand(RHS)) { 44868797214SAnna Thomas DEBUG(dbgs() << "Can't expand limit check!\n"); 44968797214SAnna Thomas return None; 45068797214SAnna Thomas } 451ebc9031bSSerguei Katkov auto LimitCheckPred = getLatchPredicateForGuard(LatchCheck.Pred); 452aab28666SArtur Pilipenko 4538aadc643SArtur Pilipenko DEBUG(dbgs() << "LHS: " << *LatchLimit << "\n"); 4548aadc643SArtur Pilipenko DEBUG(dbgs() << "RHS: " << *RHS << "\n"); 4558aadc643SArtur Pilipenko DEBUG(dbgs() << "Pred: " << LimitCheckPred << "\n"); 4568aadc643SArtur Pilipenko 4570860bfc6SArtur Pilipenko Instruction *InsertAt = Preheader->getTerminator(); 4588aadc643SArtur Pilipenko auto *LimitCheck = 4598aadc643SArtur Pilipenko expandCheck(Expander, Builder, LimitCheckPred, LatchLimit, RHS, InsertAt); 46068797214SAnna Thomas auto *FirstIterationCheck = expandCheck(Expander, Builder, RangeCheck.Pred, 4618aadc643SArtur Pilipenko GuardStart, GuardLimit, InsertAt); 462889dc1e3SArtur Pilipenko return Builder.CreateAnd(FirstIterationCheck, LimitCheck); 4638fb3d57eSArtur Pilipenko } 4647b360434SAnna Thomas 4657b360434SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheckDecrementingLoop( 4667b360434SAnna Thomas LoopPredication::LoopICmp LatchCheck, LoopPredication::LoopICmp RangeCheck, 4677b360434SAnna Thomas SCEVExpander &Expander, IRBuilder<> &Builder) { 4687b360434SAnna Thomas auto *Ty = RangeCheck.IV->getType(); 4697b360434SAnna Thomas const SCEV *GuardStart = RangeCheck.IV->getStart(); 4707b360434SAnna Thomas const SCEV *GuardLimit = RangeCheck.Limit; 4717b360434SAnna Thomas const SCEV *LatchLimit = LatchCheck.Limit; 4727b360434SAnna Thomas if (!CanExpand(GuardStart) || !CanExpand(GuardLimit) || 4737b360434SAnna Thomas !CanExpand(LatchLimit)) { 4747b360434SAnna Thomas DEBUG(dbgs() << "Can't expand limit check!\n"); 4757b360434SAnna Thomas return None; 4767b360434SAnna Thomas } 4777b360434SAnna Thomas // The decrement of the latch check IV should be the same as the 4787b360434SAnna Thomas // rangeCheckIV. 4797b360434SAnna Thomas auto *PostDecLatchCheckIV = LatchCheck.IV->getPostIncExpr(*SE); 4807b360434SAnna Thomas if (RangeCheck.IV != PostDecLatchCheckIV) { 4817b360434SAnna Thomas DEBUG(dbgs() << "Not the same. PostDecLatchCheckIV: " 4827b360434SAnna Thomas << *PostDecLatchCheckIV 4837b360434SAnna Thomas << " and RangeCheckIV: " << *RangeCheck.IV << "\n"); 4847b360434SAnna Thomas return None; 4857b360434SAnna Thomas } 4867b360434SAnna Thomas 4877b360434SAnna Thomas // Generate the widened condition for CountDownLoop: 4887b360434SAnna Thomas // guardStart u< guardLimit && 4897b360434SAnna Thomas // latchLimit <pred> 1. 4907b360434SAnna Thomas // See the header comment for reasoning of the checks. 4917b360434SAnna Thomas Instruction *InsertAt = Preheader->getTerminator(); 492*c8016e7aSSerguei Katkov auto LimitCheckPred = getLatchPredicateForGuard(LatchCheck.Pred); 4937b360434SAnna Thomas auto *FirstIterationCheck = expandCheck(Expander, Builder, ICmpInst::ICMP_ULT, 4947b360434SAnna Thomas GuardStart, GuardLimit, InsertAt); 4957b360434SAnna Thomas auto *LimitCheck = expandCheck(Expander, Builder, LimitCheckPred, LatchLimit, 4967b360434SAnna Thomas SE->getOne(Ty), InsertAt); 4977b360434SAnna Thomas return Builder.CreateAnd(FirstIterationCheck, LimitCheck); 4987b360434SAnna Thomas } 4997b360434SAnna Thomas 50068797214SAnna Thomas /// If ICI can be widened to a loop invariant condition emits the loop 50168797214SAnna Thomas /// invariant condition in the loop preheader and return it, otherwise 50268797214SAnna Thomas /// returns None. 50368797214SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheck(ICmpInst *ICI, 50468797214SAnna Thomas SCEVExpander &Expander, 50568797214SAnna Thomas IRBuilder<> &Builder) { 50668797214SAnna Thomas DEBUG(dbgs() << "Analyzing ICmpInst condition:\n"); 50768797214SAnna Thomas DEBUG(ICI->dump()); 50868797214SAnna Thomas 50968797214SAnna Thomas // parseLoopStructure guarantees that the latch condition is: 51068797214SAnna Thomas // ++i <pred> latchLimit, where <pred> is u<, u<=, s<, or s<=. 51168797214SAnna Thomas // We are looking for the range checks of the form: 51268797214SAnna Thomas // i u< guardLimit 51368797214SAnna Thomas auto RangeCheck = parseLoopICmp(ICI); 51468797214SAnna Thomas if (!RangeCheck) { 51568797214SAnna Thomas DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 51668797214SAnna Thomas return None; 51768797214SAnna Thomas } 51868797214SAnna Thomas DEBUG(dbgs() << "Guard check:\n"); 51968797214SAnna Thomas DEBUG(RangeCheck->dump()); 52068797214SAnna Thomas if (RangeCheck->Pred != ICmpInst::ICMP_ULT) { 52168797214SAnna Thomas DEBUG(dbgs() << "Unsupported range check predicate(" << RangeCheck->Pred 52268797214SAnna Thomas << ")!\n"); 52368797214SAnna Thomas return None; 52468797214SAnna Thomas } 52568797214SAnna Thomas auto *RangeCheckIV = RangeCheck->IV; 52668797214SAnna Thomas if (!RangeCheckIV->isAffine()) { 52768797214SAnna Thomas DEBUG(dbgs() << "Range check IV is not affine!\n"); 52868797214SAnna Thomas return None; 52968797214SAnna Thomas } 53068797214SAnna Thomas auto *Step = RangeCheckIV->getStepRecurrence(*SE); 53168797214SAnna Thomas // We cannot just compare with latch IV step because the latch and range IVs 53268797214SAnna Thomas // may have different types. 53368797214SAnna Thomas if (!isSupportedStep(Step)) { 53468797214SAnna Thomas DEBUG(dbgs() << "Range check and latch have IVs different steps!\n"); 53568797214SAnna Thomas return None; 53668797214SAnna Thomas } 53768797214SAnna Thomas auto *Ty = RangeCheckIV->getType(); 53868797214SAnna Thomas auto CurrLatchCheckOpt = generateLoopLatchCheck(Ty); 53968797214SAnna Thomas if (!CurrLatchCheckOpt) { 54068797214SAnna Thomas DEBUG(dbgs() << "Failed to generate a loop latch check " 54168797214SAnna Thomas "corresponding to range type: " 54268797214SAnna Thomas << *Ty << "\n"); 54368797214SAnna Thomas return None; 54468797214SAnna Thomas } 54568797214SAnna Thomas 54668797214SAnna Thomas LoopICmp CurrLatchCheck = *CurrLatchCheckOpt; 5477b360434SAnna Thomas // At this point, the range and latch step should have the same type, but need 5487b360434SAnna Thomas // not have the same value (we support both 1 and -1 steps). 5497b360434SAnna Thomas assert(Step->getType() == 5507b360434SAnna Thomas CurrLatchCheck.IV->getStepRecurrence(*SE)->getType() && 5517b360434SAnna Thomas "Range and latch steps should be of same type!"); 5527b360434SAnna Thomas if (Step != CurrLatchCheck.IV->getStepRecurrence(*SE)) { 5537b360434SAnna Thomas DEBUG(dbgs() << "Range and latch have different step values!\n"); 5547b360434SAnna Thomas return None; 5557b360434SAnna Thomas } 55668797214SAnna Thomas 5577b360434SAnna Thomas if (Step->isOne()) 55868797214SAnna Thomas return widenICmpRangeCheckIncrementingLoop(CurrLatchCheck, *RangeCheck, 55968797214SAnna Thomas Expander, Builder); 5607b360434SAnna Thomas else { 5617b360434SAnna Thomas assert(Step->isAllOnesValue() && "Step should be -1!"); 5627b360434SAnna Thomas return widenICmpRangeCheckDecrementingLoop(CurrLatchCheck, *RangeCheck, 5637b360434SAnna Thomas Expander, Builder); 5647b360434SAnna Thomas } 56568797214SAnna Thomas } 5668fb3d57eSArtur Pilipenko 5678fb3d57eSArtur Pilipenko bool LoopPredication::widenGuardConditions(IntrinsicInst *Guard, 5688fb3d57eSArtur Pilipenko SCEVExpander &Expander) { 5698fb3d57eSArtur Pilipenko DEBUG(dbgs() << "Processing guard:\n"); 5708fb3d57eSArtur Pilipenko DEBUG(Guard->dump()); 5718fb3d57eSArtur Pilipenko 5728fb3d57eSArtur Pilipenko IRBuilder<> Builder(cast<Instruction>(Preheader->getTerminator())); 5738fb3d57eSArtur Pilipenko 5748fb3d57eSArtur Pilipenko // The guard condition is expected to be in form of: 5758fb3d57eSArtur Pilipenko // cond1 && cond2 && cond3 ... 5760909ca13SHiroshi Inoue // Iterate over subconditions looking for icmp conditions which can be 5778fb3d57eSArtur Pilipenko // widened across loop iterations. Widening these conditions remember the 5788fb3d57eSArtur Pilipenko // resulting list of subconditions in Checks vector. 5798fb3d57eSArtur Pilipenko SmallVector<Value *, 4> Worklist(1, Guard->getOperand(0)); 5808fb3d57eSArtur Pilipenko SmallPtrSet<Value *, 4> Visited; 5818fb3d57eSArtur Pilipenko 5828fb3d57eSArtur Pilipenko SmallVector<Value *, 4> Checks; 5838fb3d57eSArtur Pilipenko 5848fb3d57eSArtur Pilipenko unsigned NumWidened = 0; 5858fb3d57eSArtur Pilipenko do { 5868fb3d57eSArtur Pilipenko Value *Condition = Worklist.pop_back_val(); 5878fb3d57eSArtur Pilipenko if (!Visited.insert(Condition).second) 5888fb3d57eSArtur Pilipenko continue; 5898fb3d57eSArtur Pilipenko 5908fb3d57eSArtur Pilipenko Value *LHS, *RHS; 5918fb3d57eSArtur Pilipenko using namespace llvm::PatternMatch; 5928fb3d57eSArtur Pilipenko if (match(Condition, m_And(m_Value(LHS), m_Value(RHS)))) { 5938fb3d57eSArtur Pilipenko Worklist.push_back(LHS); 5948fb3d57eSArtur Pilipenko Worklist.push_back(RHS); 5958fb3d57eSArtur Pilipenko continue; 5968fb3d57eSArtur Pilipenko } 5978fb3d57eSArtur Pilipenko 5988fb3d57eSArtur Pilipenko if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) { 5998fb3d57eSArtur Pilipenko if (auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander, Builder)) { 6008fb3d57eSArtur Pilipenko Checks.push_back(NewRangeCheck.getValue()); 6018fb3d57eSArtur Pilipenko NumWidened++; 6028fb3d57eSArtur Pilipenko continue; 6038fb3d57eSArtur Pilipenko } 6048fb3d57eSArtur Pilipenko } 6058fb3d57eSArtur Pilipenko 6068fb3d57eSArtur Pilipenko // Save the condition as is if we can't widen it 6078fb3d57eSArtur Pilipenko Checks.push_back(Condition); 6088fb3d57eSArtur Pilipenko } while (Worklist.size() != 0); 6098fb3d57eSArtur Pilipenko 6108fb3d57eSArtur Pilipenko if (NumWidened == 0) 6118fb3d57eSArtur Pilipenko return false; 6128fb3d57eSArtur Pilipenko 6138fb3d57eSArtur Pilipenko // Emit the new guard condition 6148fb3d57eSArtur Pilipenko Builder.SetInsertPoint(Guard); 6158fb3d57eSArtur Pilipenko Value *LastCheck = nullptr; 6168fb3d57eSArtur Pilipenko for (auto *Check : Checks) 6178fb3d57eSArtur Pilipenko if (!LastCheck) 6188fb3d57eSArtur Pilipenko LastCheck = Check; 6198fb3d57eSArtur Pilipenko else 6208fb3d57eSArtur Pilipenko LastCheck = Builder.CreateAnd(LastCheck, Check); 6218fb3d57eSArtur Pilipenko Guard->setOperand(0, LastCheck); 6228fb3d57eSArtur Pilipenko 6238fb3d57eSArtur Pilipenko DEBUG(dbgs() << "Widened checks = " << NumWidened << "\n"); 6248fb3d57eSArtur Pilipenko return true; 6258fb3d57eSArtur Pilipenko } 6268fb3d57eSArtur Pilipenko 627889dc1e3SArtur Pilipenko Optional<LoopPredication::LoopICmp> LoopPredication::parseLoopLatchICmp() { 628889dc1e3SArtur Pilipenko using namespace PatternMatch; 629889dc1e3SArtur Pilipenko 630889dc1e3SArtur Pilipenko BasicBlock *LoopLatch = L->getLoopLatch(); 631889dc1e3SArtur Pilipenko if (!LoopLatch) { 632889dc1e3SArtur Pilipenko DEBUG(dbgs() << "The loop doesn't have a single latch!\n"); 633889dc1e3SArtur Pilipenko return None; 634889dc1e3SArtur Pilipenko } 635889dc1e3SArtur Pilipenko 636889dc1e3SArtur Pilipenko ICmpInst::Predicate Pred; 637889dc1e3SArtur Pilipenko Value *LHS, *RHS; 638889dc1e3SArtur Pilipenko BasicBlock *TrueDest, *FalseDest; 639889dc1e3SArtur Pilipenko 640889dc1e3SArtur Pilipenko if (!match(LoopLatch->getTerminator(), 641889dc1e3SArtur Pilipenko m_Br(m_ICmp(Pred, m_Value(LHS), m_Value(RHS)), TrueDest, 642889dc1e3SArtur Pilipenko FalseDest))) { 643889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Failed to match the latch terminator!\n"); 644889dc1e3SArtur Pilipenko return None; 645889dc1e3SArtur Pilipenko } 646889dc1e3SArtur Pilipenko assert((TrueDest == L->getHeader() || FalseDest == L->getHeader()) && 647889dc1e3SArtur Pilipenko "One of the latch's destinations must be the header"); 648889dc1e3SArtur Pilipenko if (TrueDest != L->getHeader()) 649889dc1e3SArtur Pilipenko Pred = ICmpInst::getInversePredicate(Pred); 650889dc1e3SArtur Pilipenko 651889dc1e3SArtur Pilipenko auto Result = parseLoopICmp(Pred, LHS, RHS); 652889dc1e3SArtur Pilipenko if (!Result) { 653889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 654889dc1e3SArtur Pilipenko return None; 655889dc1e3SArtur Pilipenko } 656889dc1e3SArtur Pilipenko 657889dc1e3SArtur Pilipenko // Check affine first, so if it's not we don't try to compute the step 658889dc1e3SArtur Pilipenko // recurrence. 659889dc1e3SArtur Pilipenko if (!Result->IV->isAffine()) { 660889dc1e3SArtur Pilipenko DEBUG(dbgs() << "The induction variable is not affine!\n"); 661889dc1e3SArtur Pilipenko return None; 662889dc1e3SArtur Pilipenko } 663889dc1e3SArtur Pilipenko 664889dc1e3SArtur Pilipenko auto *Step = Result->IV->getStepRecurrence(*SE); 66568797214SAnna Thomas if (!isSupportedStep(Step)) { 666889dc1e3SArtur Pilipenko DEBUG(dbgs() << "Unsupported loop stride(" << *Step << ")!\n"); 667889dc1e3SArtur Pilipenko return None; 668889dc1e3SArtur Pilipenko } 669889dc1e3SArtur Pilipenko 67068797214SAnna Thomas auto IsUnsupportedPredicate = [](const SCEV *Step, ICmpInst::Predicate Pred) { 6717b360434SAnna Thomas if (Step->isOne()) { 67268797214SAnna Thomas return Pred != ICmpInst::ICMP_ULT && Pred != ICmpInst::ICMP_SLT && 67368797214SAnna Thomas Pred != ICmpInst::ICMP_ULE && Pred != ICmpInst::ICMP_SLE; 6747b360434SAnna Thomas } else { 6757b360434SAnna Thomas assert(Step->isAllOnesValue() && "Step should be -1!"); 676*c8016e7aSSerguei Katkov return Pred != ICmpInst::ICMP_UGT && Pred != ICmpInst::ICMP_SGT && 677*c8016e7aSSerguei Katkov Pred != ICmpInst::ICMP_UGE && Pred != ICmpInst::ICMP_SGE; 6787b360434SAnna Thomas } 67968797214SAnna Thomas }; 68068797214SAnna Thomas 68168797214SAnna Thomas if (IsUnsupportedPredicate(Step, Result->Pred)) { 68268797214SAnna Thomas DEBUG(dbgs() << "Unsupported loop latch predicate(" << Result->Pred 68368797214SAnna Thomas << ")!\n"); 68468797214SAnna Thomas return None; 68568797214SAnna Thomas } 686889dc1e3SArtur Pilipenko return Result; 687889dc1e3SArtur Pilipenko } 688889dc1e3SArtur Pilipenko 6891d02b13eSAnna Thomas // Returns true if its safe to truncate the IV to RangeCheckType. 6901d02b13eSAnna Thomas bool LoopPredication::isSafeToTruncateWideIVType(Type *RangeCheckType) { 6911d02b13eSAnna Thomas if (!EnableIVTruncation) 6921d02b13eSAnna Thomas return false; 6931d02b13eSAnna Thomas assert(DL->getTypeSizeInBits(LatchCheck.IV->getType()) > 6941d02b13eSAnna Thomas DL->getTypeSizeInBits(RangeCheckType) && 6951d02b13eSAnna Thomas "Expected latch check IV type to be larger than range check operand " 6961d02b13eSAnna Thomas "type!"); 6971d02b13eSAnna Thomas // The start and end values of the IV should be known. This is to guarantee 6981d02b13eSAnna Thomas // that truncating the wide type will not lose information. 6991d02b13eSAnna Thomas auto *Limit = dyn_cast<SCEVConstant>(LatchCheck.Limit); 7001d02b13eSAnna Thomas auto *Start = dyn_cast<SCEVConstant>(LatchCheck.IV->getStart()); 7011d02b13eSAnna Thomas if (!Limit || !Start) 7021d02b13eSAnna Thomas return false; 7031d02b13eSAnna Thomas // This check makes sure that the IV does not change sign during loop 7041d02b13eSAnna Thomas // iterations. Consider latchType = i64, LatchStart = 5, Pred = ICMP_SGE, 7051d02b13eSAnna Thomas // LatchEnd = 2, rangeCheckType = i32. If it's not a monotonic predicate, the 7061d02b13eSAnna Thomas // IV wraps around, and the truncation of the IV would lose the range of 7071d02b13eSAnna Thomas // iterations between 2^32 and 2^64. 7081d02b13eSAnna Thomas bool Increasing; 7091d02b13eSAnna Thomas if (!SE->isMonotonicPredicate(LatchCheck.IV, LatchCheck.Pred, Increasing)) 7101d02b13eSAnna Thomas return false; 7111d02b13eSAnna Thomas // The active bits should be less than the bits in the RangeCheckType. This 7121d02b13eSAnna Thomas // guarantees that truncating the latch check to RangeCheckType is a safe 7131d02b13eSAnna Thomas // operation. 7141d02b13eSAnna Thomas auto RangeCheckTypeBitSize = DL->getTypeSizeInBits(RangeCheckType); 7151d02b13eSAnna Thomas return Start->getAPInt().getActiveBits() < RangeCheckTypeBitSize && 7161d02b13eSAnna Thomas Limit->getAPInt().getActiveBits() < RangeCheckTypeBitSize; 7171d02b13eSAnna Thomas } 7181d02b13eSAnna Thomas 7198fb3d57eSArtur Pilipenko bool LoopPredication::runOnLoop(Loop *Loop) { 7208fb3d57eSArtur Pilipenko L = Loop; 7218fb3d57eSArtur Pilipenko 7228fb3d57eSArtur Pilipenko DEBUG(dbgs() << "Analyzing "); 7238fb3d57eSArtur Pilipenko DEBUG(L->dump()); 7248fb3d57eSArtur Pilipenko 7258fb3d57eSArtur Pilipenko Module *M = L->getHeader()->getModule(); 7268fb3d57eSArtur Pilipenko 7278fb3d57eSArtur Pilipenko // There is nothing to do if the module doesn't use guards 7288fb3d57eSArtur Pilipenko auto *GuardDecl = 7298fb3d57eSArtur Pilipenko M->getFunction(Intrinsic::getName(Intrinsic::experimental_guard)); 7308fb3d57eSArtur Pilipenko if (!GuardDecl || GuardDecl->use_empty()) 7318fb3d57eSArtur Pilipenko return false; 7328fb3d57eSArtur Pilipenko 7338fb3d57eSArtur Pilipenko DL = &M->getDataLayout(); 7348fb3d57eSArtur Pilipenko 7358fb3d57eSArtur Pilipenko Preheader = L->getLoopPreheader(); 7368fb3d57eSArtur Pilipenko if (!Preheader) 7378fb3d57eSArtur Pilipenko return false; 7388fb3d57eSArtur Pilipenko 739889dc1e3SArtur Pilipenko auto LatchCheckOpt = parseLoopLatchICmp(); 740889dc1e3SArtur Pilipenko if (!LatchCheckOpt) 741889dc1e3SArtur Pilipenko return false; 742889dc1e3SArtur Pilipenko LatchCheck = *LatchCheckOpt; 743889dc1e3SArtur Pilipenko 74468797214SAnna Thomas DEBUG(dbgs() << "Latch check:\n"); 74568797214SAnna Thomas DEBUG(LatchCheck.dump()); 74668797214SAnna Thomas 7478fb3d57eSArtur Pilipenko // Collect all the guards into a vector and process later, so as not 7488fb3d57eSArtur Pilipenko // to invalidate the instruction iterator. 7498fb3d57eSArtur Pilipenko SmallVector<IntrinsicInst *, 4> Guards; 7508fb3d57eSArtur Pilipenko for (const auto BB : L->blocks()) 7518fb3d57eSArtur Pilipenko for (auto &I : *BB) 7528fb3d57eSArtur Pilipenko if (auto *II = dyn_cast<IntrinsicInst>(&I)) 7538fb3d57eSArtur Pilipenko if (II->getIntrinsicID() == Intrinsic::experimental_guard) 7548fb3d57eSArtur Pilipenko Guards.push_back(II); 7558fb3d57eSArtur Pilipenko 75646c4e0a4SArtur Pilipenko if (Guards.empty()) 75746c4e0a4SArtur Pilipenko return false; 75846c4e0a4SArtur Pilipenko 7598fb3d57eSArtur Pilipenko SCEVExpander Expander(*SE, *DL, "loop-predication"); 7608fb3d57eSArtur Pilipenko 7618fb3d57eSArtur Pilipenko bool Changed = false; 7628fb3d57eSArtur Pilipenko for (auto *Guard : Guards) 7638fb3d57eSArtur Pilipenko Changed |= widenGuardConditions(Guard, Expander); 7648fb3d57eSArtur Pilipenko 7658fb3d57eSArtur Pilipenko return Changed; 7668fb3d57eSArtur Pilipenko } 767