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/// If the pointer operand \p Addr of a memory access is an affine AddRec
52/// w.r.t. \p L with a constant stride, return the stride in units of
53/// \p AccessTy. Otherwise return std::nullopt.
54std::optional<int64_t> getConstantStride(VPValue *Addr, Type *AccessTy,
56 const Loop *L);
57
58/// Returns true if \p Addr is an address SCEV that can be passed to
59/// TTI::getAddressComputationCost, i.e. the address SCEV is loop invariant, an
60/// affine AddRec (i.e. induction ), or an add expression of such operands or a
61/// sign-extended AddRec.
62bool isAddressSCEVForCost(const SCEV *Addr, ScalarEvolution &SE, const Loop *L);
63
64/// Returns true if \p VPV is a single scalar, either because it produces the
65/// same value for all lanes or only has its first lane used.
66bool isSingleScalar(const VPValue *VPV);
67
68/// Checks if \p V is uniform across all VF lanes and UF parts. It is considered
69/// as such if it is either loop invariant (defined outside the vector region)
70/// or its operands are known to be uniform across all VFs and UFs (e.g.
71/// VPDerivedIV or the canonical IV).
73
74/// Return true if \p V is elementwise, i.e. none of the lanes are permuted.
75bool isElementwise(const VPValue *V);
76
77/// Returns true if \p R produces scalar values for all VF lanes.
79
80/// Returns the header block of the first, top-level loop, or null if none
81/// exist.
83
84/// Get the VF scaling factor applied to the recipe's output, if the recipe has
85/// one.
87
88/// Return true if we do not know how to (mechanically) hoist or sink \p R.
89/// When sinking, passing \p Sinking = true ensures that assumes aren't sunk.
90/// Returns true for recipes that access memory.
91bool cannotHoistOrSinkRecipe(const VPRecipeBase &R, bool Sinking = false);
92
93/// Return the intrinsic ID underlying a call.
94template <typename Ty> Intrinsic::ID getIntrinsicID(const Ty *R) {
95 if (const auto *Intr = dyn_cast<VPWidenIntrinsicRecipe>(R))
96 return Intr->getVectorIntrinsicID();
97 if (const auto *Call = dyn_cast<VPWidenCallRecipe>(R))
98 return Call->getCalledScalarFunction()->getIntrinsicID();
99
100 auto GetCalleeIntrinsic = [&](VPValue *CalleeOp) -> Intrinsic::ID {
101 if (!isa<VPIRValue>(CalleeOp))
103 auto *F = cast<Function>(CalleeOp->getLiveInIRValue());
104 return F->getIntrinsicID();
105 };
106 if (const auto *Rep = dyn_cast<VPReplicateRecipe>(R))
107 if (Rep->getOpcode() == Instruction::Call)
108 // The callee is the last operand, excluding the mask if predicated.
109 return GetCalleeIntrinsic(
110 Rep->getOperand(Rep->getNumOperandsWithoutMask() - 1));
111 if (const auto *VPI = dyn_cast<VPInstruction>(R)) {
112 if (VPI->getOpcode() == Instruction::Call)
113 // The callee is the last operand, excluding the mask if masked.
114 return GetCalleeIntrinsic(
115 VPI->getOperand(VPI->getNumOperandsWithoutMask() - 1));
116 if (VPI->getOpcode() == VPInstruction::Intrinsic) {
117 return cast<VPConstantInt>(VPI->getOperand(VPI->getNumOperands() - 1))
118 ->getZExtValue();
119 }
120 }
122}
123
124/// Return the instruction opcode for the recipe defining \p V or 0 for
125/// unsupported recipes and VPValues not defined by a recipe.
126unsigned getOpcode(const VPValue *V);
127
128/// Get the instruction opcode or intrinsic ID for the recipe defining \p V.
129/// Returns an optional pair, where the first element indicates whether it is an
130/// intrinsic ID.
131std::optional<std::pair<bool, unsigned>>
133
134/// Return a MemoryLocation for \p R with noalias metadata populated from
135/// \p R, if the recipe is supported and std::nullopt otherwise. The pointer of
136/// the location is conservatively set to nullptr.
137std::optional<MemoryLocation> getMemoryLocation(const VPRecipeBase &R);
138
139/// Extracts and returns NoWrap and FastMath flags from the induction binop in
140/// \p ID.
142 if (ID.getKind() == InductionDescriptor::IK_FpInduction)
143 return ID.getInductionBinOp()->getFastMathFlags();
144
146 ID.getInductionBinOp()))
147 return VPIRFlags::WrapFlagsTy(OBO->hasNoUnsignedWrap(),
148 OBO->hasNoSignedWrap());
149
151 "Expected int induction");
152 return VPIRFlags::WrapFlagsTy(false, false);
153}
154
155/// Search \p Start's users for a recipe satisfying \p Pred, looking through
156/// recipes with definitions.
157template <typename PredT>
158inline VPRecipeBase *findRecipe(VPValue *Start, PredT Pred) {
159 SetVector<VPValue *> Worklist;
160 Worklist.insert(Start);
161 for (unsigned I = 0; I != Worklist.size(); ++I) {
162 VPValue *Cur = Worklist[I];
163 auto *R = Cur->getDefiningRecipe();
164 if (!R)
165 continue;
166 if (Pred(R))
167 return R;
168 for (VPUser *U : Cur->users()) {
169 for (VPValue *V : cast<VPRecipeBase>(U)->definedValues())
170 Worklist.insert(V);
171 }
172 }
173 return nullptr;
174}
175
176/// Find the canonical IV increment of \p Plan's vector loop region. Returns
177/// nullptr if not found.
179
180/// Returns the GEP nowrap flags for \p Ptr, looking through pointer casts
181/// mirroring Value::stripPointerCasts.
183
184/// Returns true if \p V is used as part of the address of another load or
185/// store.
186bool isUsedByLoadStoreAddress(const VPValue *V);
187
188/// Find the ComputeReductionResult recipe for \p PhiR, looking through selects
189/// inserted for predicated reductions or tail folding.
191
192/// Finds the incoming alias-mask within the vector preheader.
194
195/// Returns the (early exiting block, exit block) pairs of \p Plan, i.e. all
196/// edges to an exit block that do not come from \p MiddleVPBB.
198getEarlyExits(const VPlan &Plan, const VPBlockBase *MiddleVPBB);
199
200/// Create a scalar-iv-steps recipe over \p Plan's canonical IV for an
201/// induction of \p Kind with \p InductionOpcode / \p FPBinOp, start value \p
202/// StartV and step \p Step, truncated to \p TruncI's type if \p TruncI is
203/// non-null, inserting recipes via \p Builder.
206 Instruction::BinaryOps InductionOpcode, FPMathOperator *FPBinOp,
207 Instruction *TruncI, VPValue *StartV, VPValue *Step, DebugLoc DL,
208 VPBuilder &Builder, const VPIRFlags::WrapFlagsTy &Flags = {});
209
210/// Scalarize a VPWidenPointerInductionRecipe by replacing it with a PtrAdd
211/// (IndStart, ScalarIVSteps (0, Step)). This is used when the recipe only
212/// generates scalar values.
213VPValue *scalarizeVPWidenPointerInduction(VPWidenPointerInductionRecipe *PtrIV,
214 VPlan &Plan, VPBuilder &Builder);
215
216/// Returns true if \p R is dead, i.e. none of its defined values are used and
217/// it has no side effects (with the exception of conditional assumes, which are
218/// considered dead as their conditions may be flattened).
219bool isDeadRecipe(VPRecipeBase &R);
220
221/// Recursively delete \p V and any of its operands that become dead.
222void recursivelyDeleteDeadRecipes(VPValue *V);
223
224/// Collect all users of \p V, looking through recipes that define other values.
226
227/// Try to fold \p R using InstSimplifyFolder. Will succeed and return a
228/// non-nullptr VPValue for a handled opcode or intrinsic ID if corresponding \p
229/// Operands are foldable live-ins.
230VPIRValue *tryToFoldLiveIns(VPSingleDefRecipe &R, ArrayRef<VPValue *> Operands,
231 const DataLayout &DL);
232
233/// Insert phis to reconstruct SSA for a single value starting from \p VPBB. \p
234/// Defs is a map of definitions at specific blocks. Returns the
235/// reconstructed value at VPBB. Use if the CFG has been modified such that a
236/// def no longer dominates all its uses. Every block leading to VPBB must be
237/// reachable from the entry and the plan must be plain-CFG (not contain any
238/// regions).
239LLVM_ABI_FOR_TEST VPValue *
240reconstructSSA(VPBasicBlock *VPBB, DenseMap<VPBasicBlock *, VPValue *> &Defs);
241
242/// Denominator of the frequencies computed by computeExecutionFrequencies, i.e.
243/// the frequency of a block that always executes. Wider than
244/// BranchProbability's 31-bit one, which truncates rarely executed blocks to 0.
245inline constexpr uint64_t AlwaysExecutesFreq = 1ULL << 63;
246
247/// Returns \p Freq as a BranchProbability, relative to AlwaysExecutesFreq.
249
250/// Computes for each block in \p Blocks, which must be in reverse post-order,
251/// the frequency with which it executes relative to the first (header) block,
252/// and whether that frequency was composed using any estimated branch weights.
253/// The frequency of a block is the sum over its incoming edges, or std::nullopt
254/// if any edge on a path reaching it lacks branch weights. Edges to blocks
255/// outside \p Blocks are ignored.
258
259namespace detail {
260
261/// Template-independent implementation for pullOutPermutations.
263 VPlan &Plan, function_ref<VPValue *(VPValue *Op)> Perm,
265} // namespace detail
266
267/// Removes the permutation pattern \p Perm from any elementwise operations
268/// in the plan, by constructing a new permutation via \p Build.
269/// e.g. binop(perm(x), perm(y)) -> perm(binop(x,y)).
270template <typename Match_t, typename Builder>
271void pullOutPermutations(VPlan &Plan, Match_t Perm, Builder Build) {
272 // Convert matcher to function returing the matched VPValue.
273 auto MatchPerm = [&Perm](VPValue *Op) -> VPValue * {
274 VPValue *X;
275 return match(Op, Perm(X)) ? X : nullptr;
276 };
277 detail::pullOutPermutationsImpl(Plan, MatchPerm, Build);
278}
279
280} // namespace vputils
281
282/// Lightweight SCEV-to-VPlan expander. Converts SCEV expressions into
283/// VPInstructions and live-ins. SCEVAddRecExprs are wrapped in a
284/// VPExpandSCEVRecipe to be expanded to IR later.
286 VPBuilder &Builder;
287 ScalarEvolution &SE;
288 DebugLoc DL;
289
290 /// When true, nested SCEVUDivExprs are expanded so that they cannot divide by
291 /// zero, matching SCEVExpander's SafeUDivMode.
292 bool SafeUDivMode = false;
293
294 /// Try to find a loop-invariant IR value in the plan's entry block whose
295 /// SCEV matches \p S. Returns the corresponding live-in VPValue, or nullptr
296 /// if none is found.
297 VPValue *tryToReuseIRValue(const SCEV *S);
298
299public:
301 : Builder(Builder), SE(SE), DL(DL) {}
302
303 /// Expand \p S into recipes and live-ins using the builder.
304 VPValue *expand(const SCEV *S);
305};
306//===----------------------------------------------------------------------===//
307// Utilities for modifying predecessors and successors of VPlan blocks.
308//===----------------------------------------------------------------------===//
309
310/// Class that provides utilities for VPBlockBases in VPlan.
312public:
313 VPBlockUtils() = delete;
314
315 /// Insert disconnected VPBlockBase \p NewBlock after \p BlockPtr. Add \p
316 /// NewBlock as successor of \p BlockPtr and \p BlockPtr as predecessor of \p
317 /// NewBlock, and propagate \p BlockPtr parent to \p NewBlock. \p BlockPtr's
318 /// successors are moved from \p BlockPtr to \p NewBlock. \p NewBlock must
319 /// have neither successors nor predecessors.
320 static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
321 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
322 "Can't insert new block with predecessors or successors.");
323 NewBlock->setParent(BlockPtr->getParent());
324 transferSuccessors(BlockPtr, NewBlock);
325 connectBlocks(BlockPtr, NewBlock);
326 }
327
328 /// Insert disconnected block \p NewBlock before \p Blockptr. First
329 /// disconnects all predecessors of \p BlockPtr and connects them to \p
330 /// NewBlock. Add \p NewBlock as predecessor of \p BlockPtr and \p BlockPtr as
331 /// successor of \p NewBlock.
332 static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
333 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
334 "Can't insert new block with predecessors or successors.");
335 NewBlock->setParent(BlockPtr->getParent());
336 for (VPBlockBase *Pred : to_vector(BlockPtr->predecessors()))
337 replaceSuccessor(Pred, BlockPtr, NewBlock);
338 connectBlocks(NewBlock, BlockPtr);
339 }
340
341 /// Insert disconnected VPBlockBases \p IfTrue and \p IfFalse after \p
342 /// BlockPtr. Add \p IfTrue and \p IfFalse as succesors of \p BlockPtr and \p
343 /// BlockPtr as predecessor of \p IfTrue and \p IfFalse. Propagate \p BlockPtr
344 /// parent to \p IfTrue and \p IfFalse. \p BlockPtr must have no successors
345 /// and \p IfTrue and \p IfFalse must have neither successors nor
346 /// predecessors.
347 static void insertTwoBlocksAfter(VPBlockBase *IfTrue, VPBlockBase *IfFalse,
348 VPBlockBase *BlockPtr) {
349 assert(!IfTrue->hasSuccessors() && "Can't insert IfTrue with successors.");
350 assert(!IfFalse->hasSuccessors() &&
351 "Can't insert IfFalse with successors.");
352 BlockPtr->setTwoSuccessors(IfTrue, IfFalse);
353 IfTrue->setPredecessors({BlockPtr});
354 IfFalse->setPredecessors({BlockPtr});
355 IfTrue->setParent(BlockPtr->getParent());
356 IfFalse->setParent(BlockPtr->getParent());
357 }
358
359 /// Connect VPBlockBases \p From and \p To bi-directionally. If \p PredIdx is
360 /// -1, append \p From to the predecessors of \p To, otherwise set \p To's
361 /// predecessor at \p PredIdx to \p From. If \p SuccIdx is -1, append \p To to
362 /// the successors of \p From, otherwise set \p From's successor at \p SuccIdx
363 /// to \p To. Both VPBlockBases must have the same parent, which can be null.
364 /// Both VPBlockBases can be already connected to other VPBlockBases.
365 static void connectBlocks(VPBlockBase *From, VPBlockBase *To,
366 unsigned PredIdx = -1u, unsigned SuccIdx = -1u) {
367 assert((From->getParent() == To->getParent()) &&
368 "Can't connect two block with different parents");
369
370 if (SuccIdx == -1u)
371 From->appendSuccessor(To);
372 else
373 From->getSuccessors()[SuccIdx] = To;
374
375 if (PredIdx == -1u)
376 To->appendPredecessor(From);
377 else
378 To->getPredecessors()[PredIdx] = From;
379 }
380
381 /// Disconnect VPBlockBases \p From and \p To bi-directionally. Remove \p To
382 /// from the successors of \p From and \p From from the predecessors of \p To.
383 static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To) {
384 assert(To && "Successor to disconnect is null.");
385 From->removeSuccessor(To);
386 To->removePredecessor(From);
387 }
388
389 /// Redirect the edge from \p From to \p OldSucc to \p NewSucc, keeping \p
390 /// From's successor order. \p From is removed from \p OldSucc's predecessors
391 /// and appended to \p NewSucc's.
392 static void replaceSuccessor(VPBlockBase *From, VPBlockBase *OldSucc,
393 VPBlockBase *NewSucc) {
394 From->replaceSuccessor(OldSucc, NewSucc);
395 OldSucc->removePredecessor(From);
396 NewSucc->appendPredecessor(From);
397 }
398
399 /// Reassociate all the blocks connected to \p Old so that they now point to
400 /// \p New.
401 static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New) {
402 auto Preds = to_vector(Old->getPredecessors());
403 auto Succs = to_vector(Old->getSuccessors());
404 for (auto *Pred : Preds)
405 Pred->replaceSuccessor(Old, New);
406 for (auto *Succ : Succs)
407 Succ->replacePredecessor(Old, New);
408 New->setPredecessors(Old->getPredecessors());
409 New->setSuccessors(Old->getSuccessors());
410 Old->clearPredecessors();
411 Old->clearSuccessors();
412 }
413
414 /// Transfer successors from \p Old to \p New. \p New must have no successors.
416 for (auto *Succ : Old->getSuccessors())
417 Succ->replacePredecessor(Old, New);
418 New->setSuccessors(Old->getSuccessors());
419 Old->clearSuccessors();
420 }
421
422 /// Clone the CFG for all nodes reachable from \p Entry, including cloning
423 /// the blocks and their recipes. Operands of cloned recipes will NOT be
424 /// updated. Remapping of operands must be done separately. Returns a pair
425 /// with the new entry and exiting blocks of the cloned region. If \p Entry
426 /// isn't part of a region, return nullptr for the exiting block.
427 static std::pair<VPBlockBase *, VPBlockBase *> cloneFrom(VPBlockBase *Entry);
428
429 /// Return an iterator range over \p Range which only includes \p BlockTy
430 /// blocks. The accesses are casted to \p BlockTy.
431 template <typename BlockTy, typename T> static auto blocksOnly(T &&Range) {
432 return make_isa_range<BlockTy>(std::forward<T>(Range));
433 }
434
435 /// Return an iterator range over \p Range with each block cast to \p
436 /// BlockTy. Unlike blocksOnly, all blocks in \p Range must be of type
437 /// \p BlockTy.
438 template <typename BlockTy, typename T> static auto blocksAs(T &&Range) {
439 // Create BaseTy with correct const-ness based on BlockTy.
440 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
441 const VPBlockBase, VPBlockBase>;
442 return map_range(
443 Range, [](BaseTy *Block) -> BlockTy * { return cast<BlockTy>(Block); });
444 }
445
446 /// Returns the blocks between \p FirstBB and \p LastBB, where FirstBB
447 /// to LastBB forms a single-sucessor chain.
450 VPBasicBlock *LastBB);
451
452 /// Inserts \p BlockPtr on the edge between \p From and \p To. That is, update
453 /// \p From's successor to \p To to point to \p BlockPtr and \p To's
454 /// predecessor from \p From to \p BlockPtr. \p From and \p To are added to \p
455 /// BlockPtr's predecessors and successors respectively. There must be a
456 /// single edge between \p From and \p To.
457 static void insertOnEdge(VPBlockBase *From, VPBlockBase *To,
458 VPBlockBase *BlockPtr) {
459 unsigned SuccIdx = From->getIndexForSuccessor(To);
460 unsigned PredIx = To->getIndexForPredecessor(From);
461 VPBlockUtils::connectBlocks(From, BlockPtr, -1, SuccIdx);
462 VPBlockUtils::connectBlocks(BlockPtr, To, PredIx, -1);
463 }
464
465 /// Returns true if \p VPB is a loop header, based on regions or \p VPDT in
466 /// their absence.
467 static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
468
469 /// Returns true if \p VPB is a loop latch, using isHeader().
470 static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
471
472 /// Returns the header and latch of the outermost loop of \p Plan in plain
473 /// CFG form (before regions are formed).
474 static std::pair<VPBasicBlock *, VPBasicBlock *>
475 getPlainCFGHeaderAndLatch(const VPlan &Plan);
476
477 /// Returns the middle block of \p Plan in plain CFG form (before regions
478 /// are formed).
479 static VPBasicBlock *getPlainCFGMiddleBlock(const VPlan &Plan);
480};
481
482} // namespace llvm
483
484#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.
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:4417
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:350
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
Definition VPlan.h:306
unsigned getIndexForPredecessor(const VPBlockBase *Pred) const
Returns the index for Pred in the blocks predecessors list.
Definition VPlan.h:343
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:325
void setTwoSuccessors(VPBlockBase *IfTrue, VPBlockBase *IfFalse)
Set two given VPBlockBases IfTrue and IfFalse to be the two successors of this VPBlockBase.
Definition VPlan.h:297
void clearPredecessors()
Remove all the predecessor of this block.
Definition VPlan.h:322
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:438
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:320
static void insertOnEdge(VPBlockBase *From, VPBlockBase *To, VPBlockBase *BlockPtr)
Inserts BlockPtr on the edge between From and To.
Definition VPlanUtils.h:457
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:392
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:347
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:365
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:383
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:401
static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected block NewBlock before Blockptr.
Definition VPlanUtils.h:332
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:431
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:415
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:659
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:704
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1305
@ Intrinsic
Calls a scalar intrinsic. The intrinsic ID is the last operand.
Definition VPlan.h:1426
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:411
A recipe for handling reduction phis.
Definition VPlan.h:2863
VPSCEVExpander(VPBuilder &Builder, ScalarEvolution &SE, DebugLoc DL)
Definition VPlanUtils.h:300
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:4259
VPSingleDefRecipe is a base class for recipes that model a sequence of one or more output IR that def...
Definition VPlan.h:619
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:4829
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...
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.
Intrinsic::ID getIntrinsicID(const Ty *R)
Return the intrinsic ID underlying a call.
Definition VPlanUtils.h:94
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:245
VPIRFlags getFlagsFromIndDesc(const InductionDescriptor &ID)
Extracts and returns NoWrap and FastMath flags from the induction binop in ID.
Definition VPlanUtils.h:141
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:158
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:271
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: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