15#define DEBUG_TYPE "loop-constrainer"
19 const SCEV *Start,
const SCEV *Bound) {
33 unsigned LatchBrExitIdx,
Loop *L,
49 LLVM_DEBUG(
dbgs() <<
"LatchExitBrIdx: " << LatchBrExitIdx <<
"\n");
57 if (LatchBrExitIdx == 1)
60 assert(LatchBrExitIdx == 0 &&
"LatchBrExitIdx should be either 0 or 1");
68 const SCEV *MinusOne =
79 unsigned LatchBrExitIdx,
Loop *L,
93 LLVM_DEBUG(
dbgs() <<
"LatchExitBrIdx: " << LatchBrExitIdx <<
"\n");
101 if (LatchBrExitIdx == 1)
104 assert(LatchBrExitIdx == 0 &&
"LatchBrExitIdx should be 0 or 1");
123 const SCEV *FromBlock =
130std::optional<LoopStructure>
132 bool AllowUnsignedLatchCond,
133 const char *&FailureReason) {
135 if (!L.isLoopSimplifyForm()) {
136 FailureReason =
"loop not in LoopSimplify form";
141 assert(
Latch &&
"Simplified loops only have one latch!");
144 FailureReason =
"loop has already been cloned";
148 if (!L.isLoopExiting(
Latch)) {
149 FailureReason =
"no loop latch";
156 FailureReason =
"no preheader";
162 FailureReason =
"latch terminator not conditional branch";
170 FailureReason =
"latch terminator branch not conditional on integral icmp";
176 FailureReason =
"could not compute latch count";
181 "loop variant exit count doesn't make sense!");
198 FailureReason =
"no add recurrences in the icmp";
204 if (AR->hasNoSignedWrap())
215 const SCEV *ExtendedStep =
218 bool NoSignedWrap = ExtendAfterOp->
getStart() == ExtendedStart &&
226 return AR->hasNoSignedWrap();
234 FailureReason =
"LHS in cmp is not an AddRec for this loop";
238 FailureReason =
"LHS in icmp not induction variable";
243 FailureReason =
"LHS in icmp not induction variable";
249 FailureReason =
"LHS in icmp needs nsw for equality predicates";
261 const SCEV *FixedRightSCEV =
nullptr;
266 if (L.contains(
I->getParent()))
267 FixedRightSCEV = RightSCEV;
270 bool DecreasedRightValueByOne =
false;
271 if (StepCI->
isOne()) {
296 DecreasedRightValueByOne =
true;
301 DecreasedRightValueByOne =
true;
308 bool FoundExpectedPred =
311 if (!FoundExpectedPred) {
312 FailureReason =
"expected icmp slt semantically, found something else";
318 FailureReason =
"unsigned latch conditions are explicitly prohibited";
324 FailureReason =
"Unsafe loop bounds";
330 if (!DecreasedRightValueByOne)
334 assert(!DecreasedRightValueByOne &&
335 "Right value can be decreased only for LatchBrExitIdx == 0!");
338 bool IncreasedRightValueByOne =
false;
359 IncreasedRightValueByOne =
true;
363 IncreasedRightValueByOne =
true;
371 bool FoundExpectedPred =
374 if (!FoundExpectedPred) {
375 FailureReason =
"expected icmp sgt semantically, found something else";
383 FailureReason =
"unsigned latch conditions are explicitly prohibited";
389 FailureReason =
"Unsafe bounds";
396 if (!IncreasedRightValueByOne)
400 assert(!IncreasedRightValueByOne &&
401 "Right value can be increased only for LatchBrExitIdx == 0!");
419 Result.Latch =
Latch;
423 Result.IndVarStart = IndVarStartV;
424 Result.IndVarStep = StepCI;
425 Result.IndVarBase = LeftValue;
426 Result.IndVarIncreasing = IsIncreasing;
427 Result.LoopExitAt = RightValue;
431 FailureReason =
nullptr;
441 LLVMContext &Context = L.getHeader()->getContext();
445 Context, {
MDString::get(Context,
"llvm.loop.unroll.disable")});
447 Context, {
MDString::get(Context,
"llvm.loop.vectorize.disable")});
449 Context, {
MDString::get(Context,
"llvm.loop.licm_versioning.disable")});
451 Context, {
MDString::get(Context,
"llvm.loop.distribute.disable")});
453 MDNode::get(Context, {Dummy, DisableUnroll, DisableVectorize,
454 DisableLICMVersioning, DisableDistribution});
457 L.setLoopID(NewLoopID);
465 DT(DT), LI(LI), LPMAddNewLoop(LPMAddNewLoop), OriginalLoop(L), RangeTy(
T),
466 MainLoopStructure(LS), SR(SR) {}
468void LoopConstrainer::cloneLoop(LoopConstrainer::ClonedLoop &Result,
469 const char *
Tag)
const {
472 Result.Blocks.push_back(Clone);
473 Result.Map[BB] = Clone;
476 auto GetClonedValue = [&Result](
Value *V) {
477 assert(V &&
"null values not in domain!");
478 auto It = Result.Map.find(V);
479 if (It == Result.Map.end())
481 return static_cast<Value *
>(It->second);
489 Result.Structure = MainLoopStructure.map(GetClonedValue);
492 for (
unsigned i = 0, e =
Result.Blocks.size(); i != e; ++i) {
494 BasicBlock *OriginalBB = OriginalLoop.getBlocks()[i];
496 assert(
Result.Map[OriginalBB] == ClonedBB &&
"invariant!");
498 for (Instruction &
I : *ClonedBB)
507 if (OriginalLoop.contains(SBB))
510 for (PHINode &PN : SBB->phis()) {
511 Value *OldIncoming = PN.getIncomingValueForBlock(OriginalBB);
512 PN.addIncoming(GetClonedValue(OldIncoming), ClonedBB);
513 SE.forgetLcssaPhiWithNewPredecessor(&OriginalLoop, &PN);
519LoopConstrainer::RewrittenRangeInfo LoopConstrainer::changeIterationSpaceEnd(
593 RewrittenRangeInfo RRI;
597 &F, BBInsertLocation);
602 bool Increasing =
LS.IndVarIncreasing;
603 bool IsSignedPredicate =
LS.IsSignedPredicate;
606 auto NoopOrExt = [&](
Value *
V) {
607 if (
V->getType() == RangeTy)
609 return IsSignedPredicate ?
B.CreateSExt(V, RangeTy,
"wide." +
V->getName())
610 :
B.CreateZExt(V, RangeTy,
"wide." +
V->getName());
614 Value *EnterLoopCond =
nullptr;
618 : (IsSignedPredicate ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT);
619 Value *IndVarStart = NoopOrExt(
LS.IndVarStart);
620 EnterLoopCond =
B.CreateICmp(Pred, IndVarStart, ExitSubloopAt);
622 B.CreateCondBr(EnterLoopCond,
LS.Header, RRI.PseudoExit);
625 LS.LatchBr->setSuccessor(
LS.LatchBrExitIdx, RRI.ExitSelector);
626 B.SetInsertPoint(
LS.LatchBr);
627 Value *IndVarBase = NoopOrExt(
LS.IndVarBase);
628 Value *TakeBackedgeLoopCond =
B.CreateICmp(Pred, IndVarBase, ExitSubloopAt);
630 Value *CondForBranch =
LS.LatchBrExitIdx == 1
631 ? TakeBackedgeLoopCond
632 :
B.CreateNot(TakeBackedgeLoopCond);
634 LS.LatchBr->setCondition(CondForBranch);
636 B.SetInsertPoint(RRI.ExitSelector);
641 Value *LoopExitAt = NoopOrExt(
LS.LoopExitAt);
642 Value *IterationsLeft =
B.CreateICmp(Pred, IndVarBase, LoopExitAt);
643 B.CreateCondBr(IterationsLeft, RRI.PseudoExit,
LS.LatchExit);
645 UncondBrInst *BranchToContinuation =
651 for (PHINode &PN :
LS.Header->phis()) {
652 PHINode *NewPHI =
PHINode::Create(PN.getType(), 2, PN.getName() +
".copy",
655 NewPHI->
addIncoming(PN.getIncomingValueForBlock(Preheader), Preheader);
658 RRI.PHIValuesAtPseudoExit.push_back(NewPHI);
663 RRI.IndVarEnd->addIncoming(IndVarStart, Preheader);
664 RRI.IndVarEnd->addIncoming(IndVarBase, RRI.ExitSelector);
668 LS.LatchExit->replacePhiUsesWith(
LS.Latch, RRI.ExitSelector);
673void LoopConstrainer::rewriteIncomingValuesForPHIs(
675 const LoopConstrainer::RewrittenRangeInfo &RRI)
const {
676 unsigned PHIIndex = 0;
677 for (PHINode &PN :
LS.Header->phis())
678 PN.setIncomingValueForBlock(ContinuationBlock,
679 RRI.PHIValuesAtPseudoExit[PHIIndex++]);
681 LS.IndVarStart = RRI.IndVarEnd;
686 const char *
Tag)
const {
690 LS.Header->replacePhiUsesWith(OldPreheader, Preheader);
696 Loop *ParentLoop = OriginalLoop.getParentLoop();
700 for (BasicBlock *BB : BBs)
704Loop *LoopConstrainer::createClonedLoopStructure(
Loop *Original,
Loop *Parent,
707 Loop &
New = *LI.AllocateLoop();
711 LI.addTopLevelLoop(&New);
712 LPMAddNewLoop(&New, IsSubloop);
715 for (
auto *BB : Original->
blocks())
716 if (LI.getLoopFor(BB) == Original)
720 for (Loop *SubLoop : *Original)
721 createClonedLoopStructure(SubLoop, &New, VM,
true);
727 BasicBlock *Preheader = OriginalLoop.getLoopPreheader();
728 assert(Preheader !=
nullptr &&
"precondition!");
730 OriginalPreheader = Preheader;
731 MainLoopPreheader = Preheader;
732 bool IsSignedPredicate = MainLoopStructure.IsSignedPredicate;
733 bool Increasing = MainLoopStructure.IndVarIncreasing;
738 Instruction *InsertPt = OriginalPreheader->getTerminator();
743 ClonedLoop PreLoop, PostLoop;
745 Increasing ? SR.LowLimit.has_value() : SR.HighLimit.has_value();
747 Increasing ? SR.HighLimit.has_value() : SR.LowLimit.has_value();
749 Value *ExitPreLoopAt =
nullptr;
750 Value *ExitMainLoopAt =
nullptr;
755 const SCEV *ExitPreLoopAtSCEV =
nullptr;
758 ExitPreLoopAtSCEV = *SR.LowLimit;
761 ExitPreLoopAtSCEV = SE.getAddExpr(*SR.HighLimit, MinusOneS);
763 LLVM_DEBUG(
dbgs() <<
"could not prove no-overflow when computing "
764 <<
"preloop exit limit. HighLimit = "
765 << *(*SR.HighLimit) <<
"\n");
770 LLVM_DEBUG(
dbgs() <<
"could not prove that it is safe to expand the"
771 <<
" preloop exit limit " << *ExitPreLoopAtSCEV
772 <<
" at block " << InsertPt->
getParent()->getName()
777 ExitPreLoopAt = Expander.
expandCodeFor(ExitPreLoopAtSCEV, IVTy, InsertPt);
781 const SCEV *ExitMainLoopAtSCEV =
nullptr;
784 ExitMainLoopAtSCEV = *SR.HighLimit;
787 ExitMainLoopAtSCEV = SE.getAddExpr(*SR.LowLimit, MinusOneS);
789 LLVM_DEBUG(
dbgs() <<
"could not prove no-overflow when computing "
790 <<
"mainloop exit limit. LowLimit = "
791 << *(*SR.LowLimit) <<
"\n");
796 LLVM_DEBUG(
dbgs() <<
"could not prove that it is safe to expand the"
797 <<
" main loop exit limit " << *ExitMainLoopAtSCEV
798 <<
" at block " << InsertPt->
getParent()->getName()
803 ExitMainLoopAt = Expander.
expandCodeFor(ExitMainLoopAtSCEV, IVTy, InsertPt);
804 ExitMainLoopAt->
setName(
"exit.mainloop.at");
811 ExitPreLoopAt->
setName(
"exit.preloop.at");
816 cloneLoop(PreLoop,
"preloop");
818 cloneLoop(PostLoop,
"postloop");
820 RewrittenRangeInfo PreLoopRRI;
824 PreLoop.Structure.
Header);
827 createPreheader(MainLoopStructure, Preheader,
"mainloop");
828 PreLoopRRI = changeIterationSpaceEnd(PreLoop.Structure, Preheader,
829 ExitPreLoopAt, MainLoopPreheader);
830 rewriteIncomingValuesForPHIs(MainLoopStructure, MainLoopPreheader,
835 RewrittenRangeInfo PostLoopRRI;
839 createPreheader(PostLoop.Structure, Preheader,
"postloop");
840 PostLoopRRI = changeIterationSpaceEnd(MainLoopStructure, MainLoopPreheader,
841 ExitMainLoopAt, PostLoopPreheader);
842 rewriteIncomingValuesForPHIs(PostLoop.Structure, PostLoopPreheader,
847 MainLoopPreheader != Preheader ? MainLoopPreheader :
nullptr;
848 BasicBlock *NewBlocks[] = {PostLoopPreheader, PreLoopRRI.PseudoExit,
849 PreLoopRRI.ExitSelector, PostLoopRRI.PseudoExit,
850 PostLoopRRI.ExitSelector, NewMainLoopPreheader};
855 std::remove(std::begin(NewBlocks), std::end(NewBlocks),
nullptr);
857 addToParentLoopIfNeeded(
ArrayRef(std::begin(NewBlocks), NewBlocksEnd));
865 Loop *PreL =
nullptr, *PostL =
nullptr;
866 if (!PreLoop.Blocks.empty()) {
867 PreL = createClonedLoopStructure(&OriginalLoop,
868 OriginalLoop.getParentLoop(), PreLoop.Map,
872 if (!PostLoop.Blocks.empty()) {
874 createClonedLoopStructure(&OriginalLoop, OriginalLoop.getParentLoop(),
875 PostLoop.Map,
false);
879 auto CanonicalizeLoop = [&](
Loop *L,
bool IsOriginalLoop) {
888 CanonicalizeLoop(PreL,
false);
890 CanonicalizeLoop(PostL,
false);
891 CanonicalizeLoop(&OriginalLoop,
true);
901 if (IsSignedPredicate)
903 ->setHasNoSignedWrap(
true);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static const char * ClonedLoopTag
static bool isLoopEntryGuardedByCond(ScalarEvolution &SE, Loop *L, ICmpInst::Predicate Pred, const SCEV *Start, const SCEV *Bound)
static const SCEV * getNarrowestLatchMaxTakenCountEstimate(ScalarEvolution &SE, const Loop &L)
Returns estimate for max latch taken count of the loop of the narrowest available type.
static bool isSafeDecreasingBound(const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)
Given a loop with an deccreasing induction variable, is it possible to safely calculate the bounds of...
static void DisableAllLoopOptsOnLoop(Loop &L)
static bool isSafeIncreasingBound(const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)
Given a loop with an increasing induction variable, is it possible to safely calculate the bounds of ...
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
Class for arbitrary precision integers.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
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.
This is the shared class of boolean and integer constants.
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
const APInt & getValue() const
Return the constant as an APInt value reference.
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.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
This is an important class for using LLVM in a threaded context.
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
iterator_range< block_iterator > blocks() const
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
ArrayRef< BlockT * > getBlocks() const
Get a list of the basic blocks which make up this loop.
LLVM_ABI LoopConstrainer(Loop &L, LoopInfo &LI, function_ref< void(Loop *, bool)> LPMAddNewLoop, const LoopStructure &LS, ScalarEvolution &SE, DominatorTree &DT, Type *T, SubRanges SR)
Represents a single loop in the control flow graph.
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
This node represents a polynomial recurrence on the trip count of the specified loop.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents a constant integer value.
Helper to remove instructions inserted during SCEV expansion, unless they are marked as used.
void markResultUsed()
Indicate that the result of the expansion is used.
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...
ScalarEvolution * getSE()
LLVM_ABI Value * expandCodeFor(SCEVUse SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
This class represents an analyzed expression in the program.
Type * getType() const
Return the LLVM type of this SCEV expression.
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 bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
LLVM_ABI bool isLoopEntryGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether entry to the loop is protected by a conditional between LHS and RHS.
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.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI LoopDisposition getLoopDisposition(const SCEV *S, const Loop *L)
Return the "disposition" of the given SCEV with respect to the given loop.
@ LoopInvariant
The SCEV is loop-invariant.
LLVM_ABI bool isAvailableAtLoopEntry(const SCEV *S, const Loop *L)
Determine if the SCEV can be evaluated at loop's entry.
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 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.
@ SymbolicMaximum
An expression which provides an upper bound on the exact trip count.
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
const SCEV * getSymbolicMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEV that is greater than or equal to (i.e.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
self_iterator getIterator()
@ BasicBlock
Various leaf nodes.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
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.
LLVM_ABI BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr, bool MapAtoms=true)
Return a copy of the specified basic block, but without embedding the block into a particular functio...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
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 bool cannotBeMaxInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE, bool Signed)
Returns true if S is defined and never is equal to signed/unsigned max.
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
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...
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Convert the instruction operands from referencing the current values into those specified by VM.
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool cannotBeMinInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE, bool Signed)
Returns true if S is defined and never is equal to signed/unsigned min.
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.
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.