205#define DEBUG_TYPE "loop-predication"
207STATISTIC(TotalConsidered,
"Number of guards considered");
221 : Pred(Pred),
IV(
IV), Limit(Limit) {}
222 LoopICmp() =
default;
224 dbgs() <<
"LoopICmp Pred = " << Pred <<
", IV = " << *IV
225 <<
", Limit = " << *Limit <<
"\n";
229class LoopPredication {
230 const ScalarOptions &Opts;
235 MemorySSAUpdater *MSSAU;
238 const DataLayout *DL;
242 bool isSupportedStep(
const SCEV* Step);
243 std::optional<LoopICmp> parseLoopICmp(ICmpInst *ICI);
244 std::optional<LoopICmp> parseLoopLatchICmp();
255 Instruction *findInsertPt(
const SCEVExpander &Expander, Instruction *User,
261 bool isLoopInvariantValue(
const SCEV* S);
263 Value *expandCheck(SCEVExpander &Expander, Instruction *Guard,
264 ICmpInst::Predicate Pred,
const SCEV *
LHS,
267 std::optional<Value *> widenICmpRangeCheck(ICmpInst *ICI,
268 SCEVExpander &Expander,
270 std::optional<Value *>
271 widenICmpRangeCheckIncrementingLoop(LoopICmp LatchCheck, LoopICmp RangeCheck,
272 SCEVExpander &Expander,
274 std::optional<Value *>
275 widenICmpRangeCheckDecrementingLoop(LoopICmp LatchCheck, LoopICmp RangeCheck,
276 SCEVExpander &Expander,
278 void widenChecks(SmallVectorImpl<Value *> &Checks,
279 SmallVectorImpl<Value *> &WidenedChecks,
280 SCEVExpander &Expander, Instruction *Guard);
281 bool widenGuardConditions(IntrinsicInst *
II, SCEVExpander &Expander);
282 bool widenWidenableBranchGuardConditions(CondBrInst *Guard,
283 SCEVExpander &Expander);
288 bool isLoopProfitableToPredicate();
290 bool predicateLoopExits(
Loop *L, SCEVExpander &
Rewriter);
293 LoopPredication(
const ScalarOptions &Opts,
AliasAnalysis *AA,
294 DominatorTree *DT, ScalarEvolution *SE, LoopInfo *LI,
295 MemorySSAUpdater *MSSAU)
296 : Opts(Opts), AA(AA), DT(DT), SE(SE), LI(LI), MSSAU(MSSAU) {};
297 bool runOnLoop(
Loop *L);
305 std::unique_ptr<MemorySSAUpdater> MSSAU;
307 MSSAU = std::make_unique<MemorySSAUpdater>(AR.
MSSA);
309 LoopPredication LP(Opts, &AR.
AA, &AR.
DT, &AR.
SE, &AR.
LI,
310 MSSAU ? MSSAU.get() :
nullptr);
311 if (!LP.runOnLoop(&L))
320std::optional<LoopICmp> LoopPredication::parseLoopICmp(
ICmpInst *ICI) {
325 const SCEV *LHSS = SE->getSCEV(LHS);
328 const SCEV *RHSS = SE->getSCEV(RHS);
333 if (SE->isLoopInvariant(LHSS, L)) {
343 return LoopICmp(Pred, AR, RHSS);
351 assert(Ty ==
RHS->
getType() &&
"expandCheck operands have different types?");
353 if (SE->isLoopInvariant(
LHS, L) && SE->isLoopInvariant(
RHS, L)) {
355 if (SE->isLoopEntryGuardedByCond(L, Pred,
LHS,
RHS))
356 return Builder.getTrue();
359 return Builder.getFalse();
366 IRBuilder<> Builder(findInsertPt(Guard, {LHSV, RHSV}));
386 const LoopICmp LatchCheck,
387 Type *RangeCheckType) {
388 if (!Opts.loop_predication_enable_iv_truncation)
390 assert(
DL.getTypeSizeInBits(LatchCheck.IV->
getType()).getFixedValue() >
391 DL.getTypeSizeInBits(RangeCheckType).getFixedValue() &&
392 "Expected latch check IV type to be larger than range check operand "
398 if (!Limit || !Start)
410 auto RangeCheckTypeBitSize =
411 DL.getTypeSizeInBits(RangeCheckType).getFixedValue();
412 return Start->getAPInt().getActiveBits() < RangeCheckTypeBitSize &&
413 Limit->getAPInt().getActiveBits() < RangeCheckTypeBitSize;
421 const LoopICmp LatchCheck,
422 Type *RangeCheckType) {
424 auto *LatchType = LatchCheck.IV->
getType();
425 if (RangeCheckType == LatchType)
428 if (
DL.getTypeSizeInBits(LatchType).getFixedValue() <
429 DL.getTypeSizeInBits(RangeCheckType).getFixedValue())
435 LoopICmp NewLatchCheck;
436 NewLatchCheck.Pred = LatchCheck.Pred;
439 if (!NewLatchCheck.IV)
441 NewLatchCheck.Limit = SE.
getTruncateExpr(LatchCheck.Limit, RangeCheckType);
443 <<
"can be represented as range check type:"
444 << *RangeCheckType <<
"\n");
445 LLVM_DEBUG(
dbgs() <<
"LatchCheck.IV: " << *NewLatchCheck.IV <<
"\n");
446 LLVM_DEBUG(
dbgs() <<
"LatchCheck.Limit: " << *NewLatchCheck.Limit <<
"\n");
447 return NewLatchCheck;
450bool LoopPredication::isSupportedStep(
const SCEV* Step) {
452 Opts.loop_predication_enable_count_down_loop);
458 if (!
L->isLoopInvariant(
Op))
460 return Preheader->getTerminator();
470 if (!SE->isLoopInvariant(
Op, L) ||
473 return Preheader->getTerminator();
476bool LoopPredication::isLoopInvariantValue(
const SCEV* S) {
496 if (SE->isLoopInvariant(S, L))
506 if (LI->isUnordered() &&
L->hasLoopInvariantOperands(LI))
507 if (!
isModSet(
AA->getModRefInfoMask(LI->getOperand(0))) ||
508 LI->hasMetadata(LLVMContext::MD_invariant_load))
513std::optional<Value *> LoopPredication::widenICmpRangeCheckIncrementingLoop(
514 LoopICmp LatchCheck, LoopICmp RangeCheck,
SCEVExpander &Expander,
516 auto *Ty = RangeCheck.IV->
getType();
524 const SCEV *GuardLimit = RangeCheck.Limit;
526 const SCEV *LatchLimit = LatchCheck.Limit;
530 if (!isLoopInvariantValue(GuardStart) ||
531 !isLoopInvariantValue(GuardLimit) ||
532 !isLoopInvariantValue(LatchStart) ||
533 !isLoopInvariantValue(LatchLimit)) {
545 SE->getAddExpr(SE->getMinusSCEV(GuardLimit, GuardStart),
546 SE->getMinusSCEV(LatchStart, SE->getOne(Ty)));
547 auto LimitCheckPred =
555 expandCheck(Expander, Guard, LimitCheckPred, LatchLimit,
RHS);
556 auto *FirstIterationCheck = expandCheck(Expander, Guard, RangeCheck.Pred,
557 GuardStart, GuardLimit);
558 IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck}));
560 Builder.CreateAnd(FirstIterationCheck, LimitCheck));
563std::optional<Value *> LoopPredication::widenICmpRangeCheckDecrementingLoop(
564 LoopICmp LatchCheck, LoopICmp RangeCheck,
SCEVExpander &Expander,
566 auto *Ty = RangeCheck.IV->
getType();
568 const SCEV *GuardLimit = RangeCheck.Limit;
570 const SCEV *LatchLimit = LatchCheck.Limit;
574 if (!isLoopInvariantValue(GuardStart) ||
575 !isLoopInvariantValue(GuardLimit) ||
576 !isLoopInvariantValue(LatchStart) ||
577 !isLoopInvariantValue(LatchLimit)) {
589 if (RangeCheck.IV != PostDecLatchCheckIV) {
591 << *PostDecLatchCheckIV
592 <<
" and RangeCheckIV: " << *RangeCheck.IV <<
"\n");
600 auto LimitCheckPred =
602 auto *FirstIterationCheck = expandCheck(Expander, Guard,
604 GuardStart, GuardLimit);
605 auto *LimitCheck = expandCheck(Expander, Guard, LimitCheckPred, LatchLimit,
607 IRBuilder<> Builder(findInsertPt(Guard, {FirstIterationCheck, LimitCheck}));
609 Builder.CreateAnd(FirstIterationCheck, LimitCheck));
626std::optional<Value *>
636 auto RangeCheck = parseLoopICmp(ICI);
638 LLVM_DEBUG(
dbgs() <<
"Failed to parse the loop latch condition!\n");
645 << RangeCheck->Pred <<
")!\n");
648 auto *RangeCheckIV = RangeCheck->IV;
649 if (!RangeCheckIV->isAffine()) {
653 const SCEV *Step = RangeCheckIV->getStepRecurrence(*SE);
656 if (!isSupportedStep(Step)) {
657 LLVM_DEBUG(
dbgs() <<
"Range check and latch have IVs different steps!\n");
660 auto *Ty = RangeCheckIV->getType();
661 auto CurrLatchCheckOpt =
663 if (!CurrLatchCheckOpt) {
665 "corresponding to range type: "
670 LoopICmp CurrLatchCheck = *CurrLatchCheckOpt;
675 "Range and latch steps should be of same type!");
677 LLVM_DEBUG(
dbgs() <<
"Range and latch have different step values!\n");
682 return widenICmpRangeCheckIncrementingLoop(CurrLatchCheck, *RangeCheck,
686 return widenICmpRangeCheckDecrementingLoop(CurrLatchCheck, *RangeCheck,
694 for (
auto &
Check : Checks)
696 if (
auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander, Guard)) {
698 Check = *NewRangeCheck;
702bool LoopPredication::widenGuardConditions(
IntrinsicInst *Guard,
711 widenChecks(Checks, WidenedChecks, Expander, Guard);
712 if (WidenedChecks.
empty())
715 TotalWidened += WidenedChecks.
size();
719 Value *AllChecks = Builder.CreateAnd(Checks);
722 if (Opts.loop_predication_insert_assumes_of_predicated_guards_conditions) {
724 Builder.CreateAssumption(OldCond);
732bool LoopPredication::widenWidenableBranchGuardConditions(
746 widenChecks(Checks, WidenedChecks, Expander, BI);
747 if (WidenedChecks.
empty())
750 TotalWidened += WidenedChecks.
size();
754 Value *AllChecks = Builder.CreateAnd(Checks);
757 if (Opts.loop_predication_insert_assumes_of_predicated_guards_conditions) {
763 Value *AssumeCond = Builder.CreateAnd(WidenedChecks);
769 PN->addIncoming(Pred == GuardBB ? AssumeCond : Builder.getTrue(), Pred);
772 Builder.CreateAssumption(AssumeCond);
776 "Stopped being a guard after transform?");
782std::optional<LoopICmp> LoopPredication::parseLoopLatchICmp() {
798 (TrueDest ==
L->getHeader() || BI->
getSuccessor(1) ==
L->getHeader()) &&
799 "One of the latch's destinations must be the header");
806 auto Result = parseLoopICmp(ICI);
808 LLVM_DEBUG(
dbgs() <<
"Failed to parse the loop latch condition!\n");
812 if (TrueDest !=
L->getHeader())
817 if (!
Result->IV->isAffine()) {
822 const SCEV *Step =
Result->IV->getStepRecurrence(*SE);
823 if (!isSupportedStep(Step)) {
824 LLVM_DEBUG(
dbgs() <<
"Unsupported loop stride(" << *Step <<
")!\n");
840 if (IsUnsupportedPredicate(Step,
Result->Pred)) {
849bool LoopPredication::isLoopProfitableToPredicate() {
850 if (Opts.loop_predication_skip_profitability_checks)
854 LI->getExitEdges(*L, ExitEdges);
857 if (ExitEdges.
size() == 1)
865 auto *LatchBlock =
L->getLoopLatch();
866 assert(LatchBlock &&
"Should have a single latch at this point!");
867 auto *LatchTerm = LatchBlock->getTerminator();
868 assert(LatchTerm->getNumSuccessors() == 2 &&
869 "expected to be an exiting block with 2 succs!");
870 unsigned LatchBrExitIdx =
871 LatchTerm->getSuccessor(0) ==
L->getHeader() ? 1 : 0;
879 auto *LatchExitBlock = LatchTerm->getSuccessor(LatchBrExitIdx);
881 LatchExitBlock->getTerminatingDeoptimizeCall())
889 auto ComputeBranchProbability =
893 unsigned NumSucc =
Term->getNumSuccessors();
897 uint64_t Numerator = 0, Denominator = 0;
899 if (
Term->getSuccessor(i) == ExitBlock)
901 Denominator += Weight;
904 if (Denominator == 0)
908 assert(LatchBlock != ExitingBlock &&
909 "Latch term should always have profile data!");
916 ComputeBranchProbability(LatchBlock, LatchExitBlock);
920 float ScaleFactor = Opts.loop_predication_latch_probability_scale;
921 if (ScaleFactor < 1) {
924 <<
"Ignored user setting for loop-predication-latch-probability-scale: "
925 << Opts.loop_predication_latch_probability_scale <<
"\n");
929 const auto LatchProbabilityThreshold = LatchExitProbability * ScaleFactor;
931 for (
const auto &ExitEdge : ExitEdges) {
933 ComputeBranchProbability(ExitEdge.first, ExitEdge.second);
936 if (ExitingBlockProbability > LatchProbabilityThreshold)
982 L->getExitingBlocks(ExitingBlocks);
990 "We should only have known counts for exiting blocks that "
994 if (ExitCounts.
size() < 2)
1025 L->getExitingBlocks(ExitingBlocks);
1027 if (ExitingBlocks.
empty())
1030 auto *Latch =
L->getLoopLatch();
1038 const SCEV *LatchEC = SE->getExitCount(L, Latch);
1048 bool ChangedLoop =
false;
1050 for (
auto *ExitingBB : ExitingBlocks) {
1051 if (LI->getLoopFor(ExitingBB) != L)
1060 assert(WC->hasOneUse() &&
"Not appropriate widenable branch!");
1061 WC->user_back()->replaceUsesOfWith(
1082 !SE->isLoopInvariant(MinEC, L) ||
1083 !
Rewriter.isSafeToExpandAt(MinEC, IP))
1089 bool InvalidateLoop =
false;
1090 Value *MinECV =
nullptr;
1091 for (
BasicBlock *ExitingBB : ExitingBlocks) {
1095 if (LI->getLoopFor(ExitingBB) != L)
1107 const SCEV *ExitCount = SE->getExitCount(L, ExitingBB);
1110 !
Rewriter.isSafeToExpandAt(ExitCount, WidenableBR))
1113 const bool ExitIfTrue = !
L->contains(*
succ_begin(ExitingBB));
1128 MinECV =
Rewriter.expandCodeFor(MinEC);
1132 ECV =
B.CreateZExt(ECV, WiderTy);
1133 RHS =
B.CreateZExt(
RHS, WiderTy);
1135 assert(!Latch || DT->dominates(ExitingBB, Latch));
1140 NewCond =
B.CreateFreeze(NewCond);
1146 InvalidateLoop =
true;
1160bool LoopPredication::runOnLoop(
Loop *
Loop) {
1166 Module *
M =
L->getHeader()->getModule();
1171 bool HasIntrinsicGuards = GuardDecl && !GuardDecl->use_empty();
1173 M, Intrinsic::experimental_widenable_condition);
1174 bool HasWidenableConditions =
1175 Opts.loop_predication_predicate_widenable_branches_to_deopt && WCDecl &&
1176 !WCDecl->use_empty();
1177 if (!HasIntrinsicGuards && !HasWidenableConditions)
1180 DL = &
M->getDataLayout();
1182 Preheader =
L->getLoopPreheader();
1186 auto LatchCheckOpt = parseLoopLatchICmp();
1189 LatchCheck = *LatchCheckOpt;
1194 if (!isLoopProfitableToPredicate()) {
1202 for (
const auto BB :
L->blocks()) {
1206 if (Opts.loop_predication_predicate_widenable_branches_to_deopt &&
1214 for (
auto *Guard : Guards)
1215 Changed |= widenGuardConditions(Guard, Expander);
1216 for (
auto *Guard : GuardsAsWidenableBranches)
1217 Changed |= widenWidenableBranchGuardConditions(Guard, Expander);
1218 Changed |= predicateLoopExits(L, Expander);
1221 MSSAU->getMemorySSA()->verifyMemorySSA();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static CondBrInst * FindWidenableTerminatorAboveLoop(Loop *L, LoopInfo &LI)
If we can (cheaply) find a widenable branch which controls entry into the loop, return it.
static void normalizePredicate(ScalarEvolution *SE, Loop *L, LoopICmp &RC)
static std::optional< LoopICmp > generateLoopLatchCheck(const ScalarOptions &Opts, const DataLayout &DL, ScalarEvolution &SE, const LoopICmp LatchCheck, Type *RangeCheckType)
static const SCEV * getMinAnalyzeableBackedgeTakenCount(ScalarEvolution &SE, DominatorTree &DT, Loop *L)
Return the minimum of all analyzeable exit counts.
static bool isSafeToTruncateWideIVType(const ScalarOptions &Opts, const DataLayout &DL, ScalarEvolution &SE, const LoopICmp LatchCheck, Type *RangeCheckType)
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
uint64_t IntrinsicInst * II
This file contains the declarations for profiling metadata utility functions.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
virt reg Virtual Register Rewriter
static const uint32_t IV[8]
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
LLVM_ABI const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
InstListType::iterator iterator
Instruction iterators...
LLVM_ABI const CallInst * getPostdominatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize that is present either in current ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI 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".
Conditional Branch instruction.
void setCondition(Value *V)
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
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.
LLVM_ABI 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.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
Value * CreateFreeze(Value *V, const Twine &Name="")
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
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...
LLVM_ABI 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.
LLVM_ABI const SCEVAddRecExpr * getPostIncExpr(ScalarEvolution &SE) const
Return an expression representing the value of this expression one iteration of the loop ahead.
const Loop * getLoop() const
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class uses information about analyze scalars to rewrite expressions in canonical form.
LLVM_ABI 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...
LLVM_ABI Value * expandCodeFor(SCEVUse 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.
LLVM_ABI bool isOne() const
Return true if the expression is a constant one.
LLVM_ABI 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.
LLVM_ABI const SCEV * getTruncateExpr(SCEVUse Op, Type *Ty, unsigned Depth=0)
LLVM_ABI 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...
LLVM_ABI 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,...
LLVM_ABI const SCEV * getCouldNotCompute()
LLVM_ABI 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...
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
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.
LLVM_ABI void dump() const
Support for debugging, callable in GDB: V->dump()
const ParentTy * getParent() const
Abstract Attribute helper functions.
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
LLVM_ABI 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,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Value * extractWidenableCondition(const User *U)
auto pred_size(const MachineBasicBlock *BB)
const ScalarOptions & getScalarOptions(const LLVMContext &C)
LLVM_ABI void parseWidenableGuard(const User *U, llvm::SmallVectorImpl< Value * > &Checks)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
LLVM_ABI bool isGuard(const User *U)
Returns true iff U has semantics of a guard expressed in a form of call of llvm.experimental....
LLVM_ABI MDNode * getValidBranchWeightMDNode(const Instruction &I)
Get the valid branch weights metadata node.
bool isModSet(const ModRefInfo MRI)
LLVM_ABI bool hasValidBranchWeightMD(const Instruction &I)
Checks if an instructions has valid Branch Weight Metadata.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
LLVM_ABI bool isWidenableBranch(const User *U)
Returns true iff U is a widenable branch (that is, extractWidenableCondition returns widenable condit...
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
LLVM_ABI bool isGuardAsWidenableBranch(const User *U)
Returns true iff U has semantics of a guard expressed in a form of a widenable conditional branch to ...
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
auto predecessors(const MachineBasicBlock *BB)
LLVM_ABI void widenWidenableBranch(CondBrInst *WidenableBR, Value *NewCond)
Given a branch we know is widenable (defined per Analysis/GuardUtils.h), widen it such that condition...
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
SCEVUseT< const SCEV * > SCEVUse
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...