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" 18655bdb140SAnna Thomas #include "llvm/Analysis/MemorySSA.h" 18755bdb140SAnna Thomas #include "llvm/Analysis/MemorySSAUpdater.h" 1888fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolution.h" 1898fb3d57eSArtur Pilipenko #include "llvm/Analysis/ScalarEvolutionExpressions.h" 1908fb3d57eSArtur Pilipenko #include "llvm/IR/Function.h" 1918fb3d57eSArtur Pilipenko #include "llvm/IR/IntrinsicInst.h" 1928fb3d57eSArtur Pilipenko #include "llvm/IR/Module.h" 1938fb3d57eSArtur Pilipenko #include "llvm/IR/PatternMatch.h" 19405da2fe5SReid Kleckner #include "llvm/InitializePasses.h" 1956bda14b3SChandler Carruth #include "llvm/Pass.h" 1964c1a1d3cSReid Kleckner #include "llvm/Support/CommandLine.h" 1978fb3d57eSArtur Pilipenko #include "llvm/Support/Debug.h" 1988fb3d57eSArtur Pilipenko #include "llvm/Transforms/Scalar.h" 19970c68a6bSPhilip Reames #include "llvm/Transforms/Utils/GuardUtils.h" 200d109e2a7SPhilip Reames #include "llvm/Transforms/Utils/Local.h" 2018fb3d57eSArtur Pilipenko #include "llvm/Transforms/Utils/LoopUtils.h" 202bcbd26bfSFlorian Hahn #include "llvm/Transforms/Utils/ScalarEvolutionExpander.h" 2038fb3d57eSArtur Pilipenko 2048fb3d57eSArtur Pilipenko #define DEBUG_TYPE "loop-predication" 2058fb3d57eSArtur Pilipenko 206c297e84bSFedor Sergeev STATISTIC(TotalConsidered, "Number of guards considered"); 207c297e84bSFedor Sergeev STATISTIC(TotalWidened, "Number of checks widened"); 208c297e84bSFedor Sergeev 2098fb3d57eSArtur Pilipenko using namespace llvm; 2108fb3d57eSArtur Pilipenko 2111d02b13eSAnna Thomas static cl::opt<bool> EnableIVTruncation("loop-predication-enable-iv-truncation", 2121d02b13eSAnna Thomas cl::Hidden, cl::init(true)); 2131d02b13eSAnna Thomas 2147b360434SAnna Thomas static cl::opt<bool> EnableCountDownLoop("loop-predication-enable-count-down-loop", 2157b360434SAnna Thomas cl::Hidden, cl::init(true)); 2169b1176b0SAnna Thomas 2179b1176b0SAnna Thomas static cl::opt<bool> 2189b1176b0SAnna Thomas SkipProfitabilityChecks("loop-predication-skip-profitability-checks", 2199b1176b0SAnna Thomas cl::Hidden, cl::init(false)); 2209b1176b0SAnna Thomas 2219b1176b0SAnna Thomas // This is the scale factor for the latch probability. We use this during 2229b1176b0SAnna Thomas // profitability analysis to find other exiting blocks that have a much higher 2239b1176b0SAnna Thomas // probability of exiting the loop instead of loop exiting via latch. 2249b1176b0SAnna Thomas // This value should be greater than 1 for a sane profitability check. 2259b1176b0SAnna Thomas static cl::opt<float> LatchExitProbabilityScale( 2269b1176b0SAnna Thomas "loop-predication-latch-probability-scale", cl::Hidden, cl::init(2.0), 2279b1176b0SAnna Thomas cl::desc("scale factor for the latch probability. Value should be greater " 2289b1176b0SAnna Thomas "than 1. Lower values are ignored")); 2299b1176b0SAnna Thomas 230feb475f4SMax Kazantsev static cl::opt<bool> PredicateWidenableBranchGuards( 231feb475f4SMax Kazantsev "loop-predication-predicate-widenable-branches-to-deopt", cl::Hidden, 232feb475f4SMax Kazantsev cl::desc("Whether or not we should predicate guards " 233feb475f4SMax Kazantsev "expressed as widenable branches to deoptimize blocks"), 234feb475f4SMax Kazantsev cl::init(true)); 235feb475f4SMax Kazantsev 2368fb3d57eSArtur Pilipenko namespace { 237a6c27804SArtur Pilipenko /// Represents an induction variable check: 238a6c27804SArtur Pilipenko /// icmp Pred, <induction variable>, <loop invariant limit> 239a6c27804SArtur Pilipenko struct LoopICmp { 240a6c27804SArtur Pilipenko ICmpInst::Predicate Pred; 241a6c27804SArtur Pilipenko const SCEVAddRecExpr *IV; 242a6c27804SArtur Pilipenko const SCEV *Limit; 243c488dfabSArtur Pilipenko LoopICmp(ICmpInst::Predicate Pred, const SCEVAddRecExpr *IV, 244c488dfabSArtur Pilipenko const SCEV *Limit) 245a6c27804SArtur Pilipenko : Pred(Pred), IV(IV), Limit(Limit) {} 2463a3cb929SKazu Hirata LoopICmp() = default; 24768797214SAnna Thomas void dump() { 24868797214SAnna Thomas dbgs() << "LoopICmp Pred = " << Pred << ", IV = " << *IV 24968797214SAnna Thomas << ", Limit = " << *Limit << "\n"; 25068797214SAnna Thomas } 251a6c27804SArtur Pilipenko }; 252c488dfabSArtur Pilipenko 253099eca83SPhilip Reames class LoopPredication { 25492a7177eSPhilip Reames AliasAnalysis *AA; 255ad5a84c8SPhilip Reames DominatorTree *DT; 256c488dfabSArtur Pilipenko ScalarEvolution *SE; 257ad5a84c8SPhilip Reames LoopInfo *LI; 25855bdb140SAnna Thomas MemorySSAUpdater *MSSAU; 259c488dfabSArtur Pilipenko 260c488dfabSArtur Pilipenko Loop *L; 261c488dfabSArtur Pilipenko const DataLayout *DL; 262c488dfabSArtur Pilipenko BasicBlock *Preheader; 263889dc1e3SArtur Pilipenko LoopICmp LatchCheck; 264c488dfabSArtur Pilipenko 26568797214SAnna Thomas bool isSupportedStep(const SCEV* Step); 26619afdf74SPhilip Reames Optional<LoopICmp> parseLoopICmp(ICmpInst *ICI); 267889dc1e3SArtur Pilipenko Optional<LoopICmp> parseLoopLatchICmp(); 268a6c27804SArtur Pilipenko 269fbe64a2cSPhilip Reames /// Return an insertion point suitable for inserting a safe to speculate 270fbe64a2cSPhilip Reames /// instruction whose only user will be 'User' which has operands 'Ops'. A 271fbe64a2cSPhilip Reames /// trivial result would be the at the User itself, but we try to return a 272fbe64a2cSPhilip Reames /// loop invariant location if possible. 273fbe64a2cSPhilip Reames Instruction *findInsertPt(Instruction *User, ArrayRef<Value*> Ops); 274e46d77d1SPhilip Reames /// Same as above, *except* that this uses the SCEV definition of invariant 275e46d77d1SPhilip Reames /// which is that an expression *can be made* invariant via SCEVExpander. 276e46d77d1SPhilip Reames /// Thus, this version is only suitable for finding an insert point to be be 277e46d77d1SPhilip Reames /// passed to SCEVExpander! 278e46d77d1SPhilip Reames Instruction *findInsertPt(Instruction *User, ArrayRef<const SCEV*> Ops); 279fbe64a2cSPhilip Reames 28092a7177eSPhilip Reames /// Return true if the value is known to produce a single fixed value across 28192a7177eSPhilip Reames /// all iterations on which it executes. Note that this does not imply 282bc93c2d7SMarek Kurdej /// speculation safety. That must be established separately. 28392a7177eSPhilip Reames bool isLoopInvariantValue(const SCEV* S); 28492a7177eSPhilip Reames 285e46d77d1SPhilip Reames Value *expandCheck(SCEVExpander &Expander, Instruction *Guard, 2863d4e1082SPhilip Reames ICmpInst::Predicate Pred, const SCEV *LHS, 2873d4e1082SPhilip Reames const SCEV *RHS); 2886780ba65SArtur Pilipenko 2898fb3d57eSArtur Pilipenko Optional<Value *> widenICmpRangeCheck(ICmpInst *ICI, SCEVExpander &Expander, 290e46d77d1SPhilip Reames Instruction *Guard); 29168797214SAnna Thomas Optional<Value *> widenICmpRangeCheckIncrementingLoop(LoopICmp LatchCheck, 29268797214SAnna Thomas LoopICmp RangeCheck, 29368797214SAnna Thomas SCEVExpander &Expander, 294e46d77d1SPhilip Reames Instruction *Guard); 2957b360434SAnna Thomas Optional<Value *> widenICmpRangeCheckDecrementingLoop(LoopICmp LatchCheck, 2967b360434SAnna Thomas LoopICmp RangeCheck, 2977b360434SAnna Thomas SCEVExpander &Expander, 298e46d77d1SPhilip Reames Instruction *Guard); 299ca450878SMax Kazantsev unsigned collectChecks(SmallVectorImpl<Value *> &Checks, Value *Condition, 300e46d77d1SPhilip Reames SCEVExpander &Expander, Instruction *Guard); 3018fb3d57eSArtur Pilipenko bool widenGuardConditions(IntrinsicInst *II, SCEVExpander &Expander); 302feb475f4SMax Kazantsev bool widenWidenableBranchGuardConditions(BranchInst *Guard, SCEVExpander &Expander); 3039b1176b0SAnna Thomas // If the loop always exits through another block in the loop, we should not 3049b1176b0SAnna Thomas // predicate based on the latch check. For example, the latch check can be a 3059b1176b0SAnna Thomas // very coarse grained check and there can be more fine grained exit checks 3069403514eSAnna Thomas // within the loop. 3079b1176b0SAnna Thomas bool isLoopProfitableToPredicate(); 3089b1176b0SAnna Thomas 309ad5a84c8SPhilip Reames bool predicateLoopExits(Loop *L, SCEVExpander &Rewriter); 310ad5a84c8SPhilip Reames 3118fb3d57eSArtur Pilipenko public: 31255bdb140SAnna Thomas LoopPredication(AliasAnalysis *AA, DominatorTree *DT, ScalarEvolution *SE, 3139403514eSAnna Thomas LoopInfo *LI, MemorySSAUpdater *MSSAU) 3149403514eSAnna Thomas : AA(AA), DT(DT), SE(SE), LI(LI), MSSAU(MSSAU){}; 3158fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L); 3168fb3d57eSArtur Pilipenko }; 3178fb3d57eSArtur Pilipenko 3188fb3d57eSArtur Pilipenko class LoopPredicationLegacyPass : public LoopPass { 3198fb3d57eSArtur Pilipenko public: 3208fb3d57eSArtur Pilipenko static char ID; 3218fb3d57eSArtur Pilipenko LoopPredicationLegacyPass() : LoopPass(ID) { 3228fb3d57eSArtur Pilipenko initializeLoopPredicationLegacyPassPass(*PassRegistry::getPassRegistry()); 3238fb3d57eSArtur Pilipenko } 3248fb3d57eSArtur Pilipenko 3258fb3d57eSArtur Pilipenko void getAnalysisUsage(AnalysisUsage &AU) const override { 3269b1176b0SAnna Thomas AU.addRequired<BranchProbabilityInfoWrapperPass>(); 3278fb3d57eSArtur Pilipenko getLoopAnalysisUsage(AU); 32855bdb140SAnna Thomas AU.addPreserved<MemorySSAWrapperPass>(); 3298fb3d57eSArtur Pilipenko } 3308fb3d57eSArtur Pilipenko 3318fb3d57eSArtur Pilipenko bool runOnLoop(Loop *L, LPPassManager &LPM) override { 3328fb3d57eSArtur Pilipenko if (skipLoop(L)) 3338fb3d57eSArtur Pilipenko return false; 3348fb3d57eSArtur Pilipenko auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); 335ad5a84c8SPhilip Reames auto *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); 336ad5a84c8SPhilip Reames auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 33755bdb140SAnna Thomas auto *MSSAWP = getAnalysisIfAvailable<MemorySSAWrapperPass>(); 33855bdb140SAnna Thomas std::unique_ptr<MemorySSAUpdater> MSSAU; 33955bdb140SAnna Thomas if (MSSAWP) 34055bdb140SAnna Thomas MSSAU = std::make_unique<MemorySSAUpdater>(&MSSAWP->getMSSA()); 34192a7177eSPhilip Reames auto *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults(); 3429403514eSAnna Thomas LoopPredication LP(AA, DT, SE, LI, MSSAU ? MSSAU.get() : nullptr); 3438fb3d57eSArtur Pilipenko return LP.runOnLoop(L); 3448fb3d57eSArtur Pilipenko } 3458fb3d57eSArtur Pilipenko }; 3468fb3d57eSArtur Pilipenko 3478fb3d57eSArtur Pilipenko char LoopPredicationLegacyPass::ID = 0; 3481c03cc5aSAlina Sbirlea } // end namespace 3498fb3d57eSArtur Pilipenko 3508fb3d57eSArtur Pilipenko INITIALIZE_PASS_BEGIN(LoopPredicationLegacyPass, "loop-predication", 3518fb3d57eSArtur Pilipenko "Loop predication", false, false) 3529b1176b0SAnna Thomas INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass) 3538fb3d57eSArtur Pilipenko INITIALIZE_PASS_DEPENDENCY(LoopPass) 3548fb3d57eSArtur Pilipenko INITIALIZE_PASS_END(LoopPredicationLegacyPass, "loop-predication", 3558fb3d57eSArtur Pilipenko "Loop predication", false, false) 3568fb3d57eSArtur Pilipenko 3578fb3d57eSArtur Pilipenko Pass *llvm::createLoopPredicationPass() { 3588fb3d57eSArtur Pilipenko return new LoopPredicationLegacyPass(); 3598fb3d57eSArtur Pilipenko } 3608fb3d57eSArtur Pilipenko 3618fb3d57eSArtur Pilipenko PreservedAnalyses LoopPredicationPass::run(Loop &L, LoopAnalysisManager &AM, 3628fb3d57eSArtur Pilipenko LoopStandardAnalysisResults &AR, 3638fb3d57eSArtur Pilipenko LPMUpdater &U) { 36455bdb140SAnna Thomas std::unique_ptr<MemorySSAUpdater> MSSAU; 36555bdb140SAnna Thomas if (AR.MSSA) 36655bdb140SAnna Thomas MSSAU = std::make_unique<MemorySSAUpdater>(AR.MSSA); 3679403514eSAnna Thomas LoopPredication LP(&AR.AA, &AR.DT, &AR.SE, &AR.LI, 36855bdb140SAnna Thomas MSSAU ? MSSAU.get() : nullptr); 3698fb3d57eSArtur Pilipenko if (!LP.runOnLoop(&L)) 3708fb3d57eSArtur Pilipenko return PreservedAnalyses::all(); 3718fb3d57eSArtur Pilipenko 37255bdb140SAnna Thomas auto PA = getLoopPassPreservedAnalyses(); 37355bdb140SAnna Thomas if (AR.MSSA) 37455bdb140SAnna Thomas PA.preserve<MemorySSAAnalysis>(); 37555bdb140SAnna Thomas return PA; 3768fb3d57eSArtur Pilipenko } 3778fb3d57eSArtur Pilipenko 378099eca83SPhilip Reames Optional<LoopICmp> 37919afdf74SPhilip Reames LoopPredication::parseLoopICmp(ICmpInst *ICI) { 38019afdf74SPhilip Reames auto Pred = ICI->getPredicate(); 38119afdf74SPhilip Reames auto *LHS = ICI->getOperand(0); 38219afdf74SPhilip Reames auto *RHS = ICI->getOperand(1); 38319afdf74SPhilip Reames 384a6c27804SArtur Pilipenko const SCEV *LHSS = SE->getSCEV(LHS); 385a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(LHSS)) 386a6c27804SArtur Pilipenko return None; 387a6c27804SArtur Pilipenko const SCEV *RHSS = SE->getSCEV(RHS); 388a6c27804SArtur Pilipenko if (isa<SCEVCouldNotCompute>(RHSS)) 389a6c27804SArtur Pilipenko return None; 390a6c27804SArtur Pilipenko 391a6c27804SArtur Pilipenko // Canonicalize RHS to be loop invariant bound, LHS - a loop computable IV 392a6c27804SArtur Pilipenko if (SE->isLoopInvariant(LHSS, L)) { 393a6c27804SArtur Pilipenko std::swap(LHS, RHS); 394a6c27804SArtur Pilipenko std::swap(LHSS, RHSS); 395a6c27804SArtur Pilipenko Pred = ICmpInst::getSwappedPredicate(Pred); 396a6c27804SArtur Pilipenko } 397a6c27804SArtur Pilipenko 398a6c27804SArtur Pilipenko const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(LHSS); 399a6c27804SArtur Pilipenko if (!AR || AR->getLoop() != L) 400a6c27804SArtur Pilipenko return None; 401a6c27804SArtur Pilipenko 402a6c27804SArtur Pilipenko return LoopICmp(Pred, AR, RHSS); 403a6c27804SArtur Pilipenko } 404a6c27804SArtur Pilipenko 4056780ba65SArtur Pilipenko Value *LoopPredication::expandCheck(SCEVExpander &Expander, 406e46d77d1SPhilip Reames Instruction *Guard, 4076780ba65SArtur Pilipenko ICmpInst::Predicate Pred, const SCEV *LHS, 4083d4e1082SPhilip Reames const SCEV *RHS) { 4096780ba65SArtur Pilipenko Type *Ty = LHS->getType(); 4106780ba65SArtur Pilipenko assert(Ty == RHS->getType() && "expandCheck operands have different types?"); 411ead69ee4SArtur Pilipenko 412e46d77d1SPhilip Reames if (SE->isLoopInvariant(LHS, L) && SE->isLoopInvariant(RHS, L)) { 413e46d77d1SPhilip Reames IRBuilder<> Builder(Guard); 414ead69ee4SArtur Pilipenko if (SE->isLoopEntryGuardedByCond(L, Pred, LHS, RHS)) 415ead69ee4SArtur Pilipenko return Builder.getTrue(); 41605e3e554SPhilip Reames if (SE->isLoopEntryGuardedByCond(L, ICmpInst::getInversePredicate(Pred), 41705e3e554SPhilip Reames LHS, RHS)) 41805e3e554SPhilip Reames return Builder.getFalse(); 419e46d77d1SPhilip Reames } 420ead69ee4SArtur Pilipenko 421e46d77d1SPhilip Reames Value *LHSV = Expander.expandCodeFor(LHS, Ty, findInsertPt(Guard, {LHS})); 422e46d77d1SPhilip Reames Value *RHSV = Expander.expandCodeFor(RHS, Ty, findInsertPt(Guard, {RHS})); 423e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, {LHSV, RHSV})); 4246780ba65SArtur Pilipenko return Builder.CreateICmp(Pred, LHSV, RHSV); 4256780ba65SArtur Pilipenko } 4266780ba65SArtur Pilipenko 4270912b06fSPhilip Reames 4280912b06fSPhilip Reames // Returns true if its safe to truncate the IV to RangeCheckType. 4290912b06fSPhilip Reames // When the IV type is wider than the range operand type, we can still do loop 4300912b06fSPhilip Reames // predication, by generating SCEVs for the range and latch that are of the 4310912b06fSPhilip Reames // same type. We achieve this by generating a SCEV truncate expression for the 4320912b06fSPhilip Reames // latch IV. This is done iff truncation of the IV is a safe operation, 4330912b06fSPhilip Reames // without loss of information. 4340912b06fSPhilip Reames // Another way to achieve this is by generating a wider type SCEV for the 4350912b06fSPhilip Reames // range check operand, however, this needs a more involved check that 4360912b06fSPhilip Reames // operands do not overflow. This can lead to loss of information when the 4370912b06fSPhilip Reames // range operand is of the form: add i32 %offset, %iv. We need to prove that 4380912b06fSPhilip Reames // sext(x + y) is same as sext(x) + sext(y). 4390912b06fSPhilip Reames // This function returns true if we can safely represent the IV type in 4400912b06fSPhilip Reames // the RangeCheckType without loss of information. 4419ed16737SPhilip Reames static bool isSafeToTruncateWideIVType(const DataLayout &DL, 4429ed16737SPhilip Reames ScalarEvolution &SE, 4430912b06fSPhilip Reames const LoopICmp LatchCheck, 4440912b06fSPhilip Reames Type *RangeCheckType) { 4450912b06fSPhilip Reames if (!EnableIVTruncation) 4460912b06fSPhilip Reames return false; 44724156364SCaroline Concatto assert(DL.getTypeSizeInBits(LatchCheck.IV->getType()).getFixedSize() > 44824156364SCaroline Concatto DL.getTypeSizeInBits(RangeCheckType).getFixedSize() && 4490912b06fSPhilip Reames "Expected latch check IV type to be larger than range check operand " 4500912b06fSPhilip Reames "type!"); 4510912b06fSPhilip Reames // The start and end values of the IV should be known. This is to guarantee 4520912b06fSPhilip Reames // that truncating the wide type will not lose information. 4530912b06fSPhilip Reames auto *Limit = dyn_cast<SCEVConstant>(LatchCheck.Limit); 4540912b06fSPhilip Reames auto *Start = dyn_cast<SCEVConstant>(LatchCheck.IV->getStart()); 4550912b06fSPhilip Reames if (!Limit || !Start) 4560912b06fSPhilip Reames return false; 4570912b06fSPhilip Reames // This check makes sure that the IV does not change sign during loop 4580912b06fSPhilip Reames // iterations. Consider latchType = i64, LatchStart = 5, Pred = ICMP_SGE, 4590912b06fSPhilip Reames // LatchEnd = 2, rangeCheckType = i32. If it's not a monotonic predicate, the 4600912b06fSPhilip Reames // IV wraps around, and the truncation of the IV would lose the range of 4610912b06fSPhilip Reames // iterations between 2^32 and 2^64. 462a5b2e795SMax Kazantsev if (!SE.getMonotonicPredicateType(LatchCheck.IV, LatchCheck.Pred)) 4630912b06fSPhilip Reames return false; 4640912b06fSPhilip Reames // The active bits should be less than the bits in the RangeCheckType. This 4650912b06fSPhilip Reames // guarantees that truncating the latch check to RangeCheckType is a safe 4660912b06fSPhilip Reames // operation. 46724156364SCaroline Concatto auto RangeCheckTypeBitSize = 46824156364SCaroline Concatto DL.getTypeSizeInBits(RangeCheckType).getFixedSize(); 4690912b06fSPhilip Reames return Start->getAPInt().getActiveBits() < RangeCheckTypeBitSize && 4700912b06fSPhilip Reames Limit->getAPInt().getActiveBits() < RangeCheckTypeBitSize; 4710912b06fSPhilip Reames } 4720912b06fSPhilip Reames 4730912b06fSPhilip Reames 4749ed16737SPhilip Reames // Return an LoopICmp describing a latch check equivlent to LatchCheck but with 4759ed16737SPhilip Reames // the requested type if safe to do so. May involve the use of a new IV. 4769ed16737SPhilip Reames static Optional<LoopICmp> generateLoopLatchCheck(const DataLayout &DL, 4779ed16737SPhilip Reames ScalarEvolution &SE, 4789ed16737SPhilip Reames const LoopICmp LatchCheck, 4799ed16737SPhilip Reames Type *RangeCheckType) { 4801d02b13eSAnna Thomas 4811d02b13eSAnna Thomas auto *LatchType = LatchCheck.IV->getType(); 4821d02b13eSAnna Thomas if (RangeCheckType == LatchType) 4831d02b13eSAnna Thomas return LatchCheck; 4841d02b13eSAnna Thomas // For now, bail out if latch type is narrower than range type. 48524156364SCaroline Concatto if (DL.getTypeSizeInBits(LatchType).getFixedSize() < 48624156364SCaroline Concatto DL.getTypeSizeInBits(RangeCheckType).getFixedSize()) 4871d02b13eSAnna Thomas return None; 4889ed16737SPhilip Reames if (!isSafeToTruncateWideIVType(DL, SE, LatchCheck, RangeCheckType)) 4891d02b13eSAnna Thomas return None; 4901d02b13eSAnna Thomas // We can now safely identify the truncated version of the IV and limit for 4911d02b13eSAnna Thomas // RangeCheckType. 4921d02b13eSAnna Thomas LoopICmp NewLatchCheck; 4931d02b13eSAnna Thomas NewLatchCheck.Pred = LatchCheck.Pred; 4941d02b13eSAnna Thomas NewLatchCheck.IV = dyn_cast<SCEVAddRecExpr>( 4959ed16737SPhilip Reames SE.getTruncateExpr(LatchCheck.IV, RangeCheckType)); 4961d02b13eSAnna Thomas if (!NewLatchCheck.IV) 4971d02b13eSAnna Thomas return None; 4989ed16737SPhilip Reames NewLatchCheck.Limit = SE.getTruncateExpr(LatchCheck.Limit, RangeCheckType); 499d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "IV of type: " << *LatchType 500d34e60caSNicola Zaghen << "can be represented as range check type:" 501d34e60caSNicola Zaghen << *RangeCheckType << "\n"); 502d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "LatchCheck.IV: " << *NewLatchCheck.IV << "\n"); 503d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "LatchCheck.Limit: " << *NewLatchCheck.Limit << "\n"); 5041d02b13eSAnna Thomas return NewLatchCheck; 5051d02b13eSAnna Thomas } 5061d02b13eSAnna Thomas 50768797214SAnna Thomas bool LoopPredication::isSupportedStep(const SCEV* Step) { 5087b360434SAnna Thomas return Step->isOne() || (Step->isAllOnesValue() && EnableCountDownLoop); 5091d02b13eSAnna Thomas } 5108fb3d57eSArtur Pilipenko 511fbe64a2cSPhilip Reames Instruction *LoopPredication::findInsertPt(Instruction *Use, 512fbe64a2cSPhilip Reames ArrayRef<Value*> Ops) { 513fbe64a2cSPhilip Reames for (Value *Op : Ops) 514fbe64a2cSPhilip Reames if (!L->isLoopInvariant(Op)) 515fbe64a2cSPhilip Reames return Use; 516fbe64a2cSPhilip Reames return Preheader->getTerminator(); 517fbe64a2cSPhilip Reames } 518fbe64a2cSPhilip Reames 519e46d77d1SPhilip Reames Instruction *LoopPredication::findInsertPt(Instruction *Use, 520e46d77d1SPhilip Reames ArrayRef<const SCEV*> Ops) { 52192a7177eSPhilip Reames // Subtlety: SCEV considers things to be invariant if the value produced is 52292a7177eSPhilip Reames // the same across iterations. This is not the same as being able to 52392a7177eSPhilip Reames // evaluate outside the loop, which is what we actually need here. 524e46d77d1SPhilip Reames for (const SCEV *Op : Ops) 52592a7177eSPhilip Reames if (!SE->isLoopInvariant(Op, L) || 526*dcf4b733SNikita Popov !isSafeToExpandAt(Op, Preheader->getTerminator(), *SE, 527*dcf4b733SNikita Popov /* CanonicalMode */ true)) 528e46d77d1SPhilip Reames return Use; 529e46d77d1SPhilip Reames return Preheader->getTerminator(); 530e46d77d1SPhilip Reames } 531e46d77d1SPhilip Reames 53292a7177eSPhilip Reames bool LoopPredication::isLoopInvariantValue(const SCEV* S) { 53392a7177eSPhilip Reames // Handling expressions which produce invariant results, but *haven't* yet 53492a7177eSPhilip Reames // been removed from the loop serves two important purposes. 53592a7177eSPhilip Reames // 1) Most importantly, it resolves a pass ordering cycle which would 53692a7177eSPhilip Reames // otherwise need us to iteration licm, loop-predication, and either 53792a7177eSPhilip Reames // loop-unswitch or loop-peeling to make progress on examples with lots of 53892a7177eSPhilip Reames // predicable range checks in a row. (Since, in the general case, we can't 53992a7177eSPhilip Reames // hoist the length checks until the dominating checks have been discharged 54092a7177eSPhilip Reames // as we can't prove doing so is safe.) 54192a7177eSPhilip Reames // 2) As a nice side effect, this exposes the value of peeling or unswitching 54292a7177eSPhilip Reames // much more obviously in the IR. Otherwise, the cost modeling for other 54392a7177eSPhilip Reames // transforms would end up needing to duplicate all of this logic to model a 54492a7177eSPhilip Reames // check which becomes predictable based on a modeled peel or unswitch. 54592a7177eSPhilip Reames // 54692a7177eSPhilip Reames // The cost of doing so in the worst case is an extra fill from the stack in 54792a7177eSPhilip Reames // the loop to materialize the loop invariant test value instead of checking 54892a7177eSPhilip Reames // against the original IV which is presumable in a register inside the loop. 54992a7177eSPhilip Reames // Such cases are presumably rare, and hint at missing oppurtunities for 55092a7177eSPhilip Reames // other passes. 551e46d77d1SPhilip Reames 55292a7177eSPhilip Reames if (SE->isLoopInvariant(S, L)) 55392a7177eSPhilip Reames // Note: This the SCEV variant, so the original Value* may be within the 55492a7177eSPhilip Reames // loop even though SCEV has proven it is loop invariant. 55592a7177eSPhilip Reames return true; 55692a7177eSPhilip Reames 55792a7177eSPhilip Reames // Handle a particular important case which SCEV doesn't yet know about which 55892a7177eSPhilip Reames // shows up in range checks on arrays with immutable lengths. 55992a7177eSPhilip Reames // TODO: This should be sunk inside SCEV. 56092a7177eSPhilip Reames if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S)) 56192a7177eSPhilip Reames if (const auto *LI = dyn_cast<LoadInst>(U->getValue())) 562adf288c5SPhilip Reames if (LI->isUnordered() && L->hasLoopInvariantOperands(LI)) 56392a7177eSPhilip Reames if (AA->pointsToConstantMemory(LI->getOperand(0)) || 56427820f99SPhilip Reames LI->hasMetadata(LLVMContext::MD_invariant_load)) 56592a7177eSPhilip Reames return true; 56692a7177eSPhilip Reames return false; 56768797214SAnna Thomas } 56868797214SAnna Thomas 56968797214SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheckIncrementingLoop( 570099eca83SPhilip Reames LoopICmp LatchCheck, LoopICmp RangeCheck, 571e46d77d1SPhilip Reames SCEVExpander &Expander, Instruction *Guard) { 57268797214SAnna Thomas auto *Ty = RangeCheck.IV->getType(); 57368797214SAnna Thomas // Generate the widened condition for the forward loop: 5748aadc643SArtur Pilipenko // guardStart u< guardLimit && 5758aadc643SArtur Pilipenko // latchLimit <pred> guardLimit - 1 - guardStart + latchStart 576b4527e1cSArtur Pilipenko // where <pred> depends on the latch condition predicate. See the file 577b4527e1cSArtur Pilipenko // header comment for the reasoning. 57868797214SAnna Thomas // guardLimit - guardStart + latchStart - 1 57968797214SAnna Thomas const SCEV *GuardStart = RangeCheck.IV->getStart(); 58068797214SAnna Thomas const SCEV *GuardLimit = RangeCheck.Limit; 58168797214SAnna Thomas const SCEV *LatchStart = LatchCheck.IV->getStart(); 58268797214SAnna Thomas const SCEV *LatchLimit = LatchCheck.Limit; 58392a7177eSPhilip Reames // Subtlety: We need all the values to be *invariant* across all iterations, 58492a7177eSPhilip Reames // but we only need to check expansion safety for those which *aren't* 58592a7177eSPhilip Reames // already guaranteed to dominate the guard. 58692a7177eSPhilip Reames if (!isLoopInvariantValue(GuardStart) || 58792a7177eSPhilip Reames !isLoopInvariantValue(GuardLimit) || 58892a7177eSPhilip Reames !isLoopInvariantValue(LatchStart) || 58992a7177eSPhilip Reames !isLoopInvariantValue(LatchLimit)) { 59092a7177eSPhilip Reames LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 59192a7177eSPhilip Reames return None; 59292a7177eSPhilip Reames } 593*dcf4b733SNikita Popov if (!Expander.isSafeToExpandAt(LatchStart, Guard) || 594*dcf4b733SNikita Popov !Expander.isSafeToExpandAt(LatchLimit, Guard)) { 59592a7177eSPhilip Reames LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 59692a7177eSPhilip Reames return None; 59792a7177eSPhilip Reames } 5988aadc643SArtur Pilipenko 5998aadc643SArtur Pilipenko // guardLimit - guardStart + latchStart - 1 6008aadc643SArtur Pilipenko const SCEV *RHS = 6018aadc643SArtur Pilipenko SE->getAddExpr(SE->getMinusSCEV(GuardLimit, GuardStart), 6028aadc643SArtur Pilipenko SE->getMinusSCEV(LatchStart, SE->getOne(Ty))); 6033cb4c34aSSerguei Katkov auto LimitCheckPred = 6043cb4c34aSSerguei Katkov ICmpInst::getFlippedStrictnessPredicate(LatchCheck.Pred); 605aab28666SArtur Pilipenko 606d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "LHS: " << *LatchLimit << "\n"); 607d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "RHS: " << *RHS << "\n"); 608d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Pred: " << LimitCheckPred << "\n"); 6098aadc643SArtur Pilipenko 6108aadc643SArtur Pilipenko auto *LimitCheck = 611e46d77d1SPhilip Reames expandCheck(Expander, Guard, LimitCheckPred, LatchLimit, RHS); 612e46d77d1SPhilip Reames auto *FirstIterationCheck = expandCheck(Expander, Guard, RangeCheck.Pred, 6133d4e1082SPhilip Reames GuardStart, GuardLimit); 614e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck})); 615889dc1e3SArtur Pilipenko return Builder.CreateAnd(FirstIterationCheck, LimitCheck); 6168fb3d57eSArtur Pilipenko } 6177b360434SAnna Thomas 6187b360434SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheckDecrementingLoop( 619099eca83SPhilip Reames LoopICmp LatchCheck, LoopICmp RangeCheck, 620e46d77d1SPhilip Reames SCEVExpander &Expander, Instruction *Guard) { 6217b360434SAnna Thomas auto *Ty = RangeCheck.IV->getType(); 6227b360434SAnna Thomas const SCEV *GuardStart = RangeCheck.IV->getStart(); 6237b360434SAnna Thomas const SCEV *GuardLimit = RangeCheck.Limit; 62492a7177eSPhilip Reames const SCEV *LatchStart = LatchCheck.IV->getStart(); 6257b360434SAnna Thomas const SCEV *LatchLimit = LatchCheck.Limit; 62692a7177eSPhilip Reames // Subtlety: We need all the values to be *invariant* across all iterations, 62792a7177eSPhilip Reames // but we only need to check expansion safety for those which *aren't* 62892a7177eSPhilip Reames // already guaranteed to dominate the guard. 62992a7177eSPhilip Reames if (!isLoopInvariantValue(GuardStart) || 63092a7177eSPhilip Reames !isLoopInvariantValue(GuardLimit) || 63192a7177eSPhilip Reames !isLoopInvariantValue(LatchStart) || 63292a7177eSPhilip Reames !isLoopInvariantValue(LatchLimit)) { 63392a7177eSPhilip Reames LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 63492a7177eSPhilip Reames return None; 63592a7177eSPhilip Reames } 636*dcf4b733SNikita Popov if (!Expander.isSafeToExpandAt(LatchStart, Guard) || 637*dcf4b733SNikita Popov !Expander.isSafeToExpandAt(LatchLimit, Guard)) { 638d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Can't expand limit check!\n"); 6397b360434SAnna Thomas return None; 6407b360434SAnna Thomas } 6417b360434SAnna Thomas // The decrement of the latch check IV should be the same as the 6427b360434SAnna Thomas // rangeCheckIV. 6437b360434SAnna Thomas auto *PostDecLatchCheckIV = LatchCheck.IV->getPostIncExpr(*SE); 6447b360434SAnna Thomas if (RangeCheck.IV != PostDecLatchCheckIV) { 645d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Not the same. PostDecLatchCheckIV: " 6467b360434SAnna Thomas << *PostDecLatchCheckIV 6477b360434SAnna Thomas << " and RangeCheckIV: " << *RangeCheck.IV << "\n"); 6487b360434SAnna Thomas return None; 6497b360434SAnna Thomas } 6507b360434SAnna Thomas 6517b360434SAnna Thomas // Generate the widened condition for CountDownLoop: 6527b360434SAnna Thomas // guardStart u< guardLimit && 6537b360434SAnna Thomas // latchLimit <pred> 1. 6547b360434SAnna Thomas // See the header comment for reasoning of the checks. 6553cb4c34aSSerguei Katkov auto LimitCheckPred = 6563cb4c34aSSerguei Katkov ICmpInst::getFlippedStrictnessPredicate(LatchCheck.Pred); 657e46d77d1SPhilip Reames auto *FirstIterationCheck = expandCheck(Expander, Guard, 658e46d77d1SPhilip Reames ICmpInst::ICMP_ULT, 6593d4e1082SPhilip Reames GuardStart, GuardLimit); 660e46d77d1SPhilip Reames auto *LimitCheck = expandCheck(Expander, Guard, LimitCheckPred, LatchLimit, 6613d4e1082SPhilip Reames SE->getOne(Ty)); 662e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck})); 6637b360434SAnna Thomas return Builder.CreateAnd(FirstIterationCheck, LimitCheck); 6647b360434SAnna Thomas } 6657b360434SAnna Thomas 666099eca83SPhilip Reames static void normalizePredicate(ScalarEvolution *SE, Loop *L, 667099eca83SPhilip Reames LoopICmp& RC) { 6680e344e9dSPhilip Reames // LFTR canonicalizes checks to the ICMP_NE/EQ form; normalize back to the 6690e344e9dSPhilip Reames // ULT/UGE form for ease of handling by our caller. 6700e344e9dSPhilip Reames if (ICmpInst::isEquality(RC.Pred) && 671099eca83SPhilip Reames RC.IV->getStepRecurrence(*SE)->isOne() && 672099eca83SPhilip Reames SE->isKnownPredicate(ICmpInst::ICMP_ULE, RC.IV->getStart(), RC.Limit)) 6730e344e9dSPhilip Reames RC.Pred = RC.Pred == ICmpInst::ICMP_NE ? 6740e344e9dSPhilip Reames ICmpInst::ICMP_ULT : ICmpInst::ICMP_UGE; 675099eca83SPhilip Reames } 676099eca83SPhilip Reames 677099eca83SPhilip Reames 67868797214SAnna Thomas /// If ICI can be widened to a loop invariant condition emits the loop 67968797214SAnna Thomas /// invariant condition in the loop preheader and return it, otherwise 68068797214SAnna Thomas /// returns None. 68168797214SAnna Thomas Optional<Value *> LoopPredication::widenICmpRangeCheck(ICmpInst *ICI, 68268797214SAnna Thomas SCEVExpander &Expander, 683e46d77d1SPhilip Reames Instruction *Guard) { 684d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Analyzing ICmpInst condition:\n"); 685d34e60caSNicola Zaghen LLVM_DEBUG(ICI->dump()); 68668797214SAnna Thomas 68768797214SAnna Thomas // parseLoopStructure guarantees that the latch condition is: 68868797214SAnna Thomas // ++i <pred> latchLimit, where <pred> is u<, u<=, s<, or s<=. 68968797214SAnna Thomas // We are looking for the range checks of the form: 69068797214SAnna Thomas // i u< guardLimit 69168797214SAnna Thomas auto RangeCheck = parseLoopICmp(ICI); 69268797214SAnna Thomas if (!RangeCheck) { 693d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 69468797214SAnna Thomas return None; 69568797214SAnna Thomas } 696d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Guard check:\n"); 697d34e60caSNicola Zaghen LLVM_DEBUG(RangeCheck->dump()); 69868797214SAnna Thomas if (RangeCheck->Pred != ICmpInst::ICMP_ULT) { 699d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Unsupported range check predicate(" 700d34e60caSNicola Zaghen << RangeCheck->Pred << ")!\n"); 70168797214SAnna Thomas return None; 70268797214SAnna Thomas } 70368797214SAnna Thomas auto *RangeCheckIV = RangeCheck->IV; 70468797214SAnna Thomas if (!RangeCheckIV->isAffine()) { 705d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Range check IV is not affine!\n"); 70668797214SAnna Thomas return None; 70768797214SAnna Thomas } 70868797214SAnna Thomas auto *Step = RangeCheckIV->getStepRecurrence(*SE); 70968797214SAnna Thomas // We cannot just compare with latch IV step because the latch and range IVs 71068797214SAnna Thomas // may have different types. 71168797214SAnna Thomas if (!isSupportedStep(Step)) { 712d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Range check and latch have IVs different steps!\n"); 71368797214SAnna Thomas return None; 71468797214SAnna Thomas } 71568797214SAnna Thomas auto *Ty = RangeCheckIV->getType(); 7169ed16737SPhilip Reames auto CurrLatchCheckOpt = generateLoopLatchCheck(*DL, *SE, LatchCheck, Ty); 71768797214SAnna Thomas if (!CurrLatchCheckOpt) { 718d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to generate a loop latch check " 71968797214SAnna Thomas "corresponding to range type: " 72068797214SAnna Thomas << *Ty << "\n"); 72168797214SAnna Thomas return None; 72268797214SAnna Thomas } 72368797214SAnna Thomas 72468797214SAnna Thomas LoopICmp CurrLatchCheck = *CurrLatchCheckOpt; 7257b360434SAnna Thomas // At this point, the range and latch step should have the same type, but need 7267b360434SAnna Thomas // not have the same value (we support both 1 and -1 steps). 7277b360434SAnna Thomas assert(Step->getType() == 7287b360434SAnna Thomas CurrLatchCheck.IV->getStepRecurrence(*SE)->getType() && 7297b360434SAnna Thomas "Range and latch steps should be of same type!"); 7307b360434SAnna Thomas if (Step != CurrLatchCheck.IV->getStepRecurrence(*SE)) { 731d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Range and latch have different step values!\n"); 7327b360434SAnna Thomas return None; 7337b360434SAnna Thomas } 73468797214SAnna Thomas 7357b360434SAnna Thomas if (Step->isOne()) 73668797214SAnna Thomas return widenICmpRangeCheckIncrementingLoop(CurrLatchCheck, *RangeCheck, 737e46d77d1SPhilip Reames Expander, Guard); 7387b360434SAnna Thomas else { 7397b360434SAnna Thomas assert(Step->isAllOnesValue() && "Step should be -1!"); 7407b360434SAnna Thomas return widenICmpRangeCheckDecrementingLoop(CurrLatchCheck, *RangeCheck, 741e46d77d1SPhilip Reames Expander, Guard); 7427b360434SAnna Thomas } 74368797214SAnna Thomas } 7448fb3d57eSArtur Pilipenko 745ca450878SMax Kazantsev unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks, 746ca450878SMax Kazantsev Value *Condition, 747ca450878SMax Kazantsev SCEVExpander &Expander, 748e46d77d1SPhilip Reames Instruction *Guard) { 749ca450878SMax Kazantsev unsigned NumWidened = 0; 7508fb3d57eSArtur Pilipenko // The guard condition is expected to be in form of: 7518fb3d57eSArtur Pilipenko // cond1 && cond2 && cond3 ... 7520909ca13SHiroshi Inoue // Iterate over subconditions looking for icmp conditions which can be 7538fb3d57eSArtur Pilipenko // widened across loop iterations. Widening these conditions remember the 7548fb3d57eSArtur Pilipenko // resulting list of subconditions in Checks vector. 755ca450878SMax Kazantsev SmallVector<Value *, 4> Worklist(1, Condition); 7568fb3d57eSArtur Pilipenko SmallPtrSet<Value *, 4> Visited; 757adb3ece2SPhilip Reames Value *WideableCond = nullptr; 7588fb3d57eSArtur Pilipenko do { 7598fb3d57eSArtur Pilipenko Value *Condition = Worklist.pop_back_val(); 7608fb3d57eSArtur Pilipenko if (!Visited.insert(Condition).second) 7618fb3d57eSArtur Pilipenko continue; 7628fb3d57eSArtur Pilipenko 7638fb3d57eSArtur Pilipenko Value *LHS, *RHS; 7648fb3d57eSArtur Pilipenko using namespace llvm::PatternMatch; 7658fb3d57eSArtur Pilipenko if (match(Condition, m_And(m_Value(LHS), m_Value(RHS)))) { 7668fb3d57eSArtur Pilipenko Worklist.push_back(LHS); 7678fb3d57eSArtur Pilipenko Worklist.push_back(RHS); 7688fb3d57eSArtur Pilipenko continue; 7698fb3d57eSArtur Pilipenko } 7708fb3d57eSArtur Pilipenko 771adb3ece2SPhilip Reames if (match(Condition, 772adb3ece2SPhilip Reames m_Intrinsic<Intrinsic::experimental_widenable_condition>())) { 773adb3ece2SPhilip Reames // Pick any, we don't care which 774adb3ece2SPhilip Reames WideableCond = Condition; 775adb3ece2SPhilip Reames continue; 776adb3ece2SPhilip Reames } 777adb3ece2SPhilip Reames 7788fb3d57eSArtur Pilipenko if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) { 7793d4e1082SPhilip Reames if (auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander, 780e46d77d1SPhilip Reames Guard)) { 7817a47ee51SKazu Hirata Checks.push_back(*NewRangeCheck); 7828fb3d57eSArtur Pilipenko NumWidened++; 7838fb3d57eSArtur Pilipenko continue; 7848fb3d57eSArtur Pilipenko } 7858fb3d57eSArtur Pilipenko } 7868fb3d57eSArtur Pilipenko 7878fb3d57eSArtur Pilipenko // Save the condition as is if we can't widen it 7888fb3d57eSArtur Pilipenko Checks.push_back(Condition); 789ca450878SMax Kazantsev } while (!Worklist.empty()); 790adb3ece2SPhilip Reames // At the moment, our matching logic for wideable conditions implicitly 791adb3ece2SPhilip Reames // assumes we preserve the form: (br (and Cond, WC())). FIXME 792adb3ece2SPhilip Reames // Note that if there were multiple calls to wideable condition in the 793adb3ece2SPhilip Reames // traversal, we only need to keep one, and which one is arbitrary. 794adb3ece2SPhilip Reames if (WideableCond) 795adb3ece2SPhilip Reames Checks.push_back(WideableCond); 796ca450878SMax Kazantsev return NumWidened; 797ca450878SMax Kazantsev } 7988fb3d57eSArtur Pilipenko 799ca450878SMax Kazantsev bool LoopPredication::widenGuardConditions(IntrinsicInst *Guard, 800ca450878SMax Kazantsev SCEVExpander &Expander) { 801ca450878SMax Kazantsev LLVM_DEBUG(dbgs() << "Processing guard:\n"); 802ca450878SMax Kazantsev LLVM_DEBUG(Guard->dump()); 803ca450878SMax Kazantsev 804ca450878SMax Kazantsev TotalConsidered++; 805ca450878SMax Kazantsev SmallVector<Value *, 4> Checks; 806ca450878SMax Kazantsev unsigned NumWidened = collectChecks(Checks, Guard->getOperand(0), Expander, 807e46d77d1SPhilip Reames Guard); 8088fb3d57eSArtur Pilipenko if (NumWidened == 0) 8098fb3d57eSArtur Pilipenko return false; 8108fb3d57eSArtur Pilipenko 811c297e84bSFedor Sergeev TotalWidened += NumWidened; 812c297e84bSFedor Sergeev 8138fb3d57eSArtur Pilipenko // Emit the new guard condition 814e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(Guard, Checks)); 8159e62c864SPhilip Reames Value *AllChecks = Builder.CreateAnd(Checks); 816d109e2a7SPhilip Reames auto *OldCond = Guard->getOperand(0); 8179e62c864SPhilip Reames Guard->setOperand(0, AllChecks); 81855bdb140SAnna Thomas RecursivelyDeleteTriviallyDeadInstructions(OldCond, nullptr /* TLI */, MSSAU); 8198fb3d57eSArtur Pilipenko 820d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Widened checks = " << NumWidened << "\n"); 8218fb3d57eSArtur Pilipenko return true; 8228fb3d57eSArtur Pilipenko } 8238fb3d57eSArtur Pilipenko 824feb475f4SMax Kazantsev bool LoopPredication::widenWidenableBranchGuardConditions( 825f608678fSPhilip Reames BranchInst *BI, SCEVExpander &Expander) { 826f608678fSPhilip Reames assert(isGuardAsWidenableBranch(BI) && "Must be!"); 827feb475f4SMax Kazantsev LLVM_DEBUG(dbgs() << "Processing guard:\n"); 828f608678fSPhilip Reames LLVM_DEBUG(BI->dump()); 829feb475f4SMax Kazantsev 830feb475f4SMax Kazantsev TotalConsidered++; 831feb475f4SMax Kazantsev SmallVector<Value *, 4> Checks; 832adb3ece2SPhilip Reames unsigned NumWidened = collectChecks(Checks, BI->getCondition(), 833e46d77d1SPhilip Reames Expander, BI); 834feb475f4SMax Kazantsev if (NumWidened == 0) 835feb475f4SMax Kazantsev return false; 836feb475f4SMax Kazantsev 837feb475f4SMax Kazantsev TotalWidened += NumWidened; 838feb475f4SMax Kazantsev 839feb475f4SMax Kazantsev // Emit the new guard condition 840e46d77d1SPhilip Reames IRBuilder<> Builder(findInsertPt(BI, Checks)); 8419e62c864SPhilip Reames Value *AllChecks = Builder.CreateAnd(Checks); 842adb3ece2SPhilip Reames auto *OldCond = BI->getCondition(); 8439e62c864SPhilip Reames BI->setCondition(AllChecks); 84455bdb140SAnna Thomas RecursivelyDeleteTriviallyDeadInstructions(OldCond, nullptr /* TLI */, MSSAU); 845f608678fSPhilip Reames assert(isGuardAsWidenableBranch(BI) && 846feb475f4SMax Kazantsev "Stopped being a guard after transform?"); 847feb475f4SMax Kazantsev 848feb475f4SMax Kazantsev LLVM_DEBUG(dbgs() << "Widened checks = " << NumWidened << "\n"); 849feb475f4SMax Kazantsev return true; 850feb475f4SMax Kazantsev } 851feb475f4SMax Kazantsev 852099eca83SPhilip Reames Optional<LoopICmp> LoopPredication::parseLoopLatchICmp() { 853889dc1e3SArtur Pilipenko using namespace PatternMatch; 854889dc1e3SArtur Pilipenko 855889dc1e3SArtur Pilipenko BasicBlock *LoopLatch = L->getLoopLatch(); 856889dc1e3SArtur Pilipenko if (!LoopLatch) { 857d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "The loop doesn't have a single latch!\n"); 858889dc1e3SArtur Pilipenko return None; 859889dc1e3SArtur Pilipenko } 860889dc1e3SArtur Pilipenko 86119afdf74SPhilip Reames auto *BI = dyn_cast<BranchInst>(LoopLatch->getTerminator()); 862101915cfSPhilip Reames if (!BI || !BI->isConditional()) { 863d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to match the latch terminator!\n"); 864889dc1e3SArtur Pilipenko return None; 865889dc1e3SArtur Pilipenko } 86619afdf74SPhilip Reames BasicBlock *TrueDest = BI->getSuccessor(0); 8674e875464SRichard Trieu assert( 8684e875464SRichard Trieu (TrueDest == L->getHeader() || BI->getSuccessor(1) == L->getHeader()) && 869889dc1e3SArtur Pilipenko "One of the latch's destinations must be the header"); 870889dc1e3SArtur Pilipenko 87119afdf74SPhilip Reames auto *ICI = dyn_cast<ICmpInst>(BI->getCondition()); 872101915cfSPhilip Reames if (!ICI) { 87319afdf74SPhilip Reames LLVM_DEBUG(dbgs() << "Failed to match the latch condition!\n"); 87419afdf74SPhilip Reames return None; 87519afdf74SPhilip Reames } 87619afdf74SPhilip Reames auto Result = parseLoopICmp(ICI); 877889dc1e3SArtur Pilipenko if (!Result) { 878d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Failed to parse the loop latch condition!\n"); 879889dc1e3SArtur Pilipenko return None; 880889dc1e3SArtur Pilipenko } 881889dc1e3SArtur Pilipenko 88219afdf74SPhilip Reames if (TrueDest != L->getHeader()) 88319afdf74SPhilip Reames Result->Pred = ICmpInst::getInversePredicate(Result->Pred); 88419afdf74SPhilip Reames 885889dc1e3SArtur Pilipenko // Check affine first, so if it's not we don't try to compute the step 886889dc1e3SArtur Pilipenko // recurrence. 887889dc1e3SArtur Pilipenko if (!Result->IV->isAffine()) { 888d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "The induction variable is not affine!\n"); 889889dc1e3SArtur Pilipenko return None; 890889dc1e3SArtur Pilipenko } 891889dc1e3SArtur Pilipenko 892889dc1e3SArtur Pilipenko auto *Step = Result->IV->getStepRecurrence(*SE); 89368797214SAnna Thomas if (!isSupportedStep(Step)) { 894d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Unsupported loop stride(" << *Step << ")!\n"); 895889dc1e3SArtur Pilipenko return None; 896889dc1e3SArtur Pilipenko } 897889dc1e3SArtur Pilipenko 89868797214SAnna Thomas auto IsUnsupportedPredicate = [](const SCEV *Step, ICmpInst::Predicate Pred) { 8997b360434SAnna Thomas if (Step->isOne()) { 90068797214SAnna Thomas return Pred != ICmpInst::ICMP_ULT && Pred != ICmpInst::ICMP_SLT && 90168797214SAnna Thomas Pred != ICmpInst::ICMP_ULE && Pred != ICmpInst::ICMP_SLE; 9027b360434SAnna Thomas } else { 9037b360434SAnna Thomas assert(Step->isAllOnesValue() && "Step should be -1!"); 904c8016e7aSSerguei Katkov return Pred != ICmpInst::ICMP_UGT && Pred != ICmpInst::ICMP_SGT && 905c8016e7aSSerguei Katkov Pred != ICmpInst::ICMP_UGE && Pred != ICmpInst::ICMP_SGE; 9067b360434SAnna Thomas } 90768797214SAnna Thomas }; 90868797214SAnna Thomas 909099eca83SPhilip Reames normalizePredicate(SE, L, *Result); 91068797214SAnna Thomas if (IsUnsupportedPredicate(Step, Result->Pred)) { 911d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Unsupported loop latch predicate(" << Result->Pred 91268797214SAnna Thomas << ")!\n"); 91368797214SAnna Thomas return None; 91468797214SAnna Thomas } 91519afdf74SPhilip Reames 916889dc1e3SArtur Pilipenko return Result; 917889dc1e3SArtur Pilipenko } 918889dc1e3SArtur Pilipenko 9191d02b13eSAnna Thomas 9209b1176b0SAnna Thomas bool LoopPredication::isLoopProfitableToPredicate() { 9219403514eSAnna Thomas if (SkipProfitabilityChecks) 9229b1176b0SAnna Thomas return true; 9239b1176b0SAnna Thomas 924c6caddb7SSerguei Katkov SmallVector<std::pair<BasicBlock *, BasicBlock *>, 8> ExitEdges; 9259b1176b0SAnna Thomas L->getExitEdges(ExitEdges); 9269b1176b0SAnna Thomas // If there is only one exiting edge in the loop, it is always profitable to 9279b1176b0SAnna Thomas // predicate the loop. 9289b1176b0SAnna Thomas if (ExitEdges.size() == 1) 9299b1176b0SAnna Thomas return true; 9309b1176b0SAnna Thomas 9319b1176b0SAnna Thomas // Calculate the exiting probabilities of all exiting edges from the loop, 9329b1176b0SAnna Thomas // starting with the LatchExitProbability. 9339b1176b0SAnna Thomas // Heuristic for profitability: If any of the exiting blocks' probability of 9349b1176b0SAnna Thomas // exiting the loop is larger than exiting through the latch block, it's not 9359b1176b0SAnna Thomas // profitable to predicate the loop. 9369b1176b0SAnna Thomas auto *LatchBlock = L->getLoopLatch(); 9379b1176b0SAnna Thomas assert(LatchBlock && "Should have a single latch at this point!"); 9389b1176b0SAnna Thomas auto *LatchTerm = LatchBlock->getTerminator(); 9399b1176b0SAnna Thomas assert(LatchTerm->getNumSuccessors() == 2 && 9409b1176b0SAnna Thomas "expected to be an exiting block with 2 succs!"); 9419b1176b0SAnna Thomas unsigned LatchBrExitIdx = 9429b1176b0SAnna Thomas LatchTerm->getSuccessor(0) == L->getHeader() ? 1 : 0; 9439403514eSAnna Thomas // We compute branch probabilities without BPI. We do not rely on BPI since 9449403514eSAnna Thomas // Loop predication is usually run in an LPM and BPI is only preserved 9459403514eSAnna Thomas // lossily within loop pass managers, while BPI has an inherent notion of 9469403514eSAnna Thomas // being complete for an entire function. 9479403514eSAnna Thomas 9489403514eSAnna Thomas // If the latch exits into a deoptimize or an unreachable block, do not 9499403514eSAnna Thomas // predicate on that latch check. 9509403514eSAnna Thomas auto *LatchExitBlock = LatchTerm->getSuccessor(LatchBrExitIdx); 9519403514eSAnna Thomas if (isa<UnreachableInst>(LatchTerm) || 9529403514eSAnna Thomas LatchExitBlock->getTerminatingDeoptimizeCall()) 9539403514eSAnna Thomas return false; 9549403514eSAnna Thomas 9559403514eSAnna Thomas auto IsValidProfileData = [](MDNode *ProfileData, const Instruction *Term) { 9569403514eSAnna Thomas if (!ProfileData || !ProfileData->getOperand(0)) 9579403514eSAnna Thomas return false; 9589403514eSAnna Thomas if (MDString *MDS = dyn_cast<MDString>(ProfileData->getOperand(0))) 9599403514eSAnna Thomas if (!MDS->getString().equals("branch_weights")) 9609403514eSAnna Thomas return false; 9619403514eSAnna Thomas if (ProfileData->getNumOperands() != 1 + Term->getNumSuccessors()) 9629403514eSAnna Thomas return false; 9639403514eSAnna Thomas return true; 9649403514eSAnna Thomas }; 9659403514eSAnna Thomas MDNode *LatchProfileData = LatchTerm->getMetadata(LLVMContext::MD_prof); 9669403514eSAnna Thomas // Latch terminator has no valid profile data, so nothing to check 9679403514eSAnna Thomas // profitability on. 9689403514eSAnna Thomas if (!IsValidProfileData(LatchProfileData, LatchTerm)) 9699403514eSAnna Thomas return true; 9709403514eSAnna Thomas 9719403514eSAnna Thomas auto ComputeBranchProbability = 9729403514eSAnna Thomas [&](const BasicBlock *ExitingBlock, 9739403514eSAnna Thomas const BasicBlock *ExitBlock) -> BranchProbability { 9749403514eSAnna Thomas auto *Term = ExitingBlock->getTerminator(); 9759403514eSAnna Thomas MDNode *ProfileData = Term->getMetadata(LLVMContext::MD_prof); 9769403514eSAnna Thomas unsigned NumSucc = Term->getNumSuccessors(); 9779403514eSAnna Thomas if (IsValidProfileData(ProfileData, Term)) { 9789403514eSAnna Thomas uint64_t Numerator = 0, Denominator = 0, ProfVal = 0; 9799403514eSAnna Thomas for (unsigned i = 0; i < NumSucc; i++) { 9809403514eSAnna Thomas ConstantInt *CI = 9819403514eSAnna Thomas mdconst::extract<ConstantInt>(ProfileData->getOperand(i + 1)); 9829403514eSAnna Thomas ProfVal = CI->getValue().getZExtValue(); 9839403514eSAnna Thomas if (Term->getSuccessor(i) == ExitBlock) 9849403514eSAnna Thomas Numerator += ProfVal; 9859403514eSAnna Thomas Denominator += ProfVal; 9869403514eSAnna Thomas } 9879403514eSAnna Thomas return BranchProbability::getBranchProbability(Numerator, Denominator); 9889403514eSAnna Thomas } else { 9899403514eSAnna Thomas assert(LatchBlock != ExitingBlock && 9909403514eSAnna Thomas "Latch term should always have profile data!"); 9919403514eSAnna Thomas // No profile data, so we choose the weight as 1/num_of_succ(Src) 9929403514eSAnna Thomas return BranchProbability::getBranchProbability(1, NumSucc); 9939403514eSAnna Thomas } 9949403514eSAnna Thomas }; 9959403514eSAnna Thomas 9969b1176b0SAnna Thomas BranchProbability LatchExitProbability = 9979403514eSAnna Thomas ComputeBranchProbability(LatchBlock, LatchExitBlock); 9989b1176b0SAnna Thomas 9999b1176b0SAnna Thomas // Protect against degenerate inputs provided by the user. Providing a value 10009b1176b0SAnna Thomas // less than one, can invert the definition of profitable loop predication. 10019b1176b0SAnna Thomas float ScaleFactor = LatchExitProbabilityScale; 10029b1176b0SAnna Thomas if (ScaleFactor < 1) { 1003d34e60caSNicola Zaghen LLVM_DEBUG( 10049b1176b0SAnna Thomas dbgs() 10059b1176b0SAnna Thomas << "Ignored user setting for loop-predication-latch-probability-scale: " 10069b1176b0SAnna Thomas << LatchExitProbabilityScale << "\n"); 1007d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "The value is set to 1.0\n"); 10089b1176b0SAnna Thomas ScaleFactor = 1.0; 10099b1176b0SAnna Thomas } 10109403514eSAnna Thomas const auto LatchProbabilityThreshold = LatchExitProbability * ScaleFactor; 10119b1176b0SAnna Thomas 10129b1176b0SAnna Thomas for (const auto &ExitEdge : ExitEdges) { 10139b1176b0SAnna Thomas BranchProbability ExitingBlockProbability = 10149403514eSAnna Thomas ComputeBranchProbability(ExitEdge.first, ExitEdge.second); 10159b1176b0SAnna Thomas // Some exiting edge has higher probability than the latch exiting edge. 10169b1176b0SAnna Thomas // No longer profitable to predicate. 10179b1176b0SAnna Thomas if (ExitingBlockProbability > LatchProbabilityThreshold) 10189b1176b0SAnna Thomas return false; 10199b1176b0SAnna Thomas } 10209403514eSAnna Thomas 10219403514eSAnna Thomas // We have concluded that the most probable way to exit from the 10229b1176b0SAnna Thomas // loop is through the latch (or there's no profile information and all 10239b1176b0SAnna Thomas // exits are equally likely). 10249b1176b0SAnna Thomas return true; 10259b1176b0SAnna Thomas } 10269b1176b0SAnna Thomas 1027ad5a84c8SPhilip Reames /// If we can (cheaply) find a widenable branch which controls entry into the 1028ad5a84c8SPhilip Reames /// loop, return it. 1029ad5a84c8SPhilip Reames static BranchInst *FindWidenableTerminatorAboveLoop(Loop *L, LoopInfo &LI) { 1030ad5a84c8SPhilip Reames // Walk back through any unconditional executed blocks and see if we can find 1031ad5a84c8SPhilip Reames // a widenable condition which seems to control execution of this loop. Note 1032ad5a84c8SPhilip Reames // that we predict that maythrow calls are likely untaken and thus that it's 1033ad5a84c8SPhilip Reames // profitable to widen a branch before a maythrow call with a condition 1034ad5a84c8SPhilip Reames // afterwards even though that may cause the slow path to run in a case where 1035ad5a84c8SPhilip Reames // it wouldn't have otherwise. 1036ad5a84c8SPhilip Reames BasicBlock *BB = L->getLoopPreheader(); 1037ad5a84c8SPhilip Reames if (!BB) 1038ad5a84c8SPhilip Reames return nullptr; 1039ad5a84c8SPhilip Reames do { 1040ad5a84c8SPhilip Reames if (BasicBlock *Pred = BB->getSinglePredecessor()) 1041ad5a84c8SPhilip Reames if (BB == Pred->getSingleSuccessor()) { 1042ad5a84c8SPhilip Reames BB = Pred; 1043ad5a84c8SPhilip Reames continue; 1044ad5a84c8SPhilip Reames } 1045ad5a84c8SPhilip Reames break; 1046ad5a84c8SPhilip Reames } while (true); 1047ad5a84c8SPhilip Reames 1048ad5a84c8SPhilip Reames if (BasicBlock *Pred = BB->getSinglePredecessor()) { 1049ad5a84c8SPhilip Reames auto *Term = Pred->getTerminator(); 1050ad5a84c8SPhilip Reames 1051ad5a84c8SPhilip Reames Value *Cond, *WC; 1052ad5a84c8SPhilip Reames BasicBlock *IfTrueBB, *IfFalseBB; 1053ad5a84c8SPhilip Reames if (parseWidenableBranch(Term, Cond, WC, IfTrueBB, IfFalseBB) && 1054ad5a84c8SPhilip Reames IfTrueBB == BB) 1055ad5a84c8SPhilip Reames return cast<BranchInst>(Term); 1056ad5a84c8SPhilip Reames } 1057ad5a84c8SPhilip Reames return nullptr; 1058ad5a84c8SPhilip Reames } 1059ad5a84c8SPhilip Reames 1060ad5a84c8SPhilip Reames /// Return the minimum of all analyzeable exit counts. This is an upper bound 1061ad5a84c8SPhilip Reames /// on the actual exit count. If there are not at least two analyzeable exits, 1062ad5a84c8SPhilip Reames /// returns SCEVCouldNotCompute. 1063ad5a84c8SPhilip Reames static const SCEV *getMinAnalyzeableBackedgeTakenCount(ScalarEvolution &SE, 1064ad5a84c8SPhilip Reames DominatorTree &DT, 1065ad5a84c8SPhilip Reames Loop *L) { 1066ad5a84c8SPhilip Reames SmallVector<BasicBlock *, 16> ExitingBlocks; 1067ad5a84c8SPhilip Reames L->getExitingBlocks(ExitingBlocks); 1068ad5a84c8SPhilip Reames 1069ad5a84c8SPhilip Reames SmallVector<const SCEV *, 4> ExitCounts; 1070ad5a84c8SPhilip Reames for (BasicBlock *ExitingBB : ExitingBlocks) { 1071ad5a84c8SPhilip Reames const SCEV *ExitCount = SE.getExitCount(L, ExitingBB); 1072ad5a84c8SPhilip Reames if (isa<SCEVCouldNotCompute>(ExitCount)) 1073ad5a84c8SPhilip Reames continue; 1074ad5a84c8SPhilip Reames assert(DT.dominates(ExitingBB, L->getLoopLatch()) && 1075ad5a84c8SPhilip Reames "We should only have known counts for exiting blocks that " 1076ad5a84c8SPhilip Reames "dominate latch!"); 1077ad5a84c8SPhilip Reames ExitCounts.push_back(ExitCount); 1078ad5a84c8SPhilip Reames } 1079ad5a84c8SPhilip Reames if (ExitCounts.size() < 2) 1080ad5a84c8SPhilip Reames return SE.getCouldNotCompute(); 1081ad5a84c8SPhilip Reames return SE.getUMinFromMismatchedTypes(ExitCounts); 1082ad5a84c8SPhilip Reames } 1083ad5a84c8SPhilip Reames 1084ad5a84c8SPhilip Reames /// This implements an analogous, but entirely distinct transform from the main 1085ad5a84c8SPhilip Reames /// loop predication transform. This one is phrased in terms of using a 1086ad5a84c8SPhilip Reames /// widenable branch *outside* the loop to allow us to simplify loop exits in a 1087ad5a84c8SPhilip Reames /// following loop. This is close in spirit to the IndVarSimplify transform 1088ad5a84c8SPhilip Reames /// of the same name, but is materially different widening loosens legality 1089ad5a84c8SPhilip Reames /// sharply. 1090ad5a84c8SPhilip Reames bool LoopPredication::predicateLoopExits(Loop *L, SCEVExpander &Rewriter) { 1091ad5a84c8SPhilip Reames // The transformation performed here aims to widen a widenable condition 1092ad5a84c8SPhilip Reames // above the loop such that all analyzeable exit leading to deopt are dead. 1093ad5a84c8SPhilip Reames // It assumes that the latch is the dominant exit for profitability and that 1094ad5a84c8SPhilip Reames // exits branching to deoptimizing blocks are rarely taken. It relies on the 1095ad5a84c8SPhilip Reames // semantics of widenable expressions for legality. (i.e. being able to fall 1096ad5a84c8SPhilip Reames // down the widenable path spuriously allows us to ignore exit order, 1097ad5a84c8SPhilip Reames // unanalyzeable exits, side effects, exceptional exits, and other challenges 1098ad5a84c8SPhilip Reames // which restrict the applicability of the non-WC based version of this 1099ad5a84c8SPhilip Reames // transform in IndVarSimplify.) 1100ad5a84c8SPhilip Reames // 1101ad5a84c8SPhilip Reames // NOTE ON POISON/UNDEF - We're hoisting an expression above guards which may 1102ad5a84c8SPhilip Reames // imply flags on the expression being hoisted and inserting new uses (flags 1103ad5a84c8SPhilip Reames // are only correct for current uses). The result is that we may be 1104ad5a84c8SPhilip Reames // inserting a branch on the value which can be either poison or undef. In 1105ad5a84c8SPhilip Reames // this case, the branch can legally go either way; we just need to avoid 1106ad5a84c8SPhilip Reames // introducing UB. This is achieved through the use of the freeze 1107ad5a84c8SPhilip Reames // instruction. 1108ad5a84c8SPhilip Reames 1109ad5a84c8SPhilip Reames SmallVector<BasicBlock *, 16> ExitingBlocks; 1110ad5a84c8SPhilip Reames L->getExitingBlocks(ExitingBlocks); 1111ad5a84c8SPhilip Reames 1112ad5a84c8SPhilip Reames if (ExitingBlocks.empty()) 1113ad5a84c8SPhilip Reames return false; // Nothing to do. 1114ad5a84c8SPhilip Reames 1115ad5a84c8SPhilip Reames auto *Latch = L->getLoopLatch(); 1116ad5a84c8SPhilip Reames if (!Latch) 1117ad5a84c8SPhilip Reames return false; 1118ad5a84c8SPhilip Reames 1119ad5a84c8SPhilip Reames auto *WidenableBR = FindWidenableTerminatorAboveLoop(L, *LI); 1120ad5a84c8SPhilip Reames if (!WidenableBR) 1121ad5a84c8SPhilip Reames return false; 1122ad5a84c8SPhilip Reames 1123ad5a84c8SPhilip Reames const SCEV *LatchEC = SE->getExitCount(L, Latch); 1124ad5a84c8SPhilip Reames if (isa<SCEVCouldNotCompute>(LatchEC)) 1125ad5a84c8SPhilip Reames return false; // profitability - want hot exit in analyzeable set 1126ad5a84c8SPhilip Reames 1127dfb7a909SPhilip Reames // At this point, we have found an analyzeable latch, and a widenable 1128dfb7a909SPhilip Reames // condition above the loop. If we have a widenable exit within the loop 1129dfb7a909SPhilip Reames // (for which we can't compute exit counts), drop the ability to further 1130dfb7a909SPhilip Reames // widen so that we gain ability to analyze it's exit count and perform this 1131dfb7a909SPhilip Reames // transform. TODO: It'd be nice to know for sure the exit became 1132dfb7a909SPhilip Reames // analyzeable after dropping widenability. 11330e362883SDaniil Suchkov bool ChangedLoop = false; 1134dfb7a909SPhilip Reames 1135dfb7a909SPhilip Reames for (auto *ExitingBB : ExitingBlocks) { 1136dfb7a909SPhilip Reames if (LI->getLoopFor(ExitingBB) != L) 1137dfb7a909SPhilip Reames continue; 1138dfb7a909SPhilip Reames 1139dfb7a909SPhilip Reames auto *BI = dyn_cast<BranchInst>(ExitingBB->getTerminator()); 1140dfb7a909SPhilip Reames if (!BI) 1141dfb7a909SPhilip Reames continue; 1142dfb7a909SPhilip Reames 1143dfb7a909SPhilip Reames Use *Cond, *WC; 1144dfb7a909SPhilip Reames BasicBlock *IfTrueBB, *IfFalseBB; 1145dfb7a909SPhilip Reames if (parseWidenableBranch(BI, Cond, WC, IfTrueBB, IfFalseBB) && 1146dfb7a909SPhilip Reames L->contains(IfTrueBB)) { 1147dfb7a909SPhilip Reames WC->set(ConstantInt::getTrue(IfTrueBB->getContext())); 11480e362883SDaniil Suchkov ChangedLoop = true; 1149dfb7a909SPhilip Reames } 1150dfb7a909SPhilip Reames } 11510e362883SDaniil Suchkov if (ChangedLoop) 1152dfb7a909SPhilip Reames SE->forgetLoop(L); 1153dfb7a909SPhilip Reames 1154ad5a84c8SPhilip Reames // The use of umin(all analyzeable exits) instead of latch is subtle, but 1155ad5a84c8SPhilip Reames // important for profitability. We may have a loop which hasn't been fully 1156ad5a84c8SPhilip Reames // canonicalized just yet. If the exit we chose to widen is provably never 1157ad5a84c8SPhilip Reames // taken, we want the widened form to *also* be provably never taken. We 1158ad5a84c8SPhilip Reames // can't guarantee this as a current unanalyzeable exit may later become 1159ad5a84c8SPhilip Reames // analyzeable, but we can at least avoid the obvious cases. 1160ad5a84c8SPhilip Reames const SCEV *MinEC = getMinAnalyzeableBackedgeTakenCount(*SE, *DT, L); 1161ad5a84c8SPhilip Reames if (isa<SCEVCouldNotCompute>(MinEC) || MinEC->getType()->isPointerTy() || 1162ad5a84c8SPhilip Reames !SE->isLoopInvariant(MinEC, L) || 1163*dcf4b733SNikita Popov !Rewriter.isSafeToExpandAt(MinEC, WidenableBR)) 11640e362883SDaniil Suchkov return ChangedLoop; 1165ad5a84c8SPhilip Reames 1166ad5a84c8SPhilip Reames // Subtlety: We need to avoid inserting additional uses of the WC. We know 1167ad5a84c8SPhilip Reames // that it can only have one transitive use at the moment, and thus moving 1168ad5a84c8SPhilip Reames // that use to just before the branch and inserting code before it and then 1169ad5a84c8SPhilip Reames // modifying the operand is legal. 1170ad5a84c8SPhilip Reames auto *IP = cast<Instruction>(WidenableBR->getCondition()); 11710e362883SDaniil Suchkov // Here we unconditionally modify the IR, so after this point we should return 11720e362883SDaniil Suchkov // only `true`! 1173ad5a84c8SPhilip Reames IP->moveBefore(WidenableBR); 1174f661ce20SAnna Thomas if (MSSAU) 1175f661ce20SAnna Thomas if (auto *MUD = MSSAU->getMemorySSA()->getMemoryAccess(IP)) 1176f661ce20SAnna Thomas MSSAU->moveToPlace(MUD, WidenableBR->getParent(), 1177f661ce20SAnna Thomas MemorySSA::BeforeTerminator); 1178ad5a84c8SPhilip Reames Rewriter.setInsertPoint(IP); 1179ad5a84c8SPhilip Reames IRBuilder<> B(IP); 1180ad5a84c8SPhilip Reames 11810e362883SDaniil Suchkov bool InvalidateLoop = false; 1182ad5a84c8SPhilip Reames Value *MinECV = nullptr; // lazily generated if needed 1183ad5a84c8SPhilip Reames for (BasicBlock *ExitingBB : ExitingBlocks) { 1184ad5a84c8SPhilip Reames // If our exiting block exits multiple loops, we can only rewrite the 1185ad5a84c8SPhilip Reames // innermost one. Otherwise, we're changing how many times the innermost 1186ad5a84c8SPhilip Reames // loop runs before it exits. 1187ad5a84c8SPhilip Reames if (LI->getLoopFor(ExitingBB) != L) 1188ad5a84c8SPhilip Reames continue; 1189ad5a84c8SPhilip Reames 1190ad5a84c8SPhilip Reames // Can't rewrite non-branch yet. 1191ad5a84c8SPhilip Reames auto *BI = dyn_cast<BranchInst>(ExitingBB->getTerminator()); 1192ad5a84c8SPhilip Reames if (!BI) 1193ad5a84c8SPhilip Reames continue; 1194ad5a84c8SPhilip Reames 1195ad5a84c8SPhilip Reames // If already constant, nothing to do. 1196ad5a84c8SPhilip Reames if (isa<Constant>(BI->getCondition())) 1197ad5a84c8SPhilip Reames continue; 1198ad5a84c8SPhilip Reames 1199ad5a84c8SPhilip Reames const SCEV *ExitCount = SE->getExitCount(L, ExitingBB); 1200ad5a84c8SPhilip Reames if (isa<SCEVCouldNotCompute>(ExitCount) || 1201ad5a84c8SPhilip Reames ExitCount->getType()->isPointerTy() || 1202*dcf4b733SNikita Popov !Rewriter.isSafeToExpandAt(ExitCount, WidenableBR)) 1203ad5a84c8SPhilip Reames continue; 1204ad5a84c8SPhilip Reames 1205ad5a84c8SPhilip Reames const bool ExitIfTrue = !L->contains(*succ_begin(ExitingBB)); 1206ad5a84c8SPhilip Reames BasicBlock *ExitBB = BI->getSuccessor(ExitIfTrue ? 0 : 1); 12078a4d12aeSFedor Sergeev if (!ExitBB->getPostdominatingDeoptimizeCall()) 1208ad5a84c8SPhilip Reames continue; 1209ad5a84c8SPhilip Reames 12108a4d12aeSFedor Sergeev /// Here we can be fairly sure that executing this exit will most likely 12118a4d12aeSFedor Sergeev /// lead to executing llvm.experimental.deoptimize. 12128a4d12aeSFedor Sergeev /// This is a profitability heuristic, not a legality constraint. 12138a4d12aeSFedor Sergeev 1214ad5a84c8SPhilip Reames // If we found a widenable exit condition, do two things: 1215ad5a84c8SPhilip Reames // 1) fold the widened exit test into the widenable condition 1216ad5a84c8SPhilip Reames // 2) fold the branch to untaken - avoids infinite looping 1217ad5a84c8SPhilip Reames 1218ad5a84c8SPhilip Reames Value *ECV = Rewriter.expandCodeFor(ExitCount); 1219ad5a84c8SPhilip Reames if (!MinECV) 1220ad5a84c8SPhilip Reames MinECV = Rewriter.expandCodeFor(MinEC); 1221ad5a84c8SPhilip Reames Value *RHS = MinECV; 1222ad5a84c8SPhilip Reames if (ECV->getType() != RHS->getType()) { 1223ad5a84c8SPhilip Reames Type *WiderTy = SE->getWiderType(ECV->getType(), RHS->getType()); 1224ad5a84c8SPhilip Reames ECV = B.CreateZExt(ECV, WiderTy); 1225ad5a84c8SPhilip Reames RHS = B.CreateZExt(RHS, WiderTy); 1226ad5a84c8SPhilip Reames } 1227ad5a84c8SPhilip Reames assert(!Latch || DT->dominates(ExitingBB, Latch)); 1228ad5a84c8SPhilip Reames Value *NewCond = B.CreateICmp(ICmpInst::ICMP_UGT, ECV, RHS); 1229ad5a84c8SPhilip Reames // Freeze poison or undef to an arbitrary bit pattern to ensure we can 1230ad5a84c8SPhilip Reames // branch without introducing UB. See NOTE ON POISON/UNDEF above for 1231ad5a84c8SPhilip Reames // context. 1232ad5a84c8SPhilip Reames NewCond = B.CreateFreeze(NewCond); 1233ad5a84c8SPhilip Reames 123470c68a6bSPhilip Reames widenWidenableBranch(WidenableBR, NewCond); 1235ad5a84c8SPhilip Reames 1236ad5a84c8SPhilip Reames Value *OldCond = BI->getCondition(); 1237ad5a84c8SPhilip Reames BI->setCondition(ConstantInt::get(OldCond->getType(), !ExitIfTrue)); 12380e362883SDaniil Suchkov InvalidateLoop = true; 1239ad5a84c8SPhilip Reames } 1240ad5a84c8SPhilip Reames 12410e362883SDaniil Suchkov if (InvalidateLoop) 1242ad5a84c8SPhilip Reames // We just mutated a bunch of loop exits changing there exit counts 1243ad5a84c8SPhilip Reames // widely. We need to force recomputation of the exit counts given these 1244ad5a84c8SPhilip Reames // changes. Note that all of the inserted exits are never taken, and 1245ad5a84c8SPhilip Reames // should be removed next time the CFG is modified. 1246ad5a84c8SPhilip Reames SE->forgetLoop(L); 12470e362883SDaniil Suchkov 12480e362883SDaniil Suchkov // Always return `true` since we have moved the WidenableBR's condition. 12490e362883SDaniil Suchkov return true; 1250ad5a84c8SPhilip Reames } 1251ad5a84c8SPhilip Reames 12528fb3d57eSArtur Pilipenko bool LoopPredication::runOnLoop(Loop *Loop) { 12538fb3d57eSArtur Pilipenko L = Loop; 12548fb3d57eSArtur Pilipenko 1255d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Analyzing "); 1256d34e60caSNicola Zaghen LLVM_DEBUG(L->dump()); 12578fb3d57eSArtur Pilipenko 12588fb3d57eSArtur Pilipenko Module *M = L->getHeader()->getModule(); 12598fb3d57eSArtur Pilipenko 12608fb3d57eSArtur Pilipenko // There is nothing to do if the module doesn't use guards 12618fb3d57eSArtur Pilipenko auto *GuardDecl = 12628fb3d57eSArtur Pilipenko M->getFunction(Intrinsic::getName(Intrinsic::experimental_guard)); 1263feb475f4SMax Kazantsev bool HasIntrinsicGuards = GuardDecl && !GuardDecl->use_empty(); 1264feb475f4SMax Kazantsev auto *WCDecl = M->getFunction( 1265feb475f4SMax Kazantsev Intrinsic::getName(Intrinsic::experimental_widenable_condition)); 1266feb475f4SMax Kazantsev bool HasWidenableConditions = 1267feb475f4SMax Kazantsev PredicateWidenableBranchGuards && WCDecl && !WCDecl->use_empty(); 1268feb475f4SMax Kazantsev if (!HasIntrinsicGuards && !HasWidenableConditions) 12698fb3d57eSArtur Pilipenko return false; 12708fb3d57eSArtur Pilipenko 12718fb3d57eSArtur Pilipenko DL = &M->getDataLayout(); 12728fb3d57eSArtur Pilipenko 12738fb3d57eSArtur Pilipenko Preheader = L->getLoopPreheader(); 12748fb3d57eSArtur Pilipenko if (!Preheader) 12758fb3d57eSArtur Pilipenko return false; 12768fb3d57eSArtur Pilipenko 1277889dc1e3SArtur Pilipenko auto LatchCheckOpt = parseLoopLatchICmp(); 1278889dc1e3SArtur Pilipenko if (!LatchCheckOpt) 1279889dc1e3SArtur Pilipenko return false; 1280889dc1e3SArtur Pilipenko LatchCheck = *LatchCheckOpt; 1281889dc1e3SArtur Pilipenko 1282d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Latch check:\n"); 1283d34e60caSNicola Zaghen LLVM_DEBUG(LatchCheck.dump()); 128468797214SAnna Thomas 12859b1176b0SAnna Thomas if (!isLoopProfitableToPredicate()) { 1286d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Loop not profitable to predicate!\n"); 12879b1176b0SAnna Thomas return false; 12889b1176b0SAnna Thomas } 12898fb3d57eSArtur Pilipenko // Collect all the guards into a vector and process later, so as not 12908fb3d57eSArtur Pilipenko // to invalidate the instruction iterator. 12918fb3d57eSArtur Pilipenko SmallVector<IntrinsicInst *, 4> Guards; 1292feb475f4SMax Kazantsev SmallVector<BranchInst *, 4> GuardsAsWidenableBranches; 1293feb475f4SMax Kazantsev for (const auto BB : L->blocks()) { 12948fb3d57eSArtur Pilipenko for (auto &I : *BB) 129528298e96SMax Kazantsev if (isGuard(&I)) 129628298e96SMax Kazantsev Guards.push_back(cast<IntrinsicInst>(&I)); 1297feb475f4SMax Kazantsev if (PredicateWidenableBranchGuards && 1298feb475f4SMax Kazantsev isGuardAsWidenableBranch(BB->getTerminator())) 1299feb475f4SMax Kazantsev GuardsAsWidenableBranches.push_back( 1300feb475f4SMax Kazantsev cast<BranchInst>(BB->getTerminator())); 1301feb475f4SMax Kazantsev } 13028fb3d57eSArtur Pilipenko 13038fb3d57eSArtur Pilipenko SCEVExpander Expander(*SE, *DL, "loop-predication"); 13048fb3d57eSArtur Pilipenko bool Changed = false; 13058fb3d57eSArtur Pilipenko for (auto *Guard : Guards) 13068fb3d57eSArtur Pilipenko Changed |= widenGuardConditions(Guard, Expander); 1307feb475f4SMax Kazantsev for (auto *Guard : GuardsAsWidenableBranches) 1308feb475f4SMax Kazantsev Changed |= widenWidenableBranchGuardConditions(Guard, Expander); 1309ad5a84c8SPhilip Reames Changed |= predicateLoopExits(L, Expander); 131055bdb140SAnna Thomas 131155bdb140SAnna Thomas if (MSSAU && VerifyMemorySSA) 131255bdb140SAnna Thomas MSSAU->getMemorySSA()->verifyMemorySSA(); 13138fb3d57eSArtur Pilipenko return Changed; 13148fb3d57eSArtur Pilipenko } 1315