LLVM 23.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"
14
15namespace llvm {
16class DominatorTree;
17class MemoryLocation;
18class ScalarEvolution;
19class SCEV;
21} // namespace llvm
22
23namespace llvm {
24
25namespace vputils {
26/// Returns true if only the first lane of \p Def is used.
27bool onlyFirstLaneUsed(const VPValue *Def);
28
29/// Returns true if only the first part of \p Def is used.
30bool onlyFirstPartUsed(const VPValue *Def);
31
32/// Returns true if only scalar values of \p Def are used by all users.
33bool onlyScalarValuesUsed(const VPValue *Def);
34
35/// Get or create a VPValue that corresponds to the expansion of \p Expr. If \p
36/// Expr is a SCEVConstant or SCEVUnknown, return a VPValue wrapping the live-in
37/// value. Otherwise return a VPExpandSCEVRecipe to expand \p Expr. If \p Plan's
38/// pre-header already contains a recipe expanding \p Expr, return it. If not,
39/// create a new one.
41
42/// Return the SCEV expression for \p V. Returns SCEVCouldNotCompute if no
43/// SCEV expression could be constructed.
44const SCEV *getSCEVExprForVPValue(const VPValue *V,
46 const Loop *L = nullptr);
47
48/// Returns true if \p Addr is an address SCEV that can be passed to
49/// TTI::getAddressComputationCost, i.e. the address SCEV is loop invariant, an
50/// affine AddRec (i.e. induction ), or an add expression of such operands or a
51/// sign-extended AddRec.
52bool isAddressSCEVForCost(const SCEV *Addr, ScalarEvolution &SE, const Loop *L);
53
54/// Returns true if \p VPV is a single scalar, either because it produces the
55/// same value for all lanes or only has its first lane used.
56bool isSingleScalar(const VPValue *VPV);
57
58/// Checks if \p V is uniform across all VF lanes and UF parts. It is considered
59/// as such if it is either loop invariant (defined outside the vector region)
60/// or its operands are known to be uniform across all VFs and UFs (e.g.
61/// VPDerivedIV or the canonical IV).
63
64/// Return true if \p V is elementwise, i.e. none of the lanes are permuted.
65bool isElementwise(const VPValue *V);
66
67/// Returns the header block of the first, top-level loop, or null if none
68/// exist.
70
71/// Get the VF scaling factor applied to the recipe's output, if the recipe has
72/// one.
74
75/// Return true if we do not know how to (mechanically) hoist or sink \p R.
76/// When sinking, passing \p Sinking = true ensures that assumes aren't sunk.
77/// Returns true for recipes that access memory.
78bool cannotHoistOrSinkRecipe(const VPRecipeBase &R, bool Sinking = false);
79
80/// Return the intrinsic ID underlying a call.
81template <typename Ty> Intrinsic::ID getIntrinsicID(const Ty *R) {
82 if (const auto *Intr = dyn_cast<VPWidenIntrinsicRecipe>(R))
83 return Intr->getVectorIntrinsicID();
84 if (const auto *Call = dyn_cast<VPWidenCallRecipe>(R))
85 return Call->getCalledScalarFunction()->getIntrinsicID();
86
87 auto GetCalleeIntrinsic = [&](VPValue *CalleeOp) -> Intrinsic::ID {
88 if (!isa<VPIRValue>(CalleeOp))
90 auto *F = cast<Function>(CalleeOp->getLiveInIRValue());
91 return F->getIntrinsicID();
92 };
93 if (const auto *Rep = dyn_cast<VPReplicateRecipe>(R))
94 if (Rep->getOpcode() == Instruction::Call)
95 // The callee is the last operand, excluding the mask if predicated.
96 return GetCalleeIntrinsic(
97 Rep->getOperand(Rep->getNumOperandsWithoutMask() - 1));
98 if (const auto *VPI = dyn_cast<VPInstruction>(R)) {
99 if (VPI->getOpcode() == Instruction::Call)
100 return GetCalleeIntrinsic(VPI->getOperand(VPI->getNumOperands() - 1));
101 if (VPI->getOpcode() == VPInstruction::Intrinsic) {
102 return cast<VPConstantInt>(VPI->getOperand(VPI->getNumOperands() - 1))
103 ->getZExtValue();
104 }
105 }
107}
108
109/// Return a MemoryLocation for \p R with noalias metadata populated from
110/// \p R, if the recipe is supported and std::nullopt otherwise. The pointer of
111/// the location is conservatively set to nullptr.
112std::optional<MemoryLocation> getMemoryLocation(const VPRecipeBase &R);
113
114/// Extracts and returns NoWrap and FastMath flags from the induction binop in
115/// \p ID.
118 return ID.getInductionBinOp()->getFastMathFlags();
119
121 ID.getInductionBinOp()))
122 return VPIRFlags::WrapFlagsTy(OBO->hasNoUnsignedWrap(),
123 OBO->hasNoSignedWrap());
124
126 "Expected int induction");
127 return VPIRFlags::WrapFlagsTy(false, false);
128}
129
130/// Search \p Start's users for a recipe satisfying \p Pred, looking through
131/// recipes with definitions.
132template <typename PredT>
133inline VPRecipeBase *findRecipe(VPValue *Start, PredT Pred) {
134 SetVector<VPValue *> Worklist;
135 Worklist.insert(Start);
136 for (unsigned I = 0; I != Worklist.size(); ++I) {
137 VPValue *Cur = Worklist[I];
138 auto *R = Cur->getDefiningRecipe();
139 if (!R)
140 continue;
141 if (Pred(R))
142 return R;
143 for (VPUser *U : Cur->users()) {
144 for (VPValue *V : cast<VPRecipeBase>(U)->definedValues())
145 Worklist.insert(V);
146 }
147 }
148 return nullptr;
149}
150
151/// Find the canonical IV increment of \p Plan's vector loop region. Returns
152/// nullptr if not found.
154
155/// Returns the GEP nowrap flags for \p Ptr, looking through pointer casts
156/// mirroring Value::stripPointerCasts.
158
159/// Returns true if \p V is used as part of the address of another load or
160/// store.
161bool isUsedByLoadStoreAddress(const VPValue *V);
162
163/// Find the ComputeReductionResult recipe for \p PhiR, looking through selects
164/// inserted for predicated reductions or tail folding.
166
167/// Finds the incoming alias-mask within the vector preheader.
169
170} // namespace vputils
171
172/// Lightweight SCEV-to-VPlan expander. Converts SCEV expressions into
173/// VPInstructions where possible, and returning nullptr for unsupported
174/// expressions (like adds, casts, min/max).
176 VPBuilder &Builder;
177 ScalarEvolution &SE;
178 DebugLoc DL;
179
180 /// Try to find a loop-invariant IR value in the plan's entry block whose
181 /// SCEV matches \p S. Returns the corresponding live-in VPValue, or nullptr
182 /// if none is found.
183 VPValue *tryToReuseIRValue(const SCEV *S);
184
185public:
187 : Builder(Builder), SE(SE), DL(DL) {}
188
189 /// Try to expand \p S into recipes and live-ins using the builder. Returns
190 /// nullptr if \p S cannot be expanded yet.
191 VPValue *tryToExpand(const SCEV *S);
192};
193//===----------------------------------------------------------------------===//
194// Utilities for modifying predecessors and successors of VPlan blocks.
195//===----------------------------------------------------------------------===//
196
197/// Class that provides utilities for VPBlockBases in VPlan.
199public:
200 VPBlockUtils() = delete;
201
202 /// Insert disconnected VPBlockBase \p NewBlock after \p BlockPtr. Add \p
203 /// NewBlock as successor of \p BlockPtr and \p BlockPtr as predecessor of \p
204 /// NewBlock, and propagate \p BlockPtr parent to \p NewBlock. \p BlockPtr's
205 /// successors are moved from \p BlockPtr to \p NewBlock. \p NewBlock must
206 /// have neither successors nor predecessors.
207 static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
208 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
209 "Can't insert new block with predecessors or successors.");
210 NewBlock->setParent(BlockPtr->getParent());
211 transferSuccessors(BlockPtr, NewBlock);
212 connectBlocks(BlockPtr, NewBlock);
213 }
214
215 /// Insert disconnected block \p NewBlock before \p Blockptr. First
216 /// disconnects all predecessors of \p BlockPtr and connects them to \p
217 /// NewBlock. Add \p NewBlock as predecessor of \p BlockPtr and \p BlockPtr as
218 /// successor of \p NewBlock.
219 static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
220 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
221 "Can't insert new block with predecessors or successors.");
222 NewBlock->setParent(BlockPtr->getParent());
223 for (VPBlockBase *Pred : to_vector(BlockPtr->predecessors())) {
224 Pred->replaceSuccessor(BlockPtr, NewBlock);
225 NewBlock->appendPredecessor(Pred);
226 }
227 BlockPtr->clearPredecessors();
228 connectBlocks(NewBlock, BlockPtr);
229 }
230
231 /// Insert disconnected VPBlockBases \p IfTrue and \p IfFalse after \p
232 /// BlockPtr. Add \p IfTrue and \p IfFalse as succesors of \p BlockPtr and \p
233 /// BlockPtr as predecessor of \p IfTrue and \p IfFalse. Propagate \p BlockPtr
234 /// parent to \p IfTrue and \p IfFalse. \p BlockPtr must have no successors
235 /// and \p IfTrue and \p IfFalse must have neither successors nor
236 /// predecessors.
237 static void insertTwoBlocksAfter(VPBlockBase *IfTrue, VPBlockBase *IfFalse,
238 VPBlockBase *BlockPtr) {
239 assert(!IfTrue->hasSuccessors() && "Can't insert IfTrue with successors.");
240 assert(!IfFalse->hasSuccessors() &&
241 "Can't insert IfFalse with successors.");
242 BlockPtr->setTwoSuccessors(IfTrue, IfFalse);
243 IfTrue->setPredecessors({BlockPtr});
244 IfFalse->setPredecessors({BlockPtr});
245 IfTrue->setParent(BlockPtr->getParent());
246 IfFalse->setParent(BlockPtr->getParent());
247 }
248
249 /// Connect VPBlockBases \p From and \p To bi-directionally. If \p PredIdx is
250 /// -1, append \p From to the predecessors of \p To, otherwise set \p To's
251 /// predecessor at \p PredIdx to \p From. If \p SuccIdx is -1, append \p To to
252 /// the successors of \p From, otherwise set \p From's successor at \p SuccIdx
253 /// to \p To. Both VPBlockBases must have the same parent, which can be null.
254 /// Both VPBlockBases can be already connected to other VPBlockBases.
255 static void connectBlocks(VPBlockBase *From, VPBlockBase *To,
256 unsigned PredIdx = -1u, unsigned SuccIdx = -1u) {
257 assert((From->getParent() == To->getParent()) &&
258 "Can't connect two block with different parents");
259
260 if (SuccIdx == -1u)
261 From->appendSuccessor(To);
262 else
263 From->getSuccessors()[SuccIdx] = To;
264
265 if (PredIdx == -1u)
266 To->appendPredecessor(From);
267 else
268 To->getPredecessors()[PredIdx] = From;
269 }
270
271 /// Disconnect VPBlockBases \p From and \p To bi-directionally. Remove \p To
272 /// from the successors of \p From and \p From from the predecessors of \p To.
273 static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To) {
274 assert(To && "Successor to disconnect is null.");
275 From->removeSuccessor(To);
276 To->removePredecessor(From);
277 }
278
279 /// Reassociate all the blocks connected to \p Old so that they now point to
280 /// \p New.
281 static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New) {
282 for (auto *Pred : to_vector(Old->getPredecessors()))
283 Pred->replaceSuccessor(Old, New);
284 for (auto *Succ : to_vector(Old->getSuccessors()))
285 Succ->replacePredecessor(Old, New);
286 New->setPredecessors(Old->getPredecessors());
287 New->setSuccessors(Old->getSuccessors());
288 Old->clearPredecessors();
289 Old->clearSuccessors();
290 }
291
292 /// Transfer successors from \p Old to \p New. \p New must have no successors.
294 for (auto *Succ : Old->getSuccessors())
295 Succ->replacePredecessor(Old, New);
296 New->setSuccessors(Old->getSuccessors());
297 Old->clearSuccessors();
298 }
299
300 /// Clone the CFG for all nodes reachable from \p Entry, including cloning
301 /// the blocks and their recipes. Operands of cloned recipes will NOT be
302 /// updated. Remapping of operands must be done separately. Returns a pair
303 /// with the new entry and exiting blocks of the cloned region. If \p Entry
304 /// isn't part of a region, return nullptr for the exiting block.
305 static std::pair<VPBlockBase *, VPBlockBase *> cloneFrom(VPBlockBase *Entry);
306
307 /// Return an iterator range over \p Range which only includes \p BlockTy
308 /// blocks. The accesses are casted to \p BlockTy.
309 template <typename BlockTy, typename T> static auto blocksOnly(T &&Range) {
310 // Create BaseTy with correct const-ness based on BlockTy.
311 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
312 const VPBlockBase, VPBlockBase>;
313
314 // We need to first create an iterator range over (const) BlocktTy & instead
315 // of (const) BlockTy * for filter_range to work properly.
316 auto Mapped =
317 map_range(Range, [](BaseTy *Block) -> BaseTy & { return *Block; });
319 Mapped, [](BaseTy &Block) { return isa<BlockTy>(&Block); });
320 return map_range(Filter, [](BaseTy &Block) -> BlockTy * {
321 return cast<BlockTy>(&Block);
322 });
323 }
324
325 /// Return an iterator range over \p Range with each block cast to \p
326 /// BlockTy. Unlike blocksOnly, all blocks in \p Range must be of type
327 /// \p BlockTy.
328 template <typename BlockTy, typename T> static auto blocksAs(T &&Range) {
329 // Create BaseTy with correct const-ness based on BlockTy.
330 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
331 const VPBlockBase, VPBlockBase>;
332 return map_range(
333 Range, [](BaseTy *Block) -> BlockTy * { return cast<BlockTy>(Block); });
334 }
335
336 /// Returns the blocks between \p FirstBB and \p LastBB, where FirstBB
337 /// to LastBB forms a single-sucessor chain.
340 VPBasicBlock *LastBB);
341
342 /// Inserts \p BlockPtr on the edge between \p From and \p To. That is, update
343 /// \p From's successor to \p To to point to \p BlockPtr and \p To's
344 /// predecessor from \p From to \p BlockPtr. \p From and \p To are added to \p
345 /// BlockPtr's predecessors and successors respectively. There must be a
346 /// single edge between \p From and \p To.
347 static void insertOnEdge(VPBlockBase *From, VPBlockBase *To,
348 VPBlockBase *BlockPtr) {
349 unsigned SuccIdx = From->getIndexForSuccessor(To);
350 unsigned PredIx = To->getIndexForPredecessor(From);
351 VPBlockUtils::connectBlocks(From, BlockPtr, -1, SuccIdx);
352 VPBlockUtils::connectBlocks(BlockPtr, To, PredIx, -1);
353 }
354
355 /// Returns true if \p VPB is a loop header, based on regions or \p VPDT in
356 /// their absence.
357 static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
358
359 /// Returns true if \p VPB is a loop latch, using isHeader().
360 static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
361
362 /// Returns the header and latch of the outermost loop of \p Plan in plain
363 /// CFG form (before regions are formed).
364 static std::pair<VPBasicBlock *, VPBasicBlock *>
365 getPlainCFGHeaderAndLatch(const VPlan &Plan);
366
367 /// Returns the middle block of \p Plan in plain CFG form (before regions
368 /// are formed).
369 static VPBasicBlock *getPlainCFGMiddleBlock(const VPlan &Plan);
370};
371
372} // namespace llvm
373
374#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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))
This file contains the declarations of the Vectorization Plan base classes:
A debug info location.
Definition DebugLoc.h:126
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:151
Represents flags for the getelementptr instruction/expression.
A struct for saving information about induction variables.
@ 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:151
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:4357
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
Definition VPlan.h:94
VPRegionBlock * getParent()
Definition VPlan.h:186
iterator_range< VPBlockBase ** > predecessors()
Definition VPlan.h:220
bool hasPredecessors() const
Returns true if this block has any predecessors.
Definition VPlan.h:217
unsigned getIndexForSuccessor(const VPBlockBase *Succ) const
Returns the index for Succ in the blocks successor list.
Definition VPlan.h:344
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
Definition VPlan.h:300
unsigned getIndexForPredecessor(const VPBlockBase *Pred) const
Returns the index for Pred in the blocks predecessors list.
Definition VPlan.h:337
bool hasSuccessors() const
Returns true if this block has any successors.
Definition VPlan.h:215
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:222
void clearSuccessors()
Remove all the successors of this block.
Definition VPlan.h:319
void setTwoSuccessors(VPBlockBase *IfTrue, VPBlockBase *IfFalse)
Set two given VPBlockBases IfTrue and IfFalse to be the two successors of this VPBlockBase.
Definition VPlan.h:291
void clearPredecessors()
Remove all the predecessor of this block.
Definition VPlan.h:316
void setParent(VPRegionBlock *P)
Definition VPlan.h:197
const VPBlocksTy & getSuccessors() const
Definition VPlan.h:211
static auto blocksAs(T &&Range)
Return an iterator range over Range with each block cast to BlockTy.
Definition VPlanUtils.h:328
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:207
static void insertOnEdge(VPBlockBase *From, VPBlockBase *To, VPBlockBase *BlockPtr)
Inserts BlockPtr on the edge between From and To.
Definition VPlanUtils.h:347
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:237
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:255
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:273
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:281
static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected block NewBlock before Blockptr.
Definition VPlanUtils.h:219
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:309
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:293
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:688
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:689
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1217
@ Intrinsic
Calls a scalar intrinsic. The intrinsic ID is the last operand.
Definition VPlan.h:1339
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:396
A recipe for handling reduction phis.
Definition VPlan.h:2839
VPValue * tryToExpand(const SCEV *S)
Try to expand S into recipes and live-ins using the builder.
VPSCEVExpander(VPBuilder &Builder, ScalarEvolution &SE, DebugLoc DL)
Definition VPlanUtils.h:186
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:399
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:4761
CallInst * Call
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
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.
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:81
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.
VPValue * findIncomingAliasMask(const VPlan &Plan)
Finds the incoming alias-mask within the vector preheader.
VPIRFlags getFlagsFromIndDesc(const InductionDescriptor &ID)
Extracts and returns NoWrap and FastMath flags from the induction binop in ID.
Definition VPlanUtils.h:116
VPRecipeBase * findRecipe(VPValue *Start, PredT Pred)
Search Start's users for a recipe satisfying Pred, looking through recipes with definitions.
Definition VPlanUtils.h:133
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.
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.
unsigned getVFScaleFactor(VPRecipeBase *R)
Get the VF scaling factor applied to the recipe's output, if the recipe has one.
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
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
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
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559