63 WideCanIV->getDebugLoc(), Builder,
64 {static_cast<bool>(WideCanIV->getNoWrapFlags().HasNUW), false}));
65 WideCanIV->eraseFromParent();
82 WideCanIV->replaceAllUsesWith(WidenIV);
83 WideCanIV->eraseFromParent();
92 if (PHICost > BroadcastCost)
101 unsigned RegClass =
TTI.getRegisterClassForType(
true, VecTy);
112 nullptr, Plan.
getZero(CanIVTy), StepV, &Plan.
getVF(), ID,
113 WideCanIV->getNoWrapFlags(), WideCanIV->getDebugLoc());
114 NewWideIV->insertBefore(&*Header->getFirstNonPhi());
115 WideCanIV->replaceAllUsesWith(NewWideIV);
116 WideCanIV->eraseFromParent();
153 DebugLoc DL = CanonicalIVIncrement->getDebugLoc();
162 {StartV, TC, ALMMultiplier},
DL,
163 "active.lane.mask.entry");
166 "extract.entry.alm.part");
173 LaneMaskPhi->insertBefore(*HeaderVPBB, HeaderVPBB->begin());
178 Builder.setInsertPoint(OriginalTerminator);
180 {CanonicalIVIncrement, TC, ALMMultiplier},
181 DL,
"active.lane.mask.next");
184 "extract.next.alm.part");
185 LaneMaskPhi->addBackedgeValue(ALM);
189 auto *NotMask = Builder.createNot(ALM,
DL);
196 VPlan &Plan,
bool UseActiveLaneMask,
bool UseActiveLaneMaskForControlFlow) {
202 if (UseActiveLaneMaskForControlFlow) {
208 VPBuilder Builder(Header, Header->getFirstNonPhi());
213 if (UseActiveLaneMask) {
272 AddOp = Instruction::Add;
273 MulOp = Instruction::Mul;
275 AddOp = ID.getInductionOpcode();
276 MulOp = Instruction::FMul;
284 Step = Builder.createScalarCast(Instruction::Trunc, Step, Ty,
DL);
285 Start = Builder.createScalarCast(Instruction::Trunc, Start, Ty,
DL);
294 Init = Builder.createWidenCast(Instruction::UIToFP,
Init, StepTy);
299 Init = Builder.createNaryOp(MulOp, {
Init, SplatStep}, Flags);
300 Init = Builder.createNaryOp(AddOp, {SplatStart,
Init}, Flags,
318 if (R->getParent()->getEnclosingLoopRegion())
319 Builder.setInsertPoint(R->getParent(), std::next(R->getIterator()));
324 VF = Builder.createScalarCast(Instruction::CastOps::UIToFP, VF, StepTy,
327 VF = Builder.createScalarZExtOrTrunc(VF, StepTy,
DL);
329 Inc = Builder.createNaryOp(MulOp, {Step, VF}, Flags);
336 auto *
Next = Builder.createNaryOp(AddOp, {Prev, Inc}, Flags,
339 WidePHI->addIncoming(
Next);
366 VPlan *Plan = R->getParent()->getPlan();
367 VPValue *Start = R->getStartValue();
368 VPValue *Step = R->getStepValue();
371 assert(R->getInductionDescriptor().getKind() ==
373 "Not a pointer induction according to InductionDescriptor!");
374 assert(R->getScalarType()->isPointerTy() &&
"Unexpected type.");
376 "Recipe should have been replaced");
382 VPPhi *ScalarPtrPhi = Builder.createScalarPhi(Start,
DL,
"pointer.phi");
386 Builder.setInsertPoint(R->getParent(), R->getParent()->getFirstNonPhi());
389 Offset = Builder.createOverflowingOp(Instruction::Mul, {
Offset, Step});
391 Builder.createWidePtrAdd(ScalarPtrPhi,
Offset,
DL,
"vector.gep");
392 R->replaceAllUsesWith(PtrAdd);
397 VF = Builder.createScalarZExtOrTrunc(VF, StepTy,
DL);
398 VPValue *Inc = Builder.createOverflowingOp(Instruction::Mul, {Step, VF});
401 Builder.createPtrAdd(ScalarPtrPhi, Inc,
DL,
"ptr.ind");
408 VPValue *Start = R->getStartValue();
409 VPValue *Step = R->getStepValue();
410 VPValue *Index = R->getIndex();
413 ? Builder.createScalarZExtOrTrunc(
415 : Builder.createScalarCast(Instruction::SIToFP, Index, StepTy,
418 switch (R->getInductionKind()) {
420 assert(Index->getScalarType() == Start->getScalarType() &&
421 "Index type does not match StartValue type");
422 return R->replaceAllUsesWith(Builder.createAdd(
424 Builder.createOverflowingOp(Instruction::Mul, {Index, Step}, Flags),
428 return R->replaceAllUsesWith(Builder.createPtrAdd(
430 Builder.createOverflowingOp(Instruction::Mul, {Index, Step}, Flags)));
435 (FPBinOp->
getOpcode() == Instruction::FAdd ||
436 FPBinOp->
getOpcode() == Instruction::FSub) &&
437 "Original BinOp should be defined for FP induction");
439 VPValue *
FMul = Builder.createNaryOp(Instruction::FMul, {Step, Index}, FMF);
440 return R->replaceAllUsesWith(
441 Builder.createNaryOp(FPBinOp->
getOpcode(), {Start, FMul}, FMF));
454 if (!R->isReplicator())
458 R->dissolveToCFGLoop();
479 assert(Br->getNumOperands() == 2 &&
480 "BranchOnTwoConds must have exactly 2 conditions");
484 assert(Successors.size() == 3 &&
485 "BranchOnTwoConds must have exactly 3 successors");
490 VPValue *Cond0 = Br->getOperand(0);
491 VPValue *Cond1 = Br->getOperand(1);
498 if (Succ0 == Succ1) {
500 VPValue *Combined = Builder.createOr(Cond0, Cond1,
DL);
504 Br->eraseFromParent();
509 !BrOnTwoCondsBB->
getParent() &&
"regions must already be dissolved");
522 Br->eraseFromParent();
533 WidenIVR->eraseFromParent();
542 WidenIVR, Plan, Builder);
543 WidenIVR->replaceAllUsesWith(PtrAdd);
544 WidenIVR->eraseFromParent();
548 WidenIVR->eraseFromParent();
554 DerivedIVR->eraseFromParent();
559 VPValue *CanIV = WideCanIV->getCanonicalIV();
561 VPValue *Step = WideCanIV->getStepValue();
564 "Expected unroller to have materialized step for UF != 1");
569 Step = Builder.createAdd(
572 Builder.createAdd(CanIV, Step, WideCanIV->getDebugLoc(),
"vec.iv",
573 WideCanIV->getNoWrapFlags());
575 WideCanIV->eraseFromParent();
582 for (
unsigned I = 1;
I != Blend->getNumIncomingValues(); ++
I)
583 Select = Builder.createSelect(Blend->getMask(
I),
584 Blend->getIncomingValue(
I),
Select,
585 R.getDebugLoc(),
"predphi", *Blend);
586 Blend->replaceAllUsesWith(
Select);
587 Blend->eraseFromParent();
592 if (!VEPR->getOffset()) {
594 "Expected unroller to have materialized offset for UF != 1");
595 VEPR->materializeOffset();
602 Expr->eraseFromParent();
612 for (
VPValue *
Op : LastActiveL->operands()) {
613 VPValue *NotMask = Builder.createNot(
Op, LastActiveL->getDebugLoc());
618 VPValue *FirstInactiveLane = Builder.createFirstActiveLane(
619 NotMasks, LastActiveL->getDebugLoc(),
"first.inactive.lane");
625 Builder.createSub(FirstInactiveLane, One,
626 LastActiveL->getDebugLoc(),
"last.active.lane");
629 LastActiveL->eraseFromParent();
637 "Unmasked MaskedCond should be simplified earlier");
638 VPI->replaceAllUsesWith(Builder.createNaryOp(
640 VPI->eraseFromParent();
650 Instruction::Add, VPI->operands(), VPI->getNoWrapFlags(),
652 VPI->replaceAllUsesWith(
Add);
653 VPI->eraseFromParent();
661 DebugLoc DL = BranchOnCountInst->getDebugLoc();
664 BranchOnCountInst->eraseFromParent();
679 ? Instruction::UIToFP
680 : Instruction::Trunc;
681 VectorStep = Builder.createWidenCast(CastOp, VectorStep, IVTy);
687 Builder.createWidenCast(Instruction::Trunc, ScalarStep, IVTy);
693 MulOpc = Instruction::FMul;
694 Flags = VPI->getFastMathFlagsOrNone();
696 MulOpc = Instruction::Mul;
701 MulOpc, {VectorStep, ScalarStep}, Flags, R.getDebugLoc());
703 VPI->replaceAllUsesWith(VectorStep);
704 VPI->eraseFromParent();
725 for (
VPValue *VPV : VPValues) {
733 if (
User->usesScalars(VPV))
736 HoistPoint = HoistBlock->
begin();
740 "All users must be in the vector preheader or dominated by it");
745 VPV->replaceUsesWithIf(Broadcast,
746 [VPV, Broadcast](
VPUser &U,
unsigned Idx) {
747 return Broadcast != &U && !U.usesScalars(VPV);
755 assert(Plan.
hasVF(BestVF) &&
"BestVF is not available in Plan");
756 assert(Plan.
hasUF(BestUF) &&
"BestUF is not available in Plan");
819 auto UsesVectorOrInsideReplicateRegion = [DefR, LoopRegion](
VPUser *U) {
821 return !U->usesScalars(DefR) || ParentRegion != LoopRegion;
823 if (
none_of(DefR->users(), UsesVectorOrInsideReplicateRegion))
833 DefR->replaceUsesWithIf(
834 BuildVector, [BuildVector, &UsesVectorOrInsideReplicateRegion](
836 return &U != BuildVector && UsesVectorOrInsideReplicateRegion(&U);
850 for (
VPValue *Def : R.definedValues()) {
860 unsigned NumFirstLaneUsers =
count_if(Def->users(), [&Def](
VPUser *U) {
861 return U->usesFirstLaneOnly(Def);
863 if (!NumFirstLaneUsers || NumFirstLaneUsers == Def->getNumUsers())
870 Unpack->insertAfter(&R);
871 Def->replaceUsesWithIf(Unpack, [&Def](
VPUser &U,
unsigned) {
872 return U.usesFirstLaneOnly(Def);
881 bool RequiresScalarEpilogue,
VPValue *Step,
882 std::optional<uint64_t> MaxRuntimeStep) {
894 "Step VPBB must dominate VectorPHVPBB");
896 InsertPt = std::next(StepR->getIterator());
898 VPBuilder Builder(VectorPHVPBB, InsertPt);
904 if (!RequiresScalarEpilogue &&
match(TC,
m_APInt(TCVal)) && MaxRuntimeStep &&
905 TCVal->
urem(*MaxRuntimeStep) == 0) {
917 TC = Builder.createAdd(
928 Builder.createNaryOp(Instruction::URem, {TC, Step},
937 if (RequiresScalarEpilogue) {
939 "requiring scalar epilogue is not supported with fail folding");
942 R = Builder.createSelect(IsZero, Step, R);
956 "VF and VFxUF must be materialized together");
968 Builder.createElementCount(TCTy, VFEC * Plan.
getConcreteUF());
975 VPValue *RuntimeVF = Builder.createElementCount(TCTy, VFEC);
979 BC, [&VF](
VPUser &U,
unsigned) {
return !U.usesScalars(&VF); });
983 VPValue *MulByUF = Builder.createOverflowingOp(
997 assert(IncomingAliasMask &&
"Expected an alias mask!");
1007 if (
Check.NeedsFreeze) {
1017 Intrinsic::loop_dependence_war_mask,
1021 AliasMask = Builder.createAnd(AliasMask, WARMask);
1023 AliasMask = WARMask;
1028 VPValue *NumActive = Builder.createNaryOp(
1031 VPValue *ClampedVF = Builder.createScalarZExtOrTrunc(
1057 VPValue *DistanceToMax = Builder.createSub(MaxUIntTripCount, TripCount);
1065 VPValue *TripCountCheck = Builder.createICmp(
1068 VPValue *
Cond = Builder.createOr(IsScalar, TripCountCheck,
DL);
1079 "Clamped VF not supported with interleaving");
1087 VPBuilder Builder(Entry, Entry->begin());
1099 if (!ExpSCEV || ExpSCEV->user_empty())
1101 Builder.setInsertPoint(ExpSCEV);
1110 ExpSCEV->eraseFromParent();
1119 BasicBlock *EntryBB = Entry->getIRBasicBlock();
1126 const SCEV *Expr = ExpSCEV->getSCEV();
1129 ExpandedSCEVs[Expr] = Res;
1134 ExpSCEV->eraseFromParent();
1137 "all VPExpandSCEVRecipes must have been expanded");
1140 auto EI = Entry->begin();
1150 return ExpandedSCEVs;
1165 "must have a BranchOnCond");
1168 if (VF.
isScalable() && VScaleForTuning.has_value())
1169 VectorStep *= *VScaleForTuning;
1170 assert(VectorStep > 0 &&
"trip count should not be zero");
1174 MiddleTerm->setMetadata(LLVMContext::MD_prof, BranchWeights);
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 defines the SmallPtrSet class.
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 * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getElementCount(Type *Ty, ElementCount EC, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
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.
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'.
bool isStructTy() const
True if this is an instance of StructType.
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 begin()
Recipe iterator methods.
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.
VPlan-based builder utility analogous to IRBuilder.
VPWidenPHIRecipe * createWidenPhi(ArrayRef< VPValue * > IncomingValues, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="")
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.
A recipe for converting Current into Start + Current * Step.
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
Class to record and manage LLVM IR flags.
static 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.
@ BuildVector
Creates a fixed-width vector containing all operands.
@ BuildStructVector
Given operands of (the same) struct type, creates a struct of fixed- width vectors each containing a ...
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.
void insertAfter(VPRecipeBase *InsertPos)
Insert an unlinked Recipe into a basic block immediately after 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.
void clearCanonicalIVNUW(VPInstruction *Increment)
Unsets NUW for the canonical IV increment Increment, 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 * tryToExpand(const SCEV *S)
Try to 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 setUnderlyingValue(Value *Val)
void replaceAllUsesWith(VPValue *New)
void replaceUsesWithIf(VPValue *New, llvm::function_ref< bool(VPUser &U, unsigned Idx)> ShouldReplace)
Go through the uses list for this VPValue and make each use point to New if the callback ShouldReplac...
A Recipe for widening the canonical induction variable of the vector loop.
VPIRValue * getStartValue() const
Returns the start value of the induction.
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.
bool doesGeneratePerAllLanes(const VPRecipeBase *R)
Returns true if R produces scalar values for all VF lanes.
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,...
VPScalarIVStepsRecipe * createScalarIVSteps(VPlan &Plan, InductionDescriptor::InductionKind Kind, Instruction::BinaryOps InductionOpcode, FPMathOperator *FPBinOp, Instruction *TruncI, VPIRValue *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...
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.
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...
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
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 ...