LLVM 24.0.0git
VPlanUtils.h
Go to the documentation of this file.
1//===- VPlanUtils.h - VPlan-related utilities -------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLANUTILS_H
10#define LLVM_TRANSFORMS_VECTORIZE_VPLANUTILS_H
11
12#include "VPlan.h"
16
17namespace llvm {
18class DominatorTree;
19class MemoryLocation;
20class ScalarEvolution;
21class SCEV;
23class VPBuilder;
24} // namespace llvm
25
26namespace llvm {
27
28namespace vputils {
29/// Returns true if only the first lane of \p Def is used.
30bool onlyFirstLaneUsed(const VPValue *Def);
31
32/// Returns true if only the first part of \p Def is used.
33bool onlyFirstPartUsed(const VPValue *Def);
34
35/// Returns true if only scalar values of \p Def are used by all users.
36bool onlyScalarValuesUsed(const VPValue *Def);
37
38/// Get or create a VPValue that corresponds to the expansion of \p Expr. If \p
39/// Expr is a SCEVConstant or SCEVUnknown, return a VPValue wrapping the live-in
40/// value. Otherwise return a VPExpandSCEVRecipe to expand \p Expr. If \p Plan's
41/// pre-header already contains a recipe expanding \p Expr, return it. If not,
42/// create a new one.
44
45/// Return the SCEV expression for \p V. Returns SCEVCouldNotCompute if no
46/// SCEV expression could be constructed.
47const SCEV *getSCEVExprForVPValue(const VPValue *V,
49 const Loop *L = nullptr);
50
51/// Returns true if \p Addr is an address SCEV that can be passed to
52/// TTI::getAddressComputationCost, i.e. the address SCEV is loop invariant, an
53/// affine AddRec (i.e. induction ), or an add expression of such operands or a
54/// sign-extended AddRec.
55bool isAddressSCEVForCost(const SCEV *Addr, ScalarEvolution &SE, const Loop *L);
56
57/// Returns true if \p VPV is a single scalar, either because it produces the
58/// same value for all lanes or only has its first lane used.
59bool isSingleScalar(const VPValue *VPV);
60
61/// Checks if \p V is uniform across all VF lanes and UF parts. It is considered
62/// as such if it is either loop invariant (defined outside the vector region)
63/// or its operands are known to be uniform across all VFs and UFs (e.g.
64/// VPDerivedIV or the canonical IV).
66
67/// Return true if \p V is elementwise, i.e. none of the lanes are permuted.
68bool isElementwise(const VPValue *V);
69
70/// Returns true if \p R produces scalar values for all VF lanes.
72
73/// Returns the header block of the first, top-level loop, or null if none
74/// exist.
76
77/// Get the VF scaling factor applied to the recipe's output, if the recipe has
78/// one.
80
81/// Return true if we do not know how to (mechanically) hoist or sink \p R.
82/// When sinking, passing \p Sinking = true ensures that assumes aren't sunk.
83/// Returns true for recipes that access memory.
84bool cannotHoistOrSinkRecipe(const VPRecipeBase &R, bool Sinking = false);
85
86/// Return the intrinsic ID underlying a call.
87template <typename Ty> Intrinsic::ID getIntrinsicID(const Ty *R) {
88 if (const auto *Intr = dyn_cast<VPWidenIntrinsicRecipe>(R))
89 return Intr->getVectorIntrinsicID();
90 if (const auto *Call = dyn_cast<VPWidenCallRecipe>(R))
91 return Call->getCalledScalarFunction()->getIntrinsicID();
92
93 auto GetCalleeIntrinsic = [&](VPValue *CalleeOp) -> Intrinsic::ID {
94 if (!isa<VPIRValue>(CalleeOp))
96 auto *F = cast<Function>(CalleeOp->getLiveInIRValue());
97 return F->getIntrinsicID();
98 };
99 if (const auto *Rep = dyn_cast<VPReplicateRecipe>(R))
100 if (Rep->getOpcode() == Instruction::Call)
101 // The callee is the last operand, excluding the mask if predicated.
102 return GetCalleeIntrinsic(
103 Rep->getOperand(Rep->getNumOperandsWithoutMask() - 1));
104 if (const auto *VPI = dyn_cast<VPInstruction>(R)) {
105 if (VPI->getOpcode() == Instruction::Call)
106 // The callee is the last operand, excluding the mask if masked.
107 return GetCalleeIntrinsic(
108 VPI->getOperand(VPI->getNumOperandsWithoutMask() - 1));
109 if (VPI->getOpcode() == VPInstruction::Intrinsic) {
110 return cast<VPConstantInt>(VPI->getOperand(VPI->getNumOperands() - 1))
111 ->getZExtValue();
112 }
113 }
115}
116
117/// Return the instruction opcode for the recipe defining \p V or 0 for
118/// unsupported recipes and VPValues not defined by a recipe.
119unsigned getOpcode(const VPValue *V);
120
121/// Get the instruction opcode or intrinsic ID for the recipe defining \p V.
122/// Returns an optional pair, where the first element indicates whether it is an
123/// intrinsic ID.
124std::optional<std::pair<bool, unsigned>>
126
127/// Return a MemoryLocation for \p R with noalias metadata populated from
128/// \p R, if the recipe is supported and std::nullopt otherwise. The pointer of
129/// the location is conservatively set to nullptr.
130std::optional<MemoryLocation> getMemoryLocation(const VPRecipeBase &R);
131
132/// Extracts and returns NoWrap and FastMath flags from the induction binop in
133/// \p ID.
135 if (ID.getKind() == InductionDescriptor::IK_FpInduction)
136 return ID.getInductionBinOp()->getFastMathFlags();
137
139 ID.getInductionBinOp()))
140 return VPIRFlags::WrapFlagsTy(OBO->hasNoUnsignedWrap(),
141 OBO->hasNoSignedWrap());
142
144 "Expected int induction");
145 return VPIRFlags::WrapFlagsTy(false, false);
146}
147
148/// Search \p Start's users for a recipe satisfying \p Pred, looking through
149/// recipes with definitions.
150template <typename PredT>
151inline VPRecipeBase *findRecipe(VPValue *Start, PredT Pred) {
152 SetVector<VPValue *> Worklist;
153 Worklist.insert(Start);
154 for (unsigned I = 0; I != Worklist.size(); ++I) {
155 VPValue *Cur = Worklist[I];
156 auto *R = Cur->getDefiningRecipe();
157 if (!R)
158 continue;
159 if (Pred(R))
160 return R;
161 for (VPUser *U : Cur->users()) {
162 for (VPValue *V : cast<VPRecipeBase>(U)->definedValues())
163 Worklist.insert(V);
164 }
165 }
166 return nullptr;
167}
168
169/// Find the canonical IV increment of \p Plan's vector loop region. Returns
170/// nullptr if not found.
172
173/// Returns the GEP nowrap flags for \p Ptr, looking through pointer casts
174/// mirroring Value::stripPointerCasts.
176
177/// Returns true if \p V is used as part of the address of another load or
178/// store.
179bool isUsedByLoadStoreAddress(const VPValue *V);
180
181/// Find the ComputeReductionResult recipe for \p PhiR, looking through selects
182/// inserted for predicated reductions or tail folding.
184
185/// Finds the incoming alias-mask within the vector preheader.
187
188/// Returns the (early exiting block, exit block) pairs of \p Plan, i.e. all
189/// edges to an exit block that do not come from \p MiddleVPBB.
191getEarlyExits(const VPlan &Plan, const VPBlockBase *MiddleVPBB);
192
193/// Create a scalar-iv-steps recipe over \p Plan's canonical IV for an
194/// induction of \p Kind with \p InductionOpcode / \p FPBinOp, start value \p
195/// StartV and step \p Step, truncated to \p TruncI's type if \p TruncI is
196/// non-null, inserting recipes via \p Builder.
199 Instruction::BinaryOps InductionOpcode, FPMathOperator *FPBinOp,
200 Instruction *TruncI, VPValue *StartV, VPValue *Step, DebugLoc DL,
201 VPBuilder &Builder, const VPIRFlags::WrapFlagsTy &Flags = {});
202
203/// Scalarize a VPWidenPointerInductionRecipe by replacing it with a PtrAdd
204/// (IndStart, ScalarIVSteps (0, Step)). This is used when the recipe only
205/// generates scalar values.
206VPValue *scalarizeVPWidenPointerInduction(VPWidenPointerInductionRecipe *PtrIV,
207 VPlan &Plan, VPBuilder &Builder);
208
209/// Returns true if \p R is dead, i.e. none of its defined values are used and
210/// it has no side effects (with the exception of conditional assumes, which are
211/// considered dead as their conditions may be flattened).
212bool isDeadRecipe(VPRecipeBase &R);
213
214/// Recursively delete \p V and any of its operands that become dead.
215void recursivelyDeleteDeadRecipes(VPValue *V);
216
217/// Collect all users of \p V, looking through recipes that define other values.
219
220/// Try to fold \p R using InstSimplifyFolder. Will succeed and return a
221/// non-nullptr VPValue for a handled opcode or intrinsic ID if corresponding \p
222/// Operands are foldable live-ins.
223VPIRValue *tryToFoldLiveIns(VPSingleDefRecipe &R, ArrayRef<VPValue *> Operands,
224 const DataLayout &DL);
225
226/// Insert phis to reconstruct SSA for a single value starting from \p VPBB. \p
227/// Defs is a map of definitions at specific blocks. Returns the
228/// reconstructed value at VPBB. Use if the CFG has been modified such that a
229/// def no longer dominates all its uses. Every block leading to VPBB must be
230/// reachable from the entry and the plan must be plain-CFG (not contain any
231/// regions).
232LLVM_ABI_FOR_TEST VPValue *
233reconstructSSA(VPBasicBlock *VPBB, DenseMap<VPBasicBlock *, VPValue *> &Defs);
234
235/// Denominator of the frequencies computed by computeExecutionFrequencies, i.e.
236/// the frequency of a block that always executes. Wider than
237/// BranchProbability's 31-bit one, which truncates rarely executed blocks to 0.
238inline constexpr uint64_t AlwaysExecutesFreq = 1ULL << 63;
239
240/// Returns \p Freq as a BranchProbability, relative to AlwaysExecutesFreq.
242
243/// Computes for each block in \p Blocks, which must be in reverse post-order,
244/// the frequency with which it executes relative to the first (header) block,
245/// and whether that frequency was composed using any estimated branch weights.
246/// The frequency of a block is the sum over its incoming edges, or std::nullopt
247/// if any edge on a path reaching it lacks branch weights.
250
251namespace detail {
252
253/// Template-independent implementation for pullOutPermutations.
255 VPlan &Plan, function_ref<VPValue *(VPValue *Op)> Perm,
257} // namespace detail
258
259/// Removes the permutation pattern \p Perm from any elementwise operations
260/// in the plan, by constructing a new permutation via \p Build.
261/// e.g. binop(perm(x), perm(y)) -> perm(binop(x,y)).
262template <typename Match_t, typename Builder>
263void pullOutPermutations(VPlan &Plan, Match_t Perm, Builder Build) {
264 // Convert matcher to function returing the matched VPValue.
265 auto MatchPerm = [&Perm](VPValue *Op) -> VPValue * {
266 VPValue *X;
267 return match(Op, Perm(X)) ? X : nullptr;
268 };
269 detail::pullOutPermutationsImpl(Plan, MatchPerm, Build);
270}
271
272} // namespace vputils
273
274/// Lightweight SCEV-to-VPlan expander. Converts SCEV expressions into
275/// VPInstructions and live-ins. SCEVAddRecExprs are wrapped in a
276/// VPExpandSCEVRecipe to be expanded to IR later.
278 VPBuilder &Builder;
279 ScalarEvolution &SE;
280 DebugLoc DL;
281
282 /// When true, nested SCEVUDivExprs are expanded so that they cannot divide by
283 /// zero, matching SCEVExpander's SafeUDivMode.
284 bool SafeUDivMode = false;
285
286 /// Try to find a loop-invariant IR value in the plan's entry block whose
287 /// SCEV matches \p S. Returns the corresponding live-in VPValue, or nullptr
288 /// if none is found.
289 VPValue *tryToReuseIRValue(const SCEV *S);
290
291public:
293 : Builder(Builder), SE(SE), DL(DL) {}
294
295 /// Expand \p S into recipes and live-ins using the builder.
296 VPValue *expand(const SCEV *S);
297};
298//===----------------------------------------------------------------------===//
299// Utilities for modifying predecessors and successors of VPlan blocks.
300//===----------------------------------------------------------------------===//
301
302/// Class that provides utilities for VPBlockBases in VPlan.
304public:
305 VPBlockUtils() = delete;
306
307 /// Insert disconnected VPBlockBase \p NewBlock after \p BlockPtr. Add \p
308 /// NewBlock as successor of \p BlockPtr and \p BlockPtr as predecessor of \p
309 /// NewBlock, and propagate \p BlockPtr parent to \p NewBlock. \p BlockPtr's
310 /// successors are moved from \p BlockPtr to \p NewBlock. \p NewBlock must
311 /// have neither successors nor predecessors.
312 static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
313 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
314 "Can't insert new block with predecessors or successors.");
315 NewBlock->setParent(BlockPtr->getParent());
316 transferSuccessors(BlockPtr, NewBlock);
317 connectBlocks(BlockPtr, NewBlock);
318 }
319
320 /// Insert disconnected block \p NewBlock before \p Blockptr. First
321 /// disconnects all predecessors of \p BlockPtr and connects them to \p
322 /// NewBlock. Add \p NewBlock as predecessor of \p BlockPtr and \p BlockPtr as
323 /// successor of \p NewBlock.
324 static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
325 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
326 "Can't insert new block with predecessors or successors.");
327 NewBlock->setParent(BlockPtr->getParent());
328 for (VPBlockBase *Pred : to_vector(BlockPtr->predecessors())) {
329 Pred->replaceSuccessor(BlockPtr, NewBlock);
330 NewBlock->appendPredecessor(Pred);
331 }
332 BlockPtr->clearPredecessors();
333 connectBlocks(NewBlock, BlockPtr);
334 }
335
336 /// Insert disconnected VPBlockBases \p IfTrue and \p IfFalse after \p
337 /// BlockPtr. Add \p IfTrue and \p IfFalse as succesors of \p BlockPtr and \p
338 /// BlockPtr as predecessor of \p IfTrue and \p IfFalse. Propagate \p BlockPtr
339 /// parent to \p IfTrue and \p IfFalse. \p BlockPtr must have no successors
340 /// and \p IfTrue and \p IfFalse must have neither successors nor
341 /// predecessors.
342 static void insertTwoBlocksAfter(VPBlockBase *IfTrue, VPBlockBase *IfFalse,
343 VPBlockBase *BlockPtr) {
344 assert(!IfTrue->hasSuccessors() && "Can't insert IfTrue with successors.");
345 assert(!IfFalse->hasSuccessors() &&
346 "Can't insert IfFalse with successors.");
347 BlockPtr->setTwoSuccessors(IfTrue, IfFalse);
348 IfTrue->setPredecessors({BlockPtr});
349 IfFalse->setPredecessors({BlockPtr});
350 IfTrue->setParent(BlockPtr->getParent());
351 IfFalse->setParent(BlockPtr->getParent());
352 }
353
354 /// Connect VPBlockBases \p From and \p To bi-directionally. If \p PredIdx is
355 /// -1, append \p From to the predecessors of \p To, otherwise set \p To's
356 /// predecessor at \p PredIdx to \p From. If \p SuccIdx is -1, append \p To to
357 /// the successors of \p From, otherwise set \p From's successor at \p SuccIdx
358 /// to \p To. Both VPBlockBases must have the same parent, which can be null.
359 /// Both VPBlockBases can be already connected to other VPBlockBases.
360 static void connectBlocks(VPBlockBase *From, VPBlockBase *To,
361 unsigned PredIdx = -1u, unsigned SuccIdx = -1u) {
362 assert((From->getParent() == To->getParent()) &&
363 "Can't connect two block with different parents");
364
365 if (SuccIdx == -1u)
366 From->appendSuccessor(To);
367 else
368 From->getSuccessors()[SuccIdx] = To;
369
370 if (PredIdx == -1u)
371 To->appendPredecessor(From);
372 else
373 To->getPredecessors()[PredIdx] = From;
374 }
375
376 /// Disconnect VPBlockBases \p From and \p To bi-directionally. Remove \p To
377 /// from the successors of \p From and \p From from the predecessors of \p To.
378 static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To) {
379 assert(To && "Successor to disconnect is null.");
380 From->removeSuccessor(To);
381 To->removePredecessor(From);
382 }
383
384 /// Reassociate all the blocks connected to \p Old so that they now point to
385 /// \p New.
386 static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New) {
387 auto Preds = to_vector(Old->getPredecessors());
388 auto Succs = to_vector(Old->getSuccessors());
389 for (auto *Pred : Preds)
390 Pred->replaceSuccessor(Old, New);
391 for (auto *Succ : Succs)
392 Succ->replacePredecessor(Old, New);
393 New->setPredecessors(Old->getPredecessors());
394 New->setSuccessors(Old->getSuccessors());
395 Old->clearPredecessors();
396 Old->clearSuccessors();
397 }
398
399 /// Transfer successors from \p Old to \p New. \p New must have no successors.
401 for (auto *Succ : Old->getSuccessors())
402 Succ->replacePredecessor(Old, New);
403 New->setSuccessors(Old->getSuccessors());
404 Old->clearSuccessors();
405 }
406
407 /// Clone the CFG for all nodes reachable from \p Entry, including cloning
408 /// the blocks and their recipes. Operands of cloned recipes will NOT be
409 /// updated. Remapping of operands must be done separately. Returns a pair
410 /// with the new entry and exiting blocks of the cloned region. If \p Entry
411 /// isn't part of a region, return nullptr for the exiting block.
412 static std::pair<VPBlockBase *, VPBlockBase *> cloneFrom(VPBlockBase *Entry);
413
414 /// Return an iterator range over \p Range which only includes \p BlockTy
415 /// blocks. The accesses are casted to \p BlockTy.
416 template <typename BlockTy, typename T> static auto blocksOnly(T &&Range) {
417 // Create BaseTy with correct const-ness based on BlockTy.
418 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
419 const VPBlockBase, VPBlockBase>;
420
421 // We need the pointee range over (const) BlocktTy & instead of (const)
422 // BlockTy * for filter_range to work properly.
423 auto Filter =
425 [](BaseTy &Block) { return isa<BlockTy>(&Block); });
426 return map_range(Filter, [](BaseTy &Block) -> BlockTy * {
427 return cast<BlockTy>(&Block);
428 });
429 }
430
431 /// Return an iterator range over \p Range with each block cast to \p
432 /// BlockTy. Unlike blocksOnly, all blocks in \p Range must be of type
433 /// \p BlockTy.
434 template <typename BlockTy, typename T> static auto blocksAs(T &&Range) {
435 // Create BaseTy with correct const-ness based on BlockTy.
436 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
437 const VPBlockBase, VPBlockBase>;
438 return map_range(
439 Range, [](BaseTy *Block) -> BlockTy * { return cast<BlockTy>(Block); });
440 }
441
442 /// Returns the blocks between \p FirstBB and \p LastBB, where FirstBB
443 /// to LastBB forms a single-sucessor chain.
446 VPBasicBlock *LastBB);
447
448 /// Inserts \p BlockPtr on the edge between \p From and \p To. That is, update
449 /// \p From's successor to \p To to point to \p BlockPtr and \p To's
450 /// predecessor from \p From to \p BlockPtr. \p From and \p To are added to \p
451 /// BlockPtr's predecessors and successors respectively. There must be a
452 /// single edge between \p From and \p To.
453 static void insertOnEdge(VPBlockBase *From, VPBlockBase *To,
454 VPBlockBase *BlockPtr) {
455 unsigned SuccIdx = From->getIndexForSuccessor(To);
456 unsigned PredIx = To->getIndexForPredecessor(From);
457 VPBlockUtils::connectBlocks(From, BlockPtr, -1, SuccIdx);
458 VPBlockUtils::connectBlocks(BlockPtr, To, PredIx, -1);
459 }
460
461 /// Returns true if \p VPB is a loop header, based on regions or \p VPDT in
462 /// their absence.
463 static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
464
465 /// Returns true if \p VPB is a loop latch, using isHeader().
466 static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
467
468 /// Returns the header and latch of the outermost loop of \p Plan in plain
469 /// CFG form (before regions are formed).
470 static std::pair<VPBasicBlock *, VPBasicBlock *>
471 getPlainCFGHeaderAndLatch(const VPlan &Plan);
472
473 /// Returns the middle block of \p Plan in plain CFG form (before regions
474 /// are formed).
475 static VPBasicBlock *getPlainCFGMiddleBlock(const VPlan &Plan);
476};
477
478} // namespace llvm
479
480#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
#define LLVM_ABI_FOR_TEST
Definition Compiler.h:220
std::pair< BasicBlock *, unsigned > BlockTy
A pair of (basic block, score).
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
SI Fold Operands
This file contains the declarations of the Vectorization Plan base classes:
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A debug info location.
Definition DebugLoc.h:126
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
Utility class for floating point operations which can have information about relaxed accuracy require...
Definition Operator.h:202
Represents flags for the getelementptr instruction/expression.
A struct for saving information about induction variables.
InductionKind
This enum represents the kinds of inductions that we support.
@ IK_FpInduction
Floating point induction variable.
@ IK_IntInduction
Integer induction variable. Step = C.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Representation for a specific memory location.
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
This class represents an analyzed expression in the program.
The main scalar evolution driver.
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:4415
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
Definition VPlan.h:95
VPRegionBlock * getParent()
Definition VPlan.h:193
iterator_range< VPBlockBase ** > predecessors()
Definition VPlan.h:227
bool hasPredecessors() const
Returns true if this block has any predecessors.
Definition VPlan.h:224
unsigned getIndexForSuccessor(const VPBlockBase *Succ) const
Returns the index for Succ in the blocks successor list.
Definition VPlan.h:351
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
Definition VPlan.h:307
unsigned getIndexForPredecessor(const VPBlockBase *Pred) const
Returns the index for Pred in the blocks predecessors list.
Definition VPlan.h:344
bool hasSuccessors() const
Returns true if this block has any successors.
Definition VPlan.h:222
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:229
void clearSuccessors()
Remove all the successors of this block.
Definition VPlan.h:326
void setTwoSuccessors(VPBlockBase *IfTrue, VPBlockBase *IfFalse)
Set two given VPBlockBases IfTrue and IfFalse to be the two successors of this VPBlockBase.
Definition VPlan.h:298
void clearPredecessors()
Remove all the predecessor of this block.
Definition VPlan.h:323
void setParent(VPRegionBlock *P)
Definition VPlan.h:204
const VPBlocksTy & getSuccessors() const
Definition VPlan.h:218
static auto blocksAs(T &&Range)
Return an iterator range over Range with each block cast to BlockTy.
Definition VPlanUtils.h:434
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:312
static void insertOnEdge(VPBlockBase *From, VPBlockBase *To, VPBlockBase *BlockPtr)
Inserts BlockPtr on the edge between From and To.
Definition VPlanUtils.h:453
static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT)
Returns true if VPB is a loop latch, using isHeader().
static VPBasicBlock * getPlainCFGMiddleBlock(const VPlan &Plan)
Returns the middle block of Plan in plain CFG form (before regions are formed).
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 insertTwoBlocksAfter(VPBlockBase *IfTrue, VPBlockBase *IfFalse, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBases IfTrue and IfFalse after BlockPtr.
Definition VPlanUtils.h:342
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:360
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:378
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:386
static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected block NewBlock before Blockptr.
Definition VPlanUtils.h:324
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:416
static std::pair< VPBasicBlock *, VPBasicBlock * > getPlainCFGHeaderAndLatch(const VPlan &Plan)
Returns the header and latch of the outermost loop of Plan in plain CFG form (before regions are form...
static void transferSuccessors(VPBlockBase *Old, VPBlockBase *New)
Transfer successors from Old to New. New must have no successors.
Definition VPlanUtils.h:400
static SmallVector< VPBasicBlock * > blocksInSingleSuccessorChainBetween(VPBasicBlock *FirstBB, VPBasicBlock *LastBB)
Returns the blocks between FirstBB and LastBB, where FirstBB to LastBB forms a single-sucessor chain.
static std::pair< VPBlockBase *, VPBlockBase * > cloneFrom(VPBlockBase *Entry)
Clone the CFG for all nodes reachable from Entry, including cloning the blocks and their recipes.
Definition VPlan.cpp:710
VPlan-based builder utility analogous to IRBuilder.
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
Class to record and manage LLVM IR flags.
Definition VPlan.h:705
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1306
@ Intrinsic
Calls a scalar intrinsic. The intrinsic ID is the last operand.
Definition VPlan.h:1428
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:412
A recipe for handling reduction phis.
Definition VPlan.h:2861
VPSCEVExpander(VPBuilder &Builder, ScalarEvolution &SE, DebugLoc DL)
Definition VPlanUtils.h:292
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...
Definition VPlan.h:4257
VPSingleDefRecipe is a base class for recipes that model a sequence of one or more output IR that def...
Definition VPlan.h:620
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:401
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Definition VPlanValue.h:50
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
Definition VPlan.cpp:128
user_range users()
Definition VPlanValue.h:157
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4827
An efficient, type-erasing, non-owning reference to a callable.
CallInst * Call
bool match(Val *V, const Pattern &P)
void pullOutPermutationsImpl(VPlan &Plan, function_ref< VPValue *(VPValue *Op)> Perm, function_ref< VPSingleDefRecipe *(VPSingleDefRecipe *X)> Build)
Template-independent implementation for pullOutPermutations.
BranchProbability getExecutionProbability(BlockFrequency Freq)
Returns Freq as a BranchProbability, relative to AlwaysExecutesFreq.
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 cannotHoistOrSinkRecipe(const VPRecipeBase &R, bool Sinking=false)
Return true if we do not know how to (mechanically) hoist or sink R.
unsigned getOpcode(const VPValue *V)
Return the instruction opcode for the recipe defining V or 0 for unsupported recipes and VPValues not...
VPBasicBlock * getFirstLoopHeader(VPlan &Plan, VPDominatorTree &VPDT)
Returns the header block of the first, top-level loop, or null if none exist.
bool isAddressSCEVForCost(const SCEV *Addr, ScalarEvolution &SE, const Loop *L)
Returns true if Addr is an address SCEV that can be passed to TTI::getAddressComputationCost,...
LLVM_ABI_FOR_TEST VPValue * reconstructSSA(VPBasicBlock *VPBB, DenseMap< VPBasicBlock *, VPValue * > &Defs)
Insert phis to reconstruct SSA for a single value starting from VPBB.
bool onlyFirstPartUsed(const VPValue *Def)
Returns true if only the first part of Def is used.
Intrinsic::ID getIntrinsicID(const Ty *R)
Return the intrinsic ID underlying a call.
Definition VPlanUtils.h:87
VPInstruction * findComputeReductionResult(VPReductionPHIRecipe *PhiR)
Find the ComputeReductionResult recipe for PhiR, looking through selects inserted for predicated redu...
VPInstruction * findCanonicalIVIncrement(VPlan &Plan)
Find the canonical IV increment of Plan's vector loop region.
std::optional< MemoryLocation > getMemoryLocation(const VPRecipeBase &R)
Return a MemoryLocation for R with noalias metadata populated from R, if the recipe is supported and ...
bool onlyFirstLaneUsed(const VPValue *Def)
Returns true if only the first lane of Def is used.
VPIRValue * tryToFoldLiveIns(VPSingleDefRecipe &R, ArrayRef< VPValue * > Operands, const DataLayout &DL)
Try to fold R using InstSimplifyFolder.
SmallVector< std::pair< VPBasicBlock *, VPIRBasicBlock * > > getEarlyExits(const VPlan &Plan, const VPBlockBase *MiddleVPBB)
Returns the (early exiting block, exit block) pairs of Plan, i.e.
VPValue * findIncomingAliasMask(const VPlan &Plan)
Finds the incoming alias-mask within the vector preheader.
constexpr uint64_t AlwaysExecutesFreq
Denominator of the frequencies computed by computeExecutionFrequencies, i.e.
Definition VPlanUtils.h:238
VPIRFlags getFlagsFromIndDesc(const InductionDescriptor &ID)
Extracts and returns NoWrap and FastMath flags from the induction binop in ID.
Definition VPlanUtils.h:134
DenseMap< const VPBasicBlock *, std::optional< VPExecutionFrequency > > computeExecutionFrequencies(ArrayRef< VPBasicBlock * > Blocks)
Computes for each block in Blocks, which must be in reverse post-order, the frequency with which it e...
void recursivelyDeleteDeadRecipes(VPValue *V)
Recursively delete V and any of its operands that become dead.
bool doesGeneratePerAllLanes(const VPRecipeBase *R)
Returns true if R produces scalar values for all VF lanes.
bool isDeadRecipe(VPRecipeBase &R)
Returns true if R is dead, i.e.
VPRecipeBase * findRecipe(VPValue *Start, PredT Pred)
Search Start's users for a recipe satisfying Pred, looking through recipes with definitions.
Definition VPlanUtils.h:151
bool isElementwise(const VPValue *V)
Return true if V is elementwise, i.e. none of the lanes are permuted.
bool onlyScalarValuesUsed(const VPValue *Def)
Returns true if only scalar values of Def are used by all users.
bool isUniformAcrossVFsAndUFs(const VPValue *V)
Checks if V is uniform across all VF lanes and UF parts.
bool isUsedByLoadStoreAddress(const VPValue *V)
Returns true if V is used as part of the address of another load or store.
std::optional< std::pair< bool, unsigned > > getOpcodeOrIntrinsicID(const VPValue *V)
Get the instruction opcode or intrinsic ID for the recipe defining V.
VPValue * scalarizeVPWidenPointerInduction(VPWidenPointerInductionRecipe *PtrIV, VPlan &Plan, VPBuilder &Builder)
Scalarize a VPWidenPointerInductionRecipe by replacing it with a PtrAdd (IndStart,...
GEPNoWrapFlags getGEPFlagsForPtr(VPValue *Ptr)
Returns the GEP nowrap flags for Ptr, looking through pointer casts mirroring Value::stripPointerCast...
const SCEV * getSCEVExprForVPValue(const VPValue *V, PredicatedScalarEvolution &PSE, const Loop *L=nullptr)
Return the SCEV expression for V.
void pullOutPermutations(VPlan &Plan, Match_t Perm, Builder Build)
Removes the permutation pattern Perm from any elementwise operations in the plan, by constructing a n...
Definition VPlanUtils.h:263
unsigned getVFScaleFactor(VPRecipeBase *R)
Get the VF scaling factor applied to the recipe's output, if the recipe has one.
SmallVector< VPUser * > collectUsersRecursively(VPValue *V)
Collect all users of V, looking through recipes that define other values.
VPScalarIVStepsRecipe * createScalarIVSteps(VPlan &Plan, InductionDescriptor::InductionKind Kind, Instruction::BinaryOps InductionOpcode, FPMathOperator *FPBinOp, Instruction *TruncI, VPValue *StartV, VPValue *Step, DebugLoc DL, VPBuilder &Builder, const VPIRFlags::WrapFlagsTy &Flags={})
Create a scalar-iv-steps recipe over Plan's canonical IV for an induction of Kind with InductionOpcod...
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.
Definition Casting.h:643
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:365
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterator.h:341
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...
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
Definition STLExtras.h:551
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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...
Definition Casting.h:547
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559