116 cl::desc(
"If set to true, IRCE may eliminate wide range checks in loops "
117 "with narrow latch condition."));
122 "Maximum size of range check type for which can be produced runtime "
123 "overflow check of its limit's computation"));
129#define DEBUG_TYPE "irce"
137class InductiveRangeCheck {
139 const SCEV *Begin =
nullptr;
140 const SCEV *Step =
nullptr;
141 const SCEV *End =
nullptr;
142 Use *CheckUse =
nullptr;
158 static bool reassociateSubLHS(
Loop *L,
Value *VariantLHS,
Value *InvariantRHS,
163 const SCEV *getBegin()
const {
return Begin; }
164 const SCEV *getStep()
const {
return Step; }
165 const SCEV *getEnd()
const {
return End; }
168 OS <<
"InductiveRangeCheck:\n";
175 OS <<
"\n CheckUse: ";
176 getCheckUse()->getUser()->print(OS);
177 OS <<
" Operand: " << getCheckUse()->getOperandNo() <<
"\n";
185 Use *getCheckUse()
const {
return CheckUse; }
195 Range(
const SCEV *Begin,
const SCEV *End) : Begin(Begin), End(End) {
200 const SCEV *getBegin()
const {
return Begin; }
201 const SCEV *getEnd()
const {
return End; }
214 bool getPassingDirection() {
return true; }
221 bool IsLatchSigned)
const;
228 static void extractRangeChecksFromBranch(
230 std::optional<uint64_t> EstimatedTripCount,
234class InductiveRangeCheckElimination {
246 std::optional<uint64_t> estimatedTripCount(
const Loop &L);
251 LoopInfo &LI, GetBFIFunc GetBFI =
nullptr)
252 : SE(SE), BPI(BPI), DT(DT), LI(LI), GetBFI(GetBFI) {}
263bool InductiveRangeCheck::parseRangeCheckICmp(
Loop *L,
ICmpInst *ICI,
267 auto IsLoopInvariant = [&SE,
L](
Value *
V) {
279 if (IsLoopInvariant(
LHS)) {
282 }
else if (!IsLoopInvariant(
RHS))
286 if (parseIvAgaisntLimit(L,
LHS,
RHS, Pred, SE, Index, End))
289 if (reassociateSubLHS(L,
LHS,
RHS, Pred, SE, Index, End))
297bool InductiveRangeCheck::parseIvAgaisntLimit(Loop *L,
Value *
LHS,
Value *
RHS,
298 ICmpInst::Predicate Pred,
300 const SCEVAddRecExpr *&Index,
303 auto SIntMaxSCEV = [&](
Type *
T) {
320 case ICmpInst::ICMP_SGE:
323 End = SIntMaxSCEV(
Index->getType());
328 case ICmpInst::ICMP_SGT:
331 End = SIntMaxSCEV(
Index->getType());
336 case ICmpInst::ICMP_SLT:
337 case ICmpInst::ICMP_ULT:
342 case ICmpInst::ICMP_SLE:
343 case ICmpInst::ICMP_ULE:
346 bool Signed = Pred == ICmpInst::ICMP_SLE;
360bool InductiveRangeCheck::reassociateSubLHS(
361 Loop *L,
Value *VariantLHS,
Value *InvariantRHS, ICmpInst::Predicate Pred,
362 ScalarEvolution &SE,
const SCEVAddRecExpr *&Index,
const SCEV *&End) {
369 const SCEV *Limit = SE.
getSCEV(InvariantRHS);
371 bool OffsetSubtracted =
false;
377 OffsetSubtracted =
true;
425 const SCEV *
RHS) ->
const SCEV * {
426 const SCEV *(ScalarEvolution::*
Operation)(
const SCEV *,
const SCEV *,
431 case Instruction::Add:
434 case Instruction::Sub:
455 if (OffsetSubtracted)
457 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add,
Offset, Limit);
460 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Sub,
Offset, Limit);
461 Pred = ICmpInst::getSwappedPredicate(Pred);
464 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE) {
466 if (Pred == ICmpInst::ICMP_SLE && Limit)
467 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add, Limit,
478void InductiveRangeCheck::extractRangeChecksFromCond(
479 Loop *L, ScalarEvolution &SE, Use &ConditionUse,
480 SmallVectorImpl<InductiveRangeCheck> &Checks,
481 SmallPtrSetImpl<Value *> &Visited) {
482 Value *Condition = ConditionUse.
get();
483 if (!Visited.
insert(Condition).second)
488 extractRangeChecksFromCond(L, SE,
cast<User>(Condition)->getOperandUse(0),
490 extractRangeChecksFromCond(L, SE,
cast<User>(Condition)->getOperandUse(1),
499 const SCEV *End =
nullptr;
500 const SCEVAddRecExpr *IndexAddRec =
nullptr;
501 if (!parseRangeCheckICmp(L, ICI, SE, IndexAddRec, End))
504 assert(IndexAddRec &&
"IndexAddRec was not computed");
505 assert(End &&
"End was not computed");
510 InductiveRangeCheck IRC;
512 IRC.Begin = IndexAddRec->
getStart();
514 IRC.CheckUse = &ConditionUse;
518void InductiveRangeCheck::extractRangeChecksFromBranch(
519 BranchInst *BI, Loop *L, ScalarEvolution &SE, BranchProbabilityInfo *BPI,
520 std::optional<uint64_t> EstimatedTripCount,
521 SmallVectorImpl<InductiveRangeCheck> &Checks,
bool &
Changed) {
525 unsigned IndexLoopSucc =
L->contains(BI->
getSuccessor(0)) ? 0 : 1;
527 "No edges coming to loop?");
530 auto SuccessProbability =
532 if (EstimatedTripCount) {
533 auto EstimatedEliminatedChecks =
534 SuccessProbability.scale(*EstimatedTripCount);
536 LLVM_DEBUG(
dbgs() <<
"irce: could not prove profitability for branch "
538 <<
"estimated eliminated checks too low "
539 << EstimatedEliminatedChecks <<
"\n";);
543 BranchProbability LikelyTaken(15, 16);
544 if (SuccessProbability < LikelyTaken) {
545 LLVM_DEBUG(
dbgs() <<
"irce: could not prove profitability for branch "
547 <<
"could not estimate trip count "
548 <<
"and branch success probability too low "
549 << SuccessProbability <<
"\n";);
557 if (IndexLoopSucc != 0) {
565 SmallPtrSet<Value *, 8> Visited;
566 InductiveRangeCheck::extractRangeChecksFromCond(L, SE, BI->
getOperandUse(0),
580static std::optional<LoopConstrainer::SubRanges>
582 InductiveRangeCheck::Range &
Range,
598 RTy, SE, IsSignedPredicate);
600 SE, IsSignedPredicate);
608 const SCEV *Smallest =
nullptr, *Greatest =
nullptr, *GreatestSeen =
nullptr;
634 GreatestSeen = Start;
637 auto Clamp = [&SE, Smallest, Greatest, IsSignedPredicate](
const SCEV *S) {
638 return IsSignedPredicate
649 bool ProvablyNoPreloop =
651 if (!ProvablyNoPreloop)
652 Result.LowLimit = Clamp(
Range.getBegin());
654 bool ProvablyNoPostLoop =
656 if (!ProvablyNoPostLoop)
657 Result.HighLimit = Clamp(
Range.getEnd());
665std::optional<InductiveRangeCheck::Range>
666InductiveRangeCheck::computeSafeIterationSpace(ScalarEvolution &SE,
667 const SCEVAddRecExpr *IndVar,
668 bool IsLatchSigned)
const {
675 if (!IVType || !RCType)
677 if (IVType->getBitWidth() > RCType->getBitWidth())
708 assert(!
B->isZero() &&
"Recurrence with zero step?");
710 const SCEV *
C = getBegin();
715 assert(!
D->getValue()->isZero() &&
"Recurrence with zero step?");
716 unsigned BitWidth = RCType->getBitWidth();
732 auto ClampedSubtract = [&](
const SCEV *
X,
const SCEV *
Y) {
768 auto SCEVCheckNonNegative = [&](
const SCEV *
X) {
771 const SCEV *One = SE.
getOne(
X->getType());
785 auto SCEVCheckWillNotOverflow = [&](
const SCEV *
X) {
789 const SCEV *OverflowCheck =
795 const SCEV *UnderflowCheck =
798 return SE.
getMulExpr(OverflowCheck, UnderflowCheck);
809 const SCEV *REnd = getEnd();
810 const SCEV *EndWillNotOverflow = SE.
getOne(RCType);
812 auto PrintRangeCheck = [&](raw_ostream &OS) {
814 OS <<
"irce: in function ";
815 OS <<
L->getHeader()->getParent()->getName();
818 OS <<
"there is range check with scaled boundary:\n";
822 if (EndType->getBitWidth() > RCType->getBitWidth()) {
823 assert(EndType->getBitWidth() == RCType->getBitWidth() * 2);
825 PrintRangeCheck(
errs());
834 const SCEV *RuntimeChecks =
835 SE.
getMulExpr(SCEVCheckNonNegative(REnd), EndWillNotOverflow);
836 const SCEV *Begin = SE.
getMulExpr(ClampedSubtract(Zero, M), RuntimeChecks);
837 const SCEV *End = SE.
getMulExpr(ClampedSubtract(REnd, M), RuntimeChecks);
839 return InductiveRangeCheck::Range(Begin, End);
842static std::optional<InductiveRangeCheck::Range>
844 const std::optional<InductiveRangeCheck::Range> &R1,
845 const InductiveRangeCheck::Range &
R2) {
846 if (
R2.isEmpty(SE,
true))
853 assert(!R1Value.isEmpty(SE,
true) &&
854 "We should never have empty R1!");
858 if (R1Value.getType() !=
R2.getType())
865 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
866 if (Ret.isEmpty(SE,
true))
871static std::optional<InductiveRangeCheck::Range>
873 const std::optional<InductiveRangeCheck::Range> &R1,
874 const InductiveRangeCheck::Range &
R2) {
875 if (
R2.isEmpty(SE,
false))
882 assert(!R1Value.isEmpty(SE,
false) &&
883 "We should never have empty R1!");
887 if (R1Value.getType() !=
R2.getType())
894 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
895 if (Ret.isEmpty(SE,
false))
915 InductiveRangeCheckElimination IRCE(SE, &BPI, DT, LI, { getBFI });
919 bool CFGChanged =
false;
920 for (
const auto &L : LI) {
921 CFGChanged |=
simplifyLoop(L, &DT, &LI, &SE,
nullptr,
nullptr,
936 auto LPMAddNewLoop = [&Worklist](
Loop *NL,
bool IsSubloop) {
941 while (!Worklist.
empty()) {
943 if (IRCE.run(L, LPMAddNewLoop)) {
958std::optional<uint64_t>
959InductiveRangeCheckElimination::estimatedTripCount(
const Loop &L) {
962 uint64_t hFreq = BFI.getBlockFreq(L.getHeader()).getFrequency();
963 uint64_t phFreq = BFI.getBlockFreq(L.getLoopPreheader()).getFrequency();
964 if (phFreq == 0 || hFreq == 0)
966 return {hFreq / phFreq};
972 auto *Latch =
L.getLoopLatch();
979 auto LatchBrExitIdx = LatchBr->getSuccessor(0) ==
L.getHeader() ? 1 : 0;
980 BranchProbability ExitProbability =
988bool InductiveRangeCheckElimination::run(
989 Loop *L, function_ref<
void(Loop *,
bool)> LPMAddNewLoop) {
991 LLVM_DEBUG(
dbgs() <<
"irce: giving up constraining loop, too large\n");
1001 auto EstimatedTripCount = estimatedTripCount(*L);
1005 <<
"the estimated number of iterations is "
1006 << *EstimatedTripCount <<
"\n");
1014 for (
auto *BBI :
L->getBlocks())
1016 InductiveRangeCheck::extractRangeChecksFromBranch(
1017 TBI, L, SE, BPI, EstimatedTripCount, RangeChecks,
Changed);
1019 if (RangeChecks.
empty())
1022 auto PrintRecognizedRangeChecks = [&](raw_ostream &OS) {
1023 OS <<
"irce: looking at loop ";
L->print(OS);
1024 OS <<
"irce: loop has " << RangeChecks.
size()
1025 <<
" inductive range checks: \n";
1026 for (InductiveRangeCheck &IRC : RangeChecks)
1033 PrintRecognizedRangeChecks(
errs());
1035 const char *FailureReason =
nullptr;
1036 std::optional<LoopStructure> MaybeLoopStructure =
1039 if (!MaybeLoopStructure) {
1041 << FailureReason <<
"\n";);
1044 LoopStructure
LS = *MaybeLoopStructure;
1045 const SCEVAddRecExpr *IndVar =
1048 std::optional<InductiveRangeCheck::Range> SafeIterRange;
1055 auto IntersectRange =
1058 for (InductiveRangeCheck &IRC : RangeChecks) {
1059 auto Result = IRC.computeSafeIterationSpace(SE, IndVar,
1060 LS.IsSignedPredicate);
1062 auto MaybeSafeIterRange = IntersectRange(SE, SafeIterRange, *Result);
1063 if (MaybeSafeIterRange) {
1064 assert(!MaybeSafeIterRange->isEmpty(SE,
LS.IsSignedPredicate) &&
1065 "We should never return empty ranges!");
1067 SafeIterRange = *MaybeSafeIterRange;
1075 std::optional<LoopConstrainer::SubRanges> MaybeSR =
1082 LoopConstrainer LC(*L, LI, LPMAddNewLoop, LS, SE, DT,
1083 SafeIterRange->getBegin()->getType(), *MaybeSR);
1088 auto PrintConstrainedLoopInfo = [
L]() {
1089 dbgs() <<
"irce: in function ";
1090 dbgs() <<
L->getHeader()->getParent()->getName() <<
": ";
1091 dbgs() <<
"constrained ";
1098 PrintConstrainedLoopInfo();
1102 for (InductiveRangeCheck &IRC : RangeChecksToEliminate) {
1103 ConstantInt *FoldedRangeCheck = IRC.getPassingDirection()
1106 IRC.getCheckUse()->set(FoldedRangeCheck);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This defines the Use class.
static const SCEV * NoopOrExtend(const SCEV *S, Type *Ty, ScalarEvolution &SE, bool Signed)
If the type of S matches with Ty, return S.
static cl::opt< bool > PrintRangeChecks("irce-print-range-checks", cl::Hidden, cl::init(false))
static cl::opt< bool > AllowUnsignedLatchCondition("irce-allow-unsigned-latch", cl::Hidden, cl::init(true))
static cl::opt< unsigned > LoopSizeCutoff("irce-loop-size-cutoff", cl::Hidden, cl::init(64))
static std::optional< InductiveRangeCheck::Range > IntersectSignedRange(ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
static cl::opt< bool > AllowNarrowLatchCondition("irce-allow-narrow-latch", cl::Hidden, cl::init(true), cl::desc("If set to true, IRCE may eliminate wide range checks in loops " "with narrow latch condition."))
static cl::opt< unsigned > MaxTypeSizeForOverflowCheck("irce-max-type-size-for-overflow-check", cl::Hidden, cl::init(32), cl::desc("Maximum size of range check type for which can be produced runtime " "overflow check of its limit's computation"))
static cl::opt< unsigned > MinEliminatedChecks("irce-min-eliminated-checks", cl::Hidden, cl::init(10))
static cl::opt< bool > PrintChangedLoops("irce-print-changed-loops", cl::Hidden, cl::init(false))
static std::optional< InductiveRangeCheck::Range > IntersectUnsignedRange(ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
static cl::opt< bool > SkipProfitabilityChecks("irce-skip-profitability-checks", cl::Hidden, cl::init(false))
static std::optional< LoopConstrainer::SubRanges > calculateSubRanges(ScalarEvolution &SE, const Loop &L, InductiveRangeCheck::Range &Range, const LoopStructure &MainLoopStructure)
static cl::opt< bool > PrintScaledBoundaryRangeChecks("irce-print-scaled-boundary-range-checks", cl::Hidden, cl::init(false))
static Constant * getFalse(Type *Ty)
For a boolean type or a vector of boolean type, return false or a vector with every element false.
This header provides classes for managing per-loop analyses.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file provides a priority worklist.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
static const uint32_t IV[8]
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
void invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Invalidate cached analyses for an IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional or Unconditional Branch instruction.
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
Analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI void swapSuccEdgesProbabilities(const BasicBlock *Src)
Swap outgoing edges probabilities for Src with branch terminator.
LLVM_ABI uint64_t scaleByInverse(uint64_t Num) const
Scale a large integer by the inverse.
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_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 getPredicate() const
Return the predicate for this instruction.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
This instruction compares its operands according to the predicate given to the constructor.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
Analysis pass that exposes the LoopInfo for a function.
Represents a single loop in the control flow graph.
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.
PreservedAnalyses & abandon()
Mark an analysis as abandoned.
bool empty() const
Determine if the PriorityWorklist is empty or not.
This node represents a polynomial recurrence on the trip count of the specified loop.
const SCEV * getStart() const
const SCEV * getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
const Loop * getLoop() const
This class represents an analyzed expression in the program.
LLVM_ABI void print(raw_ostream &OS) const
Print out the internal representation of this scalar to the specified stream.
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
NoWrapFlags
NoWrapFlags are bitfield indices into SubclassData.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI const SCEV * getSMaxExpr(const SCEV *LHS, const SCEV *RHS)
LLVM_ABI const SCEV * getSMinExpr(const SCEV *LHS, const SCEV *RHS)
LLVM_ABI const SCEV * getUMaxExpr(const SCEV *LHS, const SCEV *RHS)
const SCEV * getZero(Type *Ty)
Return a SCEV for the constant 0 of a specific type.
LLVM_ABI bool willNotOverflow(Instruction::BinaryOps BinOp, bool Signed, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI=nullptr)
Is operation BinOp between LHS and RHS provably does not have a signed/unsigned overflow (Signed)?
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getNoopOrSignExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI const SCEV * getUMinExpr(const SCEV *LHS, const SCEV *RHS, bool Sequential=false)
LLVM_ABI const SCEV * getTruncateExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI const SCEV * getNoopOrZeroExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getMulExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
A version of PriorityWorklist that selects small size optimized data structures for the vector and ma...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
The instances of the Type class are immutable: once they are created, they are never changed.
bool isIntegerTy() const
True if this is an instance of IntegerType.
A Use represents the edge between a Value definition and its users.
const Use & getOperandUse(unsigned i) const
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
bool match(Val *V, const Pattern &P)
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify each loop in a loop nest recursively.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
FunctionAddr VTableAddr Value
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put a loop nest into LCSSA form.
LLVM_ABI void InvertBranch(BranchInst *PBI, IRBuilderBase &Builder)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_TEMPLATE_ABI void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI bool isKnownNegativeInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE)
Returns true if we can prove that S is defined and always negative in loop L.
constexpr unsigned BitWidth
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.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI bool isKnownNonNegativeInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE)
Returns true if we can prove that S is defined and always non-negative in loop L.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
IntegerType * ExitCountTy
static std::optional< LoopStructure > parseLoopStructure(ScalarEvolution &, Loop &, bool, const char *&)