62 WideCanIV->getDebugLoc(), Builder,
63 {static_cast<bool>(WideCanIV->getNoWrapFlags().HasNUW), false}));
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();
152 DebugLoc DL = CanonicalIVIncrement->getDebugLoc();
161 {StartV, TC, ALMMultiplier},
DL,
162 "active.lane.mask.entry");
165 "extract.entry.alm.part");
172 LaneMaskPhi->insertBefore(*HeaderVPBB, HeaderVPBB->begin());
177 Builder.setInsertPoint(OriginalTerminator);
179 {CanonicalIVIncrement, TC, ALMMultiplier},
180 DL,
"active.lane.mask.next");
183 "extract.next.alm.part");
184 LaneMaskPhi->addBackedgeValue(ALM);
188 auto *NotMask = Builder.createNot(ALM,
DL);
195 VPlan &Plan,
bool UseActiveLaneMask,
bool UseActiveLaneMaskForControlFlow) {
201 if (UseActiveLaneMaskForControlFlow) {
207 VPBuilder Builder(Header, Header->getFirstNonPhi());
212 if (UseActiveLaneMask) {
271 AddOp = Instruction::Add;
272 MulOp = Instruction::Mul;
274 AddOp = ID.getInductionOpcode();
275 MulOp = Instruction::FMul;
283 Step = Builder.createScalarCast(Instruction::Trunc, Step, Ty,
DL);
284 Start = Builder.createScalarCast(Instruction::Trunc, Start, Ty,
DL);
293 Init = Builder.createWidenCast(Instruction::UIToFP,
Init, StepTy);
298 Init = Builder.createNaryOp(MulOp, {
Init, SplatStep}, Flags);
299 Init = Builder.createNaryOp(AddOp, {SplatStart,
Init}, Flags,
317 if (R->getParent()->getEnclosingLoopRegion())
318 Builder.setInsertPoint(R->getParent(), std::next(R->getIterator()));
323 VF = Builder.createScalarCast(Instruction::CastOps::UIToFP, VF, StepTy,
326 VF = Builder.createScalarZExtOrTrunc(VF, StepTy,
DL);
328 Inc = Builder.createNaryOp(MulOp, {Step, VF}, Flags);
335 auto *
Next = Builder.createNaryOp(AddOp, {Prev, Inc}, Flags,
338 WidePHI->addIncoming(
Next);
365 VPlan *Plan = R->getParent()->getPlan();
366 VPValue *Start = R->getStartValue();
367 VPValue *Step = R->getStepValue();
370 assert(R->getInductionDescriptor().getKind() ==
372 "Not a pointer induction according to InductionDescriptor!");
373 assert(R->getScalarType()->isPointerTy() &&
"Unexpected type.");
375 "Recipe should have been replaced");
381 VPPhi *ScalarPtrPhi = Builder.createScalarPhi(Start,
DL,
"pointer.phi");
385 Builder.setInsertPoint(R->getParent(), R->getParent()->getFirstNonPhi());
388 Offset = Builder.createOverflowingOp(Instruction::Mul, {
Offset, Step});
390 Builder.createWidePtrAdd(ScalarPtrPhi,
Offset,
DL,
"vector.gep");
391 R->replaceAllUsesWith(PtrAdd);
396 VF = Builder.createScalarZExtOrTrunc(VF, StepTy,
DL);
397 VPValue *Inc = Builder.createOverflowingOp(Instruction::Mul, {Step, VF});
400 Builder.createPtrAdd(ScalarPtrPhi, Inc,
DL,
"ptr.ind");
407 VPValue *Start = R->getStartValue();
408 VPValue *Step = R->getStepValue();
409 VPValue *Index = R->getIndex();
412 ? Builder.createScalarZExtOrTrunc(
414 : Builder.createScalarCast(Instruction::SIToFP, Index, StepTy,
417 switch (R->getInductionKind()) {
419 assert(Index->getScalarType() == Start->getScalarType() &&
420 "Index type does not match StartValue type");
421 return R->replaceAllUsesWith(Builder.createAdd(
423 Builder.createOverflowingOp(Instruction::Mul, {Index, Step}, Flags),
427 return R->replaceAllUsesWith(Builder.createPtrAdd(
429 Builder.createOverflowingOp(Instruction::Mul, {Index, Step}, Flags)));
434 (FPBinOp->
getOpcode() == Instruction::FAdd ||
435 FPBinOp->
getOpcode() == Instruction::FSub) &&
436 "Original BinOp should be defined for FP induction");
438 VPValue *
FMul = Builder.createNaryOp(Instruction::FMul, {Step, Index}, FMF);
439 return R->replaceAllUsesWith(
440 Builder.createNaryOp(FPBinOp->
getOpcode(), {Start, FMul}, FMF));
453 if (!R->isReplicator())
457 R->dissolveToCFGLoop();
478 assert(Br->getNumOperands() == 2 &&
479 "BranchOnTwoConds must have exactly 2 conditions");
483 assert(Successors.size() == 3 &&
484 "BranchOnTwoConds must have exactly 3 successors");
489 VPValue *Cond0 = Br->getOperand(0);
490 VPValue *Cond1 = Br->getOperand(1);
497 if (Succ0 == Succ1) {
499 VPValue *Combined = Builder.createOr(Cond0, Cond1,
DL);
503 Br->eraseFromParent();
508 !BrOnTwoCondsBB->
getParent() &&
"regions must already be dissolved");
521 Br->eraseFromParent();
532 WidenIVR->eraseFromParent();
541 WidenIVR, Plan, Builder);
542 WidenIVR->replaceAllUsesWith(PtrAdd);
543 WidenIVR->eraseFromParent();
547 WidenIVR->eraseFromParent();
553 DerivedIVR->eraseFromParent();
558 VPValue *CanIV = WideCanIV->getCanonicalIV();
560 VPValue *Step = WideCanIV->getStepValue();
563 "Expected unroller to have materialized step for UF != 1");
568 Step = Builder.createAdd(
571 Builder.createAdd(CanIV, Step, WideCanIV->getDebugLoc(),
"vec.iv",
572 WideCanIV->getNoWrapFlags());
574 WideCanIV->eraseFromParent();
581 for (
unsigned I = 1;
I != Blend->getNumIncomingValues(); ++
I)
582 Select = Builder.createSelect(Blend->getMask(
I),
583 Blend->getIncomingValue(
I),
Select,
584 R.getDebugLoc(),
"predphi", *Blend);
585 Blend->replaceAllUsesWith(
Select);
586 Blend->eraseFromParent();
591 if (!VEPR->getOffset()) {
593 "Expected unroller to have materialized offset for UF != 1");
594 VEPR->materializeOffset();
601 Expr->eraseFromParent();
611 for (
VPValue *
Op : LastActiveL->operands()) {
612 VPValue *NotMask = Builder.createNot(
Op, LastActiveL->getDebugLoc());
617 VPValue *FirstInactiveLane = Builder.createFirstActiveLane(
618 NotMasks, LastActiveL->getDebugLoc(),
"first.inactive.lane");
624 Builder.createSub(FirstInactiveLane, One,
625 LastActiveL->getDebugLoc(),
"last.active.lane");
628 LastActiveL->eraseFromParent();
636 "Unmasked MaskedCond should be simplified earlier");
637 VPI->replaceAllUsesWith(Builder.createNaryOp(
639 VPI->eraseFromParent();
649 Instruction::Add, VPI->operands(), VPI->getNoWrapFlags(),
651 VPI->replaceAllUsesWith(
Add);
652 VPI->eraseFromParent();
660 DebugLoc DL = BranchOnCountInst->getDebugLoc();
663 BranchOnCountInst->eraseFromParent();
678 ? Instruction::UIToFP
679 : Instruction::Trunc;
680 VectorStep = Builder.createWidenCast(CastOp, VectorStep, IVTy);
686 Builder.createWidenCast(Instruction::Trunc, ScalarStep, IVTy);
692 MulOpc = Instruction::FMul;
693 Flags = VPI->getFastMathFlagsOrNone();
695 MulOpc = Instruction::Mul;
700 MulOpc, {VectorStep, ScalarStep}, Flags, R.getDebugLoc());
702 VPI->replaceAllUsesWith(VectorStep);
703 VPI->eraseFromParent();
724 for (
VPValue *VPV : VPValues) {
732 if (
User->usesScalars(VPV))
735 HoistPoint = HoistBlock->
begin();
739 "All users must be in the vector preheader or dominated by it");
744 VPV->replaceUsesWithIf(Broadcast,
745 [VPV, Broadcast](
VPUser &U,
unsigned Idx) {
746 return Broadcast != &U && !U.usesScalars(VPV);
754 assert(Plan.
hasVF(BestVF) &&
"BestVF is not available in Plan");
755 assert(Plan.
hasUF(BestUF) &&
"BestUF is not available in Plan");
818 auto UsesVectorOrInsideReplicateRegion = [DefR, LoopRegion](
VPUser *U) {
820 return !U->usesScalars(DefR) || ParentRegion != LoopRegion;
822 if (
none_of(DefR->users(), UsesVectorOrInsideReplicateRegion))
832 DefR->replaceUsesWithIf(
833 BuildVector, [BuildVector, &UsesVectorOrInsideReplicateRegion](
835 return &U != BuildVector && UsesVectorOrInsideReplicateRegion(&U);
849 for (
VPValue *Def : R.definedValues()) {
859 unsigned NumFirstLaneUsers =
count_if(Def->users(), [&Def](
VPUser *U) {
860 return U->usesFirstLaneOnly(Def);
862 if (!NumFirstLaneUsers || NumFirstLaneUsers == Def->getNumUsers())
869 Unpack->insertAfter(&R);
870 Def->replaceUsesWithIf(Unpack, [&Def](
VPUser &U,
unsigned) {
871 return U.usesFirstLaneOnly(Def);
880 bool RequiresScalarEpilogue,
VPValue *Step,
881 std::optional<uint64_t> MaxRuntimeStep) {
893 "Step VPBB must dominate VectorPHVPBB");
895 InsertPt = std::next(StepR->getIterator());
897 VPBuilder Builder(VectorPHVPBB, InsertPt);
903 if (!RequiresScalarEpilogue &&
match(TC,
m_APInt(TCVal)) && MaxRuntimeStep &&
904 TCVal->
urem(*MaxRuntimeStep) == 0) {
916 TC = Builder.createAdd(
927 Builder.createNaryOp(Instruction::URem, {TC, Step},
936 if (RequiresScalarEpilogue) {
938 "requiring scalar epilogue is not supported with fail folding");
941 R = Builder.createSelect(IsZero, Step, R);
955 "VF and VFxUF must be materialized together");
967 Builder.createElementCount(TCTy, VFEC * Plan.
getConcreteUF());
974 VPValue *RuntimeVF = Builder.createElementCount(TCTy, VFEC);
978 BC, [&VF](
VPUser &U,
unsigned) {
return !U.usesScalars(&VF); });
983 Builder.createElementCount(TCTy, VFEC * Plan.
getConcreteUF());
994 assert(IncomingAliasMask &&
"Expected an alias mask!");
1004 if (
Check.NeedsFreeze) {
1014 Intrinsic::loop_dependence_war_mask,
1018 AliasMask = Builder.createAnd(AliasMask, WARMask);
1020 AliasMask = WARMask;
1025 VPValue *NumActive = Builder.createNaryOp(
1028 VPValue *ClampedVF = Builder.createScalarZExtOrTrunc(
1054 VPValue *DistanceToMax = Builder.createSub(MaxUIntTripCount, TripCount);
1062 VPValue *TripCountCheck = Builder.createICmp(
1065 VPValue *
Cond = Builder.createOr(IsScalar, TripCountCheck,
DL);
1076 "Clamped VF not supported with interleaving");
1084 VPBuilder Builder(Entry, Entry->begin());
1094 if (!ExpSCEV || ExpSCEV->user_empty())
1096 Builder.setInsertPoint(ExpSCEV);
1103 ExpSCEV->eraseFromParent();
1112 BasicBlock *EntryBB = Entry->getIRBasicBlock();
1119 const SCEV *Expr = ExpSCEV->getSCEV();
1122 ExpandedSCEVs[Expr] = Res;
1127 ExpSCEV->eraseFromParent();
1130 "all VPExpandSCEVRecipes must have been expanded");
1133 auto EI = Entry->begin();
1143 return ExpandedSCEVs;
1158 "must have a BranchOnCond");
1161 if (VF.
isScalable() && VScaleForTuning.has_value())
1162 VectorStep *= *VScaleForTuning;
1163 assert(VectorStep > 0 &&
"trip count should not be zero");
1167 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 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 * 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 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 ...