62 WideCanIV->getDebugLoc(), Builder,
63 WideCanIV->getNoWrapFlags().withoutNoSignedWrap()));
64 WideCanIV->eraseFromParent();
81 WideCanIV->replaceAllUsesWith(WidenIV);
82 WideCanIV->eraseFromParent();
91 if (PHICost > BroadcastCost)
100 unsigned RegClass =
TTI.getRegisterClassForType(
true, VecTy);
111 nullptr, Plan.
getZero(CanIVTy), StepV, &Plan.
getVF(), ID,
112 WideCanIV->getNoWrapFlags(), WideCanIV->getDebugLoc());
113 NewWideIV->insertBefore(&*Header->getFirstNonPhi());
114 WideCanIV->replaceAllUsesWith(NewWideIV);
115 WideCanIV->eraseFromParent();
148 DebugLoc DL = CanonicalIVIncrement->getDebugLoc();
157 {StartV, TC, ALMMultiplier},
DL,
158 "active.lane.mask.entry");
161 "extract.entry.alm.part");
168 LaneMaskPhi->insertBefore(*HeaderVPBB, HeaderVPBB->begin());
173 Builder.setInsertPoint(OriginalTerminator);
175 {CanonicalIVIncrement, TC, ALMMultiplier},
176 DL,
"active.lane.mask.next");
179 "extract.next.alm.part");
180 LaneMaskPhi->addBackedgeValue(ALM);
184 auto *NotMask = Builder.createNot(ALM,
DL);
191 VPlan &Plan,
bool UseActiveLaneMask,
bool UseActiveLaneMaskForControlFlow) {
197 if (UseActiveLaneMaskForControlFlow) {
203 VPBuilder Builder(Header, Header->getFirstNonPhi());
208 if (UseActiveLaneMask) {
267 AddOp = Instruction::Add;
268 MulOp = Instruction::Mul;
270 AddOp = ID.getInductionOpcode();
271 MulOp = Instruction::FMul;
279 Step = Builder.createScalarCast(Instruction::Trunc, Step, Ty,
DL);
280 Start = Builder.createScalarCast(Instruction::Trunc, Start, Ty,
DL);
289 Init = Builder.createWidenCast(Instruction::UIToFP,
Init, StepTy);
294 Init = Builder.createNaryOp(MulOp, {
Init, SplatStep}, Flags);
295 Init = Builder.createNaryOp(AddOp, {SplatStart,
Init}, Flags,
313 if (R->getParent()->getEnclosingLoopRegion())
314 Builder.setInsertPoint(R->getParent(), std::next(R->getIterator()));
319 VF = Builder.createScalarCast(Instruction::CastOps::UIToFP, VF, StepTy,
322 VF = Builder.createScalarZExtOrTrunc(VF, StepTy,
DL);
324 Inc = Builder.createNaryOp(MulOp, {Step, VF}, Flags);
331 auto *
Next = Builder.createNaryOp(AddOp, {Prev, Inc}, Flags,
334 WidePHI->addIncoming(
Next);
361 VPlan *Plan = R->getParent()->getPlan();
362 VPValue *Start = R->getStartValue();
363 VPValue *Step = R->getStepValue();
366 assert(R->getInductionDescriptor().getKind() ==
368 "Not a pointer induction according to InductionDescriptor!");
369 assert(R->getScalarType()->isPointerTy() &&
"Unexpected type.");
371 "Recipe should have been replaced");
377 VPPhi *ScalarPtrPhi = Builder.createScalarPhi(Start,
DL,
"pointer.phi");
381 Builder.setInsertPoint(R->getParent(), R->getParent()->getFirstNonPhi());
384 Offset = Builder.createOverflowingOp(Instruction::Mul, {
Offset, Step});
386 Builder.createWidePtrAdd(ScalarPtrPhi,
Offset,
DL,
"vector.gep");
387 R->replaceAllUsesWith(PtrAdd);
392 VF = Builder.createScalarZExtOrTrunc(VF, StepTy,
DL);
393 VPValue *Inc = Builder.createOverflowingOp(Instruction::Mul, {Step, VF});
396 Builder.createPtrAdd(ScalarPtrPhi, Inc,
DL,
"ptr.ind");
403 VPValue *Start = R->getStartValue();
404 VPValue *Step = R->getStepValue();
405 VPValue *Index = R->getIndex();
408 ? Builder.createScalarZExtOrTrunc(
410 : Builder.createScalarCast(Instruction::SIToFP, Index, StepTy,
413 switch (R->getInductionKind()) {
415 assert(Index->getScalarType() == Start->getScalarType() &&
416 "Index type does not match StartValue type");
417 return R->replaceAllUsesWith(Builder.createAdd(
419 Builder.createOverflowingOp(Instruction::Mul, {Index, Step}, Flags),
423 return R->replaceAllUsesWith(Builder.createPtrAdd(
425 Builder.createOverflowingOp(Instruction::Mul, {Index, Step}, Flags)));
430 (FPBinOp->
getOpcode() == Instruction::FAdd ||
431 FPBinOp->
getOpcode() == Instruction::FSub) &&
432 "Original BinOp should be defined for FP induction");
434 VPValue *
FMul = Builder.createNaryOp(Instruction::FMul, {Step, Index}, FMF);
435 return R->replaceAllUsesWith(
436 Builder.createNaryOp(FPBinOp->
getOpcode(), {Start, FMul}, FMF));
449 if (!R->isReplicator())
453 R->dissolveToCFGLoop();
474 assert(Br->getNumOperands() == 2 &&
475 "BranchOnTwoConds must have exactly 2 conditions");
479 assert(Successors.size() == 3 &&
480 "BranchOnTwoConds must have exactly 3 successors");
485 VPValue *Cond0 = Br->getOperand(0);
486 VPValue *Cond1 = Br->getOperand(1);
493 if (Succ0 == Succ1) {
495 VPValue *Combined = Builder.createOr(Cond0, Cond1,
DL);
499 Br->eraseFromParent();
504 !BrOnTwoCondsBB->
getParent() &&
"regions must already be dissolved");
517 Br->eraseFromParent();
528 if (
Widen->getOpcode() == Instruction::Select &&
530 Widen->eraseMetadata(LLVMContext::MD_prof);
535 WidenIVR->eraseFromParent();
544 WidenIVR, Plan, Builder);
545 WidenIVR->replaceAllUsesWith(PtrAdd);
546 WidenIVR->eraseFromParent();
550 WidenIVR->eraseFromParent();
556 DerivedIVR->eraseFromParent();
561 VPValue *CanIV = WideCanIV->getCanonicalIV();
563 VPValue *Step = WideCanIV->getStepValue();
566 "Expected unroller to have materialized step for UF != 1");
571 Step = Builder.createAdd(
574 Builder.createAdd(CanIV, Step, WideCanIV->getDebugLoc(),
"vec.iv",
575 WideCanIV->getNoWrapFlags());
577 WideCanIV->eraseFromParent();
584 for (
unsigned I = 1;
I != Blend->getNumIncomingValues(); ++
I)
585 Select = Builder.createSelect(Blend->getMask(
I),
586 Blend->getIncomingValue(
I),
Select,
587 R.getDebugLoc(),
"predphi", *Blend);
588 Blend->replaceAllUsesWith(
Select);
589 Blend->eraseFromParent();
594 if (!VEPR->getOffset()) {
596 "Expected unroller to have materialized offset for UF != 1");
597 VEPR->materializeOffset();
604 Expr->eraseFromParent();
614 for (
VPValue *
Op : LastActiveL->operands()) {
615 VPValue *NotMask = Builder.createNot(
Op, LastActiveL->getDebugLoc());
620 VPValue *FirstInactiveLane = Builder.createFirstActiveLane(
621 NotMasks, LastActiveL->getDebugLoc(),
"first.inactive.lane");
627 Builder.createSub(FirstInactiveLane, One,
628 LastActiveL->getDebugLoc(),
"last.active.lane");
631 LastActiveL->eraseFromParent();
639 "Unmasked MaskedCond should be simplified earlier");
640 VPI->replaceAllUsesWith(Builder.createNaryOp(
642 VPI->eraseFromParent();
652 Instruction::Add, VPI->operands(), VPI->getNoWrapFlags(),
654 VPI->replaceAllUsesWith(
Add);
655 VPI->eraseFromParent();
663 DebugLoc DL = BranchOnCountInst->getDebugLoc();
666 BranchOnCountInst->eraseFromParent();
681 ? Instruction::UIToFP
682 : Instruction::Trunc;
683 VectorStep = Builder.createWidenCast(CastOp, VectorStep, IVTy);
689 Builder.createWidenCast(Instruction::Trunc, ScalarStep, IVTy);
695 MulOpc = Instruction::FMul;
696 Flags = VPI->getFastMathFlagsOrNone();
698 MulOpc = Instruction::Mul;
703 MulOpc, {VectorStep, ScalarStep}, Flags, R.getDebugLoc());
705 VPI->replaceAllUsesWith(VectorStep);
706 VPI->eraseFromParent();
727 for (
VPValue *VPV : VPValues) {
735 if (
User->usesScalars(VPV))
742 "All users must be in the vector preheader or dominated by it");
747 VPV->replaceUsesWithIf(Broadcast, [VPV, Broadcast](
VPUser *U) {
748 return Broadcast != U && !U->usesScalars(VPV);
756 assert(Plan.
hasVF(BestVF) &&
"BestVF is not available in Plan");
757 assert(Plan.
hasUF(BestUF) &&
"BestUF is not available in Plan");
815 for (
VPValue *Def : R.definedValues()) {
825 unsigned NumFirstLaneUsers =
count_if(Def->users(), [&Def](
VPUser *U) {
826 return U->usesFirstLaneOnly(Def);
828 if (!NumFirstLaneUsers || NumFirstLaneUsers == Def->getNumUsers())
835 Unpack->insertAfter(&R);
836 Def->replaceUsesWithIf(
837 Unpack, [&Def](
VPUser *U) {
return U->usesFirstLaneOnly(Def); });
845 bool RequiresScalarEpilogue,
VPValue *Step,
846 std::optional<uint64_t> MaxRuntimeStep) {
858 "Step VPBB must dominate VectorPHVPBB");
860 InsertPt = std::next(StepR->getIterator());
862 VPBuilder Builder(VectorPHVPBB, InsertPt);
868 if (!RequiresScalarEpilogue &&
match(TC,
m_APInt(TCVal)) && MaxRuntimeStep &&
869 TCVal->
urem(*MaxRuntimeStep) == 0) {
881 TC = Builder.createAdd(
892 Builder.createNaryOp(Instruction::URem, {TC, Step},
901 if (RequiresScalarEpilogue) {
903 "requiring scalar epilogue is not supported with fail folding");
906 R = Builder.createSelect(IsZero, Step, R);
920 "VF and VFxUF must be materialized together");
932 Builder.createElementCount(TCTy, VFEC * Plan.
getConcreteUF());
939 VPValue *RuntimeVF = Builder.createElementCount(TCTy, VFEC);
947 Builder.createElementCount(TCTy, VFEC * Plan.
getConcreteUF());
958 assert(IncomingAliasMask &&
"Expected an alias mask!");
968 if (
Check.NeedsFreeze) {
969 Src = Builder.createFreeze(Src);
970 Sink = Builder.createFreeze(Sink);
978 Intrinsic::loop_dependence_war_mask,
982 AliasMask = Builder.createAnd(AliasMask, WARMask);
989 VPValue *NumActive = Builder.createNaryOp(
992 VPValue *ClampedVF = Builder.createScalarZExtOrTrunc(
1018 VPValue *DistanceToMax = Builder.createSub(MaxUIntTripCount, TripCount);
1026 VPValue *TripCountCheck = Builder.createICmp(
1029 VPValue *
Cond = Builder.createOr(IsScalar, TripCountCheck,
DL);
1040 "Clamped VF not supported with interleaving");
1048 VPBuilder Builder(Entry, Entry->begin());
1058 if (ExpSCEV.user_empty())
1060 Builder.setInsertPoint(&ExpSCEV);
1067 ExpSCEV.eraseFromParent();
1076 BasicBlock *EntryBB = Entry->getIRBasicBlock();
1081 const SCEV *Expr = ExpSCEV.getSCEV();
1084 ExpandedSCEVs[Expr] = Res;
1089 ExpSCEV.eraseFromParent();
1092 "all VPExpandSCEVRecipes must have been expanded");
1095 auto EI = Entry->begin();
1105 return ExpandedSCEVs;
1120 "must have a BranchOnCond");
1123 if (VF.
isScalable() && VScaleForTuning.has_value())
1124 VectorStep *= *VScaleForTuning;
1125 assert(VectorStep > 0 &&
"trip count should not be zero");
1129 MiddleTerm->setMetadata(LLVMContext::MD_prof, BranchWeights);
static SDValue Widen(SelectionDAG *CurDAG, SDValue N)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static const Function * getParent(const Value *V)
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
static std::pair< Value *, APInt > getMask(Value *WideMask, unsigned Factor, ElementCount LeafValueEC)
This file provides a LoopVectorizationPlanner class.
const SmallVectorImpl< MachineOperand > & Cond
static bool dominates(InstrPosIndexes &PosIndexes, const MachineInstr &A, const MachineInstr &B)
This file implements dominator tree analysis for a single level of a VPlan's H-CFG.
This file contains the declarations of different VPlan-related auxiliary helpers.
static VPActiveLaneMaskPHIRecipe * addVPLaneMaskPhiAndUpdateExitBranch(VPlan &Plan)
static void expandVPDerivedIV(VPDerivedIVRecipe *R)
Expand a VPDerivedIVRecipe into executable recipes.
static void expandVPWidenIntOrFpInduction(VPWidenIntOrFpInductionRecipe *WidenIVR)
Expand a VPWidenIntOrFpInduction into executable recipes, for the initial value, phi and backedge val...
static void expandVPWidenPointerInduction(VPWidenPointerInductionRecipe *R)
Expand a VPWidenPointerInductionRecipe into executable recipes, for the initial value,...
This file contains the declarations of the Vectorization Plan base classes:
static const uint32_t IV[8]
Class for arbitrary precision integers.
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
@ ICMP_ULT
unsigned less than
@ ICMP_ULE
unsigned less or equal
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
static DebugLoc getCompilerGenerated()
static DebugLoc getUnknown()
bool dominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
dominates - Returns true iff A dominates B.
Utility class for floating point operations which can have information about relaxed accuracy require...
FastMathFlags getFastMathFlags() const
Convenience function for getting all the fast-math flags.
Convenience struct for specifying and reasoning about fast-math flags.
A struct for saving information about induction variables.
static LLVM_ABI InductionDescriptor getCanonicalIntInduction(Type *Ty, ScalarEvolution &SE)
Returns the canonical integer induction for type Ty with start = 0 and step = 1.
@ IK_NoInduction
Not an induction variable.
@ IK_FpInduction
Floating point induction variable.
@ IK_PtrInduction
Pointer induction var. Step = C.
@ IK_IntInduction
Integer induction variable. Step = C.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
LLVM_ABI MDNode * createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight, bool IsExpected=false)
Return metadata containing two branch weights.
unsigned getOpcode() const
Return the opcode for this Instruction or ConstantExpr.
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
ScalarEvolution * getSE() const
Returns the ScalarEvolution analysis used.
This class uses information about analyze scalars to rewrite expressions in canonical form.
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 * getUDivExpr(SCEVUse LHS, SCEVUse RHS)
Get a canonical unsigned division expression, or something simpler if possible.
LLVM_ABI const SCEV * getElementCount(Type *Ty, ElementCount EC, SCEVFlags Flags=SCEV::FlagNone)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI SCEVUse getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
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.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isIntegerTy() const
True if this is an instance of IntegerType.
A recipe for generating the active lane mask for the vector loop that is used to predicate the vector...
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
RecipeListTy::iterator iterator
Instruction iterators...
iterator getFirstNonPhi()
Return the position of the first non-phi node recipe in the block.
VPRecipeBase * getTerminator()
If the block has multiple successors, return the branch recipe terminating the block.
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
VPRegionBlock * getParent()
const VPBasicBlock * getExitingBasicBlock() const
const std::string & getName() const
const VPBasicBlock * getEntryBasicBlock() const
VPBlockBase * getSingleSuccessor() const
const VPBlocksTy & getSuccessors() const
static auto blocksAs(T &&Range)
Return an iterator range over Range with each block cast to BlockTy.
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
VPInstruction * createNaryOp(unsigned Opcode, ArrayRef< VPValue * > Operands, Instruction *Inst=nullptr, const VPIRFlags &Flags={}, const VPIRMetadata &MD={}, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="", Type *ResultTy=nullptr)
Create an N-ary operation with Opcode, Operands and set Inst as its underlying Instruction.
VPWidenPHIRecipe * createWidenPhi(ArrayRef< VPValue * > IncomingValues, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="")
A recipe for converting Current into Start + Current * Step.
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
Recipe to expand a SCEV expression.
Class to record and manage LLVM IR flags.
static LLVM_ABI_FOR_TEST VPIRFlags getDefaultFlags(unsigned Opcode, Type *ResultTy=nullptr)
Returns default flags for Opcode and scalar ResultTy for opcodes that support it, asserts otherwise.
void dropPoisonGeneratingFlags()
Drop all poison-generating flags.
static LLVM_ABI_FOR_TEST VPIRInstruction * create(Instruction &I)
Create a new VPIRPhi for \I , if it is a PHINode, otherwise create a VPIRInstruction.
This is a concrete Recipe that models a single VPlan-level instruction.
@ Unpack
Extracts all lanes from its (non-scalable) vector operand.
void addIncoming(VPValue *IncomingV)
Append IncomingV as an incoming value to the phi-like recipe.
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
VPBasicBlock * getParent()
DebugLoc getDebugLoc() const
Returns the debug location of the recipe.
void insertBefore(VPRecipeBase *InsertPos)
Insert an unlinked recipe into a basic block immediately before the specified recipe.
iplist< VPRecipeBase >::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
Type * getScalarType() const
Returns the scalar type of this VPRecipeValue.
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
const VPBlockBase * getEntry() const
VPRegionValue * getUsedHeaderMask() const
Return the header mask if it exists and is used, or null otherwise.
VPInstruction * getOrCreateCanonicalIVIncrement()
Get the canonical IV increment instruction if it exists.
Type * getCanonicalIVType() const
Return the type of the canonical IV for loop regions.
VPRegionValue * getCanonicalIV()
Return the canonical induction variable of the region, null for replicating regions.
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
Lightweight SCEV-to-VPlan expander.
VPValue * expand(const SCEV *S)
Expand S into recipes and live-ins using the builder.
A recipe for handling phi nodes of integer and floating-point inductions, producing their scalar valu...
A symbolic live-in VPValue, used for values like vector trip count, VF, and VFxUF.
bool isMaterialized() const
Returns true if this value has been materialized.
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Type * getScalarType() const
Returns the scalar type of this VPValue, dispatching based on the concrete subclass.
Value * getLiveInIRValue() const
Return the underlying IR value for a VPIRValue.
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
Value * getUnderlyingValue() const
Return the underlying Value attached to this VPValue.
void replaceUsesWithIf(VPValue *New, llvm::function_ref< bool(VPUser *U)> ShouldReplace)
Go through the uses list for this VPValue and make each use point to New if the callback ShouldReplac...
void setUnderlyingValue(Value *Val)
void replaceAllUsesWith(VPValue *New)
A Recipe for widening the canonical induction variable of the vector loop.
VPValue * getStepValue()
Returns the step value of the induction.
const InductionDescriptor & getInductionDescriptor() const
Returns the induction descriptor for the recipe.
A recipe for handling phi nodes of integer and floating-point inductions, producing their vector valu...
VPValue * getSplatVFValue() const
If the recipe has been unrolled, return the VPValue for the induction increment, otherwise return nul...
VPValue * getLastUnrolledPartOperand()
Returns the VPValue representing the value of this induction at the last unrolled part,...
A recipe for widening vector intrinsics.
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
bool hasVF(ElementCount VF) const
const DataLayout & getDataLayout() const
LLVMContext & getContext() const
VPBasicBlock * getEntry()
bool hasScalableVF() const
VPValue * getTripCount() const
The trip count of the original loop.
VPValue * getOrCreateBackedgeTakenCount()
The backedge taken count of the original loop.
VPSymbolicValue & getVFxUF()
Returns VF * UF of the vector loop region.
auto getLiveIns() const
Return the list of live-in VPValues available in the VPlan.
bool hasUF(unsigned UF) const
VPIRValue * getPoison(Type *Ty)
Return a VPIRValue wrapping a poison value of type Ty.
VPSymbolicValue & getVectorTripCount()
The vector trip count.
VPValue * getBackedgeTakenCount() const
VPIRValue * getOrAddLiveIn(Value *V)
Gets the live-in VPIRValue for V or adds a new live-in (if none exists yet) for V.
VPIRValue * getZero(Type *Ty)
Return a VPIRValue wrapping the null value of type Ty.
LLVM_ABI_FOR_TEST VPRegionBlock * getVectorLoopRegion()
Returns the VPRegionBlock of the vector loop.
unsigned getConcreteUF() const
Returns the concrete UF of the plan, after unrolling.
void resetTripCount(VPValue *NewTripCount)
Resets the trip count for the VPlan.
VPBasicBlock * getMiddleBlock()
Returns the 'middle' block of the plan, that is the block that selects whether to execute the scalar ...
VPBasicBlock * createVPBasicBlock(const Twine &Name, VPRecipeBase *Recipe=nullptr)
Create a new VPBasicBlock with Name and containing Recipe if present.
VPBasicBlock * getVectorPreheader() const
Returns the preheader of the vector loop region, if one exists, or null otherwise.
bool hasScalarVFOnly() const
VPBasicBlock * getScalarPreheader() const
Return the VPBasicBlock for the preheader of the scalar loop.
bool hasTailFolded() const
Returns true if the vector loop region is tail-folded.
VPSymbolicValue & getVF()
Returns the VF of the vector loop region.
bool hasScalarTail() const
Returns true if the scalar tail may execute after the vector loop, i.e.
VPIRValue * getConstantInt(Type *Ty, uint64_t Val, bool IsSigned=false)
Return a VPIRValue wrapping a ConstantInt with the given type and value.
LLVM Value Representation.
iterator_range< user_iterator > users()
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
bool match(Val *V, const Pattern &P)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
VPInstruction_match< VPInstruction::BranchOnTwoConds > m_BranchOnTwoConds()
canonical_widen_iv_match m_CanonicalWidenIV()
VPInstruction_match< VPInstruction::BranchOnCount > m_BranchOnCount()
auto m_VPValue()
Match an arbitrary VPValue and ignore it.
VPRecipeBase * findUserOf(VPValue *V, const MatchT &P)
If V is used by a recipe matching pattern P, return it.
match_bind< VPInstruction > m_VPInstruction(VPInstruction *&V)
Match a VPInstruction, capturing if we match.
bool isSingleScalar(const VPValue *VPV)
Returns true if VPV is a single scalar, either because it produces the same value for all lanes or on...
VPValue * getOrCreateVPValueForSCEVExpr(VPlan &Plan, const SCEV *Expr)
Get or create a VPValue that corresponds to the expansion of Expr.
bool onlyFirstLaneUsed(const VPValue *Def)
Returns true if only the first lane of Def is used.
VPValue * findIncomingAliasMask(const VPlan &Plan)
Finds the incoming alias-mask within the vector preheader.
VPScalarIVStepsRecipe * createScalarIVSteps(VPlan &Plan, InductionDescriptor::InductionKind Kind, Instruction::BinaryOps InductionOpcode, FPMathOperator *FPBinOp, Type *ResultTy, VPValue *StartV, VPValue *Step, DebugLoc DL, VPBuilder &Builder, const VPIRFlags::WrapFlagsTy &Flags={})
Create a scalar-iv-steps recipe over Plan's canonical IV for an induction of Kind with InductionOpcod...
bool onlyScalarValuesUsed(const VPValue *Def)
Returns true if only scalar values of Def are used by all users.
VPValue * scalarizeVPWidenPointerInduction(VPWidenPointerInductionRecipe *PtrIV, VPlan &Plan, VPBuilder &Builder)
Scalarize a VPWidenPointerInductionRecipe by replacing it with a PtrAdd (IndStart,...
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
VPBuilderBase<> VPBuilder
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
iterator_range< df_iterator< VPBlockShallowTraversalWrapper< VPBlockBase * > > > vp_depth_first_shallow(VPBlockBase *G)
Returns an iterator range to traverse the graph starting at G in depth-first order.
iterator_range< df_iterator< VPBlockDeepTraversalWrapper< VPBlockBase * > > > vp_depth_first_deep(VPBlockBase *G)
Returns an iterator range to traverse the graph starting at G in depth-first order while traversing t...
auto make_isa_range(RangeT &&Range)
Return a range over Range containing only elements for which isa<T> holds, casting each of them to T.
auto dyn_cast_or_null(const Y &Val)
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
SmallVector< VPRegisterUsage, 8 > calculateRegisterUsageForPlan(VPlan &Plan, ArrayRef< ElementCount > VFs, const TargetTransformInfo &TTI)
Estimate the register usage for Plan and vectorization factors in VFs by calculating the highest numb...
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
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...
auto drop_end(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the last N elements excluded.
@ Mul
Product of integers.
DWARFExpression::Operation Op
auto make_second_range(ContainerTy &&c)
Given a container of pairs, return a range over the second elements.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
A struct that represents some properties of the register usage of a loop.
SmallMapVector< unsigned, unsigned, 4 > MaxLocalUsers
Holds the maximum number of concurrent live intervals in the loop.
InstructionCost spillCost(const TargetTransformInfo &TTI, TargetTransformInfo::TargetCostKind CostKind, unsigned OverrideMaxNumRegs=0) const
Calculate the estimated cost of any spills due to using more registers than the number available for ...