LLVM 22.0.0git
VPlanTransforms.h
Go to the documentation of this file.
1//===- VPlanTransforms.h - Utility VPlan to VPlan transforms --------------===//
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/// \file
10/// This file provides utility VPlan to VPlan transformations.
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLANTRANSFORMS_H
14#define LLVM_TRANSFORMS_VECTORIZE_VPLANTRANSFORMS_H
15
16#include "VPlan.h"
17#include "VPlanVerifier.h"
21
22namespace llvm {
23
25class Instruction;
26class PHINode;
27class ScalarEvolution;
30class VPBuilder;
31class VPRecipeBuilder;
32struct VFRange;
33
35
37 /// Helper to run a VPlan transform \p Transform on \p VPlan, forwarding extra
38 /// arguments to the transform. Returns the boolean returned by the transform.
39 template <typename... ArgsTy>
40 static bool runPass(bool (*Transform)(VPlan &, ArgsTy...), VPlan &Plan,
41 typename std::remove_reference<ArgsTy>::type &...Args) {
42 bool Res = Transform(Plan, Args...);
45 return Res;
46 }
47 /// Helper to run a VPlan transform \p Transform on \p VPlan, forwarding extra
48 /// arguments to the transform.
49 template <typename... ArgsTy>
50 static void runPass(void (*Fn)(VPlan &, ArgsTy...), VPlan &Plan,
51 typename std::remove_reference<ArgsTy>::type &...Args) {
52 Fn(Plan, Args...);
55 }
56
57 /// Create a base VPlan0, serving as the common starting point for all later
58 /// candidates. It consists of an initial plain CFG loop with loop blocks from
59 /// \p TheLoop being directly translated to VPBasicBlocks with VPInstruction
60 /// corresponding to the input IR.
61 ///
62 /// The created loop is wrapped in an initial skeleton to facilitate
63 /// vectorization, consisting of a vector pre-header, an exit block for the
64 /// main vector loop (middle.block) and a new block as preheader of the scalar
65 /// loop (scalar.ph). See below for an illustration. It also adds a canonical
66 /// IV and its increment, using \p InductionTy and \p IVDL, and creates a
67 /// VPValue expression for the original trip count.
68 ///
69 /// [ ] <-- Plan's entry VPIRBasicBlock, wrapping the original loop's
70 /// / \ old preheader. Will contain iteration number check and SCEV
71 /// | | expansions.
72 /// | |
73 /// / v
74 /// | [ ] <-- vector loop bypass (may consist of multiple blocks) will be
75 /// | / | added later.
76 /// | / v
77 /// || [ ] <-- vector pre header.
78 /// |/ |
79 /// | v
80 /// | [ ] \ <-- plain CFG loop wrapping original loop to be vectorized.
81 /// | [ ]_|
82 /// | |
83 /// | v
84 /// | [ ] <--- middle-block with the branch to successors
85 /// | / |
86 /// | / |
87 /// | | v
88 /// \--->[ ] <--- scalar preheader (initial a VPBasicBlock, which will be
89 /// | | replaced later by a VPIRBasicBlock wrapping the scalar
90 /// | | preheader basic block.
91 /// | |
92 /// v <-- edge from middle to exit iff epilogue is not required.
93 /// | [ ] \
94 /// | [ ]_| <-- old scalar loop to handle remainder (scalar epilogue,
95 /// | | header wrapped in VPIRBasicBlock).
96 /// \ |
97 /// \ v
98 /// >[ ] <-- original loop exit block(s), wrapped in VPIRBasicBlocks.
99 LLVM_ABI_FOR_TEST static std::unique_ptr<VPlan>
100 buildVPlan0(Loop *TheLoop, LoopInfo &LI, Type *InductionTy, DebugLoc IVDL,
102
103 /// Update \p Plan to account for all early exits.
104 LLVM_ABI_FOR_TEST static void handleEarlyExits(VPlan &Plan,
105 bool HasUncountableExit);
106
107 /// If a check is needed to guard executing the scalar epilogue loop, it will
108 /// be added to the middle block.
109 LLVM_ABI_FOR_TEST static void addMiddleCheck(VPlan &Plan,
110 bool RequiresScalarEpilogueCheck,
111 bool TailFolded);
112
113 // Create a check to \p Plan to see if the vector loop should be executed.
114 static void addMinimumIterationCheck(
115 VPlan &Plan, ElementCount VF, unsigned UF,
116 ElementCount MinProfitableTripCount, bool RequiresScalarEpilogue,
117 bool TailFolded, bool CheckNeededWithTailFolding, Loop *OrigLoop,
119
120 /// Add a check to \p Plan to see if the epilogue vector loop should be
121 /// executed.
123 VPlan &Plan, Value *TripCount, Value *VectorTripCount,
124 bool RequiresScalarEpilogue, ElementCount EpilogueVF, unsigned EpilogueUF,
125 unsigned MainLoopStep, unsigned EpilogueLoopStep, ScalarEvolution &SE);
126
127 /// Replace loops in \p Plan's flat CFG with VPRegionBlocks, turning \p Plan's
128 /// flat CFG into a hierarchical CFG.
129 LLVM_ABI_FOR_TEST static void createLoopRegions(VPlan &Plan);
130
131 /// Wrap runtime check block \p CheckBlock in a VPIRBB and \p Cond in a
132 /// VPValue and connect the block to \p Plan, using the VPValue as branch
133 /// condition.
134 static void attachCheckBlock(VPlan &Plan, Value *Cond, BasicBlock *CheckBlock,
135 bool AddBranchWeights);
136
137 /// Replaces the VPInstructions in \p Plan with corresponding
138 /// widen recipes. Returns false if any VPInstructions could not be converted
139 /// to a wide recipe if needed.
141 VPlanPtr &Plan,
143 GetIntOrFpInductionDescriptor,
144 const TargetLibraryInfo &TLI);
145
146 /// Try to have all users of fixed-order recurrences appear after the recipe
147 /// defining their previous value, by either sinking users or hoisting recipes
148 /// defining their previous value (and its operands). Then introduce
149 /// FirstOrderRecurrenceSplice VPInstructions to combine the value from the
150 /// recurrence phis and previous values.
151 /// \returns true if all users of fixed-order recurrences could be re-arranged
152 /// as needed or false if it is not possible. In the latter case, \p Plan is
153 /// not valid.
154 static bool adjustFixedOrderRecurrences(VPlan &Plan, VPBuilder &Builder);
155
156 /// Check if \p Plan contains any FMaxNum or FMinNum reductions. If they do,
157 /// try to update the vector loop to exit early if any input is NaN and resume
158 /// executing in the scalar loop to handle the NaNs there. Return false if
159 /// this attempt was unsuccessful.
160 static bool handleMaxMinNumReductions(VPlan &Plan);
161
162 /// Clear NSW/NUW flags from reduction instructions if necessary.
163 static void clearReductionWrapFlags(VPlan &Plan);
164
165 /// Explicitly unroll \p Plan by \p UF.
166 static void unrollByUF(VPlan &Plan, unsigned UF);
167
168 /// Replace each replicating VPReplicateRecipe and VPInstruction outside of
169 /// any replicate region in \p Plan with \p VF single-scalar recipes.
170 /// TODO: Also replicate VPScalarIVSteps and VPReplicateRecipes inside
171 /// replicate regions, thereby dissolving the latter.
172 static void replicateByVF(VPlan &Plan, ElementCount VF);
173
174 /// Optimize \p Plan based on \p BestVF and \p BestUF. This may restrict the
175 /// resulting plan to \p BestVF and \p BestUF.
176 static void optimizeForVFAndUF(VPlan &Plan, ElementCount BestVF,
177 unsigned BestUF,
179
180 /// Apply VPlan-to-VPlan optimizations to \p Plan, including induction recipe
181 /// optimizations, dead recipe removal, replicate region optimizations and
182 /// block merging.
183 static void optimize(VPlan &Plan);
184
185 /// Wrap predicated VPReplicateRecipes with a mask operand in an if-then
186 /// region block and remove the mask operand. Optimize the created regions by
187 /// iteratively sinking scalar operands into the region, followed by merging
188 /// regions until no improvements are remaining.
189 static void createAndOptimizeReplicateRegions(VPlan &Plan);
190
191 /// Replace (ICMP_ULE, wide canonical IV, backedge-taken-count) checks with an
192 /// (active-lane-mask recipe, wide canonical IV, trip-count). If \p
193 /// UseActiveLaneMaskForControlFlow is true, introduce an
194 /// VPActiveLaneMaskPHIRecipe. If \p DataAndControlFlowWithoutRuntimeCheck is
195 /// true, no minimum-iteration runtime check will be created (during skeleton
196 /// creation) and instead it is handled using active-lane-mask. \p
197 /// DataAndControlFlowWithoutRuntimeCheck implies \p
198 /// UseActiveLaneMaskForControlFlow.
199 static void addActiveLaneMask(VPlan &Plan,
200 bool UseActiveLaneMaskForControlFlow,
202
203 /// Insert truncates and extends for any truncated recipe. Redundant casts
204 /// will be folded later.
205 static void
208
209 /// Replace symbolic strides from \p StridesMap in \p Plan with constants when
210 /// possible.
211 static void
213 const DenseMap<Value *, const SCEV *> &StridesMap);
214
215 /// Drop poison flags from recipes that may generate a poison value that is
216 /// used after vectorization, even when their operands are not poison. Those
217 /// recipes meet the following conditions:
218 /// * Contribute to the address computation of a recipe generating a widen
219 /// memory load/store (VPWidenMemoryInstructionRecipe or
220 /// VPInterleaveRecipe).
221 /// * Such a widen memory load/store has at least one underlying Instruction
222 /// that is in a basic block that needs predication and after vectorization
223 /// the generated instruction won't be predicated.
224 /// Uses \p BlockNeedsPredication to check if a block needs predicating.
225 /// TODO: Replace BlockNeedsPredication callback with retrieving info from
226 /// VPlan directly.
227 static void dropPoisonGeneratingRecipes(
228 VPlan &Plan,
229 const std::function<bool(BasicBlock *)> &BlockNeedsPredication);
230
231 /// Add a VPEVLBasedIVPHIRecipe and related recipes to \p Plan and
232 /// replaces all uses except the canonical IV increment of
233 /// VPCanonicalIVPHIRecipe with a VPEVLBasedIVPHIRecipe.
234 /// VPCanonicalIVPHIRecipe is only used to control the loop after
235 /// this transformation.
236 static void
238 const std::optional<unsigned> &MaxEVLSafeElements);
239
240 // For each Interleave Group in \p InterleaveGroups replace the Recipes
241 // widening its memory instructions with a single VPInterleaveRecipe at its
242 // insertion point.
243 static void createInterleaveGroups(
244 VPlan &Plan,
246 &InterleaveGroups,
247 VPRecipeBuilder &RecipeBuilder, const bool &ScalarEpilogueAllowed);
248
249 /// Remove dead recipes from \p Plan.
250 static void removeDeadRecipes(VPlan &Plan);
251
252 /// Update \p Plan to account for the uncountable early exit from \p
253 /// EarlyExitingVPBB to \p EarlyExitVPBB by
254 /// * updating the condition exiting the loop via the latch to include the
255 /// early exit condition,
256 /// * splitting the original middle block to branch to the early exit block
257 /// conditionally - according to the early exit condition.
258 static void handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
259 VPBasicBlock *EarlyExitVPBB,
260 VPlan &Plan, VPBasicBlock *HeaderVPBB,
261 VPBasicBlock *LatchVPBB);
262
263 /// Replace loop regions with explicit CFG.
264 static void dissolveLoopRegions(VPlan &Plan);
265
266 /// Transform EVL loops to use variable-length stepping after region
267 /// dissolution.
268 ///
269 /// Once loop regions are replaced with explicit CFG, EVL loops can step with
270 /// variable vector lengths instead of fixed lengths. This transformation:
271 /// * Makes EVL-Phi concrete.
272 // * Removes CanonicalIV and increment.
273 /// * Replaces the exit condition from
274 /// (branch-on-count CanonicalIVInc, VectorTripCount)
275 /// to
276 /// (branch-on-cond eq AVLNext, 0)
277 static void canonicalizeEVLLoops(VPlan &Plan);
278
279 /// Lower abstract recipes to concrete ones, that can be codegen'd.
280 static void convertToConcreteRecipes(VPlan &Plan);
281
282 /// This function converts initial recipes to the abstract recipes and clamps
283 /// \p Range based on cost model for following optimizations and cost
284 /// estimations. The converted abstract recipes will lower to concrete
285 /// recipes before codegen.
286 static void convertToAbstractRecipes(VPlan &Plan, VPCostContext &Ctx,
287 VFRange &Range);
288
289 /// Perform instcombine-like simplifications on recipes in \p Plan.
290 static void simplifyRecipes(VPlan &Plan);
291
292 /// Remove BranchOnCond recipes with true or false conditions together with
293 /// removing dead edges to their successors.
294 static void removeBranchOnConst(VPlan &Plan);
295
296 /// Perform common-subexpression-elimination on \p Plan.
297 static void cse(VPlan &Plan);
298
299 /// If there's a single exit block, optimize its phi recipes that use exiting
300 /// IV values by feeding them precomputed end values instead, possibly taken
301 /// one step backwards.
302 static void
305 ScalarEvolution &SE);
306
307 /// Add explicit broadcasts for live-ins and VPValues defined in \p Plan's entry block if they are used as vectors.
308 static void materializeBroadcasts(VPlan &Plan);
309
310 // Materialize vector trip counts for constants early if it can simply be
311 // computed as (Original TC / VF * UF) * VF * UF.
312 static void
314 unsigned BestUF,
316
317 /// Materialize vector trip count computations to a set of VPInstructions.
318 static void materializeVectorTripCount(VPlan &Plan,
319 VPBasicBlock *VectorPHVPBB,
320 bool TailByMasking,
321 bool RequiresScalarEpilogue);
322
323 /// Materialize the backedge-taken count to be computed explicitly using
324 /// VPInstructions.
325 static void materializeBackedgeTakenCount(VPlan &Plan,
326 VPBasicBlock *VectorPH);
327
328 /// Add explicit Build[Struct]Vector recipes that combine multiple scalar
329 /// values into single vectors.
330 static void materializeBuildVectors(VPlan &Plan);
331
332 /// Materialize VF and VFxUF to be computed explicitly using VPInstructions.
333 static void materializeVFAndVFxUF(VPlan &Plan, VPBasicBlock *VectorPH,
334 ElementCount VF);
335
336 /// Expand VPExpandSCEVRecipes in \p Plan's entry block. Each
337 /// VPExpandSCEVRecipe is replaced with a live-in wrapping the expanded IR
338 /// value. A mapping from SCEV expressions to their expanded IR value is
339 /// returned.
341 ScalarEvolution &SE);
342
343 /// Try to convert a plan with interleave groups with VF elements to a plan
344 /// with the interleave groups replaced by wide loads and stores processing VF
345 /// elements, if all transformed interleave groups access the full vector
346 /// width (checked via \o VectorRegWidth). This effectively is a very simple
347 /// form of loop-aware SLP, where we use interleave groups to identify
348 /// candidates.
349 static void narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
350 unsigned VectorRegWidth);
351
352 /// Predicate and linearize the control-flow in the only loop region of
353 /// \p Plan. If \p FoldTail is true, create a mask guarding the loop
354 /// header, otherwise use all-true for the header mask. Masks for blocks are
355 /// added to a block-to-mask map which is returned in order to be used later
356 /// for wide recipe construction. This argument is temporary and will be
357 /// removed in the future.
359 introduceMasksAndLinearize(VPlan &Plan, bool FoldTail);
360
361 /// Add branch weight metadata, if the \p Plan's middle block is terminated by
362 /// a BranchOnCond recipe.
363 static void
365 std::optional<unsigned> VScaleForTuning);
366};
367
368} // namespace llvm
369
370#endif // LLVM_TRANSFORMS_VECTORIZE_VPLANTRANSFORMS_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_ABI_FOR_TEST
Definition Compiler.h:218
static constexpr uint32_t MinItersBypassWeights[]
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
const SmallVectorImpl< MachineOperand > & Cond
This file declares the class VPlanVerifier, which contains utility functions to check the consistency...
This file contains the declarations of the Vectorization Plan base classes:
LLVM Basic Block Representation.
Definition BasicBlock.h:62
A debug info location.
Definition DebugLoc.h:124
A struct for saving information about induction variables.
The group of interleaved loads/stores sharing the same stride and close to each other.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
The main scalar evolution driver.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:3781
VPlan-based builder utility analogous to IRBuilder.
Helper class to create VPRecipies from IR instructions.
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4072
LLVM Value Representation.
Definition Value.h:75
An efficient, type-erasing, non-owning reference to a callable.
This is an optimization pass for GlobalISel generic memory operations.
cl::opt< bool > VerifyEachVPlan
LLVM_ABI_FOR_TEST bool verifyVPlanIsValid(const VPlan &Plan, bool VerifyLate=false)
Verify invariants for general VPlans.
@ DataAndControlFlowWithoutRuntimeCheck
Use predicate to control both data and control flow, but modify the trip count so that a runtime over...
std::unique_ptr< VPlan > VPlanPtr
Definition VPlan.h:77
A range of powers-of-2 vectorization factors with fixed start and adjustable end.
Struct to hold various analysis needed for cost computations.
static void materializeBroadcasts(VPlan &Plan)
Add explicit broadcasts for live-ins and VPValues defined in Plan's entry block if they are used as v...
static void materializeBackedgeTakenCount(VPlan &Plan, VPBasicBlock *VectorPH)
Materialize the backedge-taken count to be computed explicitly using VPInstructions.
static LLVM_ABI_FOR_TEST std::unique_ptr< VPlan > buildVPlan0(Loop *TheLoop, LoopInfo &LI, Type *InductionTy, DebugLoc IVDL, PredicatedScalarEvolution &PSE)
Create a base VPlan0, serving as the common starting point for all later candidates.
static void optimizeInductionExitUsers(VPlan &Plan, DenseMap< VPValue *, VPValue * > &EndValues, ScalarEvolution &SE)
If there's a single exit block, optimize its phi recipes that use exiting IV values by feeding them p...
static LLVM_ABI_FOR_TEST void handleEarlyExits(VPlan &Plan, bool HasUncountableExit)
Update Plan to account for all early exits.
static void canonicalizeEVLLoops(VPlan &Plan)
Transform EVL loops to use variable-length stepping after region dissolution.
static void dropPoisonGeneratingRecipes(VPlan &Plan, const std::function< bool(BasicBlock *)> &BlockNeedsPredication)
Drop poison flags from recipes that may generate a poison value that is used after vectorization,...
static void createAndOptimizeReplicateRegions(VPlan &Plan)
Wrap predicated VPReplicateRecipes with a mask operand in an if-then region block and remove the mask...
static void createInterleaveGroups(VPlan &Plan, const SmallPtrSetImpl< const InterleaveGroup< Instruction > * > &InterleaveGroups, VPRecipeBuilder &RecipeBuilder, const bool &ScalarEpilogueAllowed)
static bool runPass(bool(*Transform)(VPlan &, ArgsTy...), VPlan &Plan, typename std::remove_reference< ArgsTy >::type &...Args)
Helper to run a VPlan transform Transform on VPlan, forwarding extra arguments to the transform.
static void addBranchWeightToMiddleTerminator(VPlan &Plan, ElementCount VF, std::optional< unsigned > VScaleForTuning)
Add branch weight metadata, if the Plan's middle block is terminated by a BranchOnCond recipe.
static void materializeBuildVectors(VPlan &Plan)
Add explicit Build[Struct]Vector recipes that combine multiple scalar values into single vectors.
static void unrollByUF(VPlan &Plan, unsigned UF)
Explicitly unroll Plan by UF.
static DenseMap< const SCEV *, Value * > expandSCEVs(VPlan &Plan, ScalarEvolution &SE)
Expand VPExpandSCEVRecipes in Plan's entry block.
static void convertToConcreteRecipes(VPlan &Plan)
Lower abstract recipes to concrete ones, that can be codegen'd.
static void runPass(void(*Fn)(VPlan &, ArgsTy...), VPlan &Plan, typename std::remove_reference< ArgsTy >::type &...Args)
Helper to run a VPlan transform Transform on VPlan, forwarding extra arguments to the transform.
static void addMinimumIterationCheck(VPlan &Plan, ElementCount VF, unsigned UF, ElementCount MinProfitableTripCount, bool RequiresScalarEpilogue, bool TailFolded, bool CheckNeededWithTailFolding, Loop *OrigLoop, const uint32_t *MinItersBypassWeights, DebugLoc DL, ScalarEvolution &SE)
static void convertToAbstractRecipes(VPlan &Plan, VPCostContext &Ctx, VFRange &Range)
This function converts initial recipes to the abstract recipes and clamps Range based on cost model f...
static void materializeConstantVectorTripCount(VPlan &Plan, ElementCount BestVF, unsigned BestUF, PredicatedScalarEvolution &PSE)
static DenseMap< VPBasicBlock *, VPValue * > introduceMasksAndLinearize(VPlan &Plan, bool FoldTail)
Predicate and linearize the control-flow in the only loop region of Plan.
static void addExplicitVectorLength(VPlan &Plan, const std::optional< unsigned > &MaxEVLSafeElements)
Add a VPEVLBasedIVPHIRecipe and related recipes to Plan and replaces all uses except the canonical IV...
static void replaceSymbolicStrides(VPlan &Plan, PredicatedScalarEvolution &PSE, const DenseMap< Value *, const SCEV * > &StridesMap)
Replace symbolic strides from StridesMap in Plan with constants when possible.
static bool handleMaxMinNumReductions(VPlan &Plan)
Check if Plan contains any FMaxNum or FMinNum reductions.
static void removeBranchOnConst(VPlan &Plan)
Remove BranchOnCond recipes with true or false conditions together with removing dead edges to their ...
static LLVM_ABI_FOR_TEST void createLoopRegions(VPlan &Plan)
Replace loops in Plan's flat CFG with VPRegionBlocks, turning Plan's flat CFG into a hierarchical CFG...
static void removeDeadRecipes(VPlan &Plan)
Remove dead recipes from Plan.
static void attachCheckBlock(VPlan &Plan, Value *Cond, BasicBlock *CheckBlock, bool AddBranchWeights)
Wrap runtime check block CheckBlock in a VPIRBB and Cond in a VPValue and connect the block to Plan,...
static void materializeVectorTripCount(VPlan &Plan, VPBasicBlock *VectorPHVPBB, bool TailByMasking, bool RequiresScalarEpilogue)
Materialize vector trip count computations to a set of VPInstructions.
static void simplifyRecipes(VPlan &Plan)
Perform instcombine-like simplifications on recipes in Plan.
static LLVM_ABI_FOR_TEST bool tryToConvertVPInstructionsToVPRecipes(VPlanPtr &Plan, function_ref< const InductionDescriptor *(PHINode *)> GetIntOrFpInductionDescriptor, const TargetLibraryInfo &TLI)
Replaces the VPInstructions in Plan with corresponding widen recipes.
static void handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB, VPBasicBlock *EarlyExitVPBB, VPlan &Plan, VPBasicBlock *HeaderVPBB, VPBasicBlock *LatchVPBB)
Update Plan to account for the uncountable early exit from EarlyExitingVPBB to EarlyExitVPBB by.
static void replicateByVF(VPlan &Plan, ElementCount VF)
Replace each replicating VPReplicateRecipe and VPInstruction outside of any replicate region in Plan ...
static void clearReductionWrapFlags(VPlan &Plan)
Clear NSW/NUW flags from reduction instructions if necessary.
static void cse(VPlan &Plan)
Perform common-subexpression-elimination on Plan.
static void addActiveLaneMask(VPlan &Plan, bool UseActiveLaneMaskForControlFlow, bool DataAndControlFlowWithoutRuntimeCheck)
Replace (ICMP_ULE, wide canonical IV, backedge-taken-count) checks with an (active-lane-mask recipe,...
static void optimize(VPlan &Plan)
Apply VPlan-to-VPlan optimizations to Plan, including induction recipe optimizations,...
static void dissolveLoopRegions(VPlan &Plan)
Replace loop regions with explicit CFG.
static void narrowInterleaveGroups(VPlan &Plan, ElementCount VF, unsigned VectorRegWidth)
Try to convert a plan with interleave groups with VF elements to a plan with the interleave groups re...
static void truncateToMinimalBitwidths(VPlan &Plan, const MapVector< Instruction *, uint64_t > &MinBWs)
Insert truncates and extends for any truncated recipe.
static bool adjustFixedOrderRecurrences(VPlan &Plan, VPBuilder &Builder)
Try to have all users of fixed-order recurrences appear after the recipe defining their previous valu...
static void optimizeForVFAndUF(VPlan &Plan, ElementCount BestVF, unsigned BestUF, PredicatedScalarEvolution &PSE)
Optimize Plan based on BestVF and BestUF.
static void materializeVFAndVFxUF(VPlan &Plan, VPBasicBlock *VectorPH, ElementCount VF)
Materialize VF and VFxUF to be computed explicitly using VPInstructions.
static void addMinimumVectorEpilogueIterationCheck(VPlan &Plan, Value *TripCount, Value *VectorTripCount, bool RequiresScalarEpilogue, ElementCount EpilogueVF, unsigned EpilogueUF, unsigned MainLoopStep, unsigned EpilogueLoopStep, ScalarEvolution &SE)
Add a check to Plan to see if the epilogue vector loop should be executed.
static LLVM_ABI_FOR_TEST void addMiddleCheck(VPlan &Plan, bool RequiresScalarEpilogueCheck, bool TailFolded)
If a check is needed to guard executing the scalar epilogue loop, it will be added to the middle bloc...