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"
13#include "VPlanPatternMatch.h"
15
16namespace llvm {
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/// Return true if \p V is a header mask in \p Plan.
59bool isHeaderMask(const VPValue *V, const VPlan &Plan);
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/// 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/// Returns the VPValue representing the uncountable exit comparison used by
81/// AnyOf if the recipes it depends on can be traced back to live-ins and
82/// the addresses (in GEP/PtrAdd form) of any (non-masked) load used in
83/// generating the values for the comparison. The recipes are stored in
84/// \p Recipes, and recipes forming an address for a load are also added to
85/// \p GEPs.
87std::optional<VPValue *>
90 VPBasicBlock *LatchVPBB);
91
92/// Return a MemoryLocation for \p R with noalias metadata populated from
93/// \p R, if the recipe is supported and std::nullopt otherwise. The pointer of
94/// the location is conservatively set to nullptr.
95std::optional<MemoryLocation> getMemoryLocation(const VPRecipeBase &R);
96
97/// Extracts and returns NoWrap and FastMath flags from the induction binop in
98/// \p ID.
101 return ID.getInductionBinOp()->getFastMathFlags();
102
104 ID.getInductionBinOp()))
105 return VPIRFlags::WrapFlagsTy(OBO->hasNoUnsignedWrap(),
106 OBO->hasNoSignedWrap());
107
109 "Expected int induction");
110 return VPIRFlags::WrapFlagsTy(false, false);
111}
112
113/// Search \p Start's users for a recipe satisfying \p Pred, looking through
114/// recipes with definitions.
115template <typename PredT>
116inline VPRecipeBase *findRecipe(VPValue *Start, PredT Pred) {
117 SetVector<VPValue *> Worklist;
118 Worklist.insert(Start);
119 for (unsigned I = 0; I != Worklist.size(); ++I) {
120 VPValue *Cur = Worklist[I];
121 auto *R = Cur->getDefiningRecipe();
122 if (!R)
123 continue;
124 if (Pred(R))
125 return R;
126 for (VPUser *U : Cur->users()) {
127 for (VPValue *V : cast<VPRecipeBase>(U)->definedValues())
128 Worklist.insert(V);
129 }
130 }
131 return nullptr;
132}
133
134/// If \p V is used by a recipe matching pattern \p P, return it. Otherwise
135/// return nullptr;
136template <typename MatchT>
137static VPRecipeBase *findUserOf(VPValue *V, const MatchT &P) {
138 using namespace llvm::VPlanPatternMatch;
139 auto It = find_if(V->users(), match_fn(P));
140 return It == V->user_end() ? nullptr : cast<VPRecipeBase>(*It);
141}
142
143/// If \p V is used by a VPInstruction with \p Opcode, return it. Otherwise
144/// return nullptr.
145template <unsigned Opcode> static VPInstruction *findUserOf(VPValue *V) {
146 using namespace llvm::VPlanPatternMatch;
148}
149
150template <typename RecipeTy> static RecipeTy *findUserOf(VPValue *V) {
151 using namespace llvm::VPlanPatternMatch;
153}
154
155/// Find the canonical IV increment of \p Plan's vector loop region. Returns
156/// nullptr if not found.
158
159/// Returns the GEP nowrap flags for \p Ptr, looking through pointer casts
160/// mirroring Value::stripPointerCasts.
162
163/// Returns true if \p V is used as part of the address of another load or
164/// store.
165bool isUsedByLoadStoreAddress(const VPValue *V);
166
167/// Find the ComputeReductionResult recipe for \p PhiR, looking through selects
168/// inserted for predicated reductions or tail folding.
170
171/// Collect the header mask with the pattern:
172/// (ICMP_ULE, WideCanonicalIV, backedge-taken-count)
173/// TODO: Introduce explicit recipe for header-mask instead of searching
174/// the header-mask pattern manually.
176
177} // namespace vputils
178
179//===----------------------------------------------------------------------===//
180// Utilities for modifying predecessors and successors of VPlan blocks.
181//===----------------------------------------------------------------------===//
182
183/// Class that provides utilities for VPBlockBases in VPlan.
185public:
186 VPBlockUtils() = delete;
187
188 /// Insert disconnected VPBlockBase \p NewBlock after \p BlockPtr. Add \p
189 /// NewBlock as successor of \p BlockPtr and \p BlockPtr as predecessor of \p
190 /// NewBlock, and propagate \p BlockPtr parent to \p NewBlock. \p BlockPtr's
191 /// successors are moved from \p BlockPtr to \p NewBlock. \p NewBlock must
192 /// have neither successors nor predecessors.
193 static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
194 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
195 "Can't insert new block with predecessors or successors.");
196 NewBlock->setParent(BlockPtr->getParent());
197 transferSuccessors(BlockPtr, NewBlock);
198 connectBlocks(BlockPtr, NewBlock);
199 }
200
201 /// Insert disconnected block \p NewBlock before \p Blockptr. First
202 /// disconnects all predecessors of \p BlockPtr and connects them to \p
203 /// NewBlock. Add \p NewBlock as predecessor of \p BlockPtr and \p BlockPtr as
204 /// successor of \p NewBlock.
205 static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr) {
206 assert(!NewBlock->hasSuccessors() && !NewBlock->hasPredecessors() &&
207 "Can't insert new block with predecessors or successors.");
208 NewBlock->setParent(BlockPtr->getParent());
209 for (VPBlockBase *Pred : to_vector(BlockPtr->predecessors())) {
210 Pred->replaceSuccessor(BlockPtr, NewBlock);
211 NewBlock->appendPredecessor(Pred);
212 }
213 BlockPtr->clearPredecessors();
214 connectBlocks(NewBlock, BlockPtr);
215 }
216
217 /// Insert disconnected VPBlockBases \p IfTrue and \p IfFalse after \p
218 /// BlockPtr. Add \p IfTrue and \p IfFalse as succesors of \p BlockPtr and \p
219 /// BlockPtr as predecessor of \p IfTrue and \p IfFalse. Propagate \p BlockPtr
220 /// parent to \p IfTrue and \p IfFalse. \p BlockPtr must have no successors
221 /// and \p IfTrue and \p IfFalse must have neither successors nor
222 /// predecessors.
223 static void insertTwoBlocksAfter(VPBlockBase *IfTrue, VPBlockBase *IfFalse,
224 VPBlockBase *BlockPtr) {
225 assert(!IfTrue->hasSuccessors() && "Can't insert IfTrue with successors.");
226 assert(!IfFalse->hasSuccessors() &&
227 "Can't insert IfFalse with successors.");
228 BlockPtr->setTwoSuccessors(IfTrue, IfFalse);
229 IfTrue->setPredecessors({BlockPtr});
230 IfFalse->setPredecessors({BlockPtr});
231 IfTrue->setParent(BlockPtr->getParent());
232 IfFalse->setParent(BlockPtr->getParent());
233 }
234
235 /// Connect VPBlockBases \p From and \p To bi-directionally. If \p PredIdx is
236 /// -1, append \p From to the predecessors of \p To, otherwise set \p To's
237 /// predecessor at \p PredIdx to \p From. If \p SuccIdx is -1, append \p To to
238 /// the successors of \p From, otherwise set \p From's successor at \p SuccIdx
239 /// to \p To. Both VPBlockBases must have the same parent, which can be null.
240 /// Both VPBlockBases can be already connected to other VPBlockBases.
241 static void connectBlocks(VPBlockBase *From, VPBlockBase *To,
242 unsigned PredIdx = -1u, unsigned SuccIdx = -1u) {
243 assert((From->getParent() == To->getParent()) &&
244 "Can't connect two block with different parents");
245
246 if (SuccIdx == -1u)
247 From->appendSuccessor(To);
248 else
249 From->getSuccessors()[SuccIdx] = To;
250
251 if (PredIdx == -1u)
252 To->appendPredecessor(From);
253 else
254 To->getPredecessors()[PredIdx] = From;
255 }
256
257 /// Disconnect VPBlockBases \p From and \p To bi-directionally. Remove \p To
258 /// from the successors of \p From and \p From from the predecessors of \p To.
259 static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To) {
260 assert(To && "Successor to disconnect is null.");
261 From->removeSuccessor(To);
262 To->removePredecessor(From);
263 }
264
265 /// Reassociate all the blocks connected to \p Old so that they now point to
266 /// \p New.
267 static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New) {
268 for (auto *Pred : to_vector(Old->getPredecessors()))
269 Pred->replaceSuccessor(Old, New);
270 for (auto *Succ : to_vector(Old->getSuccessors()))
271 Succ->replacePredecessor(Old, New);
272 New->setPredecessors(Old->getPredecessors());
273 New->setSuccessors(Old->getSuccessors());
274 Old->clearPredecessors();
275 Old->clearSuccessors();
276 }
277
278 /// Transfer successors from \p Old to \p New. \p New must have no successors.
280 for (auto *Succ : Old->getSuccessors())
281 Succ->replacePredecessor(Old, New);
282 New->setSuccessors(Old->getSuccessors());
283 Old->clearSuccessors();
284 }
285
286 /// Clone the CFG for all nodes reachable from \p Entry, including cloning
287 /// the blocks and their recipes. Operands of cloned recipes will NOT be
288 /// updated. Remapping of operands must be done separately. Returns a pair
289 /// with the new entry and exiting blocks of the cloned region. If \p Entry
290 /// isn't part of a region, return nullptr for the exiting block.
291 static std::pair<VPBlockBase *, VPBlockBase *> cloneFrom(VPBlockBase *Entry);
292
293 /// Return an iterator range over \p Range which only includes \p BlockTy
294 /// blocks. The accesses are casted to \p BlockTy.
295 template <typename BlockTy, typename T> static auto blocksOnly(T &&Range) {
296 // Create BaseTy with correct const-ness based on BlockTy.
297 using BaseTy = std::conditional_t<std::is_const<BlockTy>::value,
298 const VPBlockBase, VPBlockBase>;
299
300 // We need to first create an iterator range over (const) BlocktTy & instead
301 // of (const) BlockTy * for filter_range to work properly.
302 auto Mapped =
303 map_range(Range, [](BaseTy *Block) -> BaseTy & { return *Block; });
305 Mapped, [](BaseTy &Block) { return isa<BlockTy>(&Block); });
306 return map_range(Filter, [](BaseTy &Block) -> BlockTy * {
307 return cast<BlockTy>(&Block);
308 });
309 }
310
311 /// Returns the blocks between \p FirstBB and \p LastBB, where FirstBB
312 /// to LastBB forms a single-sucessor chain.
315 VPBasicBlock *LastBB);
316
317 /// Inserts \p BlockPtr on the edge between \p From and \p To. That is, update
318 /// \p From's successor to \p To to point to \p BlockPtr and \p To's
319 /// predecessor from \p From to \p BlockPtr. \p From and \p To are added to \p
320 /// BlockPtr's predecessors and successors respectively. There must be a
321 /// single edge between \p From and \p To.
322 static void insertOnEdge(VPBlockBase *From, VPBlockBase *To,
323 VPBlockBase *BlockPtr) {
324 unsigned SuccIdx = From->getIndexForSuccessor(To);
325 unsigned PredIx = To->getIndexForPredecessor(From);
326 VPBlockUtils::connectBlocks(From, BlockPtr, -1, SuccIdx);
327 VPBlockUtils::connectBlocks(BlockPtr, To, PredIx, -1);
328 }
329
330 /// Returns true if \p VPB is a loop header, based on regions or \p VPDT in
331 /// their absence.
332 static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
333
334 /// Returns true if \p VPB is a loop latch, using isHeader().
335 static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT);
336};
337
338} // namespace llvm
339
340#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI_FOR_TEST
Definition Compiler.h:218
std::pair< BasicBlock *, unsigned > BlockTy
A pair of (basic block, score).
#define I(x, y, z)
Definition MD5.cpp:57
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
This file contains the declarations of the Vectorization Plan base classes:
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 class consists of common code factored out of the SmallVector class to reduce code duplication b...
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:4148
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
Definition VPlan.h:93
VPRegionBlock * getParent()
Definition VPlan.h:185
iterator_range< VPBlockBase ** > predecessors()
Definition VPlan.h:219
bool hasPredecessors() const
Returns true if this block has any predecessors.
Definition VPlan.h:216
unsigned getIndexForSuccessor(const VPBlockBase *Succ) const
Returns the index for Succ in the blocks successor list.
Definition VPlan.h:349
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
Definition VPlan.h:305
unsigned getIndexForPredecessor(const VPBlockBase *Pred) const
Returns the index for Pred in the blocks predecessors list.
Definition VPlan.h:342
bool hasSuccessors() const
Returns true if this block has any successors.
Definition VPlan.h:214
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:221
void clearSuccessors()
Remove all the successors of this block.
Definition VPlan.h:324
void setTwoSuccessors(VPBlockBase *IfTrue, VPBlockBase *IfFalse)
Set two given VPBlockBases IfTrue and IfFalse to be the two successors of this VPBlockBase.
Definition VPlan.h:296
void clearPredecessors()
Remove all the predecessor of this block.
Definition VPlan.h:321
void setParent(VPRegionBlock *P)
Definition VPlan.h:196
const VPBlocksTy & getSuccessors() const
Definition VPlan.h:210
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:193
static void insertOnEdge(VPBlockBase *From, VPBlockBase *To, VPBlockBase *BlockPtr)
Inserts BlockPtr on the edge between From and To.
Definition VPlanUtils.h:322
static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT)
Returns true if VPB is a loop latch, using isHeader().
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:223
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:241
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:259
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:267
static void insertBlockBefore(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected block NewBlock before Blockptr.
Definition VPlanUtils.h:205
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:295
static void transferSuccessors(VPBlockBase *Old, VPBlockBase *New)
Transfer successors from Old to New. New must have no successors.
Definition VPlanUtils.h:279
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:677
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
Class to record and manage LLVM IR flags.
Definition VPlan.h:685
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1220
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:401
A recipe for handling reduction phis.
Definition VPlan.h:2691
VPSingleDef is a base class for recipes for modeling a sequence of one or more output IR that define ...
Definition VPlan.h:605
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:335
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Definition VPlanValue.h:49
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:155
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4506
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
auto match_fn(const Pattern &P)
A match functor that can be used as a UnaryPredicate in functional algorithms like all_of.
match_bind< VPInstruction > m_VPInstruction(VPInstruction *&V)
Match a VPInstruction, capturing if we match.
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.
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.
VPIRFlags getFlagsFromIndDesc(const InductionDescriptor &ID)
Extracts and returns NoWrap and FastMath flags from the induction binop in ID.
Definition VPlanUtils.h:99
VPRecipeBase * findRecipe(VPValue *Start, PredT Pred)
Search Start's users for a recipe satisfying Pred, looking through recipes with definitions.
Definition VPlanUtils.h:116
VPSingleDefRecipe * findHeaderMask(VPlan &Plan)
Collect the header mask with the pattern: (ICMP_ULE, WideCanonicalIV, backedge-taken-count) TODO: Int...
bool onlyScalarValuesUsed(const VPValue *Def)
Returns true if only scalar values of Def are used by all users.
static VPRecipeBase * findUserOf(VPValue *V, const MatchT &P)
If V is used by a recipe matching pattern P, return it.
Definition VPlanUtils.h:137
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.
LLVM_ABI_FOR_TEST std::optional< VPValue * > getRecipesForUncountableExit(SmallVectorImpl< VPInstruction * > &Recipes, SmallVectorImpl< VPInstruction * > &GEPs, VPBasicBlock *LatchVPBB)
Returns the VPValue representing the uncountable exit comparison used by AnyOf if the recipes it depe...
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.
bool isHeaderMask(const VPValue *V, const VPlan &Plan)
Return true if V is a header mask in Plan.
This is an optimization pass for GlobalISel generic memory operations.
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 cast_or_null(const Y &Val)
Definition Casting.h:714
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
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1771