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/// Denominator of the frequencies computed by computeExecutionFrequencies, i.e.
227/// the frequency of a block that always executes. Wider than
228/// BranchProbability's 31-bit one, which truncates rarely executed blocks to 0.
229inline constexpr uint64_t AlwaysExecutesFreq = 1ULL << 63;
230
231/// Returns \p Freq as a BranchProbability, relative to AlwaysExecutesFreq.
233
234/// Computes for each block in \p Blocks, which must be in reverse post-order,
235/// the frequency with which it executes relative to the first (header) block.
236/// The frequency of a block is the sum over its incoming edges, or std::nullopt
237/// if any edge on a path reaching it lacks branch weights.
240
241namespace detail {
242
243/// Template-independent implementation for pullOutPermutations.
245 VPlan &Plan, function_ref<VPValue *(VPValue *Op)> Perm,
247} // namespace detail
248
249/// Removes the permutation pattern \p Perm from any elementwise operations
250/// in the plan, by constructing a new permutation via \p Build.
251/// e.g. binop(perm(x), perm(y)) -> perm(binop(x,y)).
252template <typename Match_t, typename Builder>
253void pullOutPermutations(VPlan &Plan, Match_t Perm, Builder Build) {
254 // Convert matcher to function returing the matched VPValue.
255 auto MatchPerm = [&Perm](VPValue *Op) -> VPValue * {
256 VPValue *X;
257 return match(Op, Perm(X)) ? X : nullptr;
258 };
259 detail::pullOutPermutationsImpl(Plan, MatchPerm, Build);
260}
261
262} // namespace vputils
263
264/// Lightweight SCEV-to-VPlan expander. Converts SCEV expressions into
265/// VPInstructions and live-ins. SCEVAddRecExprs are wrapped in a
266/// VPExpandSCEVRecipe to be expanded to IR later.
268 VPBuilder &Builder;
269 ScalarEvolution &SE;
270 DebugLoc DL;
271
272 /// When true, nested SCEVUDivExprs are expanded so that they cannot divide by
273 /// zero, matching SCEVExpander's SafeUDivMode.
274 bool SafeUDivMode = false;
275
276 /// Try to find a loop-invariant IR value in the plan's entry block whose
277 /// SCEV matches \p S. Returns the corresponding live-in VPValue, or nullptr
278 /// if none is found.
279 VPValue *tryToReuseIRValue(const SCEV *S);
280
281public:
283 : Builder(Builder), SE(SE), DL(DL) {}
284
285 /// Expand \p S into recipes and live-ins using the builder.
286 VPValue *expand(const SCEV *S);
287};
288//===----------------------------------------------------------------------===//
289// Utilities for modifying predecessors and successors of VPlan blocks.
290//===----------------------------------------------------------------------===//
291
292/// Class that provides utilities for VPBlockBases in VPlan.
294public:
295 VPBlockUtils() = delete;
296
297 /// Insert disconnected VPBlockBase \p NewBlock after \p BlockPtr. Add \p
298 /// NewBlock as successor of \p BlockPtr and \p BlockPtr as predecessor of \p
299 /// NewBlock, and propagate \p BlockPtr parent to \p NewBlock. \p BlockPtr's
300 /// successors are moved from \p BlockPtr to \p NewBlock. \p NewBlock must
301 /// have neither successors nor predecessors.
302 static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
303 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
304 "Can't insert new block with predecessors or successors.");
305 NewBlock->setParent(BlockPtr->getParent());
306 transferSuccessors(BlockPtr, NewBlock);
307 connectBlocks(BlockPtr, NewBlock);
308 }
309
310 /// Insert disconnected block \p NewBlock before \p Blockptr. First
311 /// disconnects all predecessors of \p BlockPtr and connects them to \p
312 /// NewBlock. Add \p NewBlock as predecessor of \p BlockPtr and \p BlockPtr as
313 /// successor of \p NewBlock.
314 static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
315 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
316 "Can't insert new block with predecessors or successors.");
317 NewBlock->setParent(BlockPtr->getParent());
318 for (VPBlockBase *Pred : to_vector(BlockPtr->predecessors())) {
319 Pred->replaceSuccessor(BlockPtr, NewBlock);
320 NewBlock->appendPredecessor(Pred);
321 }
322 BlockPtr->clearPredecessors();
323 connectBlocks(NewBlock, BlockPtr);
324 }
325
326 /// Insert disconnected VPBlockBases \p IfTrue and \p IfFalse after \p
327 /// BlockPtr. Add \p IfTrue and \p IfFalse as succesors of \p BlockPtr and \p
328 /// BlockPtr as predecessor of \p IfTrue and \p IfFalse. Propagate \p BlockPtr
329 /// parent to \p IfTrue and \p IfFalse. \p BlockPtr must have no successors
330 /// and \p IfTrue and \p IfFalse must have neither successors nor
331 /// predecessors.
332 static void insertTwoBlocksAfter(VPBlockBase *IfTrue, VPBlockBase *IfFalse,
333 VPBlockBase *BlockPtr) {
334 assert(!IfTrue->hasSuccessors() && "Can't insert IfTrue with successors.");
335 assert(!IfFalse->hasSuccessors() &&
336 "Can't insert IfFalse with successors.");
337 BlockPtr->setTwoSuccessors(IfTrue, IfFalse);
338 IfTrue->setPredecessors({BlockPtr});
339 IfFalse->setPredecessors({BlockPtr});
340 IfTrue->setParent(BlockPtr->getParent());
341 IfFalse->setParent(BlockPtr->getParent());
342 }
343
344 /// Connect VPBlockBases \p From and \p To bi-directionally. If \p PredIdx is
345 /// -1, append \p From to the predecessors of \p To, otherwise set \p To's
346 /// predecessor at \p PredIdx to \p From. If \p SuccIdx is -1, append \p To to
347 /// the successors of \p From, otherwise set \p From's successor at \p SuccIdx
348 /// to \p To. Both VPBlockBases must have the same parent, which can be null.
349 /// Both VPBlockBases can be already connected to other VPBlockBases.
350 static void connectBlocks(VPBlockBase *From, VPBlockBase *To,
351 unsigned PredIdx = -1u, unsigned SuccIdx = -1u) {
352 assert((From->getParent() == To->getParent()) &&
353 "Can't connect two block with different parents");
354
355 if (SuccIdx == -1u)
356 From->appendSuccessor(To);
357 else
358 From->getSuccessors()[SuccIdx] = To;
359
360 if (PredIdx == -1u)
361 To->appendPredecessor(From);
362 else
363 To->getPredecessors()[PredIdx] = From;
364 }
365
366 /// Disconnect VPBlockBases \p From and \p To bi-directionally. Remove \p To
367 /// from the successors of \p From and \p From from the predecessors of \p To.
368 static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To) {
369 assert(To && "Successor to disconnect is null.");
370 From->removeSuccessor(To);
371 To->removePredecessor(From);
372 }
373
374 /// Reassociate all the blocks connected to \p Old so that they now point to
375 /// \p New.
376 static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New) {
377 for (auto *Pred : to_vector(Old->getPredecessors()))
378 Pred->replaceSuccessor(Old, New);
379 for (auto *Succ : to_vector(Old->getSuccessors()))
380 Succ->replacePredecessor(Old, New);
381 New->setPredecessors(Old->getPredecessors());
382 New->setSuccessors(Old->getSuccessors());
383 Old->clearPredecessors();
384 Old->clearSuccessors();
385 }
386
387 /// Transfer successors from \p Old to \p New. \p New must have no successors.
389 for (auto *Succ : Old->getSuccessors())
390 Succ->replacePredecessor(Old, New);
391 New->setSuccessors(Old->getSuccessors());
392 Old->clearSuccessors();
393 }
394
395 /// Clone the CFG for all nodes reachable from \p Entry, including cloning
396 /// the blocks and their recipes. Operands of cloned recipes will NOT be
397 /// updated. Remapping of operands must be done separately. Returns a pair
398 /// with the new entry and exiting blocks of the cloned region. If \p Entry
399 /// isn't part of a region, return nullptr for the exiting block.
400 static std::pair<VPBlockBase *, VPBlockBase *> cloneFrom(VPBlockBase *Entry);
401
402 /// Return an iterator range over \p Range which only includes \p BlockTy
403 /// blocks. The accesses are casted to \p BlockTy.
404 template <typename BlockTy, typename T> static auto blocksOnly(T &&Range) {
405 // Create BaseTy with correct const-ness based on BlockTy.
406 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
407 const VPBlockBase, VPBlockBase>;
408
409 // We need the pointee range over (const) BlocktTy & instead of (const)
410 // BlockTy * for filter_range to work properly.
411 auto Filter =
413 [](BaseTy &Block) { return isa<BlockTy>(&Block); });
414 return map_range(Filter, [](BaseTy &Block) -> BlockTy * {
415 return cast<BlockTy>(&Block);
416 });
417 }
418
419 /// Return an iterator range over \p Range with each block cast to \p
420 /// BlockTy. Unlike blocksOnly, all blocks in \p Range must be of type
421 /// \p BlockTy.
422 template <typename BlockTy, typename T> static auto blocksAs(T &&Range) {
423 // Create BaseTy with correct const-ness based on BlockTy.
424 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
425 const VPBlockBase, VPBlockBase>;
426 return map_range(
427 Range, [](BaseTy *Block) -> BlockTy * { return cast<BlockTy>(Block); });
428 }
429
430 /// Returns the blocks between \p FirstBB and \p LastBB, where FirstBB
431 /// to LastBB forms a single-sucessor chain.
434 VPBasicBlock *LastBB);
435
436 /// Inserts \p BlockPtr on the edge between \p From and \p To. That is, update
437 /// \p From's successor to \p To to point to \p BlockPtr and \p To's
438 /// predecessor from \p From to \p BlockPtr. \p From and \p To are added to \p
439 /// BlockPtr's predecessors and successors respectively. There must be a
440 /// single edge between \p From and \p To.
441 static void insertOnEdge(VPBlockBase *From, VPBlockBase *To,
442 VPBlockBase *BlockPtr) {
443 unsigned SuccIdx = From->getIndexForSuccessor(To);
444 unsigned PredIx = To->getIndexForPredecessor(From);
445 VPBlockUtils::connectBlocks(From, BlockPtr, -1, SuccIdx);
446 VPBlockUtils::connectBlocks(BlockPtr, To, PredIx, -1);
447 }
448
449 /// Returns true if \p VPB is a loop header, based on regions or \p VPDT in
450 /// their absence.
451 static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
452
453 /// Returns true if \p VPB is a loop latch, using isHeader().
454 static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
455
456 /// Returns the header and latch of the outermost loop of \p Plan in plain
457 /// CFG form (before regions are formed).
458 static std::pair<VPBasicBlock *, VPBasicBlock *>
459 getPlainCFGHeaderAndLatch(const VPlan &Plan);
460
461 /// Returns the middle block of \p Plan in plain CFG form (before regions
462 /// are formed).
463 static VPBasicBlock *getPlainCFGMiddleBlock(const VPlan &Plan);
464};
465
466} // namespace llvm
467
468#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
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:4453
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:422
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:302
static void insertOnEdge(VPBlockBase *From, VPBlockBase *To, VPBlockBase *BlockPtr)
Inserts BlockPtr on the edge between From and To.
Definition VPlanUtils.h:441
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:332
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:350
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:368
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:376
static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected block NewBlock before Blockptr.
Definition VPlanUtils.h:314
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:404
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:388
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:712
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:1266
@ Intrinsic
Calls a scalar intrinsic. The intrinsic ID is the last operand.
Definition VPlan.h:1396
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:2899
VPSCEVExpander(VPBuilder &Builder, ScalarEvolution &SE, DebugLoc DL)
Definition VPlanUtils.h:282
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:4295
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:130
user_range users()
Definition VPlanValue.h:157
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4865
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,...
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:229
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< BlockFrequency > > 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:253
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