18fb3d57eSArtur Pilipenko //===-- LoopPredication.cpp - Guard based loop predication pass -----------===// 28fb3d57eSArtur Pilipenko // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68fb3d57eSArtur Pilipenko // 78fb3d57eSArtur Pilipenko //===----------------------------------------------------------------------===// 88fb3d57eSArtur Pilipenko // 98fb3d57eSArtur Pilipenko // The LoopPredication pass tries to convert loop variant range checks to loop 108fb3d57eSArtur Pilipenko // invariant by widening checks across loop iterations. For example, it will 118fb3d57eSArtur Pilipenko // convert 128fb3d57eSArtur Pilipenko // 138fb3d57eSArtur Pilipenko // for (i = 0; i < n; i++) { 148fb3d57eSArtur Pilipenko // guard(i < len); 158fb3d57eSArtur Pilipenko // ... 168fb3d57eSArtur Pilipenko // } 178fb3d57eSArtur Pilipenko // 188fb3d57eSArtur Pilipenko // to 198fb3d57eSArtur Pilipenko // 208fb3d57eSArtur Pilipenko // for (i = 0; i < n; i++) { 218fb3d57eSArtur Pilipenko // guard(n - 1 < len); 228fb3d57eSArtur Pilipenko // ... 238fb3d57eSArtur Pilipenko // } 248fb3d57eSArtur Pilipenko // 258fb3d57eSArtur Pilipenko // After this transformation the condition of the guard is loop invariant, so 268fb3d57eSArtur Pilipenko // loop-unswitch can later unswitch the loop by this condition which basically 278fb3d57eSArtur Pilipenko // predicates the loop by the widened condition: 288fb3d57eSArtur Pilipenko // 298fb3d57eSArtur Pilipenko // if (n - 1 < len) 308fb3d57eSArtur Pilipenko // for (i = 0; i < n; i++) { 318fb3d57eSArtur Pilipenko // ... 328fb3d57eSArtur Pilipenko // } 338fb3d57eSArtur Pilipenko // else 348fb3d57eSArtur Pilipenko // deoptimize 358fb3d57eSArtur Pilipenko // 36889dc1e3SArtur Pilipenko // It's tempting to rely on SCEV here, but it has proven to be problematic. 37889dc1e3SArtur Pilipenko // Generally the facts SCEV provides about the increment step of add 38889dc1e3SArtur Pilipenko // recurrences are true if the backedge of the loop is taken, which implicitly 39889dc1e3SArtur Pilipenko // assumes that the guard doesn't fail. Using these facts to optimize the 40889dc1e3SArtur Pilipenko // guard results in a circular logic where the guard is optimized under the 41889dc1e3SArtur Pilipenko // assumption that it never fails. 42889dc1e3SArtur Pilipenko // 43889dc1e3SArtur Pilipenko // For example, in the loop below the induction variable will be marked as nuw 44889dc1e3SArtur Pilipenko // basing on the guard. Basing on nuw the guard predicate will be considered 45889dc1e3SArtur Pilipenko // monotonic. Given a monotonic condition it's tempting to replace the induction 46889dc1e3SArtur Pilipenko // variable in the condition with its value on the last iteration. But this 47889dc1e3SArtur Pilipenko // transformation is not correct, e.g. e = 4, b = 5 breaks the loop. 48889dc1e3SArtur Pilipenko // 49889dc1e3SArtur Pilipenko // for (int i = b; i != e; i++) 50889dc1e3SArtur Pilipenko // guard(i u< len) 51889dc1e3SArtur Pilipenko // 52889dc1e3SArtur Pilipenko // One of the ways to reason about this problem is to use an inductive proof 53889dc1e3SArtur Pilipenko // approach. Given the loop: 54889dc1e3SArtur Pilipenko // 558aadc643SArtur Pilipenko // if (B(0)) { 56889dc1e3SArtur Pilipenko // do { 578aadc643SArtur Pilipenko // I = PHI(0, I.INC) 58889dc1e3SArtur Pilipenko // I.INC = I + Step 59889dc1e3SArtur Pilipenko // guard(G(I)); 608aadc643SArtur Pilipenko // } while (B(I)); 61889dc1e3SArtur Pilipenko // } 62889dc1e3SArtur Pilipenko // 63889dc1e3SArtur Pilipenko // where B(x) and G(x) are predicates that map integers to booleans, we want a 64889dc1e3SArtur Pilipenko // loop invariant expression M such the following program has the same semantics 65889dc1e3SArtur Pilipenko // as the above: 66889dc1e3SArtur Pilipenko // 678aadc643SArtur Pilipenko // if (B(0)) { 68889dc1e3SArtur Pilipenko // do { 698aadc643SArtur Pilipenko // I = PHI(0, I.INC) 70889dc1e3SArtur Pilipenko // I.INC = I + Step 718aadc643SArtur Pilipenko // guard(G(0) && M); 728aadc643SArtur Pilipenko // } while (B(I)); 73889dc1e3SArtur Pilipenko // } 74889dc1e3SArtur Pilipenko // 758aadc643SArtur Pilipenko // One solution for M is M = forall X . (G(X) && B(X)) => G(X + Step) 76889dc1e3SArtur Pilipenko // 77889dc1e3SArtur Pilipenko // Informal proof that the transformation above is correct: 78889dc1e3SArtur Pilipenko // 79889dc1e3SArtur Pilipenko // By the definition of guards we can rewrite the guard condition to: 808aadc643SArtur Pilipenko // G(I) && G(0) && M 81889dc1e3SArtur Pilipenko // 82889dc1e3SArtur Pilipenko // Let's prove that for each iteration of the loop: 838aadc643SArtur Pilipenko // G(0) && M => G(I) 84889dc1e3SArtur Pilipenko // And the condition above can be simplified to G(Start) && M. 85889dc1e3SArtur Pilipenko // 86889dc1e3SArtur Pilipenko // Induction base. 878aadc643SArtur Pilipenko // G(0) && M => G(0) 88889dc1e3SArtur Pilipenko // 898aadc643SArtur Pilipenko // Induction step. Assuming G(0) && M => G(I) on the subsequent 90889dc1e3SArtur Pilipenko // iteration: 91889dc1e3SArtur Pilipenko // 928aadc643SArtur Pilipenko // B(I) is true because it's the backedge condition. 93889dc1e3SArtur Pilipenko // G(I) is true because the backedge is guarded by this condition. 94889dc1e3SArtur Pilipenko // 958aadc643SArtur Pilipenko // So M = forall X . (G(X) && B(X)) => G(X + Step) implies G(I + Step). 96889dc1e3SArtur Pilipenko // 97889dc1e3SArtur Pilipenko // Note that we can use anything stronger than M, i.e. any condition which 98889dc1e3SArtur Pilipenko // implies M. 99889dc1e3SArtur Pilipenko // 1007b360434SAnna Thomas // When S = 1 (i.e. forward iterating loop), the transformation is supported 1017b360434SAnna Thomas // when: 102b4527e1cSArtur Pilipenko // * The loop has a single latch with the condition of the form: 1038aadc643SArtur Pilipenko // B(X) = latchStart + X <pred> latchLimit, 1048aadc643SArtur Pilipenko // where <pred> is u<, u<=, s<, or s<=. 1058aadc643SArtur Pilipenko // * The guard condition is of the form 1068aadc643SArtur Pilipenko // G(X) = guardStart + X u< guardLimit 107889dc1e3SArtur Pilipenko // 108b4527e1cSArtur Pilipenko // For the ult latch comparison case M is: 1098aadc643SArtur Pilipenko // forall X . guardStart + X u< guardLimit && latchStart + X <u latchLimit => 1108aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 111889dc1e3SArtur Pilipenko // 112889dc1e3SArtur Pilipenko // The only way the antecedent can be true and the consequent can be false is 113889dc1e3SArtur Pilipenko // if 1148aadc643SArtur Pilipenko // X == guardLimit - 1 - guardStart 115889dc1e3SArtur Pilipenko // (and guardLimit is non-zero, but we won't use this latter fact). 1168aadc643SArtur Pilipenko // If X == guardLimit - 1 - guardStart then the second half of the antecedent is 1178aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u< latchLimit 118889dc1e3SArtur Pilipenko // and its negation is 1198aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u>= latchLimit 120889dc1e3SArtur Pilipenko // 1218aadc643SArtur Pilipenko // In other words, if 1228aadc643SArtur Pilipenko // latchLimit u<= latchStart + guardLimit - 1 - guardStart 1238aadc643SArtur Pilipenko // then: 124889dc1e3SArtur Pilipenko // (the ranges below are written in ConstantRange notation, where [A, B) is the 125889dc1e3SArtur Pilipenko // set for (I = A; I != B; I++ /*maywrap*/) yield(I);) 126889dc1e3SArtur Pilipenko // 1278aadc643SArtur Pilipenko // forall X . guardStart + X u< guardLimit && 1288aadc643SArtur Pilipenko // latchStart + X u< latchLimit => 1298aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 1308aadc643SArtur Pilipenko // == forall X . guardStart + X u< guardLimit && 1318aadc643SArtur Pilipenko // latchStart + X u< latchStart + guardLimit - 1 - guardStart => 1328aadc643SArtur Pilipenko // guardStart + X + 1 u< guardLimit 1338aadc643SArtur Pilipenko // == forall X . (guardStart + X) in [0, guardLimit) && 1348aadc643SArtur Pilipenko // (latchStart + X) in [0, latchStart + guardLimit - 1 - guardStart) => 1358aadc643SArtur Pilipenko // (guardStart + X + 1) in [0, guardLimit) 1368aadc643SArtur Pilipenko // == forall X . X in [-guardStart, guardLimit - guardStart) && 1378aadc643SArtur Pilipenko // X in [-latchStart, guardLimit - 1 - guardStart) => 1388aadc643SArtur Pilipenko // X in [-guardStart - 1, guardLimit - guardStart - 1) 139889dc1e3SArtur Pilipenko // == true 140889dc1e3SArtur Pilipenko // 141889dc1e3SArtur Pilipenko // So the widened condition is: 1428aadc643SArtur Pilipenko // guardStart u< guardLimit && 1438aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u>= latchLimit 1448aadc643SArtur Pilipenko // Similarly for ule condition the widened condition is: 1458aadc643SArtur Pilipenko // guardStart u< guardLimit && 1468aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart u> latchLimit 1478aadc643SArtur Pilipenko // For slt condition the widened condition is: 1488aadc643SArtur Pilipenko // guardStart u< guardLimit && 1498aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart s>= latchLimit 1508aadc643SArtur Pilipenko // For sle condition the widened condition is: 1518aadc643SArtur Pilipenko // guardStart u< guardLimit && 1528aadc643SArtur Pilipenko // latchStart + guardLimit - 1 - guardStart s> latchLimit 153889dc1e3SArtur Pilipenko // 1547b360434SAnna Thomas // When S = -1 (i.e. reverse iterating loop), the transformation is supported 1557b360434SAnna Thomas // when: 1567b360434SAnna Thomas // * The loop has a single latch with the condition of the form: 157c8016e7aSSerguei Katkov // B(X) = X <pred> latchLimit, where <pred> is u>, u>=, s>, or s>=. 1587b360434SAnna Thomas // * The guard condition is of the form 1597b360434SAnna Thomas // G(X) = X - 1 u< guardLimit 1607b360434SAnna Thomas // 1617b360434SAnna Thomas // For the ugt latch comparison case M is: 1627b360434SAnna Thomas // forall X. X-1 u< guardLimit and X u> latchLimit => X-2 u< guardLimit 1637b360434SAnna Thomas // 1647b360434SAnna Thomas // The only way the antecedent can be true and the consequent can be false is if 1657b360434SAnna Thomas // X == 1. 1667b360434SAnna Thomas // If X == 1 then the second half of the antecedent is 1677b360434SAnna Thomas // 1 u> latchLimit, and its negation is latchLimit u>= 1. 1687b360434SAnna Thomas // 1697b360434SAnna Thomas // So the widened condition is: 1707b360434SAnna Thomas // guardStart u< guardLimit && latchLimit u>= 1. 1717b360434SAnna Thomas // Similarly for sgt condition the widened condition is: 1727b360434SAnna Thomas // guardStart u< guardLimit && latchLimit s>= 1. 173c8016e7aSSerguei Katkov // For uge condition the widened condition is: 174c8016e7aSSerguei Katkov // guardStart u< guardLimit && latchLimit u> 1. 175c8016e7aSSerguei Katkov // For sge condition the widened condition is: 176c8016e7aSSerguei Katkov // guardStart u< guardLimit && latchLimit s> 1. 1778fb3d57eSArtur Pilipenko //===----------------------------------------------------------------------===// 1788fb3d57eSArtur Pilipenko 1798fb3d57eSArtur Pilipenko #include "llvm/Transforms/Scalar/LoopPredication.h" 180c297e84bSFedor Sergeev #include "llvm/ADT/Statistic.h" 18192a7177eSPhilip Reames #include "llvm/Analysis/AliasAnalysis.h" 1829b1176b0SAnna Thomas #include "llvm/Analysis/BranchProbabilityInfo.h" 18328298e96SMax Kazantsev #include "llvm/Analysis/GuardUtils.h" 1848fb3d57eSArtur Pilipenko #include "llvm/Analysis/LoopInfo.h" 1858fb3d57eSArtur Pilipenko #include "llvm/Analysis/LoopPass.h" 1868fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolution.h" 1878fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolutionExpander.h" 1888fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolutionExpressions.h" 1898fb3d57eSArtur Pilipenko #include "llvm/IR/Function.h" 1908fb3d57eSArtur Pilipenko #include "llvm/IR/GlobalValue.h" 1918fb3d57eSArtur Pilipenko #include "llvm/IR/IntrinsicInst.h" 1928fb3d57eSArtur Pilipenko #include "llvm/IR/Module.h" 1938fb3d57eSArtur Pilipenko #include "llvm/IR/PatternMatch.h" 1946bda14b3SChandler Carruth #include "llvm/Pass.h" 1958fb3d57eSArtur Pilipenko #include "llvm/Support/Debug.h" 1968fb3d57eSArtur Pilipenko #include "llvm/Transforms/Scalar.h" 197d109e2a7SPhilip Reames #include "llvm/Transforms/Utils/Local.h" 1988fb3d57eSArtur Pilipenko #include "llvm/Transforms/Utils/LoopUtils.h" 1998fb3d57eSArtur Pilipenko 2008fb3d57eSArtur Pilipenko #define DEBUG_TYPE "loop-predication" 2018fb3d57eSArtur Pilipenko 202c297e84bSFedor Sergeev STATISTIC(TotalConsidered, "Number of guards considered"); 203c297e84bSFedor Sergeev STATISTIC(TotalWidened, "Number of checks widened"); 204c297e84bSFedor Sergeev 2058fb3d57eSArtur Pilipenko using namespace llvm; 2068fb3d57eSArtur Pilipenko 2071d02b13eSAnna Thomas static cl::opt<bool> EnableIVTruncation("loop-predication-enable-iv-truncation", 2081d02b13eSAnna Thomas cl::Hidden, cl::init(true)); 2091d02b13eSAnna Thomas 2107b360434SAnna Thomas static cl::opt<bool> EnableCountDownLoop("loop-predication-enable-count-down-loop", 2117b360434SAnna Thomas cl::Hidden, cl::init(true)); 2129b1176b0SAnna Thomas 2139b1176b0SAnna Thomas static cl::opt<bool> 2149b1176b0SAnna Thomas SkipProfitabilityChecks("loop-predication-skip-profitability-checks", 2159b1176b0SAnna Thomas cl::Hidden, cl::init(false)); 2169b1176b0SAnna Thomas 2179b1176b0SAnna Thomas // This is the scale factor for the latch probability. We use this during 2189b1176b0SAnna Thomas // profitability analysis to find other exiting blocks that have a much higher 2199b1176b0SAnna Thomas // probability of exiting the loop instead of loop exiting via latch. 2209b1176b0SAnna Thomas // This value should be greater than 1 for a sane profitability check. 2219b1176b0SAnna Thomas static cl::opt<float> LatchExitProbabilityScale( 2229b1176b0SAnna Thomas "loop-predication-latch-probability-scale", cl::Hidden, cl::init(2.0), 2239b1176b0SAnna Thomas cl::desc("scale factor for the latch probability. Value should be greater " 2249b1176b0SAnna Thomas "than 1. Lower values are ignored")); 2259b1176b0SAnna Thomas 226feb475f4SMax Kazantsev static cl::opt<bool> PredicateWidenableBranchGuards( 227feb475f4SMax Kazantsev "loop-predication-predicate-widenable-branches-to-deopt", cl::Hidden, 228feb475f4SMax Kazantsev cl::desc("Whether or not we should predicate guards " 229feb475f4SMax Kazantsev "expressed as widenable branches to deoptimize blocks"), 230feb475f4SMax Kazantsev cl::init(true)); 231feb475f4SMax Kazantsev 2328fb3d57eSArtur Pilipenko namespace { 233a6c27804SArtur Pilipenko /// Represents an induction variable check: 234a6c27804SArtur Pilipenko /// icmp Pred, <induction variable>, <loop invariant limit> 235a6c27804SArtur Pilipenko struct LoopICmp { 236a6c27804SArtur Pilipenko ICmpInst::Predicate Pred; 237a6c27804SArtur Pilipenko const SCEVAddRecExpr *IV; 238a6c27804SArtur Pilipenko const SCEV *Limit; 239c488dfabSArtur Pilipenko LoopICmp(ICmpInst::Predicate Pred, const SCEVAddRecExpr *IV, 240c488dfabSArtur Pilipenko const SCEV *Limit) 241a6c27804SArtur Pilipenko : Pred(Pred), IV(IV), Limit(Limit) {} 242a6c27804SArtur Pilipenko LoopICmp() {} 24368797214SAnna Thomas void dump() { 24468797214SAnna Thomas dbgs() << "LoopICmp Pred = " << Pred << ", IV = " << *IV 24568797214SAnna Thomas << ", Limit = " << *Limit << "\n"; 24668797214SAnna Thomas } 247a6c27804SArtur Pilipenko }; 248c488dfabSArtur Pilipenko 249099eca83SPhilip Reames class LoopPredication { 25092a7177eSPhilip Reames AliasAnalysis *AA; 251c488dfabSArtur Pilipenko ScalarEvolution *SE; 2529b1176b0SAnna Thomas BranchProbabilityInfo *BPI; 253c488dfabSArtur Pilipenko 254c488dfabSArtur Pilipenko Loop *L; 255c488dfabSArtur Pilipenko const DataLayout *DL; 256c488dfabSArtur Pilipenko BasicBlock *Preheader; 257889dc1e3SArtur Pilipenko LoopICmp LatchCheck; 258c488dfabSArtur Pilipenko 25968797214SAnna Thomas bool isSupportedStep(const SCEV* Step); 26019afdf74SPhilip Reames Optional<LoopICmp> parseLoopICmp(ICmpInst *ICI); 261889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopLatchICmp(); 262a6c27804SArtur Pilipenko 263fbe64a2cSPhilip Reames /// Return an insertion point suitable for inserting a safe to speculate 264fbe64a2cSPhilip Reames /// instruction whose only user will be 'User' which has operands 'Ops'. A 265fbe64a2cSPhilip Reames /// trivial result would be the at the User itself, but we try to return a 266fbe64a2cSPhilip Reames /// loop invariant location if possible. 267fbe64a2cSPhilip Reames Instruction *findInsertPt(Instruction *User, ArrayRef<Value*> Ops); 268e46d77d1SPhilip Reames /// Same as above, *except* that this uses the SCEV definition of invariant 269e46d77d1SPhilip Reames /// which is that an expression *can be made* invariant via SCEVExpander. 270e46d77d1SPhilip Reames /// Thus, this version is only suitable for finding an insert point to be be 271e46d77d1SPhilip Reames /// passed to SCEVExpander! 272e46d77d1SPhilip Reames Instruction *findInsertPt(Instruction *User, ArrayRef<const SCEV*> Ops); 273fbe64a2cSPhilip Reames 27492a7177eSPhilip Reames /// Return true if the value is known to produce a single fixed value across 27592a7177eSPhilip Reames /// all iterations on which it executes. Note that this does not imply 27692a7177eSPhilip Reames /// speculation safety. That must be established seperately. 27792a7177eSPhilip Reames bool isLoopInvariantValue(const SCEV* S); 27892a7177eSPhilip Reames 279e46d77d1SPhilip Reames Value *expandCheck(SCEVExpander &Expander, Instruction *Guard, 2803d4e1082SPhilip Reames ICmpInst::Predicate Pred, const SCEV *LHS, 2813d4e1082SPhilip Reames const SCEV *RHS); 2826780ba65SArtur Pilipenko 2838fb3d57eSArtur Pilipenko Optional<Value *> widenICmpRangeCheck(ICmpInst *ICI, SCEVExpander &Expander, 284e46d77d1SPhilip Reames Instruction *Guard); 28568797214SAnna Thomas Optional<Value *> widenICmpRangeCheckIncrementingLoop(LoopICmp LatchCheck, 28668797214SAnna Thomas LoopICmp RangeCheck, 28768797214SAnna Thomas SCEVExpander &Expander, 288e46d77d1SPhilip Reames Instruction *Guard); 2897b360434SAnna Thomas Optional<Value *> widenICmpRangeCheckDecrementingLoop(LoopICmp LatchCheck, 2907b360434SAnna Thomas LoopICmp RangeCheck, 2917b360434SAnna Thomas SCEVExpander &Expander, 292e46d77d1SPhilip Reames Instruction *Guard); 293ca450878SMax Kazantsev unsigned collectChecks(SmallVectorImpl<Value *> &Checks, Value *Condition, 294e46d77d1SPhilip Reames SCEVExpander &Expander, Instruction *Guard); 2958fb3d57eSArtur Pilipenko bool widenGuardConditions(IntrinsicInst *II, SCEVExpander &Expander); 296feb475f4SMax Kazantsev bool widenWidenableBranchGuardConditions(BranchInst *Guard, SCEVExpander &Expander); 2979b1176b0SAnna Thomas // If the loop always exits through another block in the loop, we should not 2989b1176b0SAnna Thomas // predicate based on the latch check. For example, the latch check can be a 2999b1176b0SAnna Thomas // very coarse grained check and there can be more fine grained exit checks 3009b1176b0SAnna Thomas // within the loop. We identify such unprofitable loops through BPI. 3019b1176b0SAnna Thomas bool isLoopProfitableToPredicate(); 3029b1176b0SAnna Thomas 3031d02b13eSAnna Thomas // When the IV type is wider than the range operand type, we can still do loop 3041d02b13eSAnna Thomas // predication, by generating SCEVs for the range and latch that are of the 3051d02b13eSAnna Thomas // same type. We achieve this by generating a SCEV truncate expression for the 3061d02b13eSAnna Thomas // latch IV. This is done iff truncation of the IV is a safe operation, 3071d02b13eSAnna Thomas // without loss of information. 3081d02b13eSAnna Thomas // Another way to achieve this is by generating a wider type SCEV for the 3091d02b13eSAnna Thomas // range check operand, however, this needs a more involved check that 3101d02b13eSAnna Thomas // operands do not overflow. This can lead to loss of information when the 3111d02b13eSAnna Thomas // range operand is of the form: add i32 %offset, %iv. We need to prove that 3121d02b13eSAnna Thomas // sext(x + y) is same as sext(x) + sext(y). 3131d02b13eSAnna Thomas // This function returns true if we can safely represent the IV type in 3141d02b13eSAnna Thomas // the RangeCheckType without loss of information. 3151d02b13eSAnna Thomas bool isSafeToTruncateWideIVType(Type *RangeCheckType); 3161d02b13eSAnna Thomas // Return the loopLatchCheck corresponding to the RangeCheckType if safe to do 3171d02b13eSAnna Thomas // so. 3181d02b13eSAnna Thomas Optional<LoopICmp> generateLoopLatchCheck(Type *RangeCheckType); 319ebc9031bSSerguei Katkov 3208fb3d57eSArtur Pilipenko public: 32192a7177eSPhilip Reames LoopPredication(AliasAnalysis *AA, ScalarEvolution *SE, 32292a7177eSPhilip Reames BranchProbabilityInfo *BPI) 32392a7177eSPhilip Reames : AA(AA), SE(SE), BPI(BPI){}; 3248fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L); 3258fb3d57eSArtur Pilipenko }; 3268fb3d57eSArtur Pilipenko 3278fb3d57eSArtur Pilipenko class LoopPredicationLegacyPass : public LoopPass { 3288fb3d57eSArtur Pilipenko public: 3298fb3d57eSArtur Pilipenko static char ID; 3308fb3d57eSArtur Pilipenko LoopPredicationLegacyPass() : LoopPass(ID) { 3318fb3d57eSArtur Pilipenko initializeLoopPredicationLegacyPassPass(*PassRegistry::getPassRegistry()); 3328fb3d57eSArtur Pilipenko } 3338fb3d57eSArtur Pilipenko 3348fb3d57eSArtur Pilipenko void getAnalysisUsage(AnalysisUsage &AU) const override { 3359b1176b0SAnna Thomas AU.addRequired<BranchProbabilityInfoWrapperPass>(); 3368fb3d57eSArtur Pilipenko getLoopAnalysisUsage(AU); 3378fb3d57eSArtur Pilipenko } 3388fb3d57eSArtur Pilipenko 3398fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L, LPPassManager &LPM) override { 3408fb3d57eSArtur Pilipenko if (skipLoop(L)) 3418fb3d57eSArtur Pilipenko return false; 3428fb3d57eSArtur Pilipenko auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); 3439b1176b0SAnna Thomas BranchProbabilityInfo &BPI = 3449b1176b0SAnna Thomas getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI(); 34592a7177eSPhilip Reames auto *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults(); 34692a7177eSPhilip Reames LoopPredication LP(AA, SE, &BPI); 3478fb3d57eSArtur Pilipenko return LP.runOnLoop(L); 3488fb3d57eSArtur Pilipenko } 3498fb3d57eSArtur Pilipenko }; 3508fb3d57eSArtur Pilipenko 3518fb3d57eSArtur Pilipenko char LoopPredicationLegacyPass::ID = 0; 3528fb3d57eSArtur Pilipenko } // end namespace llvm 3538fb3d57eSArtur Pilipenko 3548fb3d57eSArtur Pilipenko INITIALIZE_PASS_BEGIN(LoopPredicationLegacyPass, "loop-predication", 3558fb3d57eSArtur Pilipenko "Loop predication", false, false) 3569b1176b0SAnna Thomas INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass) 3578fb3d57eSArtur Pilipenko INITIALIZE_PASS_DEPENDENCY(LoopPass) 3588fb3d57eSArtur Pilipenko INITIALIZE_PASS_END(LoopPredicationLegacyPass, "loop-predication", 3598fb3d57eSArtur Pilipenko "Loop predication", false, false) 3608fb3d57eSArtur Pilipenko 3618fb3d57eSArtur Pilipenko Pass *llvm::createLoopPredicationPass() { 3628fb3d57eSArtur Pilipenko return new LoopPredicationLegacyPass(); 3638fb3d57eSArtur Pilipenko } 3648fb3d57eSArtur Pilipenko 3658fb3d57eSArtur Pilipenko PreservedAnalyses LoopPredicationPass::run(Loop &L, LoopAnalysisManager &AM, 3668fb3d57eSArtur Pilipenko LoopStandardAnalysisResults &AR, 3678fb3d57eSArtur Pilipenko LPMUpdater &U) { 3689b1176b0SAnna Thomas const auto &FAM = 3699b1176b0SAnna Thomas AM.getResult<FunctionAnalysisManagerLoopProxy>(L, AR).getManager(); 3709b1176b0SAnna Thomas Function *F = L.getHeader()->getParent(); 3719b1176b0SAnna Thomas auto *BPI = FAM.getCachedResult<BranchProbabilityAnalysis>(*F); 37292a7177eSPhilip Reames LoopPredication LP(&AR.AA, &AR.SE, BPI); 3738fb3d57eSArtur Pilipenko if (!LP.runOnLoop(&L)) 3748fb3d57eSArtur Pilipenko return PreservedAnalyses::all(); 3758fb3d57eSArtur Pilipenko 3768fb3d57eSArtur Pilipenko return getLoopPassPreservedAnalyses(); 3778fb3d57eSArtur Pilipenko } 3788fb3d57eSArtur Pilipenko 379099eca83SPhilip Reames Optional<LoopICmp> 38019afdf74SPhilip Reames LoopPredication::parseLoopICmp(ICmpInst *ICI) { 38119afdf74SPhilip Reames auto Pred = ICI->getPredicate(); 38219afdf74SPhilip Reames auto *LHS = ICI->getOperand(0); 38319afdf74SPhilip Reames auto *RHS = ICI->getOperand(1); 38419afdf74SPhilip Reames 385a6c27804SArtur Pilipenko const SCEV *LHSS = SE->getSCEV(LHS); 386a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(LHSS)) 387a6c27804SArtur Pilipenko return None; 388a6c27804SArtur Pilipenko const SCEV *RHSS = SE->getSCEV(RHS); 389a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(RHSS)) 390a6c27804SArtur Pilipenko return None; 391a6c27804SArtur Pilipenko 392a6c27804SArtur Pilipenko // Canonicalize RHS to be loop invariant bound, LHS - a loop computable IV 393a6c27804SArtur Pilipenko if (SE->isLoopInvariant(LHSS, L)) { 394a6c27804SArtur Pilipenko std::swap(LHS, RHS); 395a6c27804SArtur Pilipenko std::swap(LHSS, RHSS); 396a6c27804SArtur Pilipenko Pred = ICmpInst::getSwappedPredicate(Pred); 397a6c27804SArtur Pilipenko } 398a6c27804SArtur Pilipenko 399a6c27804SArtur Pilipenko const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(LHSS); 400a6c27804SArtur Pilipenko if (!AR || AR->getLoop() != L) 401a6c27804SArtur Pilipenko return None; 402a6c27804SArtur Pilipenko 403a6c27804SArtur Pilipenko return LoopICmp(Pred, AR, RHSS); 404a6c27804SArtur Pilipenko } 405a6c27804SArtur Pilipenko 4066780ba65SArtur Pilipenko Value *LoopPredication::expandCheck(SCEVExpander &Expander, 407e46d77d1SPhilip Reames Instruction *Guard, 4086780ba65SArtur Pilipenko ICmpInst::Predicate Pred, const SCEV *LHS, 4093d4e1082SPhilip Reames const SCEV *RHS) { 4106780ba65SArtur Pilipenko Type *Ty = LHS->getType(); 4116780ba65SArtur Pilipenko assert(Ty == RHS->getType() && "expandCheck operands have different types?"); 412ead69ee4SArtur Pilipenko 413e46d77d1SPhilip Reames if (SE->isLoopInvariant(LHS, L) && SE->isLoopInvariant(RHS, L)) { 414e46d77d1SPhilip Reames IRBuilder<> Builder(Guard); 415ead69ee4SArtur Pilipenko if (SE->isLoopEntryGuardedByCond(L, Pred, LHS, RHS)) 416ead69ee4SArtur Pilipenko return Builder.getTrue(); 41705e3e554SPhilip Reames if (SE->isLoopEntryGuardedByCond(L, ICmpInst::getInversePredicate(Pred), 41805e3e554SPhilip Reames LHS, RHS)) 41905e3e554SPhilip Reames return Builder.getFalse(); 420e46d77d1SPhilip Reames } 421ead69ee4SArtur Pilipenko 422e46d77d1SPhilip Reames Value *LHSV = Expander.expandCodeFor(LHS, Ty, findInsertPt(Guard, {LHS})); 423e46d77d1SPhilip Reames Value *RHSV = Expander.expandCodeFor(RHS, Ty, findInsertPt(Guard, {RHS})); 424e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, {LHSV, RHSV})); 4256780ba65SArtur Pilipenko return Builder.CreateICmp(Pred, LHSV, RHSV); 4266780ba65SArtur Pilipenko } 4276780ba65SArtur Pilipenko 428099eca83SPhilip Reames Optional<LoopICmp> 4291d02b13eSAnna Thomas LoopPredication::generateLoopLatchCheck(Type *RangeCheckType) { 4301d02b13eSAnna Thomas 4311d02b13eSAnna Thomas auto *LatchType = LatchCheck.IV->getType(); 4321d02b13eSAnna Thomas if (RangeCheckType == LatchType) 4331d02b13eSAnna Thomas return LatchCheck; 4341d02b13eSAnna Thomas // For now, bail out if latch type is narrower than range type. 4351d02b13eSAnna Thomas if (DL->getTypeSizeInBits(LatchType) < DL->getTypeSizeInBits(RangeCheckType)) 4361d02b13eSAnna Thomas return None; 4371d02b13eSAnna Thomas if (!isSafeToTruncateWideIVType(RangeCheckType)) 4381d02b13eSAnna Thomas return None; 4391d02b13eSAnna Thomas // We can now safely identify the truncated version of the IV and limit for 4401d02b13eSAnna Thomas // RangeCheckType. 4411d02b13eSAnna Thomas LoopICmp NewLatchCheck; 4421d02b13eSAnna Thomas NewLatchCheck.Pred = LatchCheck.Pred; 4431d02b13eSAnna Thomas NewLatchCheck.IV = dyn_cast<SCEVAddRecExpr>( 4441d02b13eSAnna Thomas SE->getTruncateExpr(LatchCheck.IV, RangeCheckType)); 4451d02b13eSAnna Thomas if (!NewLatchCheck.IV) 4461d02b13eSAnna Thomas return None; 4471d02b13eSAnna Thomas NewLatchCheck.Limit = SE->getTruncateExpr(LatchCheck.Limit, RangeCheckType); 448d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "IV of type: " << *LatchType 449d34e60caSNicola Zaghen << "can be represented as range check type:" 450d34e60caSNicola Zaghen << *RangeCheckType << "\n"); 451d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "LatchCheck.IV: " << *NewLatchCheck.IV << "\n"); 452d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "LatchCheck.Limit: " << *NewLatchCheck.Limit << "\n"); 4531d02b13eSAnna Thomas return NewLatchCheck; 4541d02b13eSAnna Thomas } 4551d02b13eSAnna Thomas 45668797214SAnna Thomas bool LoopPredication::isSupportedStep(const SCEV* Step) { 4577b360434SAnna Thomas return Step->isOne() || (Step->isAllOnesValue() && EnableCountDownLoop); 4581d02b13eSAnna Thomas } 4598fb3d57eSArtur Pilipenko 460fbe64a2cSPhilip Reames Instruction *LoopPredication::findInsertPt(Instruction *Use, 461fbe64a2cSPhilip Reames ArrayRef<Value*> Ops) { 462fbe64a2cSPhilip Reames for (Value *Op : Ops) 463fbe64a2cSPhilip Reames if (!L->isLoopInvariant(Op)) 464fbe64a2cSPhilip Reames return Use; 465fbe64a2cSPhilip Reames return Preheader->getTerminator(); 466fbe64a2cSPhilip Reames } 467fbe64a2cSPhilip Reames 468e46d77d1SPhilip Reames Instruction *LoopPredication::findInsertPt(Instruction *Use, 469e46d77d1SPhilip Reames ArrayRef<const SCEV*> Ops) { 47092a7177eSPhilip Reames // Subtlety: SCEV considers things to be invariant if the value produced is 47192a7177eSPhilip Reames // the same across iterations. This is not the same as being able to 47292a7177eSPhilip Reames // evaluate outside the loop, which is what we actually need here. 473e46d77d1SPhilip Reames for (const SCEV *Op : Ops) 47492a7177eSPhilip Reames if (!SE->isLoopInvariant(Op, L) || 47592a7177eSPhilip Reames !isSafeToExpandAt(Op, Preheader->getTerminator(), *SE)) 476e46d77d1SPhilip Reames return Use; 477e46d77d1SPhilip Reames return Preheader->getTerminator(); 478e46d77d1SPhilip Reames } 479e46d77d1SPhilip Reames 48092a7177eSPhilip Reames bool LoopPredication::isLoopInvariantValue(const SCEV* S) { 48192a7177eSPhilip Reames // Handling expressions which produce invariant results, but *haven't* yet 48292a7177eSPhilip Reames // been removed from the loop serves two important purposes. 48392a7177eSPhilip Reames // 1) Most importantly, it resolves a pass ordering cycle which would 48492a7177eSPhilip Reames // otherwise need us to iteration licm, loop-predication, and either 48592a7177eSPhilip Reames // loop-unswitch or loop-peeling to make progress on examples with lots of 48692a7177eSPhilip Reames // predicable range checks in a row. (Since, in the general case, we can't 48792a7177eSPhilip Reames // hoist the length checks until the dominating checks have been discharged 48892a7177eSPhilip Reames // as we can't prove doing so is safe.) 48992a7177eSPhilip Reames // 2) As a nice side effect, this exposes the value of peeling or unswitching 49092a7177eSPhilip Reames // much more obviously in the IR. Otherwise, the cost modeling for other 49192a7177eSPhilip Reames // transforms would end up needing to duplicate all of this logic to model a 49292a7177eSPhilip Reames // check which becomes predictable based on a modeled peel or unswitch. 49392a7177eSPhilip Reames // 49492a7177eSPhilip Reames // The cost of doing so in the worst case is an extra fill from the stack in 49592a7177eSPhilip Reames // the loop to materialize the loop invariant test value instead of checking 49692a7177eSPhilip Reames // against the original IV which is presumable in a register inside the loop. 49792a7177eSPhilip Reames // Such cases are presumably rare, and hint at missing oppurtunities for 49892a7177eSPhilip Reames // other passes. 499e46d77d1SPhilip Reames 50092a7177eSPhilip Reames if (SE->isLoopInvariant(S, L)) 50192a7177eSPhilip Reames // Note: This the SCEV variant, so the original Value* may be within the 50292a7177eSPhilip Reames // loop even though SCEV has proven it is loop invariant. 50392a7177eSPhilip Reames return true; 50492a7177eSPhilip Reames 50592a7177eSPhilip Reames // Handle a particular important case which SCEV doesn't yet know about which 50692a7177eSPhilip Reames // shows up in range checks on arrays with immutable lengths. 50792a7177eSPhilip Reames // TODO: This should be sunk inside SCEV. 50892a7177eSPhilip Reames if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S)) 50992a7177eSPhilip Reames if (const auto *LI = dyn_cast<LoadInst>(U->getValue())) 510adf288c5SPhilip Reames if (LI->isUnordered() && L->hasLoopInvariantOperands(LI)) 51192a7177eSPhilip Reames if (AA->pointsToConstantMemory(LI->getOperand(0)) || 51292a7177eSPhilip Reames LI->getMetadata(LLVMContext::MD_invariant_load) != nullptr) 51392a7177eSPhilip Reames return true; 51492a7177eSPhilip Reames return false; 51568797214SAnna Thomas } 51668797214SAnna Thomas 51768797214SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheckIncrementingLoop( 518099eca83SPhilip Reames LoopICmp LatchCheck, LoopICmp RangeCheck, 519e46d77d1SPhilip Reames SCEVExpander &Expander, Instruction *Guard) { 52068797214SAnna Thomas auto *Ty = RangeCheck.IV->getType(); 52168797214SAnna Thomas // Generate the widened condition for the forward loop: 5228aadc643SArtur Pilipenko // guardStart u< guardLimit && 5238aadc643SArtur Pilipenko // latchLimit <pred> guardLimit - 1 - guardStart + latchStart 524b4527e1cSArtur Pilipenko // where <pred> depends on the latch condition predicate. See the file 525b4527e1cSArtur Pilipenko // header comment for the reasoning. 52668797214SAnna Thomas // guardLimit - guardStart + latchStart - 1 52768797214SAnna Thomas const SCEV *GuardStart = RangeCheck.IV->getStart(); 52868797214SAnna Thomas const SCEV *GuardLimit = RangeCheck.Limit; 52968797214SAnna Thomas const SCEV *LatchStart = LatchCheck.IV->getStart(); 53068797214SAnna Thomas const SCEV *LatchLimit = LatchCheck.Limit; 53192a7177eSPhilip Reames // Subtlety: We need all the values to be *invariant* across all iterations, 53292a7177eSPhilip Reames // but we only need to check expansion safety for those which *aren't* 53392a7177eSPhilip Reames // already guaranteed to dominate the guard. 53492a7177eSPhilip Reames if (!isLoopInvariantValue(GuardStart) || 53592a7177eSPhilip Reames !isLoopInvariantValue(GuardLimit) || 53692a7177eSPhilip Reames !isLoopInvariantValue(LatchStart) || 53792a7177eSPhilip Reames !isLoopInvariantValue(LatchLimit)) { 53892a7177eSPhilip Reames LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 53992a7177eSPhilip Reames return None; 54092a7177eSPhilip Reames } 54192a7177eSPhilip Reames if (!isSafeToExpandAt(LatchStart, Guard, *SE) || 54292a7177eSPhilip Reames !isSafeToExpandAt(LatchLimit, Guard, *SE)) { 54392a7177eSPhilip Reames LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 54492a7177eSPhilip Reames return None; 54592a7177eSPhilip Reames } 5468aadc643SArtur Pilipenko 5478aadc643SArtur Pilipenko // guardLimit - guardStart + latchStart - 1 5488aadc643SArtur Pilipenko const SCEV *RHS = 5498aadc643SArtur Pilipenko SE->getAddExpr(SE->getMinusSCEV(GuardLimit, GuardStart), 5508aadc643SArtur Pilipenko SE->getMinusSCEV(LatchStart, SE->getOne(Ty))); 5513cb4c34aSSerguei Katkov auto LimitCheckPred = 5523cb4c34aSSerguei Katkov ICmpInst::getFlippedStrictnessPredicate(LatchCheck.Pred); 553aab28666SArtur Pilipenko 554d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "LHS: " << *LatchLimit << "\n"); 555d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "RHS: " << *RHS << "\n"); 556d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Pred: " << LimitCheckPred << "\n"); 5578aadc643SArtur Pilipenko 5588aadc643SArtur Pilipenko auto *LimitCheck = 559e46d77d1SPhilip Reames expandCheck(Expander, Guard, LimitCheckPred, LatchLimit, RHS); 560e46d77d1SPhilip Reames auto *FirstIterationCheck = expandCheck(Expander, Guard, RangeCheck.Pred, 5613d4e1082SPhilip Reames GuardStart, GuardLimit); 562e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck})); 563889dc1e3SArtur Pilipenko return Builder.CreateAnd(FirstIterationCheck, LimitCheck); 5648fb3d57eSArtur Pilipenko } 5657b360434SAnna Thomas 5667b360434SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheckDecrementingLoop( 567099eca83SPhilip Reames LoopICmp LatchCheck, LoopICmp RangeCheck, 568e46d77d1SPhilip Reames SCEVExpander &Expander, Instruction *Guard) { 5697b360434SAnna Thomas auto *Ty = RangeCheck.IV->getType(); 5707b360434SAnna Thomas const SCEV *GuardStart = RangeCheck.IV->getStart(); 5717b360434SAnna Thomas const SCEV *GuardLimit = RangeCheck.Limit; 57292a7177eSPhilip Reames const SCEV *LatchStart = LatchCheck.IV->getStart(); 5737b360434SAnna Thomas const SCEV *LatchLimit = LatchCheck.Limit; 57492a7177eSPhilip Reames // Subtlety: We need all the values to be *invariant* across all iterations, 57592a7177eSPhilip Reames // but we only need to check expansion safety for those which *aren't* 57692a7177eSPhilip Reames // already guaranteed to dominate the guard. 57792a7177eSPhilip Reames if (!isLoopInvariantValue(GuardStart) || 57892a7177eSPhilip Reames !isLoopInvariantValue(GuardLimit) || 57992a7177eSPhilip Reames !isLoopInvariantValue(LatchStart) || 58092a7177eSPhilip Reames !isLoopInvariantValue(LatchLimit)) { 58192a7177eSPhilip Reames LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 58292a7177eSPhilip Reames return None; 58392a7177eSPhilip Reames } 58492a7177eSPhilip Reames if (!isSafeToExpandAt(LatchStart, Guard, *SE) || 58592a7177eSPhilip Reames !isSafeToExpandAt(LatchLimit, Guard, *SE)) { 586d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 5877b360434SAnna Thomas return None; 5887b360434SAnna Thomas } 5897b360434SAnna Thomas // The decrement of the latch check IV should be the same as the 5907b360434SAnna Thomas // rangeCheckIV. 5917b360434SAnna Thomas auto *PostDecLatchCheckIV = LatchCheck.IV->getPostIncExpr(*SE); 5927b360434SAnna Thomas if (RangeCheck.IV != PostDecLatchCheckIV) { 593d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Not the same. PostDecLatchCheckIV: " 5947b360434SAnna Thomas << *PostDecLatchCheckIV 5957b360434SAnna Thomas << " and RangeCheckIV: " << *RangeCheck.IV << "\n"); 5967b360434SAnna Thomas return None; 5977b360434SAnna Thomas } 5987b360434SAnna Thomas 5997b360434SAnna Thomas // Generate the widened condition for CountDownLoop: 6007b360434SAnna Thomas // guardStart u< guardLimit && 6017b360434SAnna Thomas // latchLimit <pred> 1. 6027b360434SAnna Thomas // See the header comment for reasoning of the checks. 6033cb4c34aSSerguei Katkov auto LimitCheckPred = 6043cb4c34aSSerguei Katkov ICmpInst::getFlippedStrictnessPredicate(LatchCheck.Pred); 605e46d77d1SPhilip Reames auto *FirstIterationCheck = expandCheck(Expander, Guard, 606e46d77d1SPhilip Reames ICmpInst::ICMP_ULT, 6073d4e1082SPhilip Reames GuardStart, GuardLimit); 608e46d77d1SPhilip Reames auto *LimitCheck = expandCheck(Expander, Guard, LimitCheckPred, LatchLimit, 6093d4e1082SPhilip Reames SE->getOne(Ty)); 610e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck})); 6117b360434SAnna Thomas return Builder.CreateAnd(FirstIterationCheck, LimitCheck); 6127b360434SAnna Thomas } 6137b360434SAnna Thomas 614099eca83SPhilip Reames static void normalizePredicate(ScalarEvolution *SE, Loop *L, 615099eca83SPhilip Reames LoopICmp& RC) { 616099eca83SPhilip Reames // LFTR canonicalizes checks to the ICMP_NE form instead of an ULT/SLT form. 617099eca83SPhilip Reames // Normalize back to the ULT/SLT form for ease of handling. 618099eca83SPhilip Reames if (RC.Pred == ICmpInst::ICMP_NE && 619099eca83SPhilip Reames RC.IV->getStepRecurrence(*SE)->isOne() && 620099eca83SPhilip Reames SE->isKnownPredicate(ICmpInst::ICMP_ULE, RC.IV->getStart(), RC.Limit)) 621099eca83SPhilip Reames RC.Pred = ICmpInst::ICMP_ULT; 622099eca83SPhilip Reames } 623099eca83SPhilip Reames 624099eca83SPhilip Reames 62568797214SAnna Thomas /// If ICI can be widened to a loop invariant condition emits the loop 62668797214SAnna Thomas /// invariant condition in the loop preheader and return it, otherwise 62768797214SAnna Thomas /// returns None. 62868797214SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheck(ICmpInst *ICI, 62968797214SAnna Thomas SCEVExpander &Expander, 630e46d77d1SPhilip Reames Instruction *Guard) { 631d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Analyzing ICmpInst condition:\n"); 632d34e60caSNicola Zaghen LLVM_DEBUG(ICI->dump()); 63368797214SAnna Thomas 63468797214SAnna Thomas // parseLoopStructure guarantees that the latch condition is: 63568797214SAnna Thomas // ++i <pred> latchLimit, where <pred> is u<, u<=, s<, or s<=. 63668797214SAnna Thomas // We are looking for the range checks of the form: 63768797214SAnna Thomas // i u< guardLimit 63868797214SAnna Thomas auto RangeCheck = parseLoopICmp(ICI); 63968797214SAnna Thomas if (!RangeCheck) { 640d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 64168797214SAnna Thomas return None; 64268797214SAnna Thomas } 643d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Guard check:\n"); 644d34e60caSNicola Zaghen LLVM_DEBUG(RangeCheck->dump()); 64568797214SAnna Thomas if (RangeCheck->Pred != ICmpInst::ICMP_ULT) { 646d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Unsupported range check predicate(" 647d34e60caSNicola Zaghen << RangeCheck->Pred << ")!\n"); 64868797214SAnna Thomas return None; 64968797214SAnna Thomas } 65068797214SAnna Thomas auto *RangeCheckIV = RangeCheck->IV; 65168797214SAnna Thomas if (!RangeCheckIV->isAffine()) { 652d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Range check IV is not affine!\n"); 65368797214SAnna Thomas return None; 65468797214SAnna Thomas } 65568797214SAnna Thomas auto *Step = RangeCheckIV->getStepRecurrence(*SE); 65668797214SAnna Thomas // We cannot just compare with latch IV step because the latch and range IVs 65768797214SAnna Thomas // may have different types. 65868797214SAnna Thomas if (!isSupportedStep(Step)) { 659d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Range check and latch have IVs different steps!\n"); 66068797214SAnna Thomas return None; 66168797214SAnna Thomas } 66268797214SAnna Thomas auto *Ty = RangeCheckIV->getType(); 66368797214SAnna Thomas auto CurrLatchCheckOpt = generateLoopLatchCheck(Ty); 66468797214SAnna Thomas if (!CurrLatchCheckOpt) { 665d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to generate a loop latch check " 66668797214SAnna Thomas "corresponding to range type: " 66768797214SAnna Thomas << *Ty << "\n"); 66868797214SAnna Thomas return None; 66968797214SAnna Thomas } 67068797214SAnna Thomas 67168797214SAnna Thomas LoopICmp CurrLatchCheck = *CurrLatchCheckOpt; 6727b360434SAnna Thomas // At this point, the range and latch step should have the same type, but need 6737b360434SAnna Thomas // not have the same value (we support both 1 and -1 steps). 6747b360434SAnna Thomas assert(Step->getType() == 6757b360434SAnna Thomas CurrLatchCheck.IV->getStepRecurrence(*SE)->getType() && 6767b360434SAnna Thomas "Range and latch steps should be of same type!"); 6777b360434SAnna Thomas if (Step != CurrLatchCheck.IV->getStepRecurrence(*SE)) { 678d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Range and latch have different step values!\n"); 6797b360434SAnna Thomas return None; 6807b360434SAnna Thomas } 68168797214SAnna Thomas 6827b360434SAnna Thomas if (Step->isOne()) 68368797214SAnna Thomas return widenICmpRangeCheckIncrementingLoop(CurrLatchCheck, *RangeCheck, 684e46d77d1SPhilip Reames Expander, Guard); 6857b360434SAnna Thomas else { 6867b360434SAnna Thomas assert(Step->isAllOnesValue() && "Step should be -1!"); 6877b360434SAnna Thomas return widenICmpRangeCheckDecrementingLoop(CurrLatchCheck, *RangeCheck, 688e46d77d1SPhilip Reames Expander, Guard); 6897b360434SAnna Thomas } 69068797214SAnna Thomas } 6918fb3d57eSArtur Pilipenko 692ca450878SMax Kazantsev unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks, 693ca450878SMax Kazantsev Value *Condition, 694ca450878SMax Kazantsev SCEVExpander &Expander, 695e46d77d1SPhilip Reames Instruction *Guard) { 696ca450878SMax Kazantsev unsigned NumWidened = 0; 6978fb3d57eSArtur Pilipenko // The guard condition is expected to be in form of: 6988fb3d57eSArtur Pilipenko // cond1 && cond2 && cond3 ... 6990909ca13SHiroshi Inoue // Iterate over subconditions looking for icmp conditions which can be 7008fb3d57eSArtur Pilipenko // widened across loop iterations. Widening these conditions remember the 7018fb3d57eSArtur Pilipenko // resulting list of subconditions in Checks vector. 702ca450878SMax Kazantsev SmallVector<Value *, 4> Worklist(1, Condition); 7038fb3d57eSArtur Pilipenko SmallPtrSet<Value *, 4> Visited; 704adb3ece2SPhilip Reames Value *WideableCond = nullptr; 7058fb3d57eSArtur Pilipenko do { 7068fb3d57eSArtur Pilipenko Value *Condition = Worklist.pop_back_val(); 7078fb3d57eSArtur Pilipenko if (!Visited.insert(Condition).second) 7088fb3d57eSArtur Pilipenko continue; 7098fb3d57eSArtur Pilipenko 7108fb3d57eSArtur Pilipenko Value *LHS, *RHS; 7118fb3d57eSArtur Pilipenko using namespace llvm::PatternMatch; 7128fb3d57eSArtur Pilipenko if (match(Condition, m_And(m_Value(LHS), m_Value(RHS)))) { 7138fb3d57eSArtur Pilipenko Worklist.push_back(LHS); 7148fb3d57eSArtur Pilipenko Worklist.push_back(RHS); 7158fb3d57eSArtur Pilipenko continue; 7168fb3d57eSArtur Pilipenko } 7178fb3d57eSArtur Pilipenko 718adb3ece2SPhilip Reames if (match(Condition, 719adb3ece2SPhilip Reames m_Intrinsic<Intrinsic::experimental_widenable_condition>())) { 720adb3ece2SPhilip Reames // Pick any, we don't care which 721adb3ece2SPhilip Reames WideableCond = Condition; 722adb3ece2SPhilip Reames continue; 723adb3ece2SPhilip Reames } 724adb3ece2SPhilip Reames 7258fb3d57eSArtur Pilipenko if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) { 7263d4e1082SPhilip Reames if (auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander, 727e46d77d1SPhilip Reames Guard)) { 7288fb3d57eSArtur Pilipenko Checks.push_back(NewRangeCheck.getValue()); 7298fb3d57eSArtur Pilipenko NumWidened++; 7308fb3d57eSArtur Pilipenko continue; 7318fb3d57eSArtur Pilipenko } 7328fb3d57eSArtur Pilipenko } 7338fb3d57eSArtur Pilipenko 7348fb3d57eSArtur Pilipenko // Save the condition as is if we can't widen it 7358fb3d57eSArtur Pilipenko Checks.push_back(Condition); 736ca450878SMax Kazantsev } while (!Worklist.empty()); 737adb3ece2SPhilip Reames // At the moment, our matching logic for wideable conditions implicitly 738adb3ece2SPhilip Reames // assumes we preserve the form: (br (and Cond, WC())). FIXME 739adb3ece2SPhilip Reames // Note that if there were multiple calls to wideable condition in the 740adb3ece2SPhilip Reames // traversal, we only need to keep one, and which one is arbitrary. 741adb3ece2SPhilip Reames if (WideableCond) 742adb3ece2SPhilip Reames Checks.push_back(WideableCond); 743ca450878SMax Kazantsev return NumWidened; 744ca450878SMax Kazantsev } 7458fb3d57eSArtur Pilipenko 746ca450878SMax Kazantsev bool LoopPredication::widenGuardConditions(IntrinsicInst *Guard, 747ca450878SMax Kazantsev SCEVExpander &Expander) { 748ca450878SMax Kazantsev LLVM_DEBUG(dbgs() << "Processing guard:\n"); 749ca450878SMax Kazantsev LLVM_DEBUG(Guard->dump()); 750ca450878SMax Kazantsev 751ca450878SMax Kazantsev TotalConsidered++; 752ca450878SMax Kazantsev SmallVector<Value *, 4> Checks; 753ca450878SMax Kazantsev unsigned NumWidened = collectChecks(Checks, Guard->getOperand(0), Expander, 754e46d77d1SPhilip Reames Guard); 7558fb3d57eSArtur Pilipenko if (NumWidened == 0) 7568fb3d57eSArtur Pilipenko return false; 7578fb3d57eSArtur Pilipenko 758c297e84bSFedor Sergeev TotalWidened += NumWidened; 759c297e84bSFedor Sergeev 7608fb3d57eSArtur Pilipenko // Emit the new guard condition 761e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, Checks)); 7628fb3d57eSArtur Pilipenko Value *LastCheck = nullptr; 7638fb3d57eSArtur Pilipenko for (auto *Check : Checks) 7648fb3d57eSArtur Pilipenko if (!LastCheck) 7658fb3d57eSArtur Pilipenko LastCheck = Check; 7668fb3d57eSArtur Pilipenko else 7678fb3d57eSArtur Pilipenko LastCheck = Builder.CreateAnd(LastCheck, Check); 768d109e2a7SPhilip Reames auto *OldCond = Guard->getOperand(0); 7698fb3d57eSArtur Pilipenko Guard->setOperand(0, LastCheck); 770d109e2a7SPhilip Reames RecursivelyDeleteTriviallyDeadInstructions(OldCond); 7718fb3d57eSArtur Pilipenko 772d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Widened checks = " << NumWidened << "\n"); 7738fb3d57eSArtur Pilipenko return true; 7748fb3d57eSArtur Pilipenko } 7758fb3d57eSArtur Pilipenko 776feb475f4SMax Kazantsev bool LoopPredication::widenWidenableBranchGuardConditions( 777f608678fSPhilip Reames BranchInst *BI, SCEVExpander &Expander) { 778f608678fSPhilip Reames assert(isGuardAsWidenableBranch(BI) && "Must be!"); 779feb475f4SMax Kazantsev LLVM_DEBUG(dbgs() << "Processing guard:\n"); 780f608678fSPhilip Reames LLVM_DEBUG(BI->dump()); 781feb475f4SMax Kazantsev 782feb475f4SMax Kazantsev TotalConsidered++; 783feb475f4SMax Kazantsev SmallVector<Value *, 4> Checks; 784adb3ece2SPhilip Reames unsigned NumWidened = collectChecks(Checks, BI->getCondition(), 785e46d77d1SPhilip Reames Expander, BI); 786feb475f4SMax Kazantsev if (NumWidened == 0) 787feb475f4SMax Kazantsev return false; 788feb475f4SMax Kazantsev 789feb475f4SMax Kazantsev TotalWidened += NumWidened; 790feb475f4SMax Kazantsev 791feb475f4SMax Kazantsev // Emit the new guard condition 792e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(BI, Checks)); 793feb475f4SMax Kazantsev Value *LastCheck = nullptr; 794feb475f4SMax Kazantsev for (auto *Check : Checks) 795feb475f4SMax Kazantsev if (!LastCheck) 796feb475f4SMax Kazantsev LastCheck = Check; 797feb475f4SMax Kazantsev else 798feb475f4SMax Kazantsev LastCheck = Builder.CreateAnd(LastCheck, Check); 799adb3ece2SPhilip Reames auto *OldCond = BI->getCondition(); 800adb3ece2SPhilip Reames BI->setCondition(LastCheck); 801f608678fSPhilip Reames assert(isGuardAsWidenableBranch(BI) && 802feb475f4SMax Kazantsev "Stopped being a guard after transform?"); 803d109e2a7SPhilip Reames RecursivelyDeleteTriviallyDeadInstructions(OldCond); 804feb475f4SMax Kazantsev 805feb475f4SMax Kazantsev LLVM_DEBUG(dbgs() << "Widened checks = " << NumWidened << "\n"); 806feb475f4SMax Kazantsev return true; 807feb475f4SMax Kazantsev } 808feb475f4SMax Kazantsev 809099eca83SPhilip Reames Optional<LoopICmp> LoopPredication::parseLoopLatchICmp() { 810889dc1e3SArtur Pilipenko using namespace PatternMatch; 811889dc1e3SArtur Pilipenko 812889dc1e3SArtur Pilipenko BasicBlock *LoopLatch = L->getLoopLatch(); 813889dc1e3SArtur Pilipenko if (!LoopLatch) { 814d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "The loop doesn't have a single latch!\n"); 815889dc1e3SArtur Pilipenko return None; 816889dc1e3SArtur Pilipenko } 817889dc1e3SArtur Pilipenko 81819afdf74SPhilip Reames auto *BI = dyn_cast<BranchInst>(LoopLatch->getTerminator()); 81919afdf74SPhilip Reames if (!BI) { 820d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to match the latch terminator!\n"); 821889dc1e3SArtur Pilipenko return None; 822889dc1e3SArtur Pilipenko } 82319afdf74SPhilip Reames BasicBlock *TrueDest = BI->getSuccessor(0); 824*4e875464SRichard Trieu assert( 825*4e875464SRichard Trieu (TrueDest == L->getHeader() || BI->getSuccessor(1) == L->getHeader()) && 826889dc1e3SArtur Pilipenko "One of the latch's destinations must be the header"); 827889dc1e3SArtur Pilipenko 82819afdf74SPhilip Reames auto *ICI = dyn_cast<ICmpInst>(BI->getCondition()); 82919afdf74SPhilip Reames if (!ICI || !BI->isConditional()) { 83019afdf74SPhilip Reames LLVM_DEBUG(dbgs() << "Failed to match the latch condition!\n"); 83119afdf74SPhilip Reames return None; 83219afdf74SPhilip Reames } 83319afdf74SPhilip Reames auto Result = parseLoopICmp(ICI); 834889dc1e3SArtur Pilipenko if (!Result) { 835d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 836889dc1e3SArtur Pilipenko return None; 837889dc1e3SArtur Pilipenko } 838889dc1e3SArtur Pilipenko 83919afdf74SPhilip Reames if (TrueDest != L->getHeader()) 84019afdf74SPhilip Reames Result->Pred = ICmpInst::getInversePredicate(Result->Pred); 84119afdf74SPhilip Reames 842889dc1e3SArtur Pilipenko // Check affine first, so if it's not we don't try to compute the step 843889dc1e3SArtur Pilipenko // recurrence. 844889dc1e3SArtur Pilipenko if (!Result->IV->isAffine()) { 845d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "The induction variable is not affine!\n"); 846889dc1e3SArtur Pilipenko return None; 847889dc1e3SArtur Pilipenko } 848889dc1e3SArtur Pilipenko 849889dc1e3SArtur Pilipenko auto *Step = Result->IV->getStepRecurrence(*SE); 85068797214SAnna Thomas if (!isSupportedStep(Step)) { 851d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Unsupported loop stride(" << *Step << ")!\n"); 852889dc1e3SArtur Pilipenko return None; 853889dc1e3SArtur Pilipenko } 854889dc1e3SArtur Pilipenko 85568797214SAnna Thomas auto IsUnsupportedPredicate = [](const SCEV *Step, ICmpInst::Predicate Pred) { 8567b360434SAnna Thomas if (Step->isOne()) { 85768797214SAnna Thomas return Pred != ICmpInst::ICMP_ULT && Pred != ICmpInst::ICMP_SLT && 85868797214SAnna Thomas Pred != ICmpInst::ICMP_ULE && Pred != ICmpInst::ICMP_SLE; 8597b360434SAnna Thomas } else { 8607b360434SAnna Thomas assert(Step->isAllOnesValue() && "Step should be -1!"); 861c8016e7aSSerguei Katkov return Pred != ICmpInst::ICMP_UGT && Pred != ICmpInst::ICMP_SGT && 862c8016e7aSSerguei Katkov Pred != ICmpInst::ICMP_UGE && Pred != ICmpInst::ICMP_SGE; 8637b360434SAnna Thomas } 86468797214SAnna Thomas }; 86568797214SAnna Thomas 866099eca83SPhilip Reames normalizePredicate(SE, L, *Result); 86768797214SAnna Thomas if (IsUnsupportedPredicate(Step, Result->Pred)) { 868d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Unsupported loop latch predicate(" << Result->Pred 86968797214SAnna Thomas << ")!\n"); 87068797214SAnna Thomas return None; 87168797214SAnna Thomas } 87219afdf74SPhilip Reames 873889dc1e3SArtur Pilipenko return Result; 874889dc1e3SArtur Pilipenko } 875889dc1e3SArtur Pilipenko 8761d02b13eSAnna Thomas // Returns true if its safe to truncate the IV to RangeCheckType. 8771d02b13eSAnna Thomas bool LoopPredication::isSafeToTruncateWideIVType(Type *RangeCheckType) { 8781d02b13eSAnna Thomas if (!EnableIVTruncation) 8791d02b13eSAnna Thomas return false; 8801d02b13eSAnna Thomas assert(DL->getTypeSizeInBits(LatchCheck.IV->getType()) > 8811d02b13eSAnna Thomas DL->getTypeSizeInBits(RangeCheckType) && 8821d02b13eSAnna Thomas "Expected latch check IV type to be larger than range check operand " 8831d02b13eSAnna Thomas "type!"); 8841d02b13eSAnna Thomas // The start and end values of the IV should be known. This is to guarantee 8851d02b13eSAnna Thomas // that truncating the wide type will not lose information. 8861d02b13eSAnna Thomas auto *Limit = dyn_cast<SCEVConstant>(LatchCheck.Limit); 8871d02b13eSAnna Thomas auto *Start = dyn_cast<SCEVConstant>(LatchCheck.IV->getStart()); 8881d02b13eSAnna Thomas if (!Limit || !Start) 8891d02b13eSAnna Thomas return false; 8901d02b13eSAnna Thomas // This check makes sure that the IV does not change sign during loop 8911d02b13eSAnna Thomas // iterations. Consider latchType = i64, LatchStart = 5, Pred = ICMP_SGE, 8921d02b13eSAnna Thomas // LatchEnd = 2, rangeCheckType = i32. If it's not a monotonic predicate, the 8931d02b13eSAnna Thomas // IV wraps around, and the truncation of the IV would lose the range of 8941d02b13eSAnna Thomas // iterations between 2^32 and 2^64. 8951d02b13eSAnna Thomas bool Increasing; 8961d02b13eSAnna Thomas if (!SE->isMonotonicPredicate(LatchCheck.IV, LatchCheck.Pred, Increasing)) 8971d02b13eSAnna Thomas return false; 8981d02b13eSAnna Thomas // The active bits should be less than the bits in the RangeCheckType. This 8991d02b13eSAnna Thomas // guarantees that truncating the latch check to RangeCheckType is a safe 9001d02b13eSAnna Thomas // operation. 9011d02b13eSAnna Thomas auto RangeCheckTypeBitSize = DL->getTypeSizeInBits(RangeCheckType); 9021d02b13eSAnna Thomas return Start->getAPInt().getActiveBits() < RangeCheckTypeBitSize && 9031d02b13eSAnna Thomas Limit->getAPInt().getActiveBits() < RangeCheckTypeBitSize; 9041d02b13eSAnna Thomas } 9051d02b13eSAnna Thomas 9069b1176b0SAnna Thomas bool LoopPredication::isLoopProfitableToPredicate() { 9079b1176b0SAnna Thomas if (SkipProfitabilityChecks || !BPI) 9089b1176b0SAnna Thomas return true; 9099b1176b0SAnna Thomas 9109b1176b0SAnna Thomas SmallVector<std::pair<const BasicBlock *, const BasicBlock *>, 8> ExitEdges; 9119b1176b0SAnna Thomas L->getExitEdges(ExitEdges); 9129b1176b0SAnna Thomas // If there is only one exiting edge in the loop, it is always profitable to 9139b1176b0SAnna Thomas // predicate the loop. 9149b1176b0SAnna Thomas if (ExitEdges.size() == 1) 9159b1176b0SAnna Thomas return true; 9169b1176b0SAnna Thomas 9179b1176b0SAnna Thomas // Calculate the exiting probabilities of all exiting edges from the loop, 9189b1176b0SAnna Thomas // starting with the LatchExitProbability. 9199b1176b0SAnna Thomas // Heuristic for profitability: If any of the exiting blocks' probability of 9209b1176b0SAnna Thomas // exiting the loop is larger than exiting through the latch block, it's not 9219b1176b0SAnna Thomas // profitable to predicate the loop. 9229b1176b0SAnna Thomas auto *LatchBlock = L->getLoopLatch(); 9239b1176b0SAnna Thomas assert(LatchBlock && "Should have a single latch at this point!"); 9249b1176b0SAnna Thomas auto *LatchTerm = LatchBlock->getTerminator(); 9259b1176b0SAnna Thomas assert(LatchTerm->getNumSuccessors() == 2 && 9269b1176b0SAnna Thomas "expected to be an exiting block with 2 succs!"); 9279b1176b0SAnna Thomas unsigned LatchBrExitIdx = 9289b1176b0SAnna Thomas LatchTerm->getSuccessor(0) == L->getHeader() ? 1 : 0; 9299b1176b0SAnna Thomas BranchProbability LatchExitProbability = 9309b1176b0SAnna Thomas BPI->getEdgeProbability(LatchBlock, LatchBrExitIdx); 9319b1176b0SAnna Thomas 9329b1176b0SAnna Thomas // Protect against degenerate inputs provided by the user. Providing a value 9339b1176b0SAnna Thomas // less than one, can invert the definition of profitable loop predication. 9349b1176b0SAnna Thomas float ScaleFactor = LatchExitProbabilityScale; 9359b1176b0SAnna Thomas if (ScaleFactor < 1) { 936d34e60caSNicola Zaghen LLVM_DEBUG( 9379b1176b0SAnna Thomas dbgs() 9389b1176b0SAnna Thomas << "Ignored user setting for loop-predication-latch-probability-scale: " 9399b1176b0SAnna Thomas << LatchExitProbabilityScale << "\n"); 940d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "The value is set to 1.0\n"); 9419b1176b0SAnna Thomas ScaleFactor = 1.0; 9429b1176b0SAnna Thomas } 9439b1176b0SAnna Thomas const auto LatchProbabilityThreshold = 9449b1176b0SAnna Thomas LatchExitProbability * ScaleFactor; 9459b1176b0SAnna Thomas 9469b1176b0SAnna Thomas for (const auto &ExitEdge : ExitEdges) { 9479b1176b0SAnna Thomas BranchProbability ExitingBlockProbability = 9489b1176b0SAnna Thomas BPI->getEdgeProbability(ExitEdge.first, ExitEdge.second); 9499b1176b0SAnna Thomas // Some exiting edge has higher probability than the latch exiting edge. 9509b1176b0SAnna Thomas // No longer profitable to predicate. 9519b1176b0SAnna Thomas if (ExitingBlockProbability > LatchProbabilityThreshold) 9529b1176b0SAnna Thomas return false; 9539b1176b0SAnna Thomas } 9549b1176b0SAnna Thomas // Using BPI, we have concluded that the most probable way to exit from the 9559b1176b0SAnna Thomas // loop is through the latch (or there's no profile information and all 9569b1176b0SAnna Thomas // exits are equally likely). 9579b1176b0SAnna Thomas return true; 9589b1176b0SAnna Thomas } 9599b1176b0SAnna Thomas 9608fb3d57eSArtur Pilipenko bool LoopPredication::runOnLoop(Loop *Loop) { 9618fb3d57eSArtur Pilipenko L = Loop; 9628fb3d57eSArtur Pilipenko 963d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Analyzing "); 964d34e60caSNicola Zaghen LLVM_DEBUG(L->dump()); 9658fb3d57eSArtur Pilipenko 9668fb3d57eSArtur Pilipenko Module *M = L->getHeader()->getModule(); 9678fb3d57eSArtur Pilipenko 9688fb3d57eSArtur Pilipenko // There is nothing to do if the module doesn't use guards 9698fb3d57eSArtur Pilipenko auto *GuardDecl = 9708fb3d57eSArtur Pilipenko M->getFunction(Intrinsic::getName(Intrinsic::experimental_guard)); 971feb475f4SMax Kazantsev bool HasIntrinsicGuards = GuardDecl && !GuardDecl->use_empty(); 972feb475f4SMax Kazantsev auto *WCDecl = M->getFunction( 973feb475f4SMax Kazantsev Intrinsic::getName(Intrinsic::experimental_widenable_condition)); 974feb475f4SMax Kazantsev bool HasWidenableConditions = 975feb475f4SMax Kazantsev PredicateWidenableBranchGuards && WCDecl && !WCDecl->use_empty(); 976feb475f4SMax Kazantsev if (!HasIntrinsicGuards && !HasWidenableConditions) 9778fb3d57eSArtur Pilipenko return false; 9788fb3d57eSArtur Pilipenko 9798fb3d57eSArtur Pilipenko DL = &M->getDataLayout(); 9808fb3d57eSArtur Pilipenko 9818fb3d57eSArtur Pilipenko Preheader = L->getLoopPreheader(); 9828fb3d57eSArtur Pilipenko if (!Preheader) 9838fb3d57eSArtur Pilipenko return false; 9848fb3d57eSArtur Pilipenko 985889dc1e3SArtur Pilipenko auto LatchCheckOpt = parseLoopLatchICmp(); 986889dc1e3SArtur Pilipenko if (!LatchCheckOpt) 987889dc1e3SArtur Pilipenko return false; 988889dc1e3SArtur Pilipenko LatchCheck = *LatchCheckOpt; 989889dc1e3SArtur Pilipenko 990d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Latch check:\n"); 991d34e60caSNicola Zaghen LLVM_DEBUG(LatchCheck.dump()); 99268797214SAnna Thomas 9939b1176b0SAnna Thomas if (!isLoopProfitableToPredicate()) { 994d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Loop not profitable to predicate!\n"); 9959b1176b0SAnna Thomas return false; 9969b1176b0SAnna Thomas } 9978fb3d57eSArtur Pilipenko // Collect all the guards into a vector and process later, so as not 9988fb3d57eSArtur Pilipenko // to invalidate the instruction iterator. 9998fb3d57eSArtur Pilipenko SmallVector<IntrinsicInst *, 4> Guards; 1000feb475f4SMax Kazantsev SmallVector<BranchInst *, 4> GuardsAsWidenableBranches; 1001feb475f4SMax Kazantsev for (const auto BB : L->blocks()) { 10028fb3d57eSArtur Pilipenko for (auto &I : *BB) 100328298e96SMax Kazantsev if (isGuard(&I)) 100428298e96SMax Kazantsev Guards.push_back(cast<IntrinsicInst>(&I)); 1005feb475f4SMax Kazantsev if (PredicateWidenableBranchGuards && 1006feb475f4SMax Kazantsev isGuardAsWidenableBranch(BB->getTerminator())) 1007feb475f4SMax Kazantsev GuardsAsWidenableBranches.push_back( 1008feb475f4SMax Kazantsev cast<BranchInst>(BB->getTerminator())); 1009feb475f4SMax Kazantsev } 10108fb3d57eSArtur Pilipenko 1011feb475f4SMax Kazantsev if (Guards.empty() && GuardsAsWidenableBranches.empty()) 101246c4e0a4SArtur Pilipenko return false; 101346c4e0a4SArtur Pilipenko 10148fb3d57eSArtur Pilipenko SCEVExpander Expander(*SE, *DL, "loop-predication"); 10158fb3d57eSArtur Pilipenko 10168fb3d57eSArtur Pilipenko bool Changed = false; 10178fb3d57eSArtur Pilipenko for (auto *Guard : Guards) 10188fb3d57eSArtur Pilipenko Changed |= widenGuardConditions(Guard, Expander); 1019feb475f4SMax Kazantsev for (auto *Guard : GuardsAsWidenableBranches) 1020feb475f4SMax Kazantsev Changed |= widenWidenableBranchGuardConditions(Guard, Expander); 10218fb3d57eSArtur Pilipenko 10228fb3d57eSArtur Pilipenko return Changed; 10238fb3d57eSArtur Pilipenko } 1024