206#define DEBUG_TYPE "loop-predication"
208STATISTIC(TotalConsidered,
"Number of guards considered");
229 cl::desc(
"scale factor for the latch probability. Value should be greater "
230 "than 1. Lower values are ignored"));
233 "loop-predication-predicate-widenable-branches-to-deopt",
cl::Hidden,
234 cl::desc(
"Whether or not we should predicate guards "
235 "expressed as widenable branches to deoptimize blocks"),
239 "loop-predication-insert-assumes-of-predicated-guards-conditions",
241 cl::desc(
"Whether or not we should insert assumes of conditions of "
242 "predicated guards"),
254 : Pred(Pred), IV(IV), Limit(Limit) {}
255 LoopICmp() =
default;
257 dbgs() <<
"LoopICmp Pred = " << Pred <<
", IV = " << *IV
258 <<
", Limit = " << *Limit <<
"\n";
262class LoopPredication {
274 bool isSupportedStep(
const SCEV* Step);
275 std::optional<LoopICmp> parseLoopICmp(
ICmpInst *ICI);
276 std::optional<LoopICmp> parseLoopLatchICmp();
293 bool isLoopInvariantValue(
const SCEV* S);
299 std::optional<Value *> widenICmpRangeCheck(
ICmpInst *ICI,
302 std::optional<Value *>
303 widenICmpRangeCheckIncrementingLoop(LoopICmp LatchCheck, LoopICmp RangeCheck,
306 std::optional<Value *>
307 widenICmpRangeCheckDecrementingLoop(LoopICmp LatchCheck, LoopICmp RangeCheck,
319 bool isLoopProfitableToPredicate();
326 : AA(AA), DT(DT), SE(SE), LI(LI), MSSAU(MSSAU){};
327 bool runOnLoop(
Loop *L);
335 std::unique_ptr<MemorySSAUpdater> MSSAU;
337 MSSAU = std::make_unique<MemorySSAUpdater>(AR.
MSSA);
338 LoopPredication LP(&AR.
AA, &AR.
DT, &AR.
SE, &AR.
LI,
339 MSSAU ? MSSAU.get() :
nullptr);
340 if (!LP.runOnLoop(&L))
349std::optional<LoopICmp> LoopPredication::parseLoopICmp(
ICmpInst *ICI) {
354 const SCEV *LHSS = SE->getSCEV(LHS);
355 if (isa<SCEVCouldNotCompute>(LHSS))
357 const SCEV *RHSS = SE->getSCEV(RHS);
358 if (isa<SCEVCouldNotCompute>(RHSS))
362 if (SE->isLoopInvariant(LHSS, L)) {
372 return LoopICmp(Pred, AR, RHSS);
380 assert(Ty ==
RHS->
getType() &&
"expandCheck operands have different types?");
382 if (SE->isLoopInvariant(LHS, L) && SE->isLoopInvariant(RHS, L)) {
384 if (SE->isLoopEntryGuardedByCond(L, Pred, LHS, RHS))
385 return Builder.getTrue();
388 return Builder.getFalse();
395 IRBuilder<> Builder(findInsertPt(Guard, {LHSV, RHSV}));
396 return Builder.CreateICmp(Pred, LHSV, RHSV);
414 const LoopICmp LatchCheck,
415 Type *RangeCheckType) {
418 assert(
DL.getTypeSizeInBits(LatchCheck.IV->getType()).getFixedValue() >
419 DL.getTypeSizeInBits(RangeCheckType).getFixedValue() &&
420 "Expected latch check IV type to be larger than range check operand "
424 auto *Limit = dyn_cast<SCEVConstant>(LatchCheck.Limit);
425 auto *Start = dyn_cast<SCEVConstant>(LatchCheck.IV->getStart());
426 if (!Limit || !Start)
438 auto RangeCheckTypeBitSize =
439 DL.getTypeSizeInBits(RangeCheckType).getFixedValue();
440 return Start->getAPInt().getActiveBits() < RangeCheckTypeBitSize &&
441 Limit->getAPInt().getActiveBits() < RangeCheckTypeBitSize;
449 const LoopICmp LatchCheck,
450 Type *RangeCheckType) {
452 auto *LatchType = LatchCheck.IV->getType();
453 if (RangeCheckType == LatchType)
456 if (
DL.getTypeSizeInBits(LatchType).getFixedValue() <
457 DL.getTypeSizeInBits(RangeCheckType).getFixedValue())
463 LoopICmp NewLatchCheck;
464 NewLatchCheck.Pred = LatchCheck.Pred;
465 NewLatchCheck.IV = dyn_cast<SCEVAddRecExpr>(
467 if (!NewLatchCheck.IV)
469 NewLatchCheck.Limit = SE.
getTruncateExpr(LatchCheck.Limit, RangeCheckType);
471 <<
"can be represented as range check type:"
472 << *RangeCheckType <<
"\n");
473 LLVM_DEBUG(
dbgs() <<
"LatchCheck.IV: " << *NewLatchCheck.IV <<
"\n");
474 LLVM_DEBUG(
dbgs() <<
"LatchCheck.Limit: " << *NewLatchCheck.Limit <<
"\n");
475 return NewLatchCheck;
478bool LoopPredication::isSupportedStep(
const SCEV* Step) {
485 if (!
L->isLoopInvariant(
Op))
487 return Preheader->getTerminator();
496 for (
const SCEV *
Op : Ops)
497 if (!SE->isLoopInvariant(
Op, L) ||
500 return Preheader->getTerminator();
503bool LoopPredication::isLoopInvariantValue(
const SCEV* S) {
523 if (SE->isLoopInvariant(S, L))
531 if (
const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S))
532 if (
const auto *LI = dyn_cast<LoadInst>(
U->getValue()))
533 if (LI->isUnordered() &&
L->hasLoopInvariantOperands(LI))
534 if (!
isModSet(AA->getModRefInfoMask(LI->getOperand(0))) ||
535 LI->hasMetadata(LLVMContext::MD_invariant_load))
540std::optional<Value *> LoopPredication::widenICmpRangeCheckIncrementingLoop(
541 LoopICmp LatchCheck, LoopICmp RangeCheck,
SCEVExpander &Expander,
543 auto *Ty = RangeCheck.IV->getType();
550 const SCEV *GuardStart = RangeCheck.IV->getStart();
551 const SCEV *GuardLimit = RangeCheck.Limit;
552 const SCEV *LatchStart = LatchCheck.IV->getStart();
553 const SCEV *LatchLimit = LatchCheck.Limit;
557 if (!isLoopInvariantValue(GuardStart) ||
558 !isLoopInvariantValue(GuardLimit) ||
559 !isLoopInvariantValue(LatchStart) ||
560 !isLoopInvariantValue(LatchLimit)) {
572 SE->getAddExpr(SE->getMinusSCEV(GuardLimit, GuardStart),
573 SE->getMinusSCEV(LatchStart, SE->getOne(Ty)));
574 auto LimitCheckPred =
582 expandCheck(Expander, Guard, LimitCheckPred, LatchLimit, RHS);
583 auto *FirstIterationCheck = expandCheck(Expander, Guard, RangeCheck.Pred,
584 GuardStart, GuardLimit);
585 IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck}));
586 return Builder.CreateFreeze(
587 Builder.CreateAnd(FirstIterationCheck, LimitCheck));
590std::optional<Value *> LoopPredication::widenICmpRangeCheckDecrementingLoop(
591 LoopICmp LatchCheck, LoopICmp RangeCheck,
SCEVExpander &Expander,
593 auto *Ty = RangeCheck.IV->getType();
594 const SCEV *GuardStart = RangeCheck.IV->getStart();
595 const SCEV *GuardLimit = RangeCheck.Limit;
596 const SCEV *LatchStart = LatchCheck.IV->getStart();
597 const SCEV *LatchLimit = LatchCheck.Limit;
601 if (!isLoopInvariantValue(GuardStart) ||
602 !isLoopInvariantValue(GuardLimit) ||
603 !isLoopInvariantValue(LatchStart) ||
604 !isLoopInvariantValue(LatchLimit)) {
615 auto *PostDecLatchCheckIV = LatchCheck.IV->getPostIncExpr(*SE);
616 if (RangeCheck.IV != PostDecLatchCheckIV) {
618 << *PostDecLatchCheckIV
619 <<
" and RangeCheckIV: " << *RangeCheck.IV <<
"\n");
627 auto LimitCheckPred =
629 auto *FirstIterationCheck = expandCheck(Expander, Guard,
631 GuardStart, GuardLimit);
632 auto *LimitCheck = expandCheck(Expander, Guard, LimitCheckPred, LatchLimit,
634 IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck}));
635 return Builder.CreateFreeze(
636 Builder.CreateAnd(FirstIterationCheck, LimitCheck));
644 RC.IV->getStepRecurrence(*SE)->isOne() &&
653std::optional<Value *>
663 auto RangeCheck = parseLoopICmp(ICI);
665 LLVM_DEBUG(
dbgs() <<
"Failed to parse the loop latch condition!\n");
672 << RangeCheck->Pred <<
")!\n");
675 auto *RangeCheckIV = RangeCheck->IV;
676 if (!RangeCheckIV->isAffine()) {
680 const SCEV *Step = RangeCheckIV->getStepRecurrence(*SE);
683 if (!isSupportedStep(Step)) {
684 LLVM_DEBUG(
dbgs() <<
"Range check and latch have IVs different steps!\n");
687 auto *Ty = RangeCheckIV->getType();
689 if (!CurrLatchCheckOpt) {
691 "corresponding to range type: "
696 LoopICmp CurrLatchCheck = *CurrLatchCheckOpt;
700 CurrLatchCheck.IV->getStepRecurrence(*SE)->getType() &&
701 "Range and latch steps should be of same type!");
702 if (Step != CurrLatchCheck.IV->getStepRecurrence(*SE)) {
703 LLVM_DEBUG(
dbgs() <<
"Range and latch have different step values!\n");
708 return widenICmpRangeCheckIncrementingLoop(CurrLatchCheck, *RangeCheck,
712 return widenICmpRangeCheckDecrementingLoop(CurrLatchCheck, *RangeCheck,
720 for (
auto &Check : Checks)
721 if (
ICmpInst *ICI = dyn_cast<ICmpInst>(Check))
722 if (
auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander, Guard)) {
724 Check = *NewRangeCheck;
728bool LoopPredication::widenGuardConditions(
IntrinsicInst *Guard,
737 widenChecks(Checks, WidenedChecks, Expander, Guard);
738 if (WidenedChecks.
empty())
741 TotalWidened += WidenedChecks.
size();
745 Value *AllChecks = Builder.CreateAnd(Checks);
750 Builder.CreateAssumption(OldCond);
758bool LoopPredication::widenWidenableBranchGuardConditions(
772 widenChecks(Checks, WidenedChecks, Expander, BI);
773 if (WidenedChecks.
empty())
776 TotalWidened += WidenedChecks.
size();
780 Value *AllChecks = Builder.CreateAnd(Checks);
789 Value *AssumeCond = Builder.CreateAnd(WidenedChecks);
795 PN->addIncoming(Pred == GuardBB ? AssumeCond : Builder.getTrue(), Pred);
798 Builder.CreateAssumption(AssumeCond);
802 "Stopped being a guard after transform?");
808std::optional<LoopICmp> LoopPredication::parseLoopLatchICmp() {
809 using namespace PatternMatch;
824 (TrueDest ==
L->getHeader() || BI->
getSuccessor(1) ==
L->getHeader()) &&
825 "One of the latch's destinations must be the header");
832 auto Result = parseLoopICmp(ICI);
834 LLVM_DEBUG(
dbgs() <<
"Failed to parse the loop latch condition!\n");
838 if (TrueDest !=
L->getHeader())
843 if (!
Result->IV->isAffine()) {
848 const SCEV *Step =
Result->IV->getStepRecurrence(*SE);
849 if (!isSupportedStep(Step)) {
850 LLVM_DEBUG(
dbgs() <<
"Unsupported loop stride(" << *Step <<
")!\n");
866 if (IsUnsupportedPredicate(Step,
Result->Pred)) {
875bool LoopPredication::isLoopProfitableToPredicate() {
880 L->getExitEdges(ExitEdges);
883 if (ExitEdges.
size() == 1)
891 auto *LatchBlock =
L->getLoopLatch();
892 assert(LatchBlock &&
"Should have a single latch at this point!");
893 auto *LatchTerm = LatchBlock->getTerminator();
894 assert(LatchTerm->getNumSuccessors() == 2 &&
895 "expected to be an exiting block with 2 succs!");
896 unsigned LatchBrExitIdx =
897 LatchTerm->getSuccessor(0) ==
L->getHeader() ? 1 : 0;
905 auto *LatchExitBlock = LatchTerm->getSuccessor(LatchBrExitIdx);
906 if (isa<UnreachableInst>(LatchTerm) ||
907 LatchExitBlock->getTerminatingDeoptimizeCall())
915 auto ComputeBranchProbability =
919 unsigned NumSucc =
Term->getNumSuccessors();
923 uint64_t Numerator = 0, Denominator = 0;
925 if (
Term->getSuccessor(i) == ExitBlock)
927 Denominator += Weight;
930 if (Denominator == 0)
934 assert(LatchBlock != ExitingBlock &&
935 "Latch term should always have profile data!");
942 ComputeBranchProbability(LatchBlock, LatchExitBlock);
947 if (ScaleFactor < 1) {
950 <<
"Ignored user setting for loop-predication-latch-probability-scale: "
955 const auto LatchProbabilityThreshold = LatchExitProbability * ScaleFactor;
957 for (
const auto &ExitEdge : ExitEdges) {
959 ComputeBranchProbability(ExitEdge.first, ExitEdge.second);
962 if (ExitingBlockProbability > LatchProbabilityThreshold)
994 if (
auto *BI = dyn_cast<BranchInst>(Pred->getTerminator()))
1008 L->getExitingBlocks(ExitingBlocks);
1011 for (
BasicBlock *ExitingBB : ExitingBlocks) {
1013 if (isa<SCEVCouldNotCompute>(ExitCount))
1016 "We should only have known counts for exiting blocks that "
1020 if (ExitCounts.
size() < 2)
1051 L->getExitingBlocks(ExitingBlocks);
1053 if (ExitingBlocks.
empty())
1056 auto *Latch =
L->getLoopLatch();
1064 const SCEV *LatchEC = SE->getExitCount(L, Latch);
1065 if (isa<SCEVCouldNotCompute>(LatchEC))
1074 bool ChangedLoop =
false;
1076 for (
auto *ExitingBB : ExitingBlocks) {
1077 if (LI->getLoopFor(ExitingBB) != L)
1080 auto *BI = dyn_cast<BranchInst>(ExitingBB->getTerminator());
1086 assert(WC->hasOneUse() &&
"Not appropriate widenable branch!");
1087 WC->user_back()->replaceUsesOfWith(
1098 auto *IP = cast<Instruction>(WidenableBR->getCondition());
1108 !SE->isLoopInvariant(MinEC, L) ||
1109 !
Rewriter.isSafeToExpandAt(MinEC, IP))
1115 bool InvalidateLoop =
false;
1116 Value *MinECV =
nullptr;
1117 for (
BasicBlock *ExitingBB : ExitingBlocks) {
1121 if (LI->getLoopFor(ExitingBB) != L)
1125 auto *BI = dyn_cast<BranchInst>(ExitingBB->getTerminator());
1133 const SCEV *ExitCount = SE->getExitCount(L, ExitingBB);
1134 if (isa<SCEVCouldNotCompute>(ExitCount) ||
1136 !
Rewriter.isSafeToExpandAt(ExitCount, WidenableBR))
1139 const bool ExitIfTrue = !
L->contains(*
succ_begin(ExitingBB));
1154 MinECV =
Rewriter.expandCodeFor(MinEC);
1158 ECV =
B.CreateZExt(ECV, WiderTy);
1159 RHS =
B.CreateZExt(RHS, WiderTy);
1161 assert(!Latch || DT->dominates(ExitingBB, Latch));
1166 NewCond =
B.CreateFreeze(NewCond);
1172 InvalidateLoop =
true;
1186bool LoopPredication::runOnLoop(
Loop *
Loop) {
1192 Module *
M =
L->getHeader()->getModule();
1197 bool HasIntrinsicGuards = GuardDecl && !GuardDecl->use_empty();
1198 auto *WCDecl =
M->getFunction(
1200 bool HasWidenableConditions =
1202 if (!HasIntrinsicGuards && !HasWidenableConditions)
1205 DL = &
M->getDataLayout();
1207 Preheader =
L->getLoopPreheader();
1211 auto LatchCheckOpt = parseLoopLatchICmp();
1214 LatchCheck = *LatchCheckOpt;
1219 if (!isLoopProfitableToPredicate()) {
1227 for (
const auto BB :
L->blocks()) {
1234 cast<BranchInst>(BB->getTerminator()));
1238 bool Changed =
false;
1239 for (
auto *Guard : Guards)
1240 Changed |= widenGuardConditions(Guard, Expander);
1241 for (
auto *Guard : GuardsAsWidenableBranches)
1242 Changed |= widenWidenableBranchGuardConditions(Guard, Expander);
1243 Changed |= predicateLoopExits(L, Expander);
1246 MSSAU->getMemorySSA()->verifyMemorySSA();
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static cl::opt< bool > SkipProfitabilityChecks("irce-skip-profitability-checks", cl::Hidden, cl::init(false))
static cl::opt< float > LatchExitProbabilityScale("loop-predication-latch-probability-scale", cl::Hidden, cl::init(2.0), cl::desc("scale factor for the latch probability. Value should be greater " "than 1. Lower values are ignored"))
static void normalizePredicate(ScalarEvolution *SE, Loop *L, LoopICmp &RC)
static cl::opt< bool > SkipProfitabilityChecks("loop-predication-skip-profitability-checks", cl::Hidden, cl::init(false))
static const SCEV * getMinAnalyzeableBackedgeTakenCount(ScalarEvolution &SE, DominatorTree &DT, Loop *L)
Return the minimum of all analyzeable exit counts.
static cl::opt< bool > EnableCountDownLoop("loop-predication-enable-count-down-loop", cl::Hidden, cl::init(true))
static cl::opt< bool > EnableIVTruncation("loop-predication-enable-iv-truncation", cl::Hidden, cl::init(true))
static std::optional< LoopICmp > generateLoopLatchCheck(const DataLayout &DL, ScalarEvolution &SE, const LoopICmp LatchCheck, Type *RangeCheckType)
static cl::opt< bool > PredicateWidenableBranchGuards("loop-predication-predicate-widenable-branches-to-deopt", cl::Hidden, cl::desc("Whether or not we should predicate guards " "expressed as widenable branches to deoptimize blocks"), cl::init(true))
static bool isSafeToTruncateWideIVType(const DataLayout &DL, ScalarEvolution &SE, const LoopICmp LatchCheck, Type *RangeCheckType)
static cl::opt< bool > InsertAssumesOfPredicatedGuardsConditions("loop-predication-insert-assumes-of-predicated-guards-conditions", cl::Hidden, cl::desc("Whether or not we should insert assumes of conditions of " "predicated guards"), cl::init(true))
static BranchInst * FindWidenableTerminatorAboveLoop(Loop *L, LoopInfo &LI)
If we can (cheaply) find a widenable branch which controls entry into the loop, return it.
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
Module.h This file contains the declarations for the Module class.
uint64_t IntrinsicInst * II
This file contains the declarations for profiling metadata utility functions.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Virtual Register Rewriter
A container for analyses that lazily runs them and caches their results.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
const CallInst * getPostdominatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize that is present either in current ...
Conditional or Unconditional Branch instruction.
void setCondition(Value *V)
bool isConditional() const
BasicBlock * getSuccessor(unsigned i) const
Value * getCondition() const
static BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
@ ICMP_ULE
unsigned less or equal
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Predicate getPredicate() const
Return the predicate for this instruction.
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
static ConstantInt * getTrue(LLVMContext &Context)
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This instruction compares its operands according to the predicate given to the constructor.
bool isEquality() const
Return true if this predicate is either EQ or NE.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
A wrapper class for inspecting calls to intrinsic functions.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Represents a single loop in the control flow graph.
An analysis that produces MemorySSA for a function.
A Module instance is used to store all the information related to an LLVM module.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
This node represents a polynomial recurrence on the trip count of the specified loop.
const Loop * getLoop() const
This class uses information about analyze scalars to rewrite expressions in canonical form.
bool isSafeToExpandAt(const SCEV *S, const Instruction *InsertionPoint) const
Return true if the given expression is safe to expand in the sense that all materialized values are d...
Value * expandCodeFor(const SCEV *SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
This means that we are dealing with an entirely unknown SCEV value, and only represent it as its LLVM...
This class represents an analyzed expression in the program.
bool isOne() const
Return true if the expression is a constant one.
bool isAllOnesValue() const
Return true if the expression is a constant all-ones value.
Type * getType() const
Return the LLVM type of this SCEV expression.
The main scalar evolution driver.
bool isKnownPredicate(ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
const SCEV * getTruncateExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
const SCEV * getUMinFromMismatchedTypes(const SCEV *LHS, const SCEV *RHS, bool Sequential=false)
Promote the operands to the wider of the types using zero-extension, and then perform a umin operatio...
std::optional< MonotonicPredicateType > getMonotonicPredicateType(const SCEVAddRecExpr *LHS, ICmpInst::Predicate Pred)
If, for all loop invariant X, the predicate "LHS `Pred` X" is monotonically increasing or decreasing,...
const SCEV * getCouldNotCompute()
const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)
Return the number of times the backedge executes before the given exit would be taken; if not exactly...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isPointerTy() const
True if this is an instance of PointerType.
A Use represents the edge between a Value definition and its users.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVMContext & getContext() const
All values hold a context through their type.
void dump() const
Support for debugging, callable in GDB: V->dump()
const ParentTy * getParent() const
StringRef getName(ID id)
Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
void widenWidenableBranch(BranchInst *WidenableBR, Value *NewCond)
Given a branch we know is widenable (defined per Analysis/GuardUtils.h), widen it such that condition...
Value * extractWidenableCondition(const User *U)
void parseWidenableGuard(const User *U, llvm::SmallVectorImpl< Value * > &Checks)
bool isGuard(const User *U)
Returns true iff U has semantics of a guard expressed in a form of call of llvm.experimental....
MDNode * getValidBranchWeightMDNode(const Instruction &I)
Get the valid branch weights metadata node.
bool isModSet(const ModRefInfo MRI)
bool hasValidBranchWeightMD(const Instruction &I)
Checks if an instructions has valid Branch Weight Metadata.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
bool isWidenableBranch(const User *U)
Returns true iff U is a widenable branch (that is, extractWidenableCondition returns widenable condit...
bool VerifyMemorySSA
Enables verification of MemorySSA.
bool isGuardAsWidenableBranch(const User *U)
Returns true iff U has semantics of a guard expressed in a form of a widenable conditional branch to ...
bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
auto predecessors(const MachineBasicBlock *BB)
unsigned pred_size(const MachineBasicBlock *BB)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...