9#ifndef LLVM_TRANSFORMS_VECTORIZE_VPRECIPEBUILDER_H
10#define LLVM_TRANSFORMS_VECTORIZE_VPRECIPEBUILDER_H
19class LoopVectorizationLegality;
20class LoopVectorizationCostModel;
21class TargetLibraryInfo;
22class TargetTransformInfo;
142 bool getScaledReductions(
155 CM(CM), PSE(PSE), Builder(Builder), BlockMaskCache(BlockMaskCache),
159 auto It = ScaledReductionMap.
find(ExitInst);
160 return It == ScaledReductionMap.
end() ? std::nullopt
161 : std::make_optional(It->second);
176 unsigned ScaleFactor);
181 "Cannot reset recipe for instruction.");
182 Ingredient2Recipe[
I] = R;
188 return BlockMaskCache.
lookup(VPBB);
194 "Recording this ingredients recipe was not requested");
195 assert(Ingredient2Recipe[
I] !=
nullptr &&
196 "Ingredient doesn't have a recipe");
197 return Ingredient2Recipe[
I];
208 if (
auto *
I = dyn_cast<Instruction>(V)) {
209 if (
auto *R = Ingredient2Recipe.
lookup(
I))
210 return R->getVPSingleValue();
216 for (
auto &[
_, V] : BlockMaskCache) {
217 if (
auto *New = Old2New.
lookup(V)) {
218 V->replaceAllUsesWith(New);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the DenseMap class.
This file provides a LoopVectorizationPlanner class.
mir Rename Register Operands
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file contains the declarations of the Vectorization Plan base classes:
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class represents a function call, abstracting a target machine's calling convention.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
LoopVectorizationCostModel - estimates the expected speedups due to vectorization.
LoopVectorizationLegality checks if it is legal to vectorize a loop, and to what vectorization factor...
This class emits a version of the loop where run-time checks ensure that may-alias pointers can't ove...
Represents a single loop in the control flow graph.
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
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.
Provides information about what library functions are available for the current target.
This class represents a truncation of integer types.
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
VPlan-based builder utility analogous to IRBuilder.
A recipe representing a sequence of load -> update -> store as part of a histogram operation.
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Helper class to create VPRecipies from IR instructions.
VPRecipeBase * tryToCreateWidenRecipe(VPSingleDefRecipe *R, VFRange &Range)
Create and return a widened recipe for R if one can be created within the given VF Range.
VPValue * getBlockInMask(VPBasicBlock *VPBB) const
Returns the entry mask for block VPBB or null if the mask is all-true.
VPValue * getVPValueOrAddLiveIn(Value *V)
std::optional< unsigned > getScalingForReduction(const Instruction *ExitInst)
void collectScaledReductions(VFRange &Range)
Find all possible partial reductions in the loop and track all of those that are valid so recipes can...
void setRecipe(Instruction *I, VPRecipeBase *R)
Set the recipe created for given ingredient.
VPReplicateRecipe * handleReplication(Instruction *I, ArrayRef< VPValue * > Operands, VFRange &Range)
Build a VPReplicationRecipe for I using Operands.
VPRecipeBase * tryToCreatePartialReduction(Instruction *Reduction, ArrayRef< VPValue * > Operands, unsigned ScaleFactor)
Create and return a partial reduction recipe for a reduction instruction along with binary operation ...
VPRecipeBuilder(VPlan &Plan, Loop *OrigLoop, const TargetLibraryInfo *TLI, const TargetTransformInfo *TTI, LoopVectorizationLegality *Legal, LoopVectorizationCostModel &CM, PredicatedScalarEvolution &PSE, VPBuilder &Builder, DenseMap< VPBasicBlock *, VPValue * > &BlockMaskCache, LoopVersioning *LVer)
VPRecipeBase * getRecipe(Instruction *I)
Return the recipe created for given ingredient.
void updateBlockMaskCache(DenseMap< VPValue *, VPValue * > &Old2New)
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
VPSingleDef is a base class for recipes for modeling a sequence of one or more output IR that define ...
A recipe for handling phi nodes of integer and floating-point inductions, producing their vector valu...
A common base class for widening memory operations.
VPWidenRecipe is a recipe for producing a widened instruction using the opcode and operands of the re...
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
VPValue * getOrAddLiveIn(Value *V)
Gets the live-in VPValue for V or adds a new live-in (if none exists yet) for V.
LLVM Value Representation.
This is an optimization pass for GlobalISel generic memory operations.
This holds details about a histogram operation – a load -> update -> store sequence where each lane i...
A chain of instructions that form a partial reduction.
PartialReductionChain(Instruction *Reduction, Instruction *ExtendA, Instruction *ExtendB, Instruction *ExtendUser)
Instruction * ExtendUser
The user of the extends that is then reduced.
Instruction * Reduction
The top-level binary operation that forms the reduction to a scalar after the loop body.
Instruction * ExtendA
The extension of each of the inner binary operation's operands.
A range of powers-of-2 vectorization factors with fixed start and adjustable end.