62 cl::desc(
"Use dot format instead of plain text when dumping VPlans"));
64#define DEBUG_TYPE "loop-vectorize"
66#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
89 : SubclassID(SC), UnderlyingVal(UV), Def(Def) {
91 Def->addDefinedValue(
this);
95 assert(Users.empty() &&
"trying to delete a VPValue with remaining users");
97 Def->removeDefinedValue(
this);
100#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
111 (Instr && Instr->getParent()) ? Instr->getParent()->getPlan() :
nullptr);
117 const VPRecipeBase *Instr = dyn_cast_or_null<VPRecipeBase>(
this);
119 (Instr && Instr->getParent()) ? Instr->getParent()->getPlan() :
nullptr);
126 return cast_or_null<VPRecipeBase>(
Def);
130 return cast_or_null<VPRecipeBase>(
Def);
138 while ((Next = Next->getParent()))
144 for (
unsigned i = 0; i < WorkList.
size(); i++) {
145 T *Current = WorkList[i];
146 if (!Current->hasPredecessors())
148 auto &Predecessors = Current->getPredecessors();
164 return cast<VPBasicBlock>(
Block);
171 return cast<VPBasicBlock>(
Block);
175 assert(ParentPlan->
getEntry() ==
this &&
"Can only set plan on its entry.");
184 return cast<VPBasicBlock>(
Block);
191 return cast<VPBasicBlock>(
Block);
195 if (!Successors.empty() || !Parent)
198 "Block w/o successors not the exiting block of its parent.");
203 if (!Predecessors.empty() || !Parent)
206 "Block w/o predecessors not the entry of its parent.");
212 auto *VPBB = dyn_cast<VPBasicBlock>(VPB);
218 if (
auto *R = VPBB->getParent())
219 return !R->isReplicator() && !VPBB->hasPredecessors();
238 while (It !=
end() && It->isPhi())
247 Loop *CurrentParentLoop,
Type *CanonicalIVTy)
248 :
TTI(
TTI), VF(VF),
CFG(DT), LI(LI), AC(AC), Builder(Builder), Plan(Plan),
249 CurrentParentLoop(CurrentParentLoop), TypeAnalysis(*Plan), VPDT(*Plan) {}
253 return Def->getLiveInIRValue();
266 auto *BuildVector = cast<VPInstruction>(Def);
267 return get(BuildVector->getOperand(
Lane.getKnownLane()),
true);
272 if (!VecPart->getType()->isVectorTy()) {
273 assert(
Lane.isFirstLane() &&
"cannot get lane > 0 for scalar");
289 "Trying to access a single scalar per part but has multiple scalars "
298 auto GetBroadcastInstrs = [
this](
Value *V) {
307 assert(Def->isLiveIn() &&
"expected a live-in");
308 Value *IRV = Def->getLiveInIRValue();
309 Value *
B = GetBroadcastInstrs(IRV);
318 set(Def, ScalarValue);
331 "unexpected recipe found to be invariant");
332 IsSingleScalar =
true;
336 auto *LastInst = cast<Instruction>(
get(Def, LastLane));
341 auto NewIP = isa<PHINode>(LastInst)
342 ? LastInst->getParent()->getFirstNonPHIIt()
352 Value *VectorValue =
nullptr;
353 if (IsSingleScalar) {
354 VectorValue = GetBroadcastInstrs(ScalarValue);
355 set(Def, VectorValue);
358 assert(isa<VPInstruction>(Def) &&
359 "Explicit BuildVector recipes must have"
360 "handled packing for non-VPInstructions.");
365 set(Def, VectorValue);
388 << DIL->getFilename() <<
" Line: " << DIL->getLine());
398 if (
auto *StructTy = dyn_cast<StructType>(WideValue->
getType())) {
400 for (
unsigned I = 0, E = StructTy->getNumElements();
I != E;
I++) {
436 SuccOrExitVPB = SuccOrExitVPB ? SuccOrExitVPB :
this;
439 cast<VPIRBasicBlock>(SuccOrExitVPB)->getIRBasicBlock());
457 assert(
CFG.VPBB2IRBB.contains(PredVPBB) &&
458 "Predecessor basic-block not found building successor.");
463 auto *TermBr = dyn_cast<BranchInst>(PredBBTerminator);
464 if (isa<UnreachableInst>(PredBBTerminator)) {
465 assert(PredVPSuccessors.size() == 1 &&
466 "Predecessor ending w/o branch must have single successor.");
467 DebugLoc DL = PredBBTerminator->getDebugLoc();
471 }
else if (TermBr && !TermBr->isConditional()) {
472 TermBr->setSuccessor(0, NewBB);
481 unsigned idx = PredVPSuccessors.front() ==
this ? 0 : 1;
482 assert((TermBr && (!TermBr->getSuccessor(idx) ||
483 (isa<VPIRBasicBlock>(
this) &&
484 (TermBr->getSuccessor(idx) == NewBB ||
485 PredVPBlock ==
getPlan()->getEntry())))) &&
486 "Trying to reset an existing successor block.");
487 TermBr->setSuccessor(idx, NewBB);
495 "VPIRBasicBlock can have at most two successors at the moment!");
512 "other blocks must be terminated by a branch");
543 auto *R = dyn_cast_or_null<VPRegionBlock>(BB);
544 assert((!R || R->isReplicator()) &&
545 "only replicate region blocks should remain");
549 if ((Replica &&
this ==
getParent()->getEntry()) ||
556 NewBB = createEmptyBasicBlock(*State);
585 <<
" in BB: " << BB->
getName() <<
'\n');
591 Recipe.execute(*State);
598 assert((SplitAt ==
end() || SplitAt->getParent() ==
this) &&
599 "can only split at a position in the same block");
616 if (
P &&
P->isReplicator()) {
620 assert((!
P || !
P->isReplicator()) &&
"unexpected nested replicate regions");
637 "block with multiple successors doesn't have a recipe as terminator");
642 bool IsSwitch = isa<VPInstruction>(R) &&
643 cast<VPInstruction>(R)->getOpcode() == Instruction::Switch;
652 "block with multiple successors not terminated by "
653 "conditional branch nor switch recipe");
659 assert(IsSwitch &&
"block with more than 2 successors not terminated by "
666 "block with 0 or 1 successors terminated by conditional branch recipe");
686#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
694 O << Indent <<
"No successors\n";
696 O << Indent <<
"Successor(s): ";
699 O << LS << Succ->getName();
706 O << Indent <<
getName() <<
":\n";
708 auto RecipeIndent = Indent +
" ";
728 bool InRegion = Entry->getParent();
732 Old2NewVPBlocks[BB] = NewBB;
733 if (InRegion && BB->getNumSuccessors() == 0) {
734 assert(!Exiting &&
"Multiple exiting blocks?");
738 assert((!InRegion || Exiting) &&
"regions must have a single exiting block");
745 NewPreds.
push_back(Old2NewVPBlocks[Pred]);
750 NewSuccs.
push_back(Old2NewVPBlocks[Succ]);
758 for (
const auto &[OldBB, NewBB] :
761 for (
const auto &[OldPred, NewPred] :
762 zip(OldBB->getPredecessors(), NewBB->getPredecessors()))
763 assert(NewPred == Old2NewVPBlocks[OldPred] &&
"Different predecessors");
765 for (
const auto &[OldSucc, NewSucc] :
766 zip(OldBB->successors(), NewBB->successors()))
767 assert(NewSucc == Old2NewVPBlocks[OldSucc] &&
"Different successors");
771 return std::make_pair(Old2NewVPBlocks[Entry],
772 Exiting ? Old2NewVPBlocks[Exiting] :
nullptr);
780 Block->setParent(NewRegion);
786 "Loop regions should have been lowered to plain CFG");
787 assert(!State->
Lane &&
"Replicating a Region with non-null instance.");
793 for (
unsigned Lane = 0, VF = State->
VF.
getFixedValue(); Lane < VF; ++Lane) {
798 Block->execute(State);
809 Cost += R.cost(VF, Ctx);
820 "must be in the entry block of a non-replicate region");
822 "loop region has a single predecessor (preheader), its entry block "
823 "has 2 incoming blocks");
841 LLVM_DEBUG(
dbgs() <<
"Cost of " << BackedgeCost <<
" for VF " << VF
842 <<
": vector loop backedge\n");
843 Cost += BackedgeCost;
869#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
873 auto NewIndent = Indent +
" ";
878 O << Indent <<
"}\n";
885 auto *Header = cast<VPBasicBlock>(
getEntry());
886 if (
auto *CanIV = dyn_cast<VPCanonicalIVPHIRecipe>(&Header->front())) {
888 "Canonical IV must be in the entry of the top-level loop region");
890 {CanIV->getStartValue(), CanIV->getBackedgeValue()},
891 CanIV->getDebugLoc(),
"index");
893 CanIV->eraseFromParent();
897 auto *ExitingLatch = cast<VPBasicBlock>(
getExiting());
915 L->getUniqueExitBlocks(IRExitBlocks);
923 for (
auto *VPB : CreatedBlocks) {
924 if (
auto *VPBB = dyn_cast<VPBasicBlock>(VPB)) {
928 for (
auto *Def : R.definedValues())
929 Def->replaceAllUsesWith(&DummyValue);
931 for (
unsigned I = 0, E = R.getNumOperands();
I != E;
I++)
932 R.setOperand(
I, &DummyValue);
939 if (BackedgeTakenCount)
940 delete BackedgeTakenCount;
969 cast<BranchInst>(VectorPreHeader->
getTerminator())->setSuccessor(0,
nullptr);
974 <<
", UF=" <<
getUF() <<
'\n');
990 Block->execute(State);
998 auto *LatchVPBB = cast<VPBasicBlock>(Header->getPredecessors()[1]);
1005 if (isa<VPWidenPHIRecipe>(&R))
1008 auto *PhiR = cast<VPSingleDefRecipe>(&R);
1010 bool NeedsScalar = isa<VPInstruction>(PhiR) ||
1011 (isa<VPReductionPHIRecipe>(PhiR) &&
1012 cast<VPReductionPHIRecipe>(PhiR)->isInLoop());
1014 Value *Phi = State->
get(PhiR, NeedsScalar);
1017 Value *Val = State->
get(PhiR->getOperand(1), NeedsScalar);
1018 cast<PHINode>(Phi)->addIncoming(Val, VectorLatchBB);
1043 if (
auto *R = dyn_cast<VPRegionBlock>(
B))
1044 return R->isReplicator() ? nullptr : R;
1050 if (
auto *R = dyn_cast<VPRegionBlock>(
B))
1051 return R->isReplicator() ? nullptr : R;
1055#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1074 O <<
" = vector-trip-count";
1077 if (BackedgeTakenCount && BackedgeTakenCount->
getNumUsers()) {
1080 O <<
" = backedge-taken count";
1088 O <<
" = original trip-count";
1097 O <<
"VPlan '" <<
getName() <<
"' {";
1114 RSO << Name <<
" for ";
1116 RSO <<
"VF={" << VFs[0];
1125 RSO <<
"UF={" << UFs[0];
1152 NewDeepRPOT(NewEntry);
1155 for (
const auto &[OldBB, NewBB] :
1156 zip(VPBlockUtils::blocksOnly<VPBasicBlock>(OldDeepRPOT),
1157 VPBlockUtils::blocksOnly<VPBasicBlock>(NewDeepRPOT))) {
1158 assert(OldBB->getRecipeList().size() == NewBB->getRecipeList().
size() &&
1159 "blocks must have the same number of recipes");
1160 for (
const auto &[OldR, NewR] :
zip(*OldBB, *NewBB)) {
1161 assert(OldR.getNumOperands() == NewR.getNumOperands() &&
1162 "recipes must have the same number of operands");
1163 assert(OldR.getNumDefinedValues() == NewR.getNumDefinedValues() &&
1164 "recipes must define the same number of operands");
1165 for (
const auto &[OldV, NewV] :
1166 zip(OldR.definedValues(), NewR.definedValues()))
1167 Old2NewVPValues[OldV] = NewV;
1173 VPBlockUtils::blocksOnly<VPBasicBlock>(NewDeepRPOT)) {
1175 for (
unsigned I = 0, E = NewR.getNumOperands();
I != E; ++
I) {
1177 NewR.setOperand(
I, NewOp);
1183 unsigned NumBlocksBeforeCloning = CreatedBlocks.size();
1185 const auto &[NewEntry, __] =
cloneFrom(Entry);
1190 NewScalarHeader = cast<VPIRBasicBlock>(*
find_if(
1192 auto *VPIRBB = dyn_cast<VPIRBasicBlock>(VPB);
1193 return VPIRBB && VPIRBB->getIRBasicBlock() == ScalarHeaderIRBB;
1199 auto *NewPlan =
new VPlan(cast<VPBasicBlock>(NewEntry), NewScalarHeader);
1202 Old2NewVPValues[OldLiveIn] =
1203 NewPlan->getOrAddLiveIn(OldLiveIn->getLiveInIRValue());
1205 Old2NewVPValues[&VectorTripCount] = &NewPlan->VectorTripCount;
1206 Old2NewVPValues[&VF] = &NewPlan->VF;
1207 Old2NewVPValues[&VFxUF] = &NewPlan->VFxUF;
1208 if (BackedgeTakenCount) {
1209 NewPlan->BackedgeTakenCount =
new VPValue();
1210 Old2NewVPValues[BackedgeTakenCount] = NewPlan->BackedgeTakenCount;
1212 if (TripCount && TripCount->
isLiveIn())
1213 Old2NewVPValues[TripCount] =
1224 NewPlan->Name = Name;
1227 "TripCount must have been added to Old2NewVPValues");
1228 NewPlan->TripCount = Old2NewVPValues[TripCount];
1233 unsigned NumBlocksAfterCloning = CreatedBlocks.size();
1235 seq<unsigned>(NumBlocksBeforeCloning, NumBlocksAfterCloning))
1236 NewPlan->CreatedBlocks.push_back(this->CreatedBlocks[
I]);
1237 CreatedBlocks.truncate(NumBlocksBeforeCloning);
1242 VPB != NewScalarHeader)
1243 NewPlan->ExitBlocks.push_back(cast<VPIRBasicBlock>(VPB));
1251 CreatedBlocks.push_back(VPIRBB);
1263#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1266 return (isa<VPRegionBlock>(
Block) ?
"cluster_N" :
"N") +
1271 const std::string &
Name =
Block->getName();
1280 OS <<
"digraph VPlan {\n";
1281 OS <<
"graph [labelloc=t, fontsize=30; label=\"Vectorization Plan";
1292 for (
auto Line : Lines)
1297 OS <<
"node [shape=rect, fontname=Courier, fontsize=30]\n";
1298 OS <<
"edge [fontname=Courier, fontsize=30]\n";
1299 OS <<
"compound=true\n";
1317 bool Hidden,
const Twine &Label) {
1322 OS << Indent << getUID(
Tail) <<
" -> " << getUID(Head);
1323 OS <<
" [ label=\"" << Label <<
'\"';
1325 OS <<
" ltail=" << getUID(
From);
1327 OS <<
" lhead=" << getUID(To);
1329 OS <<
"; splines=none";
1334 auto &Successors =
Block->getSuccessors();
1335 if (Successors.size() == 1)
1336 drawEdge(
Block, Successors.front(),
false,
"");
1337 else if (Successors.size() == 2) {
1338 drawEdge(
Block, Successors.front(),
false,
"T");
1339 drawEdge(
Block, Successors.back(),
false,
"F");
1341 unsigned SuccessorNumber = 0;
1350 OS << Indent << getUID(
BasicBlock) <<
" [label =\n";
1368 EmitLine(Line,
" +\n");
1369 EmitLine(
Lines.back(),
"\n");
1372 OS << Indent <<
"]\n";
1378 OS << Indent <<
"subgraph " << getUID(
Region) <<
" {\n";
1380 OS << Indent <<
"fontname=Courier\n"
1381 << Indent <<
"label=\""
1389 OS << Indent <<
"}\n";
1421 bool RemovedUser =
false;
1444#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1456void VPSlotTracker::assignName(
const VPValue *V) {
1457 assert(!VPValue2Name.contains(V) &&
"VPValue already has a name!");
1458 auto *UV = V->getUnderlyingValue();
1459 auto *VPI = dyn_cast_or_null<VPInstruction>(V->getDefiningRecipe());
1460 if (!UV && !(VPI && !VPI->getName().empty())) {
1461 VPValue2Name[V] = (
Twine(
"vp<%") +
Twine(NextSlot) +
">").str();
1472 Name = VPI->getName();
1474 assert(!
Name.empty() &&
"Name cannot be empty.");
1476 std::string BaseName = (
Twine(Prefix) +
Name +
Twine(
">")).str();
1479 const auto &[
A,
_] = VPValue2Name.try_emplace(V, BaseName);
1482 if (V->isLiveIn() && isa<ConstantInt, ConstantFP>(UV))
1487 const auto &[
C, UseInserted] = BaseName2Version.
try_emplace(BaseName, 0);
1490 A->second = (BaseName +
Twine(
".") +
Twine(
C->second)).str();
1494void VPSlotTracker::assignNames(
const VPlan &Plan) {
1496 assignName(&Plan.VF);
1498 assignName(&Plan.VFxUF);
1499 assignName(&Plan.VectorTripCount);
1500 if (Plan.BackedgeTakenCount)
1501 assignName(Plan.BackedgeTakenCount);
1508 VPBlockUtils::blocksOnly<const VPBasicBlock>(RPOT))
1512void VPSlotTracker::assignNames(
const VPBasicBlock *VPBB) {
1514 for (
VPValue *Def : Recipe.definedValues())
1518std::string VPSlotTracker::getName(
const Value *V) {
1521 if (
V->hasName() || !isa<Instruction>(V)) {
1522 V->printAsOperand(S,
false);
1529 auto *
I = cast<Instruction>(V);
1531 if (
I->getParent()) {
1532 MST = std::make_unique<ModuleSlotTracker>(
I->getModule());
1533 MST->incorporateFunction(*
I->getFunction());
1535 MST = std::make_unique<ModuleSlotTracker>(
nullptr);
1538 V->printAsOperand(S,
false, *MST);
1543 std::string
Name = VPValue2Name.lookup(V);
1557 "VPValue defined by a recipe in a VPlan?");
1560 if (
auto *UV = V->getUnderlyingValue()) {
1563 UV->printAsOperand(S,
false);
1564 return (
Twine(
"ir<") +
Name +
">").str();
1572 assert(!
Range.isEmpty() &&
"Trying to test an empty VF range.");
1573 bool PredicateAtRangeStart = Predicate(
Range.Start);
1576 if (Predicate(TmpVF) != PredicateAtRangeStart) {
1581 return PredicateAtRangeStart;
1591 auto MaxVFTimes2 = MaxVF * 2;
1593 VFRange SubRange = {VF, MaxVFTimes2};
1594 if (
auto Plan = tryToBuildVPlan(SubRange)) {
1607 [VF](
const VPlanPtr &Plan) {
return Plan->hasVF(VF); }) ==
1609 "Multiple VPlans for VF.");
1611 for (
const VPlanPtr &Plan : VPlans) {
1612 if (Plan->hasVF(VF))
1618#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1620 if (VPlans.
empty()) {
1621 O <<
"LV: No VPlans built.\n";
1624 for (
const auto &Plan : VPlans)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
dxil pretty DXIL Metadata Pretty Printer
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This file provides a LoopVectorizationPlanner class.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
This file defines the SmallVector 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 T * getPlanEntry(T *Start)
static T * getEnclosingLoopRegionForRegion(T *P)
Return the enclosing loop region for region P.
static bool isDefinedInsideLoopRegions(const VPValue *VPV)
Returns true if there is a vector loop region and VPV is defined in a loop region.
cl::opt< unsigned > ForceTargetInstructionCost
static bool hasConditionalTerminator(const VPBasicBlock *VPBB)
static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry, DenseMap< VPValue *, VPValue * > &Old2NewVPValues)
static std::pair< VPBlockBase *, VPBlockBase * > cloneFrom(VPBlockBase *Entry)
static cl::opt< bool > PrintVPlansInDotFormat("vplan-print-in-dot-format", cl::Hidden, cl::desc("Use dot format instead of plain text when dumping VPlans"))
This file contains the declarations of the Vectorization Plan base classes:
static bool IsCondBranch(unsigned BrOpc)
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
LLVM_ABI void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW=nullptr, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the basic block to an output stream with an optional AssemblyAnnotationWriter.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI void moveAfter(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it right after MovePos in the function M...
LLVM_ABI bool hasNPredecessors(unsigned N) const
Return true if this block has exactly N predecessors.
LLVM_ABI const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
const Function * getParent() const
Return the enclosing method, or null if none.
InstListType::iterator iterator
Instruction iterators...
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
std::optional< const DILocation * > cloneByMultiplyingDuplicationFactor(unsigned DF) const
Returns a new DILocation with duplication factor DF * current duplication factor encoded in the discr...
This class represents an Operation in the Expression.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
bool dominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
dominates - Returns true iff A dominates B.
static constexpr UpdateKind Delete
static constexpr UpdateKind Insert
void recalculate(ParentType &Func)
recalculate - compute a dominator tree for the given function
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
constexpr bool isScalar() const
Exactly one element.
bool shouldEmitDebugInfoForProfiling() const
Returns true if we should emit debug info for profiling.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
void flush()
Apply all pending updates to available trees and flush all BasicBlocks awaiting deletion.
Common base class shared among various IRBuilders.
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
Value * CreateInsertValue(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &Name="")
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
UnreachableInst * CreateUnreachable()
LLVM_ABI Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
IntegerType * getInt32Ty()
Fetch the type representing a 32-bit integer.
BasicBlock * GetInsertBlock() const
void SetCurrentDebugLocation(DebugLoc L)
Set location information used by debugging information.
InsertPoint saveIP() const
Returns the current insert point.
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
BranchInst * CreateBr(BasicBlock *Dest)
Create an unconditional 'br label X' instruction.
void restoreIP(InsertPoint IP)
Sets the current insert point to a previously-saved location.
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
static InstructionCost getInvalid(CostType Val=0)
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
void addTopLevelLoop(LoopT *New)
This adds the specified loop to the collection of top-level loops.
LoopT * AllocateLoop(ArgsTy &&...Args)
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
VPlan & getPlanFor(ElementCount VF) const
Return the VPlan for VF.
void buildVPlans(ElementCount MinVF, ElementCount MaxVF)
Build VPlans for power-of-2 VF's between MinVF and MaxVF inclusive, according to the information gath...
static bool getDecisionAndClampRange(const std::function< bool(ElementCount)> &Predicate, VFRange &Range)
Test a Predicate on a Range of VF's.
void printPlans(raw_ostream &O)
Represents a single loop in the control flow graph.
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
BlockT * getEntry() const
Get the entry BasicBlock of the Region.
size_type size() const
Determine the number of elements in the SetVector.
void insert_range(Range &&R)
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
This class provides computation of slot numbers for LLVM Assembly writing.
A SetVector that performs no allocations if smaller than a certain size.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
std::pair< iterator, bool > try_emplace(StringRef Key, ArgsTy &&...Args)
Emplace a new element for the specified key into the map if the key isn't already in the map.
StringRef - Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
StringRef rtrim(char Char) const
Return string with consecutive Char characters starting from the right removed.
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.
This function has undefined behavior.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
void appendRecipe(VPRecipeBase *Recipe)
Augment the existing recipes of a VPBasicBlock with an additional Recipe as the last recipe.
RecipeListTy::iterator iterator
Instruction iterators...
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPBasicBlock,...
iterator begin()
Recipe iterator methods.
VPBasicBlock * clone() override
Clone the current block and it's recipes, without updating the operands of the cloned recipes.
InstructionCost cost(ElementCount VF, VPCostContext &Ctx) override
Return the cost of this VPBasicBlock.
const VPBasicBlock * getCFGPredecessor(unsigned Idx) const
Returns the predecessor block at index Idx with the predecessors as per the corresponding plain CFG.
iterator getFirstNonPhi()
Return the position of the first non-phi node recipe in the block.
void connectToPredecessors(VPTransformState &State)
Connect the VPBBs predecessors' in the VPlan CFG to the IR basic block generated for this VPBB.
VPRegionBlock * getEnclosingLoopRegion()
VPBasicBlock * splitAt(iterator SplitAt)
Split current block at SplitAt by inserting a new block between the current block and its successors ...
RecipeListTy Recipes
The VPRecipes held in the order of output instructions to generate.
void executeRecipes(VPTransformState *State, BasicBlock *BB)
Execute the recipes in the IR basic block BB.
void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override
Print this VPBsicBlock to O, prefixing all lines with Indent.
bool isExiting() const
Returns true if the block is exiting it's parent region.
VPRecipeBase * getTerminator()
If the block has multiple successors, return the branch recipe terminating the block.
const VPRecipeBase & back() const
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
void setSuccessors(ArrayRef< VPBlockBase * > NewSuccs)
Set each VPBasicBlock in NewSuccss as successor of this VPBlockBase.
VPRegionBlock * getParent()
const VPBasicBlock * getExitingBasicBlock() const
void setName(const Twine &newName)
size_t getNumSuccessors() const
iterator_range< VPBlockBase ** > successors()
virtual void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const =0
Print plain-text dump of this VPBlockBase to O, prefixing all lines with Indent.
bool hasPredecessors() const
Returns true if this block has any predecessors.
void printSuccessors(raw_ostream &O, const Twine &Indent) const
Print the successors of this block to O, prefixing all lines with Indent.
size_t getNumPredecessors() const
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
VPBlockBase * getEnclosingBlockWithPredecessors()
const VPBlocksTy & getPredecessors() const
void setPlan(VPlan *ParentPlan)
Sets the pointer of the plan containing the block.
const std::string & getName() const
VPBlockBase * getSinglePredecessor() const
const VPBlocksTy & getHierarchicalSuccessors()
VPBlockBase * getEnclosingBlockWithSuccessors()
An Enclosing Block of a block B is any block containing B, including B itself.
const VPBasicBlock * getEntryBasicBlock() const
VPBlockBase * getSingleHierarchicalPredecessor()
VPBlockBase * getSingleSuccessor() const
const VPBlocksTy & getSuccessors() const
Helper for GraphTraits specialization that traverses through VPRegionBlocks.
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT)
Returns true if VPB is a loop latch, using isHeader().
static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT)
Returns true if VPB is a loop header, based on regions or VPDT in their absence.
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.
VPlan-based builder utility analogous to IRBuilder.
VPPhi * createScalarPhi(ArrayRef< VPValue * > IncomingValues, DebugLoc DL, const Twine &Name="")
This class augments a recipe with a set of VPValues defined by the recipe.
void dump() const
Dump the VPDef to stderr (for debugging).
virtual void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const =0
Each concrete VPDef prints itself.
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
Recipe to expand a SCEV expression.
A special type of VPBasicBlock that wraps an existing IR basic block.
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPBasicBlock,...
BasicBlock * getIRBasicBlock() const
VPIRBasicBlock * clone() override
Clone the current block and it's recipes, without updating the operands of the cloned recipes.
static LLVM_ABI_FOR_TEST VPIRInstruction * create(Instruction &I)
Create a new VPIRPhi for \I , if it is a PHINode, otherwise create a VPIRInstruction.
In what follows, the term "input IR" refers to code that is fed into the vectorizer whereas the term ...
Value * getAsRuntimeExpr(IRBuilderBase &Builder, const ElementCount &VF) const
Returns an expression describing the lane index that can be used at runtime.
static VPLane getFirstLane()
@ ScalableLast
For ScalableLast, Lane is the offset from the start of the last N-element subvector in a scalable vec...
@ First
For First, Lane is the index into the first N elements of a fixed-vector <N x <ElTy>> or a scalable v...
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
VPBasicBlock * getParent()
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
VPRegionBlock * clone() override
Clone all blocks in the single-entry single-exit region of the block and their recipes without updati...
const VPBlockBase * getEntry() const
void dissolveToCFGLoop()
Remove the current region from its VPlan, connecting its predecessor to its entry,...
bool isReplicator() const
An indicator whether this region is to generate multiple replicated instances of output IR correspond...
InstructionCost cost(ElementCount VF, VPCostContext &Ctx) override
Return the cost of the block.
void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override
Print this VPRegionBlock to O (recursively), prefixing all lines with Indent.
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPRegionBlock,...
const VPBlockBase * getExiting() const
A recipe for handling phi nodes of integer and floating-point inductions, producing their scalar valu...
This class can be used to assign names to VPValues.
std::string getOrCreateName(const VPValue *V) const
Returns the name assigned to V, if there is one, otherwise try to construct one from the underlying v...
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
void replaceUsesOfWith(VPValue *From, VPValue *To)
Replaces all uses of From in the VPUser with To.
void printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const
Print the operands to O.
void setOperand(unsigned I, VPValue *New)
unsigned getNumOperands() const
VPValue * getOperand(unsigned N) const
bool isDefinedOutsideLoopRegions() const
Returns true if the VPValue is defined outside any loop.
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
void printAsOperand(raw_ostream &OS, VPSlotTracker &Tracker) const
Value * getLiveInIRValue() const
Returns the underlying IR value, if this VPValue is defined outside the scope of VPlan.
void dump() const
Dump the value to stderr (for debugging).
VPValue(const unsigned char SC, Value *UV=nullptr, VPDef *Def=nullptr)
void print(raw_ostream &OS, VPSlotTracker &Tracker) const
void replaceAllUsesWith(VPValue *New)
unsigned getNumUsers() const
bool isLiveIn() const
Returns true if this VPValue is a live-in, i.e. defined outside the VPlan.
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...
VPDef * Def
Pointer to the VPDef that defines this VPValue.
A recipe for handling phi nodes of integer and floating-point inductions, producing their vector valu...
VPlanPrinter prints a given VPlan to a given output stream.
LLVM_DUMP_METHOD void dump()
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
void printDOT(raw_ostream &O) const
Print this VPlan in DOT format to O.
std::string getName() const
Return a string with the name of the plan and the applicable VFs and UFs.
VPBasicBlock * getEntry()
VPRegionBlock * createVPRegionBlock(VPBlockBase *Entry, VPBlockBase *Exiting, const std::string &Name="", bool IsReplicator=false)
Create a new VPRegionBlock with Entry, Exiting and Name.
void setName(const Twine &newName)
VPIRBasicBlock * getExitBlock(BasicBlock *IRBB) const
Return the VPIRBasicBlock corresponding to IRBB.
LLVM_ABI_FOR_TEST ~VPlan()
bool isExitBlock(VPBlockBase *VPBB)
Returns true if VPBB is an exit block.
VPIRBasicBlock * createEmptyVPIRBasicBlock(BasicBlock *IRBB)
Create a VPIRBasicBlock wrapping IRBB, but do not create VPIRInstructions wrapping the instructions i...
ArrayRef< VPIRBasicBlock * > getExitBlocks() const
Return an ArrayRef containing VPIRBasicBlocks wrapping the exit blocks of the original scalar loop.
LLVM_ABI_FOR_TEST VPRegionBlock * getVectorLoopRegion()
Returns the VPRegionBlock of the vector loop.
InstructionCost cost(ElementCount VF, VPCostContext &Ctx)
Return the cost of this plan.
void setEntry(VPBasicBlock *VPBB)
VPBasicBlock * createVPBasicBlock(const Twine &Name, VPRecipeBase *Recipe=nullptr)
Create a new VPBasicBlock with Name and containing Recipe if present.
LLVM_ABI_FOR_TEST VPIRBasicBlock * createVPIRBasicBlock(BasicBlock *IRBB)
Create a VPIRBasicBlock from IRBB containing VPIRInstructions for all instructions in IRBB,...
LLVM_DUMP_METHOD void dump() const
Dump the plan to stderr (for debugging).
void execute(VPTransformState *State)
Generate the IR code for this VPlan.
ArrayRef< VPValue * > getLiveIns() const
Return the list of live-in VPValues available in the VPlan.
void print(raw_ostream &O) const
Print this VPlan to O.
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
void printLiveIns(raw_ostream &O) const
Print the live-ins of this VPlan to O.
VPlan * duplicate()
Clone the current VPlan, update all VPValues of the new VPlan and cloned recipes to refer to the clon...
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
constexpr ScalarTy getFixedValue() const
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
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.
An efficient, type-erasing, non-owning reference to a callable.
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI std::string EscapeString(const std::string &Label)
bool match(Val *V, const Pattern &P)
VPInstruction_match< VPInstruction::BranchOnCount, Op0_t, Op1_t > m_BranchOnCount(const Op0_t &Op0, const Op1_t &Op1)
class_match< VPValue > m_VPValue()
Match an arbitrary VPValue and ignore it.
VPInstruction_match< VPInstruction::BuildVector > m_BuildVector()
BuildVector is matches only its opcode, w/o matching its operands as the number of operands is not fi...
VPInstruction_match< VPInstruction::BranchOnCond, Op0_t > m_BranchOnCond(const Op0_t &Op0)
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...
VPBasicBlock * getFirstLoopHeader(VPlan &Plan, VPDominatorTree &VPDT)
Returns the header block of the first, top-level loop, or null if none exist.
bool onlyFirstLaneUsed(const VPValue *Def)
Returns true if only the first lane of Def is used.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Value * getRuntimeVF(IRBuilderBase &B, Type *Ty, ElementCount VF)
Return the runtime value for VF.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
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.
LLVM_ABI cl::opt< bool > EnableFSDiscriminator
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
std::unique_ptr< VPlan > VPlanPtr
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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...
Type * toVectorizedTy(Type *Ty, ElementCount EC)
A helper for converting to vectorized types.
cl::opt< unsigned > ForceTargetInstructionCost
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...
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
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...
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="", bool Before=false)
Split the specified block at the specified instruction.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
cl::opt< bool > EnableVPlanNativePath
unsigned getPredBlockCostDivisor(TargetTransformInfo::TargetCostKind CostKind)
A helper function that returns how much we should divide the cost of a predicated block by.
A range of powers-of-2 vectorization factors with fixed start and adjustable end.
Struct to hold various analysis needed for cost computations.
TargetTransformInfo::OperandValueInfo getOperandInfo(VPValue *V) const
Returns the OperandInfo for V, if it is a live-in.
TargetTransformInfo::TargetCostKind CostKind
const TargetTransformInfo & TTI