117 cl::desc(
"If set to true, IRCE may eliminate wide range checks in loops "
118 "with narrow latch condition."));
123 "Maximum size of range check type for which can be produced runtime "
124 "overflow check of its limit's computation"));
130#define DEBUG_TYPE "irce"
138class InductiveRangeCheck {
140 const SCEV *Begin =
nullptr;
141 const SCEV *Step =
nullptr;
142 const SCEV *End =
nullptr;
143 Use *CheckUse =
nullptr;
159 static bool reassociateSubLHS(
Loop *L,
Value *VariantLHS,
Value *InvariantRHS,
164 const SCEV *getBegin()
const {
return Begin; }
165 const SCEV *getStep()
const {
return Step; }
166 const SCEV *getEnd()
const {
return End; }
169 OS <<
"InductiveRangeCheck:\n";
176 OS <<
"\n CheckUse: ";
177 getCheckUse()->getUser()->print(OS);
178 OS <<
" Operand: " << getCheckUse()->getOperandNo() <<
"\n";
186 Use *getCheckUse()
const {
return CheckUse; }
196 Range(
const SCEV *Begin,
const SCEV *End) : Begin(Begin), End(End) {
201 const SCEV *getBegin()
const {
return Begin; }
202 const SCEV *getEnd()
const {
return End; }
215 bool getPassingDirection() {
return true; }
222 bool IsLatchSigned)
const;
229 static void extractRangeChecksFromBranch(
231 std::optional<uint64_t> EstimatedTripCount,
235class InductiveRangeCheckElimination {
247 std::optional<uint64_t> estimatedTripCount(
const Loop &L);
252 LoopInfo &LI, GetBFIFunc GetBFI =
nullptr)
253 : SE(SE), BPI(BPI), DT(DT), LI(LI), GetBFI(GetBFI) {}
264bool InductiveRangeCheck::parseRangeCheckICmp(
Loop *L,
ICmpInst *ICI,
268 auto IsLoopInvariant = [&SE,
L](
Value *
V) {
280 if (IsLoopInvariant(
LHS)) {
283 }
else if (!IsLoopInvariant(
RHS))
287 if (parseIvAgaisntLimit(L,
LHS,
RHS, Pred, SE, Index, End))
290 if (reassociateSubLHS(L,
LHS,
RHS, Pred, SE, Index, End))
298bool InductiveRangeCheck::parseIvAgaisntLimit(Loop *L,
Value *
LHS,
Value *
RHS,
299 ICmpInst::Predicate Pred,
301 const SCEVAddRecExpr *&Index,
304 auto SIntMaxSCEV = [&](
Type *
T) {
321 case ICmpInst::ICMP_SGE:
324 End = SIntMaxSCEV(
Index->getType());
329 case ICmpInst::ICMP_SGT:
332 End = SIntMaxSCEV(
Index->getType());
337 case ICmpInst::ICMP_SLT:
338 case ICmpInst::ICMP_ULT:
343 case ICmpInst::ICMP_SLE:
344 case ICmpInst::ICMP_ULE:
347 bool Signed = Pred == ICmpInst::ICMP_SLE;
361bool InductiveRangeCheck::reassociateSubLHS(
362 Loop *L,
Value *VariantLHS,
Value *InvariantRHS, ICmpInst::Predicate Pred,
363 ScalarEvolution &SE,
const SCEVAddRecExpr *&Index,
const SCEV *&End) {
370 const SCEV *Limit = SE.
getSCEV(InvariantRHS);
372 bool OffsetSubtracted =
false;
378 OffsetSubtracted =
true;
426 const SCEV *
RHS) ->
const SCEV * {
432 case Instruction::Add:
435 case Instruction::Sub:
456 if (OffsetSubtracted)
458 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add,
Offset, Limit);
461 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Sub,
Offset, Limit);
462 Pred = ICmpInst::getSwappedPredicate(Pred);
465 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE) {
467 if (Pred == ICmpInst::ICMP_SLE && Limit)
468 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add, Limit,
479void InductiveRangeCheck::extractRangeChecksFromCond(
480 Loop *L, ScalarEvolution &SE, Use &ConditionUse,
481 SmallVectorImpl<InductiveRangeCheck> &Checks,
482 SmallPtrSetImpl<Value *> &Visited) {
483 Value *Condition = ConditionUse.
get();
484 if (!Visited.
insert(Condition).second)
489 extractRangeChecksFromCond(L, SE,
cast<User>(Condition)->getOperandUse(0),
491 extractRangeChecksFromCond(L, SE,
cast<User>(Condition)->getOperandUse(1),
500 const SCEV *End =
nullptr;
501 const SCEVAddRecExpr *IndexAddRec =
nullptr;
502 if (!parseRangeCheckICmp(L, ICI, SE, IndexAddRec, End))
505 assert(IndexAddRec &&
"IndexAddRec was not computed");
506 assert(End &&
"End was not computed");
511 InductiveRangeCheck IRC;
513 IRC.Begin = IndexAddRec->
getStart();
515 IRC.CheckUse = &ConditionUse;
519void InductiveRangeCheck::extractRangeChecksFromBranch(
520 CondBrInst *BI, Loop *L, ScalarEvolution &SE, BranchProbabilityInfo *BPI,
521 std::optional<uint64_t> EstimatedTripCount,
522 SmallVectorImpl<InductiveRangeCheck> &Checks,
bool &
Changed) {
526 unsigned IndexLoopSucc =
L->contains(BI->
getSuccessor(0)) ? 0 : 1;
528 "No edges coming to loop?");
531 auto SuccessProbability =
533 if (EstimatedTripCount) {
534 auto EstimatedEliminatedChecks =
535 SuccessProbability.scale(*EstimatedTripCount);
537 LLVM_DEBUG(
dbgs() <<
"irce: could not prove profitability for branch "
539 <<
"estimated eliminated checks too low "
540 << EstimatedEliminatedChecks <<
"\n";);
544 BranchProbability LikelyTaken(15, 16);
545 if (SuccessProbability < LikelyTaken) {
546 LLVM_DEBUG(
dbgs() <<
"irce: could not prove profitability for branch "
548 <<
"could not estimate trip count "
549 <<
"and branch success probability too low "
550 << SuccessProbability <<
"\n";);
558 if (IndexLoopSucc != 0) {
566 SmallPtrSet<Value *, 8> Visited;
567 InductiveRangeCheck::extractRangeChecksFromCond(L, SE, BI->
getOperandUse(0),
581static std::optional<LoopConstrainer::SubRanges>
583 InductiveRangeCheck::Range &
Range,
599 RTy, SE, IsSignedPredicate);
601 SE, IsSignedPredicate);
609 const SCEV *Smallest =
nullptr, *Greatest =
nullptr, *GreatestSeen =
nullptr;
635 GreatestSeen = Start;
638 auto Clamp = [&SE, Smallest, Greatest, IsSignedPredicate](
const SCEV *S) {
639 return IsSignedPredicate
650 bool ProvablyNoPreloop =
652 if (!ProvablyNoPreloop)
653 Result.LowLimit = Clamp(
Range.getBegin());
655 bool ProvablyNoPostLoop =
657 if (!ProvablyNoPostLoop)
658 Result.HighLimit = Clamp(
Range.getEnd());
666std::optional<InductiveRangeCheck::Range>
667InductiveRangeCheck::computeSafeIterationSpace(ScalarEvolution &SE,
668 const SCEVAddRecExpr *IndVar,
669 bool IsLatchSigned)
const {
676 if (!IVType || !RCType)
678 if (IVType->getBitWidth() > RCType->getBitWidth())
709 assert(!
B->isZero() &&
"Recurrence with zero step?");
711 const SCEV *
C = getBegin();
716 assert(!
D->getValue()->isZero() &&
"Recurrence with zero step?");
717 unsigned BitWidth = RCType->getBitWidth();
733 auto ClampedSubtract = [&](
const SCEV *
X,
const SCEV *
Y) {
769 auto SCEVCheckNonNegative = [&](
const SCEV *
X) {
772 const SCEV *One = SE.
getOne(
X->getType());
786 auto SCEVCheckWillNotOverflow = [&](
const SCEV *
X) {
790 const SCEV *OverflowCheck =
796 const SCEV *UnderflowCheck =
799 return SE.
getMulExpr(OverflowCheck, UnderflowCheck);
810 const SCEV *REnd = getEnd();
811 const SCEV *EndWillNotOverflow = SE.
getOne(RCType);
813 auto PrintRangeCheck = [&](raw_ostream &OS) {
815 OS <<
"irce: in function ";
816 OS <<
L->getHeader()->getParent()->getName();
819 OS <<
"there is range check with scaled boundary:\n";
823 if (EndType->getBitWidth() > RCType->getBitWidth()) {
824 assert(EndType->getBitWidth() == RCType->getBitWidth() * 2);
826 PrintRangeCheck(
errs());
835 const SCEV *RuntimeChecks =
836 SE.
getMulExpr(SCEVCheckNonNegative(REnd), EndWillNotOverflow);
837 const SCEV *Begin = SE.
getMulExpr(ClampedSubtract(Zero, M), RuntimeChecks);
838 const SCEV *End = SE.
getMulExpr(ClampedSubtract(REnd, M), RuntimeChecks);
840 return InductiveRangeCheck::Range(Begin, End);
843static std::optional<InductiveRangeCheck::Range>
845 const std::optional<InductiveRangeCheck::Range> &R1,
846 const InductiveRangeCheck::Range &
R2) {
847 if (
R2.isEmpty(SE,
true))
854 assert(!R1Value.isEmpty(SE,
true) &&
855 "We should never have empty R1!");
859 if (R1Value.getType() !=
R2.getType())
866 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
867 if (Ret.isEmpty(SE,
true))
872static std::optional<InductiveRangeCheck::Range>
874 const std::optional<InductiveRangeCheck::Range> &R1,
875 const InductiveRangeCheck::Range &
R2) {
876 if (
R2.isEmpty(SE,
false))
883 assert(!R1Value.isEmpty(SE,
false) &&
884 "We should never have empty R1!");
888 if (R1Value.getType() !=
R2.getType())
895 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
896 if (Ret.isEmpty(SE,
false))
916 InductiveRangeCheckElimination IRCE(SE, &BPI, DT, LI, { getBFI });
920 bool CFGChanged =
false;
921 for (
const auto &L : LI) {
922 CFGChanged |=
simplifyLoop(L, &DT, &LI, &SE,
nullptr,
nullptr,
937 auto LPMAddNewLoop = [&Worklist](
Loop *NL,
bool IsSubloop) {
942 while (!Worklist.
empty()) {
944 if (IRCE.run(L, LPMAddNewLoop)) {
959std::optional<uint64_t>
960InductiveRangeCheckElimination::estimatedTripCount(
const Loop &L) {
965 if (phFreq == 0 || hFreq == 0)
967 return {hFreq / phFreq};
973 auto *Latch =
L.getLoopLatch();
980 auto LatchBrExitIdx = LatchBr->getSuccessor(0) ==
L.getHeader() ? 1 : 0;
981 BranchProbability ExitProbability =
989bool InductiveRangeCheckElimination::run(
990 Loop *L, function_ref<
void(Loop *,
bool)> LPMAddNewLoop) {
992 LLVM_DEBUG(
dbgs() <<
"irce: giving up constraining loop, too large\n");
1002 auto EstimatedTripCount = estimatedTripCount(*L);
1006 <<
"the estimated number of iterations is "
1007 << *EstimatedTripCount <<
"\n");
1015 for (
auto *BBI :
L->getBlocks())
1017 InductiveRangeCheck::extractRangeChecksFromBranch(
1018 TBI, L, SE, BPI, EstimatedTripCount, RangeChecks,
Changed);
1020 if (RangeChecks.
empty())
1023 auto PrintRecognizedRangeChecks = [&](raw_ostream &OS) {
1024 OS <<
"irce: looking at loop ";
L->print(OS);
1025 OS <<
"irce: loop has " << RangeChecks.
size()
1026 <<
" inductive range checks: \n";
1027 for (InductiveRangeCheck &IRC : RangeChecks)
1034 PrintRecognizedRangeChecks(
errs());
1036 const char *FailureReason =
nullptr;
1037 SCEVExpander LoopStructureExpander(SE,
"loop-constrainer");
1038 SCEVExpanderCleaner LoopStructureExpanderCleaner(LoopStructureExpander);
1039 std::optional<LoopStructure> MaybeLoopStructure =
1043 if (!MaybeLoopStructure) {
1045 << FailureReason <<
"\n";);
1048 LoopStructure
LS = *MaybeLoopStructure;
1049 const SCEVAddRecExpr *IndVar =
1052 std::optional<InductiveRangeCheck::Range> SafeIterRange;
1059 auto IntersectRange =
1062 for (InductiveRangeCheck &IRC : RangeChecks) {
1063 auto Result = IRC.computeSafeIterationSpace(SE, IndVar,
1064 LS.IsSignedPredicate);
1066 auto MaybeSafeIterRange = IntersectRange(SE, SafeIterRange, *Result);
1067 if (MaybeSafeIterRange) {
1068 assert(!MaybeSafeIterRange->isEmpty(SE,
LS.IsSignedPredicate) &&
1069 "We should never return empty ranges!");
1071 SafeIterRange = *MaybeSafeIterRange;
1079 std::optional<LoopConstrainer::SubRanges> MaybeSR =
1086 LoopConstrainer LC(*L, LI, LPMAddNewLoop, LS, SE, DT,
1087 SafeIterRange->getBegin()->getType(), *MaybeSR);
1090 LoopStructureExpanderCleaner.markResultUsed();
1091 LS.IndVarStart->setName(
"indvar.start");
1094 auto PrintConstrainedLoopInfo = [
L]() {
1095 dbgs() <<
"irce: in function ";
1096 dbgs() <<
L->getHeader()->getParent()->getName() <<
": ";
1097 dbgs() <<
"constrained ";
1104 PrintConstrainedLoopInfo();
1108 for (InductiveRangeCheck &IRC : RangeChecksToEliminate) {
1109 ConstantInt *FoldedRangeCheck = IRC.getPassingDirection()
1112 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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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 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...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
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.
Conditional Branch instruction.
BasicBlock * getSuccessor(unsigned i) const
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.
LLVM_ABI 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.
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
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents an analyzed expression in the program.
SCEVNoWrapFlags NoWrapFlags
static constexpr auto FlagNUW
static constexpr auto FlagAnyWrap
static constexpr auto FlagNSW
Type * getType() const
Return the LLVM type of this SCEV expression.
LLVM_ABI void print(raw_ostream &OS) const
Print out the internal representation of this scalar to the specified stream.
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 * getSMinExpr(SCEVUse LHS, SCEVUse 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 * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
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 * getTruncateExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getUMaxExpr(SCEVUse LHS, SCEVUse 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 * getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< SCEVUse > &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, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * getSMaxExpr(SCEVUse LHS, SCEVUse RHS)
LLVM_ABI const SCEV * getUMinExpr(SCEVUse LHS, SCEVUse RHS, bool Sequential=false)
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.
@ BasicBlock
Various leaf nodes.
bool match(Val *V, const Pattern &P)
auto 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)
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
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)
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI void InvertBranch(CondBrInst *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.
SCEVUseT< const SCEV * > SCEVUse
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
static LLVM_ABI std::optional< LoopStructure > parseLoopStructure(SCEVExpander &Expander, Loop &L, bool AllowUnsignedLatchCond, const char *&FailureReason)
Parse L and use Expander to materialize values needed by the parsed structure.
IntegerType * ExitCountTy