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 MemoryLocation;
19class ScalarEvolution;
20class SCEV;
21class SCEVNAryExpr;
23} // namespace llvm
24
25namespace llvm {
26
27namespace vputils {
28/// Returns true if checking whether \p U uses the first lane of \p Op requires
29/// recursively checking \p Op's users.
30bool propagatesFirstLaneUse(const VPUser *U, const VPValue *Op);
31
32/// Returns true if only the first lane of \p Def is used by all users.
33bool onlyFirstLaneUsed(const VPValue *Def);
34
35/// Returns true if only the first part of \p Def is used by all users.
36bool onlyFirstPartUsed(const VPValue *Def);
37
38/// Returns true if only scalar values of \p Def are used by all users.
39bool onlyScalarValuesUsed(const VPValue *Def);
40
41/// Get or create a VPValue that corresponds to the expansion of \p Expr. If \p
42/// Expr is a SCEVConstant or SCEVUnknown, return a VPValue wrapping the live-in
43/// value. Otherwise return a VPExpandSCEVRecipe to expand \p Expr. If \p Plan's
44/// pre-header already contains a recipe expanding \p Expr, return it. If not,
45/// create a new one. \p ExpandInIR is forwarded to the VPExpandSCEVRecipe.
47 bool ExpandInIR = false);
48
49/// Return the SCEV expression for \p V. Returns SCEVCouldNotCompute if no
50/// SCEV expression could be constructed.
53 const Loop *L = nullptr);
54
55/// If the pointer operand \p Addr of a memory access is an affine AddRec
56/// w.r.t. \p L with a constant stride, return the stride in units of
57/// \p AccessTy. Otherwise return std::nullopt.
58std::optional<int64_t> getConstantStride(VPValue *Addr, Type *AccessTy,
60 const Loop *L);
61
62/// Returns true if \p Addr is an address SCEV that can be passed to
63/// TTI::getAddressComputationCost, i.e. the address SCEV is loop invariant, an
64/// affine AddRec (i.e. induction ), or an add expression of such operands or a
65/// sign-extended AddRec.
66bool isAddressSCEVForCost(const SCEV *Addr, ScalarEvolution &SE, const Loop *L);
67
68/// Returns true if \p VPV is a single scalar, either because it produces the
69/// same value for all lanes or only has its first lane used.
70bool isSingleScalar(const VPValue *VPV);
71
72/// Checks if \p V is uniform across all VF lanes and UF parts. It is considered
73/// as such if it is either loop invariant (defined outside the vector region)
74/// or its operands are known to be uniform across all VFs and UFs (e.g.
75/// VPDerivedIV or the canonical IV).
77
78/// Return true if \p V is elementwise, i.e. none of the lanes are permuted.
79bool isElementwise(const VPValue *V);
80
81/// Returns true if \p R produces scalar values for all VF lanes.
83
84/// Returns the header block of the first, top-level loop, or null if none
85/// exist.
87
88/// Get the VF scaling factor applied to the recipe's output, if the recipe has
89/// one.
91
92/// Return true if we do not know how to (mechanically) hoist or sink \p R.
93/// When sinking, passing \p Sinking = true ensures that assumes aren't sunk.
94/// Returns true for recipes that access memory.
95bool cannotHoistOrSinkRecipe(const VPRecipeBase &R, bool Sinking = false);
96
97/// Return the intrinsic ID underlying a call.
98template <typename Ty> Intrinsic::ID getIntrinsicID(const Ty *R) {
99 if (const auto *Intr = dyn_cast<VPWidenIntrinsicRecipe>(R))
100 return Intr->getVectorIntrinsicID();
101 if (const auto *Call = dyn_cast<VPWidenCallRecipe>(R))
102 return Call->getCalledScalarFunction()->getIntrinsicID();
103
104 auto GetCalleeIntrinsic = [&](VPValue *CalleeOp) -> Intrinsic::ID {
105 if (!isa<VPIRValue>(CalleeOp))
107 auto *F = cast<Function>(CalleeOp->getLiveInIRValue());
108 return F->getIntrinsicID();
109 };
110 if (const auto *Rep = dyn_cast<VPReplicateRecipe>(R))
111 if (Rep->getOpcode() == Instruction::Call)
112 // The callee is the last operand, excluding the mask if predicated.
113 return GetCalleeIntrinsic(
114 Rep->getOperand(Rep->getNumOperandsWithoutMask() - 1));
115 if (const auto *VPI = dyn_cast<VPInstruction>(R)) {
116 if (VPI->getOpcode() == Instruction::Call)
117 // The callee is the last operand, excluding the mask if masked.
118 return GetCalleeIntrinsic(
119 VPI->getOperand(VPI->getNumOperandsWithoutMask() - 1));
120 if (VPI->getOpcode() == VPInstruction::Intrinsic) {
121 return cast<VPConstantInt>(VPI->getLastOperand())->getZExtValue();
122 }
123 }
125}
126
127/// Return the instruction opcode for the recipe defining \p V or 0 for
128/// unsupported recipes and VPValues not defined by a recipe.
129unsigned getOpcode(const VPValue *V);
130
131/// Get the instruction opcode or intrinsic ID for the recipe defining \p V.
132/// Returns an optional pair, where the first element indicates whether it is an
133/// intrinsic ID.
134std::optional<std::pair<bool, unsigned>>
136
137/// Return a MemoryLocation for \p R with noalias metadata populated from
138/// \p R, if the recipe is supported and std::nullopt otherwise. The pointer of
139/// the location is conservatively set to nullptr.
140std::optional<MemoryLocation> getMemoryLocation(const VPRecipeBase &R);
141
142/// Extracts and returns NoWrap flags from \p PhiR and fast-math flags from \p
143/// ID.
145 const VPPhi *PhiR);
146
147/// Search \p Start's users for a recipe satisfying \p Pred, looking through
148/// recipes with definitions.
149template <typename PredT>
150inline VPRecipeBase *findRecipe(VPValue *Start, PredT Pred) {
151 SetVector<VPValue *> Worklist;
152 Worklist.insert(Start);
153 for (unsigned I = 0; I != Worklist.size(); ++I) {
154 VPValue *Cur = Worklist[I];
155 auto *R = Cur->getDefiningRecipe();
156 if (!R)
157 continue;
158 if (Pred(R))
159 return R;
160 for (VPUser *U : Cur->users()) {
161 for (VPValue *V : cast<VPRecipeBase>(U)->definedValues())
162 Worklist.insert(V);
163 }
164 }
165 return nullptr;
166}
167
168/// Find the canonical IV increment of \p Plan's vector loop region. Returns
169/// nullptr if not found.
171
172/// Returns the GEP nowrap flags for \p Ptr, looking through pointer casts
173/// mirroring Value::stripPointerCasts.
175
176/// Returns true if \p V is used as part of the address of another load or
177/// store.
179
180/// Find the ComputeReductionResult recipe for \p PhiR, looking through selects
181/// inserted for predicated reductions or tail folding.
183
184/// Finds the incoming alias-mask within the vector preheader.
186
187/// Returns the (early exiting block, exit block) pairs of \p Plan, i.e. all
188/// edges to an exit block that do not come from \p MiddleVPBB.
190getEarlyExits(const VPlan &Plan, const VPBlockBase *MiddleVPBB);
191
192/// Create a scalar-iv-steps recipe over \p Plan's canonical IV for an
193/// induction of \p Kind with \p InductionOpcode / \p FPBinOp, start value \p
194/// StartV and step \p Step, truncated to \p ResultTy, inserting recipes via \p
195/// Builder.
198 Instruction::BinaryOps InductionOpcode,
199 FPMathOperator *FPBinOp, Type *ResultTy, VPValue *StartV,
200 VPValue *Step, DebugLoc DL, VPBuilder &Builder,
201 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/// Returns \p Freq as a BranchProbability, relative to the full mass.
236BranchProbability getExecutionProbability(BlockFrequency Freq);
237
238/// Computes for each block in \p Blocks, which must be in reverse post-order,
239/// the frequency with which it executes relative to the first (header) block,
240/// and whether that frequency was composed using any estimated branch weights.
241/// The frequency of a block is the sum over its incoming edges, or std::nullopt
242/// if any edge on a path reaching it lacks branch weights. Edges to blocks
243/// outside \p Blocks are ignored.
244DenseMap<const VPBasicBlock *, std::optional<VPExecutionFrequency>>
246
247/// Get the value type of a VPInstruction or VPReplicateRecipe load or store.
249 bool IsLoad = vputils::getOpcode(R) == Instruction::Load;
250 return (IsLoad ? R : R->getOperand(0))->getScalarType();
251}
252
253namespace detail {
254
255/// Template-independent implementation for pullOutPermutations.
257 VPlan &Plan, function_ref<VPValue *(VPValue *Op)> Perm,
259} // namespace detail
260
261/// Removes the permutation pattern \p Perm from any elementwise operations
262/// in the plan, by constructing a new permutation via \p Build.
263/// e.g. binop(perm(x), perm(y)) -> perm(binop(x,y)).
264template <typename Match_t, typename Builder>
265void pullOutPermutations(VPlan &Plan, Match_t Perm, Builder Build) {
266 // Convert matcher to function returing the matched VPValue.
267 auto MatchPerm = [&Perm](VPValue *Op) -> VPValue * {
268 VPValue *X;
269 return match(Op, Perm(X)) ? X : nullptr;
270 };
271 detail::pullOutPermutationsImpl(Plan, MatchPerm, Build);
272}
273
274} // namespace vputils
275
276/// Lightweight SCEV-to-VPlan expander. Converts SCEV expressions into
277/// VPInstructions and live-ins. Canonical IVs and non-affine SCEVAddRecExprs
278/// are wrapped in a VPExpandSCEVRecipe to be expanded to IR later. Expansions
279/// are reused across calls to expand(), so the builder's insert point must
280/// only move to positions dominated by all earlier insert points.
282 VPBuilder &Builder;
283 ScalarEvolution &SE;
284 DebugLoc DL;
285
286 /// When true, nested SCEVUDivExprs are expanded so that they cannot divide by
287 /// zero, matching SCEVExpander's SafeUDivMode.
288 bool SafeUDivMode = false;
289
290 /// If set, expressions invariant in this loop are expanded in IR via
291 /// VPExpandSCEVRecipes, which hoists them out of it.
292 const Loop *HoistOutOf;
293
295 InsertedExpressions;
296
297 /// Try to find a loop-invariant IR value in the plan's entry block whose
298 /// SCEV matches \p S. Returns the corresponding live-in VPValue, or nullptr
299 /// if none is found.
300 VPValue *tryToReuseIRValue(const SCEV *S);
301
302 /// Returns true if \p S can be expanded in IR, hoisted out of HoistOutOf.
303 bool canExpandInIR(const SCEV *S);
304
305 /// Expand pointer-typed \p S as a ptradd of its pointer base and offset.
306 VPValue *expandAsPtrAdd(const SCEVNAryExpr *S);
307
308 VPValue *expandImpl(const SCEV *S);
309
310public:
312 const Loop *HoistOutOf = nullptr)
313 : Builder(Builder), SE(SE), DL(DL), HoistOutOf(HoistOutOf) {}
314
315 /// Expand \p S into recipes and live-ins using the builder.
316 VPValue *expand(const SCEV *S);
317
318 /// Expand the expression of \p R, or return \p R if it must be expanded in
319 /// IR.
321 return R.expandInIR() ? &R : expand(R.getSCEV());
322 }
323};
324//===----------------------------------------------------------------------===//
325// Utilities for modifying predecessors and successors of VPlan blocks.
326//===----------------------------------------------------------------------===//
327
328/// Class that provides utilities for VPBlockBases in VPlan.
330public:
331 VPBlockUtils() = delete;
332
333 /// Insert disconnected VPBlockBase \p NewBlock after \p BlockPtr. Add \p
334 /// NewBlock as successor of \p BlockPtr and \p BlockPtr as predecessor of \p
335 /// NewBlock, and propagate \p BlockPtr parent to \p NewBlock. \p BlockPtr's
336 /// successors are moved from \p BlockPtr to \p NewBlock. \p NewBlock must
337 /// have neither successors nor predecessors.
338 static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
339 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
340 "Can't insert new block with predecessors or successors.");
341 NewBlock->setParent(BlockPtr->getParent());
342 transferSuccessors(BlockPtr, NewBlock);
343 connectBlocks(BlockPtr, NewBlock);
344 }
345
346 /// Insert disconnected block \p NewBlock before \p Blockptr. First
347 /// disconnects all predecessors of \p BlockPtr and connects them to \p
348 /// NewBlock. Add \p NewBlock as predecessor of \p BlockPtr and \p BlockPtr as
349 /// successor of \p NewBlock.
350 static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
351 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
352 "Can't insert new block with predecessors or successors.");
353 NewBlock->setParent(BlockPtr->getParent());
354 for (VPBlockBase *Pred : to_vector(BlockPtr->predecessors()))
355 replaceSuccessor(Pred, BlockPtr, NewBlock);
356 connectBlocks(NewBlock, BlockPtr);
357 }
358
359 /// Insert disconnected VPBlockBases \p IfTrue and \p IfFalse after \p
360 /// BlockPtr. Add \p IfTrue and \p IfFalse as succesors of \p BlockPtr and \p
361 /// BlockPtr as predecessor of \p IfTrue and \p IfFalse. Propagate \p BlockPtr
362 /// parent to \p IfTrue and \p IfFalse. \p BlockPtr must have no successors
363 /// and \p IfTrue and \p IfFalse must have neither successors nor
364 /// predecessors.
365 static void insertTwoBlocksAfter(VPBlockBase *IfTrue, VPBlockBase *IfFalse,
366 VPBlockBase *BlockPtr) {
367 assert(!IfTrue->hasSuccessors() && "Can't insert IfTrue with successors.");
368 assert(!IfFalse->hasSuccessors() &&
369 "Can't insert IfFalse with successors.");
370 BlockPtr->setTwoSuccessors(IfTrue, IfFalse);
371 IfTrue->setPredecessors({BlockPtr});
372 IfFalse->setPredecessors({BlockPtr});
373 IfTrue->setParent(BlockPtr->getParent());
374 IfFalse->setParent(BlockPtr->getParent());
375 }
376
377 /// Connect VPBlockBases \p From and \p To bi-directionally. If \p PredIdx is
378 /// -1, append \p From to the predecessors of \p To, otherwise set \p To's
379 /// predecessor at \p PredIdx to \p From. If \p SuccIdx is -1, append \p To to
380 /// the successors of \p From, otherwise set \p From's successor at \p SuccIdx
381 /// to \p To. Both VPBlockBases must have the same parent, which can be null.
382 /// Both VPBlockBases can be already connected to other VPBlockBases.
383 static void connectBlocks(VPBlockBase *From, VPBlockBase *To,
384 unsigned PredIdx = -1u, unsigned SuccIdx = -1u) {
385 assert((From->getParent() == To->getParent()) &&
386 "Can't connect two block with different parents");
387
388 if (SuccIdx == -1u)
389 From->appendSuccessor(To);
390 else
391 From->getSuccessors()[SuccIdx] = To;
392
393 if (PredIdx == -1u)
394 To->appendPredecessor(From);
395 else
396 To->getPredecessors()[PredIdx] = From;
397 }
398
399 /// Disconnect VPBlockBases \p From and \p To bi-directionally. Remove \p To
400 /// from the successors of \p From and \p From from the predecessors of \p To.
401 static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To) {
402 assert(To && "Successor to disconnect is null.");
403 From->removeSuccessor(To);
404 To->removePredecessor(From);
405 }
406
407 /// Redirect the edge from \p From to \p OldSucc to \p NewSucc, keeping \p
408 /// From's successor order. \p From is removed from \p OldSucc's predecessors
409 /// and appended to \p NewSucc's.
410 static void replaceSuccessor(VPBlockBase *From, VPBlockBase *OldSucc,
411 VPBlockBase *NewSucc) {
412 From->replaceSuccessor(OldSucc, NewSucc);
413 OldSucc->removePredecessor(From);
414 NewSucc->appendPredecessor(From);
415 }
416
417 /// Reassociate all the blocks connected to \p Old so that they now point to
418 /// \p New.
419 static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New) {
420 auto Preds = to_vector(Old->getPredecessors());
421 auto Succs = to_vector(Old->getSuccessors());
422 for (auto *Pred : Preds)
423 Pred->replaceSuccessor(Old, New);
424 for (auto *Succ : Succs)
425 Succ->replacePredecessor(Old, New);
426 New->setPredecessors(Old->getPredecessors());
427 New->setSuccessors(Old->getSuccessors());
428 Old->clearPredecessors();
429 Old->clearSuccessors();
430 }
431
432 /// Transfer successors from \p Old to \p New. \p New must have no successors.
434 for (auto *Succ : Old->getSuccessors())
435 Succ->replacePredecessor(Old, New);
436 New->setSuccessors(Old->getSuccessors());
437 Old->clearSuccessors();
438 }
439
440 /// Clone the CFG for all nodes reachable from \p Entry, including cloning
441 /// the blocks and their recipes. Operands of cloned recipes will NOT be
442 /// updated. Remapping of operands must be done separately. Returns a pair
443 /// with the new entry and exiting blocks of the cloned region. If \p Entry
444 /// isn't part of a region, return nullptr for the exiting block.
445 static std::pair<VPBlockBase *, VPBlockBase *> cloneFrom(VPBlockBase *Entry);
446
447 /// Return an iterator range over \p Range which only includes \p BlockTy
448 /// blocks. The accesses are casted to \p BlockTy.
449 template <typename BlockTy, typename T> static auto blocksOnly(T &&Range) {
450 return make_isa_range<BlockTy>(std::forward<T>(Range));
451 }
452
453 /// Return an iterator range over \p Range with each block cast to \p
454 /// BlockTy. Unlike blocksOnly, all blocks in \p Range must be of type
455 /// \p BlockTy.
456 template <typename BlockTy, typename T> static auto blocksAs(T &&Range) {
457 // Create BaseTy with correct const-ness based on BlockTy.
458 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
459 const VPBlockBase, VPBlockBase>;
460 return map_range(
461 Range, [](BaseTy *Block) -> BlockTy * { return cast<BlockTy>(Block); });
462 }
463
464 /// Returns the blocks between \p FirstBB and \p LastBB, where FirstBB
465 /// to LastBB forms a single-sucessor chain.
468 VPBasicBlock *LastBB);
469
470 /// Inserts \p BlockPtr on the edge between \p From and \p To. That is, update
471 /// \p From's successor to \p To to point to \p BlockPtr and \p To's
472 /// predecessor from \p From to \p BlockPtr. \p From and \p To are added to \p
473 /// BlockPtr's predecessors and successors respectively. There must be a
474 /// single edge between \p From and \p To.
475 static void insertOnEdge(VPBlockBase *From, VPBlockBase *To,
476 VPBlockBase *BlockPtr) {
477 unsigned SuccIdx = From->getIndexForSuccessor(To);
478 unsigned PredIx = To->getIndexForPredecessor(From);
479 VPBlockUtils::connectBlocks(From, BlockPtr, -1, SuccIdx);
480 VPBlockUtils::connectBlocks(BlockPtr, To, PredIx, -1);
481 }
482
483 /// Returns true if \p VPB is a loop header, based on regions or \p VPDT in
484 /// their absence.
485 static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
486
487 /// Returns true if \p VPB is a loop latch, using isHeader().
488 static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
489
490 /// Returns the header and latch of the outermost loop of \p Plan in plain
491 /// CFG form (before regions are formed).
492 static std::pair<VPBasicBlock *, VPBasicBlock *>
493 getPlainCFGHeaderAndLatch(const VPlan &Plan);
494
495 /// Returns the middle block of \p Plan in plain CFG form (before regions
496 /// are formed).
497 static VPBasicBlock *getPlainCFGMiddleBlock(const VPlan &Plan);
498};
499
500} // namespace llvm
501
502#endif
SDValue Pred
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
#define LLVM_ABI_FOR_TEST
Definition Compiler.h:216
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:
A debug info location.
Definition DebugLoc.h:126
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.
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 node is a base class providing common functionality for n'ary operators.
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.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:4522
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:226
bool hasPredecessors() const
Returns true if this block has any predecessors.
Definition VPlan.h:223
unsigned getIndexForSuccessor(const VPBlockBase *Succ) const
Returns the index for Succ in the blocks successor list.
Definition VPlan.h:340
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
Definition VPlan.h:296
unsigned getIndexForPredecessor(const VPBlockBase *Pred) const
Returns the index for Pred in the blocks predecessors list.
Definition VPlan.h:333
bool hasSuccessors() const
Returns true if this block has any successors.
Definition VPlan.h:221
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:228
void clearSuccessors()
Remove all the successors of this block.
Definition VPlan.h:315
void setTwoSuccessors(VPBlockBase *IfTrue, VPBlockBase *IfFalse)
Set two given VPBlockBases IfTrue and IfFalse to be the two successors of this VPBlockBase.
Definition VPlan.h:287
void clearPredecessors()
Remove all the predecessor of this block.
Definition VPlan.h:312
void setParent(VPRegionBlock *P)
Definition VPlan.h:203
const VPBlocksTy & getSuccessors() const
Definition VPlan.h:217
static auto blocksAs(T &&Range)
Return an iterator range over Range with each block cast to BlockTy.
Definition VPlanUtils.h:456
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:338
static void insertOnEdge(VPBlockBase *From, VPBlockBase *To, VPBlockBase *BlockPtr)
Inserts BlockPtr on the edge between From and To.
Definition VPlanUtils.h:475
static void replaceSuccessor(VPBlockBase *From, VPBlockBase *OldSucc, VPBlockBase *NewSucc)
Redirect the edge from From to OldSucc to NewSucc, keeping From's successor order.
Definition VPlanUtils.h:410
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:365
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:383
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:401
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:419
static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected block NewBlock before Blockptr.
Definition VPlanUtils.h:350
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:449
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:433
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:657
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
Recipe to expand a SCEV expression.
Definition VPlan.h:4116
Class to record and manage LLVM IR flags.
Definition VPlan.h:683
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1322
@ Intrinsic
Calls a scalar intrinsic. The intrinsic ID is the last operand.
Definition VPlan.h:1449
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:402
A recipe for handling reduction phis.
Definition VPlan.h:2879
VPValue * expand(VPExpandSCEVRecipe &R)
Expand the expression of R, or return R if it must be expanded in IR.
Definition VPlanUtils.h:320
VPSCEVExpander(VPBuilder &Builder, ScalarEvolution &SE, DebugLoc DL, const Loop *HoistOutOf=nullptr)
Definition VPlanUtils.h:311
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:4353
VPSingleDefRecipe is a base class for recipes that model a sequence of one or more output IR that def...
Definition VPlan.h:605
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:396
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:123
user_range users()
Definition VPlanValue.h:157
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4940
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 the full mass.
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...
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...
std::optional< int64_t > getConstantStride(VPValue *Addr, Type *AccessTy, PredicatedScalarEvolution &PSE, const Loop *L)
If the pointer operand Addr of a memory access is an affine AddRec w.r.t.
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 by all users.
Intrinsic::ID getIntrinsicID(const Ty *R)
Return the intrinsic ID underlying a call.
Definition VPlanUtils.h:98
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 by all users.
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.
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...
Type * getLoadStoreValueType(VPSingleDefRecipe *R)
Get the value type of a VPInstruction or VPReplicateRecipe load or store.
Definition VPlanUtils.h:248
VPScalarIVStepsRecipe * createScalarIVSteps(VPlan &Plan, InductionDescriptor::InductionKind Kind, Instruction::BinaryOps InductionOpcode, FPMathOperator *FPBinOp, Type *ResultTy, VPValue *StartV, VPValue *Step, DebugLoc DL, VPBuilder &Builder, const VPIRFlags::WrapFlagsTy &Flags={})
Create a scalar-iv-steps recipe over Plan's canonical IV for an induction of Kind with InductionOpcod...
bool propagatesFirstLaneUse(const VPUser *U, const VPValue *Op)
Returns true if checking whether U uses the first lane of Op requires recursively checking Op's users...
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.
VPIRFlags getFlagsForInduction(const InductionDescriptor &ID, const VPPhi *PhiR)
Extracts and returns NoWrap flags from PhiR and fast-math flags from ID.
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:150
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.
LLVM_ABI_FOR_TEST bool isUniformAcrossVFsAndUFs(const VPValue *V)
Checks if V is uniform across all VF lanes and UF parts.
VPValue * getOrCreateVPValueForSCEVExpr(VPlan &Plan, const SCEV *Expr, bool ExpandInIR=false)
Get or create a VPValue that corresponds to the expansion of Expr.
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...
LLVM_ABI_FOR_TEST 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:265
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.
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
VPBuilderBase<> VPBuilder
Definition VPlan.h:66
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:366
auto make_isa_range(RangeT &&Range)
Return a range over Range containing only elements for which isa<T> holds, casting each of them to T.
Definition STLExtras.h:567
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...
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