LLVM 24.0.0git
LoopVectorize.cpp
Go to the documentation of this file.
1//===- LoopVectorize.cpp - A Loop Vectorizer ------------------------------===//
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// This is the LLVM loop vectorizer. This pass modifies 'vectorizable' loops
10// and generates target-independent LLVM-IR.
11// The vectorizer uses the TargetTransformInfo analysis to estimate the costs
12// of instructions in order to estimate the profitability of vectorization.
13//
14// The loop vectorizer combines consecutive loop iterations into a single
15// 'wide' iteration. After this transformation the index is incremented
16// by the SIMD vector width, and not by one.
17//
18// This pass has three parts:
19// 1. The main loop pass that drives the different parts.
20// 2. LoopVectorizationLegality - A unit that checks for the legality
21// of the vectorization.
22// 3. InnerLoopVectorizer - A unit that performs the actual
23// widening of instructions.
24// 4. LoopVectorizationCostModel - A unit that checks for the profitability
25// of vectorization. It decides on the optimal vector width, which
26// can be one, if vectorization is not profitable.
27//
28// There is a development effort going on to migrate loop vectorizer to the
29// VPlan infrastructure and to introduce outer loop vectorization support (see
30// docs/VectorizationPlan.rst and
31// http://lists.llvm.org/pipermail/llvm-dev/2017-December/119523.html). For this
32// purpose, we temporarily introduced the VPlan-native vectorization path: an
33// alternative vectorization path that is natively implemented on top of the
34// VPlan infrastructure. See EnableVPlanNativePath for enabling.
35//
36//===----------------------------------------------------------------------===//
37//
38// The reduction-variable vectorization is based on the paper:
39// D. Nuzman and R. Henderson. Multi-platform Auto-vectorization.
40//
41// Variable uniformity checks are inspired by:
42// Karrenberg, R. and Hack, S. Whole Function Vectorization.
43//
44// The interleaved access vectorization is based on the paper:
45// Dorit Nuzman, Ira Rosen and Ayal Zaks. Auto-Vectorization of Interleaved
46// Data for SIMD
47//
48// Other ideas/concepts are from:
49// A. Zaks and D. Nuzman. Autovectorization in GCC-two years later.
50//
51// S. Maleki, Y. Gao, M. Garzaran, T. Wong and D. Padua. An Evaluation of
52// Vectorizing Compilers.
53//
54//===----------------------------------------------------------------------===//
55
58#include "VPRecipeBuilder.h"
59#include "VPlan.h"
60#include "VPlanAnalysis.h"
61#include "VPlanCFG.h"
62#include "VPlanHelpers.h"
63#include "VPlanPatternMatch.h"
64#include "VPlanTransforms.h"
65#include "VPlanUtils.h"
66#include "VPlanVerifier.h"
67#include "VectorizeOptions.h"
68#include "llvm/ADT/APInt.h"
69#include "llvm/ADT/ArrayRef.h"
70#include "llvm/ADT/DenseMap.h"
71#include "llvm/ADT/Hashing.h"
72#include "llvm/ADT/MapVector.h"
73#include "llvm/ADT/STLExtras.h"
76#include "llvm/ADT/Statistic.h"
77#include "llvm/ADT/StringRef.h"
78#include "llvm/ADT/Twine.h"
79#include "llvm/ADT/TypeSwitch.h"
85#include "llvm/Analysis/CFG.h"
103#include "llvm/IR/Attributes.h"
104#include "llvm/IR/BasicBlock.h"
105#include "llvm/IR/CFG.h"
106#include "llvm/IR/Constant.h"
107#include "llvm/IR/Constants.h"
108#include "llvm/IR/DataLayout.h"
109#include "llvm/IR/DebugInfo.h"
110#include "llvm/IR/DebugLoc.h"
111#include "llvm/IR/DerivedTypes.h"
113#include "llvm/IR/Dominators.h"
114#include "llvm/IR/Function.h"
115#include "llvm/IR/IRBuilder.h"
116#include "llvm/IR/InstrTypes.h"
117#include "llvm/IR/Instruction.h"
118#include "llvm/IR/Instructions.h"
120#include "llvm/IR/Intrinsics.h"
121#include "llvm/IR/MDBuilder.h"
122#include "llvm/IR/Metadata.h"
123#include "llvm/IR/Module.h"
124#include "llvm/IR/Operator.h"
125#include "llvm/IR/PatternMatch.h"
127#include "llvm/IR/Type.h"
128#include "llvm/IR/Use.h"
129#include "llvm/IR/User.h"
130#include "llvm/IR/Value.h"
131#include "llvm/IR/Verifier.h"
132#include "llvm/Support/Casting.h"
134#include "llvm/Support/Debug.h"
149#include <algorithm>
150#include <cassert>
151#include <cmath>
152#include <cstdint>
153#include <functional>
154#include <iterator>
155#include <memory>
156#include <string>
157#include <tuple>
158#include <utility>
159
160using namespace llvm;
161using namespace SCEVPatternMatch;
162using namespace LoopVectorizationUtils;
163
164#define LV_NAME "loop-vectorize"
165#define DEBUG_TYPE LV_NAME
166
167#ifndef NDEBUG
168const char VerboseDebug[] = DEBUG_TYPE "-verbose";
169#endif
170
171STATISTIC(LoopsVectorized, "Number of loops vectorized");
172STATISTIC(LoopsAnalyzed, "Number of loops analyzed for vectorization");
173STATISTIC(LoopsEpilogueVectorized, "Number of epilogues vectorized");
174STATISTIC(LoopsEarlyExitVectorized, "Number of early exit loops vectorized");
175STATISTIC(LoopsPartialAliasVectorized,
176 "Number of partial aliasing loops vectorized");
177
179 "epilogue-vectorization-force-VF", cl::init(ElementCount::getFixed(1)),
181 cl::desc("When epilogue vectorization is enabled, and a value greater than "
182 "1 is specified, forces the given VF for all applicable epilogue "
183 "loops. Note: This allows all scalable VFs >= vscale x 1."));
184
185// Returns true if the epilogue VF has been set to a non-zero value other than
186// VF=1 (scalar).
191
192// Likelyhood of bypassing the vectorized loop because there are zero trips left
193// after prolog. See `emitIterationCountCheck`.
194static constexpr uint32_t MinItersBypassWeights[] = {1, 127};
195
196/// A version of ScalarEvolution::getSmallConstantTripCount that returns an
197/// ElementCount to include loops whose trip count is a function of vscale.
199 const Loop *L) {
200 if (unsigned ExpectedTC = SE->getSmallConstantTripCount(L))
201 return ElementCount::getFixed(ExpectedTC);
202
203 const SCEV *BTC = SE->getBackedgeTakenCount(L);
205 return ElementCount::getFixed(0);
206
207 const SCEV *ExitCount = SE->getTripCountFromExitCount(BTC, BTC->getType(), L);
208 if (isa<SCEVVScale>(ExitCount))
210
211 const APInt *Scale;
212 if (match(ExitCount, m_scev_Mul(m_scev_APInt(Scale), m_SCEVVScale())))
213 if (cast<SCEVMulExpr>(ExitCount)->hasNoUnsignedWrap())
214 if (Scale->getActiveBits() <= 32)
216
217 return ElementCount::getFixed(0);
218}
219
220/// Get the maximum trip count for \p L from the SCEV unsigned range, excluding
221/// zero from the range. Only valid when not folding the tail, as the minimum
222/// iteration count check guards against a zero trip count. Returns 0 if
223/// unknown.
225 Loop *L) {
226 const SCEV *BTC = PSE.getBackedgeTakenCount();
228 return 0;
229 ScalarEvolution *SE = PSE.getSE();
230 const SCEV *TripCount = SE->getTripCountFromExitCount(BTC, BTC->getType(), L);
231 ConstantRange TCRange = SE->getUnsignedRange(TripCount);
232 APInt MaxTCFromRange = TCRange.getUnsignedMax();
233 if (!MaxTCFromRange.isZero() && MaxTCFromRange.getActiveBits() <= 32)
234 return MaxTCFromRange.getZExtValue();
235 return 0;
236}
237
238/// Returns "best known" trip count, which is either a valid positive trip count
239/// or std::nullopt when an estimate cannot be made (including when the trip
240/// count would overflow), for the specified loop \p L as defined by the
241/// following procedure:
242/// 1) Returns exact trip count if it is known.
243/// 2) Returns expected trip count according to profile data if any.
244/// 3) Returns upper bound estimate if known, if \p CanUseConstantMax, and
245/// if \p ComputeUpperBoundOnly is false.
246/// 4) Returns the maximum trip count from the SCEV range excluding zero,
247/// if \p CanUseConstantMax and \p CanExcludeZeroTrips.
248/// 5) Returns std::nullopt if all of the above failed.
249static std::optional<ElementCount> getSmallBestKnownTC(
250 const VectorizeOptions &Opts, PredicatedScalarEvolution &PSE, Loop *L,
251 bool CanUseConstantMax = true, bool CanExcludeZeroTrips = false,
252 bool ComputeUpperBoundOnly = false) {
253 // Check if exact trip count is known.
254 if (auto ExpectedTC = getSmallConstantTripCount(PSE.getSE(), L))
255 return ExpectedTC;
256
257 // Check if there is an expected trip count available from profile data.
258 // An estimate of zero means the loop is estimated not to be entered; it is
259 // not a usable trip count for the profitability decisions below (and would
260 // e.g. divide by zero when scaling runtime check cost), so treat it as
261 // unknown.
262 if (Opts.loop_vectorize_with_block_frequency && !ComputeUpperBoundOnly)
263 if (unsigned EstimatedTC = getLoopEstimatedTripCount(L).value_or(0))
264 return ElementCount::getFixed(EstimatedTC);
265
266 if (!CanUseConstantMax)
267 return std::nullopt;
268
269 // Check if upper bound estimate is known.
270 if (unsigned ExpectedTC = PSE.getSmallConstantMaxTripCount())
271 return ElementCount::getFixed(ExpectedTC);
272
273 // Get the maximum trip count from the SCEV range excluding zero. This is
274 // only safe when not folding the tail, as the minimum iteration count check
275 // prevents entering the vector loop with a zero trip count.
276 if (CanUseConstantMax && CanExcludeZeroTrips)
277 if (unsigned RefinedTC = getMaxTCFromNonZeroRange(PSE, L))
278 return ElementCount::getFixed(RefinedTC);
279
280 return std::nullopt;
281}
282
283namespace {
284// Forward declare GeneratedRTChecks.
285class GeneratedRTChecks;
286
287using SCEV2ValueTy = DenseMap<const SCEV *, Value *>;
288} // namespace
289
290namespace llvm {
291
293
294/// InnerLoopVectorizer vectorizes loops which contain only one basic
295/// block to a specified vectorization factor (VF).
296/// This class performs the widening of scalars into vectors, or multiple
297/// scalars. This class also implements the following features:
298/// * It inserts an epilogue loop for handling loops that don't have iteration
299/// counts that are known to be a multiple of the vectorization factor.
300/// * It handles the code generation for reduction variables.
301/// * Scalarization (implementation using scalars) of un-vectorizable
302/// instructions.
303/// InnerLoopVectorizer does not perform any vectorization-legality
304/// checks, and relies on the caller to check for the different legality
305/// aspects. The InnerLoopVectorizer relies on the
306/// LoopVectorizationLegality class to provide information about the induction
307/// and reduction variables that were found to a given vectorization factor.
309public:
313 ElementCount VecWidth, unsigned UnrollFactor,
314 GeneratedRTChecks &RTChecks, VPlan &Plan)
315 : OrigLoop(OrigLoop), PSE(PSE), LI(LI), DT(DT), TTI(TTI), AC(AC),
316 VF(VecWidth), UF(UnrollFactor), Builder(PSE.getSE()->getModule()),
319 Plan.getVectorLoopRegion()->getSinglePredecessor())) {}
320
321 virtual ~InnerLoopVectorizer() = default;
322
323 /// Creates a basic block for the scalar preheader.
324 /// EpilogueVectorizerEpilogueLoop overrides the method to create additional
325 /// blocks and checks needed for epilogue vectorization.
327
328 /// Fix the vectorized code, taking care of header phi's, and more.
330
331protected:
333
334 /// Create and return a new IR basic block for the scalar preheader whose name
335 /// is prefixed with \p Prefix.
337
338 /// The original loop.
340
341 /// A wrapper around ScalarEvolution used to add runtime SCEV checks. Applies
342 /// dynamic knowledge to simplify SCEV expressions and converts them to a
343 /// more usable form.
345
346 /// Loop Info.
348
349 /// Dominator Tree.
351
352 /// Target Transform Info.
354
355 /// Assumption Cache.
357
358 /// The vectorization SIMD factor to use. Each vector will have this many
359 /// vector elements.
361
362 /// The vectorization unroll factor to use. Each scalar is vectorized to this
363 /// many different vector instructions.
364 unsigned UF;
365
366 /// The builder that we use
368
369 // --- Vectorization state ---
370
371 /// Structure to hold information about generated runtime checks, responsible
372 /// for cleaning the checks, if vectorization turns out unprofitable.
373 GeneratedRTChecks &RTChecks;
374
376
377 /// The vector preheader block of \p Plan, used as target for check blocks
378 /// introduced during skeleton creation.
380};
381
382/// A specialized derived class of inner loop vectorizer that performs
383/// vectorization of *epilogue* loops in the process of vectorizing loops and
384/// their epilogues. The idea is to run the vplan on a given loop twice, firstly
385/// to vectorize the main loop, and secondly to complete the skeleton from the
386/// first step and vectorize the epilogue. This helps us avoid regenerating and
387/// recomputing runtime safety checks, and shortens the iteration-count-check
388/// path length for loops whose iteration count is so small that the main vector
389/// loop is completely skipped.
391 VPlan &MainPlan;
392
393public:
395
400 unsigned UnrollFactor,
401 GeneratedRTChecks &Checks, VPlan &Plan,
402 VPlan &MainPlan)
403 : InnerLoopVectorizer(OrigLoop, PSE, LI, DT, TTI, AC, VecWidth,
404 UnrollFactor, Checks, Plan),
405 MainPlan(MainPlan) {}
406 /// Implements the interface for creating a vectorized skeleton using the
407 /// *epilogue loop* strategy (i.e., the second pass of VPlan execution).
409};
410} // end namespace llvm
411
412/// Look for a meaningful debug location on the instruction or its operands.
414 if (!I)
415 return DebugLoc::getUnknown();
416
418 if (I->getDebugLoc() != Empty)
419 return I->getDebugLoc();
420
421 for (Use &Op : I->operands()) {
422 if (Instruction *OpInst = dyn_cast<Instruction>(Op))
423 if (OpInst->getDebugLoc() != Empty)
424 return OpInst->getDebugLoc();
425 }
426
427 return I->getDebugLoc();
428}
429
430namespace llvm {
431
432/// Return the runtime value for VF.
434 return B.CreateElementCount(Ty, VF);
435}
436
437} // end namespace llvm
438
439namespace llvm {
440
441// Loop vectorization cost-model hints how the epilogue/tail loop should be
442// lowered.
444
445 // The default: allowing epilogues.
447
448 // Vectorization with OptForSize: don't allow epilogues.
450
451 // A special case of vectorisation with OptForSize: loops with a very small
452 // trip count are considered for vectorization under OptForSize, thereby
453 // making sure the cost of their loop body is dominant, free of runtime
454 // guards and scalar iteration overheads.
456
457 // Loop hint indicating an epilogue is undesired, apply tail folding.
459
460 // Directive indicating we must either fold the epilogue/tail or not vectorize
462};
463
465
466/// LoopVectorizationCostModel - estimates the expected speedups due to
467/// vectorization.
468/// In many cases vectorization is not profitable. This can happen because of
469/// a number of reasons. In this class we mainly attempt to predict the
470/// expected speedup/slowdowns due to the supported instruction set. We use the
471/// TargetTransformInfo to query the different backends for the cost of
472/// different operations.
475
476public:
483 std::function<BlockFrequencyInfo &()> GetBFI,
484 const Function *F, InterleavedAccessInfo &IAI,
485 VFSelectionContext &Config)
486 : Opts(Config.getOpts()), Config(Config), EpilogueLoweringStatus(SEL),
487 TheLoop(L), PSE(PSE), LI(LI), Legal(Legal), TTI(TTI), TLI(TLI), AC(AC),
489
490 /// \return An upper bound for the vectorization factors (both fixed and
491 /// scalable). If the factors are 0, vectorization and interleaving should be
492 /// avoided up front.
493 FixedScalableVFPair computeMaxVF(ElementCount UserVF, unsigned UserIC);
494
495 /// Memory access instruction may be vectorized in more than one way.
496 /// Form of instruction after vectorization depends on cost.
497 /// This function takes cost-based decisions for Load/Store instructions
498 /// and collects them in a map. This decisions map is used for building
499 /// the lists of loop-uniform and loop-scalar instructions.
500 /// The calculated cost is saved with widening decision in order to
501 /// avoid redundant calculations.
502 void setCostBasedWideningDecision(ElementCount VF);
503
504 /// Collect values we want to ignore in the cost model.
505 void collectValuesToIgnore();
506
507 /// \returns True if it is more profitable to scalarize instruction \p I for
508 /// vectorization factor \p VF.
510 assert(VF.isVector() &&
511 "Profitable to scalarize relevant only for VF > 1.");
512 assert(
513 TheLoop->isInnermost() &&
514 "cost-model should not be used for outer loops (in VPlan-native path)");
515
516 auto Scalars = InstsToScalarize.find(VF);
517 assert(Scalars != InstsToScalarize.end() &&
518 "VF not yet analyzed for scalarization profitability");
519 return Scalars->second.contains(I);
520 }
521
522 /// Returns true if \p I is known to be uniform after vectorization.
524 assert(
525 TheLoop->isInnermost() &&
526 "cost-model should not be used for outer loops (in VPlan-native path)");
527
528 // If VF is scalar, then all instructions are trivially uniform.
529 if (VF.isScalar())
530 return true;
531
532 // Pseudo probes must be duplicated per vector lane so that the
533 // profiled loop trip count is not undercounted.
535 return false;
536
537 auto UniformsPerVF = Uniforms.find(VF);
538 assert(UniformsPerVF != Uniforms.end() &&
539 "VF not yet analyzed for uniformity");
540 return UniformsPerVF->second.count(I);
541 }
542
543 /// Returns true if \p I is known to be scalar after vectorization.
545 assert(
546 TheLoop->isInnermost() &&
547 "cost-model should not be used for outer loops (in VPlan-native path)");
548 if (VF.isScalar())
549 return true;
550
551 auto ScalarsPerVF = Scalars.find(VF);
552 assert(ScalarsPerVF != Scalars.end() &&
553 "Scalar values are not calculated for VF");
554 return ScalarsPerVF->second.count(I);
555 }
556
557 /// \returns True if instruction \p I can be truncated to a smaller bitwidth
558 /// for vectorization factor \p VF.
560 const auto &MinBWs = Config.getMinimalBitwidths();
561 // Truncs must truncate at most to their destination type.
562 if (isa_and_nonnull<TruncInst>(I) && MinBWs.contains(I) &&
563 I->getType()->getScalarSizeInBits() < MinBWs.lookup(I))
564 return false;
565 return VF.isVector() && MinBWs.contains(I) &&
568 }
569
570 /// Decision that was taken during cost calculation for memory instruction.
573 CM_Widen, // For consecutive accesses with stride +1.
574 CM_Widen_Reverse, // For consecutive accesses with stride -1.
578 /// A widening decision that has been invalidated after replacing the
579 /// corresponding recipe during VPlan transforms.
580 /// TODO: Remove once the legacy exit cost computation is retired.
582 };
583
584#ifndef NDEBUG
586 constexpr StringLiteral WideningStr[] = {
587 "Unknown", "Widen", "Widen_Reverse", "Interleave",
588 "GatherScatter", "Scalarize", "InvalidatedDecision"};
589 return WideningStr[W];
590 }
591#endif
592
593 /// Save vectorization decision \p W and \p Cost taken by the cost model for
594 /// instruction \p I and vector width \p VF.
597 assert(VF.isVector() && "Expected VF >=2");
598 LLVM_DEBUG(dbgs() << "LV: Setting widening decision to "
599 << getInstWideningStr(W) << " for VF " << VF
600 << " and instruction: " << *I << '\n');
601 WideningDecisions[{I, VF}] = {W, Cost};
602 }
603
604 /// Save vectorization decision \p W and \p Cost taken by the cost model for
605 /// interleaving group \p Grp and vector width \p VF.
609 assert(VF.isVector() && "Expected VF >=2");
610 /// Broadcast this decicion to all instructions inside the group.
611 /// When interleaving, the cost will only be assigned one instruction, the
612 /// insert position. For other cases, add the appropriate fraction of the
613 /// total cost to each instruction. This ensures accurate costs are used,
614 /// even if the insert position instruction is not used.
615 InstructionCost InsertPosCost = Cost;
616 InstructionCost OtherMemberCost = 0;
617 if (W != CM_Interleave)
618 OtherMemberCost = InsertPosCost = Cost / Grp->getNumMembers();
619 ;
620 for (auto *I : Grp->members()) {
621 LLVM_DEBUG(dbgs() << "LV: Setting widening decision to "
622 << getInstWideningStr(W) << " for VF " << VF
623 << " and instruction: " << *I << '\n');
624 if (Grp->getInsertPos() == I)
625 WideningDecisions[{I, VF}] = {W, InsertPosCost};
626 else
627 WideningDecisions[{I, VF}] = {W, OtherMemberCost};
628 }
629 }
630
631 /// Return the cost model decision for the given instruction \p I and vector
632 /// width \p VF. Return CM_Unknown if this instruction did not pass
633 /// through the cost modeling.
635 assert(VF.isVector() && "Expected VF to be a vector VF");
636 assert(
637 TheLoop->isInnermost() &&
638 "cost-model should not be used for outer loops (in VPlan-native path)");
639
640 std::pair<Instruction *, ElementCount> InstOnVF(I, VF);
641 auto Itr = WideningDecisions.find(InstOnVF);
642 if (Itr == WideningDecisions.end())
643 return CM_Unknown;
644 return Itr->second.first;
645 }
646
647 /// Return the vectorization cost for the given instruction \p I and vector
648 /// width \p VF.
650 assert(VF.isVector() && "Expected VF >=2");
651 std::pair<Instruction *, ElementCount> InstOnVF(I, VF);
652 assert(WideningDecisions.contains(InstOnVF) &&
653 "The cost is not calculated");
654 return WideningDecisions[InstOnVF].second;
655 }
656
657 /// Return True if instruction \p I is an optimizable truncate whose operand
658 /// is an induction variable. Such a truncate will be removed by adding a new
659 /// induction variable with the destination type.
661 // If the instruction is not a truncate, return false.
662 auto *Trunc = dyn_cast<TruncInst>(I);
663 if (!Trunc)
664 return false;
665
666 // Get the source and destination types of the truncate.
667 Type *SrcTy = toVectorTy(Trunc->getSrcTy(), VF);
668 Type *DestTy = toVectorTy(Trunc->getDestTy(), VF);
669
670 // If the truncate is free for the given types, return false. Replacing a
671 // free truncate with an induction variable would add an induction variable
672 // update instruction to each iteration of the loop. We exclude from this
673 // check the primary induction variable since it will need an update
674 // instruction regardless.
675 Value *Op = Trunc->getOperand(0);
676 if (Op != Legal->getPrimaryInduction() && TTI.isTruncateFree(SrcTy, DestTy))
677 return false;
678
679 // If the truncated value is not an induction variable, return false.
680 return Legal->isInductionPhi(Op);
681 }
682
683 /// Collects the instructions to scalarize for each predicated instruction in
684 /// the loop.
685 void collectInstsToScalarize(ElementCount VF);
686
687 /// Collect values that will not be widened, including Uniforms, Scalars, and
688 /// Instructions to Scalarize for the given \p VF.
689 /// The sets depend on CM decision for Load/Store instructions
690 /// that may be vectorized as interleave, gather-scatter or scalarized.
691 /// Also make a decision on what to do about call instructions in the loop
692 /// at that VF -- scalarize, call a known vector routine, or call a
693 /// vector intrinsic.
695 // Do the analysis once.
696 if (VF.isScalar() || Uniforms.contains(VF))
697 return;
699 collectLoopUniforms(VF);
700 collectLoopScalars(VF);
702 }
703
704 /// Given costs for both strategies, return true if the scalar predication
705 /// lowering should be used for div/rem. This incorporates an override
706 /// option so it is not simply a cost comparison.
708 InstructionCost MaskedCost) const {
709 return !valueOr(Opts.force_widen_divrem_via_masked_intrinsic,
710 !(ScalarCost < MaskedCost));
711 }
712
713 /// Returns true if \p I is an instruction which requires predication and
714 /// for which our chosen predication strategy is scalarization (i.e. we
715 /// don't have an alternate strategy such as masking available).
716 /// \p VF is the vectorization factor that will be used to vectorize \p I.
717 bool isScalarWithPredication(Instruction *I, ElementCount VF);
718
719 /// Wrapper function for LoopVectorizationLegality::isMaskRequired,
720 /// that passes the Instruction \p I and if we fold tail.
721 bool isMaskRequired(Instruction *I) const;
722
723 /// Returns true if \p I is an instruction that needs to be predicated
724 /// at runtime. The result is independent of the predication mechanism.
725 /// Superset of instructions that return true for isScalarWithPredication.
726 bool isPredicatedInst(Instruction *I) const;
727
728 /// A helper function that returns how much we should divide the cost of a
729 /// predicated block by. Typically this is the reciprocal of the block
730 /// probability, i.e. if we return X we are assuming the predicated block will
731 /// execute once for every X iterations of the loop header so the block should
732 /// only contribute 1/X of its cost to the total cost calculation, but when
733 /// optimizing for code size it will just be 1 as code size costs don't depend
734 /// on execution probabilities.
735 ///
736 /// Note that if a block wasn't originally predicated but was predicated due
737 /// to tail folding, the divisor will still be 1 because it will execute for
738 /// every iteration of the loop header.
739 inline uint64_t
740 getPredBlockCostDivisor(TargetTransformInfo::TargetCostKind CostKind,
741 const BasicBlock *BB);
742
743 /// Returns true if an artificially high cost for emulated masked memrefs
744 /// should be used.
745 bool useEmulatedMaskMemRefHack(Instruction *I, ElementCount VF) const;
746
747 /// Return the costs for our two available strategies for lowering a
748 /// div/rem operation which requires speculating at least one lane.
749 /// First result is for scalarization (will be invalid for scalable
750 /// vectors); second is for the masked intrinsic strategy.
751 std::pair<InstructionCost, InstructionCost>
752 getDivRemSpeculationCost(Instruction *I, ElementCount VF);
753
754 /// If \p I is a memory instruction with a consecutive pointer that can be
755 /// widened, returns the widening kind (CM_Widen or CM_Widen_Reverse) and
756 /// std::nullopt otherwise.
757 std::optional<InstWidening> memoryInstructionCanBeWidened(Instruction *I,
758 ElementCount VF);
759
760 /// Returns true if \p I is a memory instruction in an interleaved-group
761 /// of memory accesses that can be vectorized with wide vector loads/stores
762 /// and shuffles.
763 bool interleavedAccessCanBeWidened(Instruction *I, ElementCount VF) const;
764
765 /// Returns true if the target machine supports masked loads or stores
766 /// for \p I's data type and alignment. The caller must ensure the access is
767 /// consecutive or part of an interleave group.
768 bool isLegalMaskedLoadOrStore(Instruction *I, ElementCount VF) const;
769
770 /// Returns true if the target machine supports gather or scatter for \p I's
771 /// data type and alignment.
772 bool isLegalGatherOrScatter(Instruction *I, ElementCount VF) const;
773
774 /// Check if \p Instr belongs to any interleaved access group.
775 bool isAccessInterleaved(Instruction *Instr) const {
776 return InterleaveInfo.isInterleaved(Instr);
777 }
778
779 /// Get the interleaved access group that \p Instr belongs to.
782 return InterleaveInfo.getInterleaveGroup(Instr);
783 }
784
785 /// Returns true if we're required to use a scalar epilogue for at least
786 /// the final iteration of the original loop.
787 bool requiresScalarEpilogue(bool IsVectorizing) const {
788 if (!isEpilogueAllowed()) {
789 LLVM_DEBUG(dbgs() << "LV: Loop does not require scalar epilogue\n");
790 return false;
791 }
792 // If we might exit from anywhere but the latch and early exit vectorization
793 // is disabled, we must run the exiting iteration in scalar form.
794 if (TheLoop->getExitingBlock() != TheLoop->getLoopLatch() &&
795 !(Opts.enable_early_exit_vectorization &&
796 Legal->hasUncountableEarlyExit())) {
797 LLVM_DEBUG(dbgs() << "LV: Loop requires scalar epilogue: not exiting "
798 "from latch block\n");
799 return true;
800 }
801 if (IsVectorizing && InterleaveInfo.requiresScalarEpilogue()) {
802 LLVM_DEBUG(dbgs() << "LV: Loop requires scalar epilogue: "
803 "interleaved group requires scalar epilogue\n");
804 return true;
805 }
806 LLVM_DEBUG(dbgs() << "LV: Loop does not require scalar epilogue\n");
807 return false;
808 }
809
810 /// Returns true if an epilogue is allowed (e.g., not prevented by
811 /// optsize or a loop hint annotation).
812 bool isEpilogueAllowed() const {
813 return EpilogueLoweringStatus == CM_EpilogueAllowed;
814 }
815
816 /// Returns the TailFoldingStyle that is best for the current loop.
818 return ChosenTailFoldingStyle;
819 }
820
821 /// Selects and saves TailFoldingStyle.
822 /// \param IsScalableVF true if scalable vector factors enabled.
823 /// \param UserIC User specific interleave count.
824 void setTailFoldingStyle(bool IsScalableVF, unsigned UserIC) {
825 assert(ChosenTailFoldingStyle == TailFoldingStyle::None &&
826 "Tail folding must not be selected yet.");
827 if (!Legal->canFoldTailByMasking()) {
828 ChosenTailFoldingStyle = TailFoldingStyle::None;
829 return;
830 }
831
832 // Default to TTI preference, but allow command line override.
833 ChosenTailFoldingStyle = Opts.force_tail_folding_style.value_or(
834 TTI.getPreferredTailFoldingStyle());
835
836 if (ChosenTailFoldingStyle != TailFoldingStyle::DataWithEVL)
837 return;
838 // Override EVL styles if needed.
839 // FIXME: Investigate opportunity for fixed vector factor.
840 bool EVLIsLegal = UserIC <= 1 && IsScalableVF &&
841 TTI.hasActiveVectorLength() &&
842 !Opts.enable_vplan_native_path;
843 if (EVLIsLegal)
844 return;
845 // If for some reason EVL mode is unsupported, fallback to an epilogue
846 // if it's allowed, or DataWithoutLaneMask otherwise.
847 if (EpilogueLoweringStatus == CM_EpilogueAllowed ||
848 EpilogueLoweringStatus == CM_EpilogueNotNeededFoldTail)
849 ChosenTailFoldingStyle = TailFoldingStyle::None;
850 else
851 ChosenTailFoldingStyle = TailFoldingStyle::DataWithoutLaneMask;
852
854 dbgs() << "LV: Preference for VP intrinsics indicated. Will "
855 "not try to generate VP Intrinsics "
856 << (UserIC > 1
857 ? "since interleave count specified is greater than 1.\n"
858 : "due to non-interleaving reasons.\n"));
859 }
860
861 /// Returns true if all loop blocks should be masked to fold tail loop.
862 bool foldTailByMasking() const {
864 }
865
867 assert(foldTailByMasking() && "Expected tail folding to be enabled!");
869 "Did not expect to enable alias masking with EVL!");
870 assert(PartialAliasMaskingStatus == AliasMaskingStatus::NotDecided);
871
872 // Assume we fail to enable alias masking (in case we early exit).
873 PartialAliasMaskingStatus = AliasMaskingStatus::Disabled;
874
875 // Note: FixedOrderRecurrences are not supported yet as we cannot handle
876 // the required `splice.right` with the alias-mask.
877 if (!Opts.force_partial_aliasing_vectorization ||
878 !Legal->getFixedOrderRecurrences().empty())
879 return;
880
881 const RuntimePointerChecking *Checks = Legal->getRuntimePointerChecking();
882 if (!Checks)
883 return;
884
885 auto DiffChecks = Checks->getDiffChecks();
886 if (!DiffChecks || DiffChecks->empty())
887 return;
888
889 [[maybe_unused]] auto HasPointerArgs = [](CallBase *CB) {
890 return any_of(CB->args(), [](Value const *Arg) {
891 return Arg->getType()->isPointerTy();
892 });
893 };
894
895 for (BasicBlock *BB : TheLoop->blocks()) {
896 for (Instruction &I : *BB) {
898 [[maybe_unused]] auto *Call = dyn_cast<CallInst>(&I);
899 assert(
900 (!I.mayReadOrWriteMemory() || (Call && !HasPointerArgs(Call))) &&
901 "Skipped unexpected memory access");
902 continue;
903 }
904
905 Type *ScalarTy = getLoadStoreType(&I);
907
908 // Currently, we can't handle alias masking in reverse. Reversing the
909 // alias mask is not correct (or necessary). When combined with
910 // tail-folding the active lane mask should only be reversed where the
911 // alias-mask is true.
912 if (Legal->isConsecutivePtr(ScalarTy, Ptr) == -1)
913 return;
914 }
915 }
916
917 PartialAliasMaskingStatus = AliasMaskingStatus::Enabled;
918 }
919
920 /// Returns true if all loop blocks should have partial aliases masked.
921 bool maskPartialAliasing() const {
922 return PartialAliasMaskingStatus == AliasMaskingStatus::Enabled;
923 }
924
925 /// Returns true if the instructions in this block requires predication
926 /// for any reason, e.g. because tail folding now requires a predicate
927 /// or because the block in the original loop was predicated.
929 return foldTailByMasking() || Legal->blockNeedsPredication(BB);
930 }
931
932 /// Returns true if VP intrinsics with explicit vector length support should
933 /// be generated in the tail folded loop.
937
938 /// Returns true if the predicated reduction select should be used to set the
939 /// incoming value for the reduction phi.
941 bool HasUsesOutsideReductionChain) const {
942 // Force to use predicated reduction select since the EVL of the
943 // second-to-last iteration might not be VF*UF.
944 if (foldTailWithEVL())
945 return true;
946
947 // Force a predicated select with alias-masking to avoid propagating poison
948 // values to the header phi for lanes outside the alias-mask.
950 return true;
951
952 // Note: For FindLast recurrences and multi-use reductions we prefer a
953 // predicated select to simplify matching in handleFindLastReductions() and
954 // handleMultiUseReductions() respectively, rather than handle multiple
955 // cases.
957 HasUsesOutsideReductionChain)
958 return true;
959
960 return Opts.prefer_predicated_reduction_select ||
961 TTI.preferPredicatedReductionSelect();
962 }
963
964 /// Estimate cost of an intrinsic call instruction CI if it were vectorized
965 /// with factor VF. Return the cost of the instruction, including
966 /// scalarization overhead if it's needed.
967 InstructionCost getVectorIntrinsicCost(CallInst *CI, ElementCount VF) const;
968
969 /// Estimate cost of a call instruction CI if it were vectorized with factor
970 /// VF. Return the cost of the instruction, including scalarization overhead
971 /// if it's needed.
972 InstructionCost getVectorCallCost(CallInst *CI, ElementCount VF) const;
973
974 /// Invalidates decisions already taken by the cost model.
976 WideningDecisions.clear();
977 Uniforms.clear();
978 Scalars.clear();
979 }
980
981 /// Returns the expected execution cost. The unit of the cost does
982 /// not matter because we use the 'cost' units to compare different
983 /// vector widths. The cost that is returned is *not* normalized by
984 /// the factor width.
985 InstructionCost expectedCost(ElementCount VF);
986
987 /// Returns the execution time cost of an instruction for a given vector
988 /// width. Vector width of one means scalar.
989 InstructionCost getInstructionCost(Instruction *I, ElementCount VF);
990
991 /// Returns true if \p Op should be considered invariant and if it is
992 /// trivially hoistable.
993 bool shouldConsiderInvariant(Value *Op);
994
995 /// Returns true if \p I has been forced to be scalarized at \p VF.
997 auto FS = ForcedScalars.find(VF);
998 return FS != ForcedScalars.end() && FS->second.contains(I);
999 }
1000
1001private:
1002 const VectorizeOptions &Opts;
1003
1004 unsigned NumPredStores = 0;
1005
1006 /// VF selection state independent of cost-modeling decisions.
1007 VFSelectionContext &Config;
1008
1009 /// Wrapper around LoopVectorizationLegality::isUniform() that takes into
1010 /// account if alias-masking is enabled. We consider the VF to be unknown when
1011 /// alias masking.
1012 bool isUniform(Value *V, ElementCount VF) const {
1013 // With alias-masking our runtime VF is [2, VF] (and not necessarily a
1014 // power-of-two). Something that is uniform for VF may not be for the full
1015 // range.
1016 assert(PartialAliasMaskingStatus != AliasMaskingStatus::NotDecided &&
1017 "alias-mask status must be decided already");
1018 return Legal->isUniform(V, PartialAliasMaskingStatus ==
1020 ? std::optional(VF)
1021 : std::nullopt);
1022 }
1023
1024 /// Wrapper around LoopVectorizationLegality::isUniformMemOp() that takes into
1025 /// account if alias-masking is enabled. We consider the VF to be unknown when
1026 /// alias masking.
1027 bool isUniformMemOp(Instruction &I, ElementCount VF) const {
1028 assert(PartialAliasMaskingStatus != AliasMaskingStatus::NotDecided &&
1029 "alias-mask status must be decided already");
1030 return Legal->isUniformMemOp(I, PartialAliasMaskingStatus ==
1032 ? std::optional(VF)
1033 : std::nullopt);
1034 }
1035
1036 /// Calculate vectorization cost of memory instruction \p I.
1037 InstructionCost getMemoryInstructionCost(Instruction *I, ElementCount VF);
1038
1039 /// The cost computation for scalarized memory instruction.
1040 InstructionCost getMemInstScalarizationCost(Instruction *I, ElementCount VF);
1041
1042 /// The cost computation for interleaving group of memory instructions.
1043 InstructionCost getInterleaveGroupCost(Instruction *I, ElementCount VF) const;
1044
1045 /// The cost computation for Gather/Scatter instruction.
1046 InstructionCost getGatherScatterCost(Instruction *I, ElementCount VF) const;
1047
1048 /// The cost computation for widening instruction \p I with consecutive
1049 /// memory access.
1050 InstructionCost getConsecutiveMemOpCost(Instruction *I, ElementCount VF,
1051 InstWidening Kind);
1052
1053 /// The cost calculation for Load/Store instruction \p I with uniform pointer -
1054 /// Load: scalar load + broadcast.
1055 /// Store: scalar store + (loop invariant value stored? 0 : extract of last
1056 /// element)
1057 InstructionCost getUniformMemOpCost(Instruction *I, ElementCount VF) const;
1058
1059 /// Estimate the overhead of scalarizing an instruction. This is a
1060 /// convenience wrapper for the type-based getScalarizationOverhead API.
1062 ElementCount VF) const;
1063
1064 /// A type representing the costs for instructions if they were to be
1065 /// scalarized rather than vectorized. The entries are Instruction-Cost
1066 /// pairs.
1067 using ScalarCostsTy = MapVector<Instruction *, InstructionCost>;
1068
1069 /// A set containing all BasicBlocks that are known to present after
1070 /// vectorization as a predicated block.
1071 DenseMap<ElementCount, SmallPtrSet<BasicBlock *, 4>>
1072 PredicatedBBsAfterVectorization;
1073
1074 /// Records whether it is allowed to have the original scalar loop execute at
1075 /// least once. This may be needed as a fallback loop in case runtime
1076 /// aliasing/dependence checks fail, or to handle the tail/remainder
1077 /// iterations when the trip count is unknown or doesn't divide by the VF,
1078 /// or as a peel-loop to handle gaps in interleave-groups.
1079 /// Under optsize and when the trip count is very small we don't allow any
1080 /// iterations to execute in the scalar loop.
1081 EpilogueLowering EpilogueLoweringStatus = CM_EpilogueAllowed;
1082
1083 /// Control finally chosen tail folding style.
1084 TailFoldingStyle ChosenTailFoldingStyle = TailFoldingStyle::None;
1085
1086 /// If partial alias masking is enabled/disabled or not decided.
1087 AliasMaskingStatus PartialAliasMaskingStatus = AliasMaskingStatus::NotDecided;
1088
1089 /// A map holding scalar costs for different vectorization factors. The
1090 /// presence of a cost for an instruction in the mapping indicates that the
1091 /// instruction will be scalarized when vectorizing with the associated
1092 /// vectorization factor. The entries are VF-ScalarCostTy pairs.
1093 MapVector<ElementCount, ScalarCostsTy> InstsToScalarize;
1094
1095 /// Holds the instructions known to be uniform after vectorization.
1096 /// The data is collected per VF.
1097 DenseMap<ElementCount, SmallPtrSet<Instruction *, 4>> Uniforms;
1098
1099 /// Holds the instructions known to be scalar after vectorization.
1100 /// The data is collected per VF.
1101 DenseMap<ElementCount, SmallPtrSet<Instruction *, 4>> Scalars;
1102
1103 /// Holds the instructions (address computations) that are forced to be
1104 /// scalarized.
1105 DenseMap<ElementCount, SmallSetVector<Instruction *, 4>> ForcedScalars;
1106
1107 /// Returns the expected difference in cost from scalarizing the expression
1108 /// feeding a predicated instruction \p PredInst. The instructions to
1109 /// scalarize and their scalar costs are collected in \p ScalarCosts. A
1110 /// non-negative return value implies the expression will be scalarized.
1111 /// Currently, only single-use chains are considered for scalarization.
1112 InstructionCost computePredInstDiscount(Instruction *PredInst,
1113 ScalarCostsTy &ScalarCosts,
1114 ElementCount VF);
1115
1116 /// Collect the instructions that are uniform after vectorization. An
1117 /// instruction is uniform if we represent it with a single scalar value in
1118 /// the vectorized loop corresponding to each vector iteration. Examples of
1119 /// uniform instructions include pointer operands of consecutive or
1120 /// interleaved memory accesses. Note that although uniformity implies an
1121 /// instruction will be scalar, the reverse is not true. In general, a
1122 /// scalarized instruction will be represented by VF scalar values in the
1123 /// vectorized loop, each corresponding to an iteration of the original
1124 /// scalar loop.
1125 void collectLoopUniforms(ElementCount VF);
1126
1127 /// Collect the instructions that are scalar after vectorization. An
1128 /// instruction is scalar if it is known to be uniform or will be scalarized
1129 /// during vectorization. collectLoopScalars should only add non-uniform nodes
1130 /// to the list if they are used by a load/store instruction that is marked as
1131 /// CM_Scalarize. Non-uniform scalarized instructions will be represented by
1132 /// VF values in the vectorized loop, each corresponding to an iteration of
1133 /// the original scalar loop.
1134 void collectLoopScalars(ElementCount VF);
1135
1136 /// Keeps cost model vectorization decision and cost for instructions.
1137 /// Right now it is used for memory instructions only.
1138 using DecisionList = DenseMap<std::pair<Instruction *, ElementCount>,
1139 std::pair<InstWidening, InstructionCost>>;
1140
1141 DecisionList WideningDecisions;
1142
1143 /// Returns true if \p V is expected to be vectorized and it needs to be
1144 /// extracted.
1145 bool needsExtract(Value *V, ElementCount VF) const {
1147 if (VF.isScalar() || !I || !TheLoop->contains(I) ||
1148 TheLoop->isLoopInvariant(I) ||
1149 getWideningDecision(I, VF) == CM_Scalarize)
1150 return false;
1151
1152 // Assume we can vectorize V (and hence we need extraction) if the
1153 // scalars are not computed yet. This can happen, because it is called
1154 // via getScalarizationOverhead from setCostBasedWideningDecision, before
1155 // the scalars are collected. That should be a safe assumption in most
1156 // cases, because we check if the operands have vectorizable types
1157 // beforehand in LoopVectorizationLegality.
1158 return !Scalars.contains(VF) || !isScalarAfterVectorization(I, VF);
1159 };
1160
1161 /// Returns a range containing only operands needing to be extracted.
1162 SmallVector<Value *, 4> filterExtractingOperands(Instruction::op_range Ops,
1163 ElementCount VF) const {
1164
1165 SmallPtrSet<const Value *, 4> UniqueOperands;
1166 SmallVector<Value *, 4> Res;
1167 for (Value *Op : Ops) {
1168 if (isa<Constant>(Op) || !UniqueOperands.insert(Op).second ||
1169 !needsExtract(Op, VF))
1170 continue;
1171 Res.push_back(Op);
1172 }
1173 return Res;
1174 }
1175
1176public:
1177 /// The loop that we evaluate.
1179
1180 /// Predicated scalar evolution analysis.
1182
1183 /// Loop Info analysis.
1185
1186 /// Vectorization legality.
1188
1189 /// Vector target information.
1191
1192 /// Target Library Info.
1194
1195 /// Assumption cache.
1197
1198 /// Interface to emit optimization remarks.
1200
1201 /// A function to lazily fetch BlockFrequencyInfo. This avoids computing it
1202 /// unless necessary, e.g. when the loop isn't legal to vectorize or when
1203 /// there is no predication.
1204 std::function<BlockFrequencyInfo &()> GetBFI;
1205 /// The BlockFrequencyInfo returned from GetBFI.
1207 /// Returns the BlockFrequencyInfo for the function if cached, otherwise
1208 /// fetches it via GetBFI. Avoids an indirect call to the std::function.
1210 if (!BFI)
1211 BFI = &GetBFI();
1212 return *BFI;
1213 }
1214
1216
1217 /// The interleave access information contains groups of interleaved accesses
1218 /// with the same stride and close to each other.
1220
1221 /// Values to ignore in the cost model.
1223
1224 /// Values to ignore in the cost model when VF > 1.
1226};
1227} // end namespace llvm
1228
1229namespace {
1230/// Helper struct to manage generating runtime checks for vectorization.
1231///
1232/// The runtime checks are created up-front in temporary blocks to allow better
1233/// estimating the cost and un-linked from the existing IR. After deciding to
1234/// vectorize, the checks are attached to VPlan as IR or recipes. If deciding
1235/// not to vectorize, the temporary blocks are completely removed.
1236class GeneratedRTChecks {
1237 const VectorizeOptions &Opts;
1238
1239 /// Basic block which contains the generated SCEV checks, if any.
1240 BasicBlock *SCEVCheckBlock = nullptr;
1241
1242 /// The value representing the result of the generated SCEV checks. If it is
1243 /// nullptr no SCEV checks have been generated.
1244 Value *SCEVCheckCond = nullptr;
1245
1246 /// Basic block which contains the generated memory runtime checks, if any.
1247 BasicBlock *MemCheckBlock = nullptr;
1248
1249 /// The value representing the result of the generated memory runtime checks.
1250 /// If it is nullptr no memory runtime checks have been generated.
1251 Value *MemRuntimeCheckCond = nullptr;
1252
1253 /// Whether checks were generated, retained after their IR is replaced or
1254 /// removed during VPlan execution.
1255 bool HasChecks = false;
1256
1257 DominatorTree *DT;
1258 LoopInfo *LI;
1260
1261 SCEVExpander SCEVExp;
1262 SCEVExpander MemCheckExp;
1263
1264 bool CostTooHigh = false;
1265
1266 Loop *OuterLoop = nullptr;
1267
1269
1270 /// The kind of cost that we are calculating
1272
1273 /// True if the loop is alias-masked (which allows us to omit diff checks).
1274 bool LoopUsesPartialAliasMasking = false;
1275
1276public:
1277 GeneratedRTChecks(const VectorizeOptions &Opts,
1281 bool LoopUsesPartialAliasMasking)
1282 : Opts(Opts), DT(DT), LI(LI), TTI(TTI),
1283 SCEVExp(*PSE.getSE(), "scev.check", /*PreserveLCSSA=*/false),
1284 MemCheckExp(*PSE.getSE(), "scev.check", /*PreserveLCSSA=*/false),
1285 PSE(PSE), CostKind(CostKind),
1286 LoopUsesPartialAliasMasking(LoopUsesPartialAliasMasking) {}
1287
1288 /// Generate runtime checks in SCEVCheckBlock and MemCheckBlock, so we can
1289 /// accurately estimate the cost of the runtime checks. The blocks are
1290 /// un-linked from the IR and attached to VPlan as IR or recipes if
1291 /// profitable. Otherwise, the check blocks are removed completely.
1292 void create(Loop *L, const LoopAccessInfo &LAI,
1293 const SCEVPredicate &UnionPred, ElementCount VF, unsigned IC,
1294 OptimizationRemarkEmitter &ORE) {
1295
1296 // Hard cutoff to limit compile-time increase in case a very large number of
1297 // runtime checks needs to be generated.
1298 // TODO: Skip cutoff if the loop is guaranteed to execute, e.g. due to
1299 // profile info.
1300 CostTooHigh = LAI.getNumRuntimePointerChecks() >
1302 if (CostTooHigh) {
1303 // Mark runtime checks as never succeeding when they exceed the threshold.
1304 MemRuntimeCheckCond = ConstantInt::getTrue(L->getHeader()->getContext());
1305 SCEVCheckCond = ConstantInt::getTrue(L->getHeader()->getContext());
1306 ORE.emit([&]() {
1307 return OptimizationRemarkAnalysisAliasing(
1308 DEBUG_TYPE, "TooManyMemoryRuntimeChecks", L->getStartLoc(),
1309 L->getHeader())
1310 << "loop not vectorized: too many memory checks needed";
1311 });
1312 LLVM_DEBUG(dbgs() << "LV: Too many memory checks needed.\n");
1313 return;
1314 }
1315
1316 BasicBlock *LoopHeader = L->getHeader();
1317 BasicBlock *Preheader = L->getLoopPreheader();
1318
1319 // Use SplitBlock to create blocks for SCEV & memory runtime checks to
1320 // ensure the blocks are properly added to LoopInfo & DominatorTree. Those
1321 // may be used by SCEVExpander. The blocks will be un-linked from their
1322 // predecessors and removed from LI & DT at the end of the function.
1323 if (!UnionPred.isAlwaysTrue()) {
1324 SCEVCheckBlock = SplitBlock(Preheader, Preheader->getTerminator(), DT, LI,
1325 nullptr, "vector.scevcheck");
1326
1327 SCEVCheckCond = SCEVExp.expandCodeForPredicate(
1328 &UnionPred, SCEVCheckBlock->getTerminator());
1329 if (isa<Constant>(SCEVCheckCond)) {
1330 // Clean up directly after expanding the predicate to a constant, to
1331 // avoid further expansions re-using anything left over from SCEVExp.
1332 SCEVExpanderCleaner SCEVCleaner(SCEVExp);
1333 SCEVCleaner.cleanup();
1334 }
1335 }
1336
1337 const auto &RtPtrChecking = *LAI.getRuntimePointerChecking();
1338 // TODO: We need to estimate the cost of alias-masking in
1339 // GeneratedRTChecks::getCost(). We can't check the MemCheckBlock as the
1340 // alias-mask is generated later in VPlan.
1341 if (RtPtrChecking.Need && !LoopUsesPartialAliasMasking) {
1342 auto *Pred = SCEVCheckBlock ? SCEVCheckBlock : Preheader;
1343 MemCheckBlock = SplitBlock(Pred, Pred->getTerminator(), DT, LI, nullptr,
1344 "vector.memcheck");
1345
1346 auto DiffChecks = RtPtrChecking.getDiffChecks();
1347 if (DiffChecks) {
1348 MemRuntimeCheckCond = addDiffRuntimeChecks(
1349 MemCheckBlock->getTerminator(), *DiffChecks, MemCheckExp, VF, IC);
1350 } else {
1351 MemRuntimeCheckCond = addRuntimeChecks(
1352 MemCheckBlock->getTerminator(), L, RtPtrChecking.getChecks(),
1354 }
1355 assert(MemRuntimeCheckCond &&
1356 "no RT checks generated although RtPtrChecking "
1357 "claimed checks are required");
1358 }
1359
1360 SCEVExp.eraseDeadInstructions(SCEVCheckCond);
1361 HasChecks = getSCEVChecks().first || getMemRuntimeChecks().first;
1362
1363 if (!MemCheckBlock && !SCEVCheckBlock)
1364 return;
1365
1366 // Unhook the temporary block with the checks, update various places
1367 // accordingly.
1368 if (SCEVCheckBlock)
1369 SCEVCheckBlock->replaceAllUsesWith(Preheader);
1370 if (MemCheckBlock)
1371 MemCheckBlock->replaceAllUsesWith(Preheader);
1372
1373 if (SCEVCheckBlock) {
1374 SCEVCheckBlock->getTerminator()->moveBefore(
1375 Preheader->getTerminator()->getIterator());
1376 auto *UI = new UnreachableInst(Preheader->getContext(), SCEVCheckBlock);
1377 UI->setDebugLoc(DebugLoc::getTemporary());
1378 Preheader->getTerminator()->eraseFromParent();
1379 }
1380 if (MemCheckBlock) {
1381 MemCheckBlock->getTerminator()->moveBefore(
1382 Preheader->getTerminator()->getIterator());
1383 auto *UI = new UnreachableInst(Preheader->getContext(), MemCheckBlock);
1384 UI->setDebugLoc(DebugLoc::getTemporary());
1385 Preheader->getTerminator()->eraseFromParent();
1386 }
1387
1388 DT->changeImmediateDominator(LoopHeader, Preheader);
1389 if (MemCheckBlock) {
1390 DT->eraseNode(MemCheckBlock);
1391 LI->removeBlock(MemCheckBlock);
1392 }
1393 if (SCEVCheckBlock) {
1394 DT->eraseNode(SCEVCheckBlock);
1395 LI->removeBlock(SCEVCheckBlock);
1396 }
1397
1398 // Outer loop is used as part of the later cost calculations.
1399 OuterLoop = L->getParentLoop();
1400 }
1401
1403 if (SCEVCheckBlock || MemCheckBlock)
1404 LLVM_DEBUG(dbgs() << "Calculating cost of runtime checks:\n");
1405
1406 if (CostTooHigh) {
1408 Cost.setInvalid();
1409 LLVM_DEBUG(dbgs() << " number of checks exceeded threshold\n");
1410 return Cost;
1411 }
1412
1413 InstructionCost RTCheckCost = 0;
1414 if (SCEVCheckBlock)
1415 for (Instruction &I : *SCEVCheckBlock) {
1416 if (SCEVCheckBlock->getTerminator() == &I)
1417 continue;
1419 LLVM_DEBUG(dbgs() << " " << C << " for " << I << "\n");
1420 RTCheckCost += C;
1421 }
1422 if (MemCheckBlock) {
1423 InstructionCost MemCheckCost = 0;
1424 for (Instruction &I : *MemCheckBlock) {
1425 if (MemCheckBlock->getTerminator() == &I)
1426 continue;
1428 LLVM_DEBUG(dbgs() << " " << C << " for " << I << "\n");
1429 MemCheckCost += C;
1430 }
1431
1432 // If the runtime memory checks are being created inside an outer loop
1433 // we should find out if these checks are outer loop invariant. If so,
1434 // the checks will likely be hoisted out and so the effective cost will
1435 // reduce according to the outer loop trip count.
1436 if (OuterLoop) {
1437 ScalarEvolution *SE = MemCheckExp.getSE();
1438 // TODO: If profitable, we could refine this further by analysing every
1439 // individual memory check, since there could be a mixture of loop
1440 // variant and invariant checks that mean the final condition is
1441 // variant.
1442 const SCEV *Cond = SE->getSCEV(MemRuntimeCheckCond);
1443 if (SE->isLoopInvariant(Cond, OuterLoop)) {
1444 // It seems reasonable to assume that we can reduce the effective
1445 // cost of the checks even when we know nothing about the trip
1446 // count. Assume that the outer loop executes at least twice.
1447 unsigned BestTripCount = 2;
1448
1449 // Get the best known TC estimate.
1450 if (auto EstimatedTC = getSmallBestKnownTC(
1451 Opts, PSE, OuterLoop, /* CanUseConstantMax = */ false))
1452 if (EstimatedTC->isFixed())
1453 BestTripCount = EstimatedTC->getFixedValue();
1454
1455 InstructionCost NewMemCheckCost = MemCheckCost / BestTripCount;
1456
1457 // Let's ensure the cost is always at least 1.
1458 NewMemCheckCost = std::max(NewMemCheckCost.getValue(),
1459 (InstructionCost::CostType)1);
1460
1461 if (BestTripCount > 1)
1463 << "We expect runtime memory checks to be hoisted "
1464 << "out of the outer loop. Cost reduced from "
1465 << MemCheckCost << " to " << NewMemCheckCost << '\n');
1466
1467 MemCheckCost = NewMemCheckCost;
1468 }
1469 }
1470
1471 RTCheckCost += MemCheckCost;
1472 }
1473
1474 if (SCEVCheckBlock || MemCheckBlock)
1475 LLVM_DEBUG(dbgs() << "Total cost of runtime checks: " << RTCheckCost
1476 << "\n");
1477
1478 return RTCheckCost;
1479 }
1480
1481 /// Remove the created SCEV & memory runtime check blocks & instructions, if
1482 /// unused.
1483 ~GeneratedRTChecks() {
1484 SCEVExpanderCleaner SCEVCleaner(SCEVExp);
1485 bool SCEVChecksUsed = !SCEVCheckBlock || !pred_empty(SCEVCheckBlock);
1486 if (SCEVChecksUsed)
1487 SCEVCleaner.markResultUsed();
1488
1489 if (MemCheckBlock && pred_empty(MemCheckBlock))
1490 eraseMemCheckBlock();
1491
1492 SCEVCleaner.cleanup();
1493
1494 if (!SCEVChecksUsed)
1495 SCEVCheckBlock->eraseFromParent();
1496 }
1497
1498 /// Retrieves the SCEVCheckCond and SCEVCheckBlock that were generated as IR
1499 /// outside VPlan.
1500 std::pair<Value *, BasicBlock *> getSCEVChecks() const {
1501 using namespace llvm::PatternMatch;
1502 if (!SCEVCheckCond || match(SCEVCheckCond, m_ZeroInt()))
1503 return {nullptr, nullptr};
1504
1505 return {SCEVCheckCond, SCEVCheckBlock};
1506 }
1507
1508 /// Retrieves the MemCheckCond and MemCheckBlock that were generated as IR
1509 /// outside VPlan.
1510 std::pair<Value *, BasicBlock *> getMemRuntimeChecks() const {
1511 using namespace llvm::PatternMatch;
1512 if (MemRuntimeCheckCond && match(MemRuntimeCheckCond, m_ZeroInt()))
1513 return {nullptr, nullptr};
1514 return {MemRuntimeCheckCond, MemCheckBlock};
1515 }
1516
1517 /// Return true if any runtime checks have been added
1518 bool hasChecks() const { return HasChecks; }
1519
1520 /// Erase the memory check block, its instructions and their SCEV expansions.
1521 void eraseMemCheckBlock() {
1522 SCEVExpanderCleaner MemCheckCleaner(MemCheckExp);
1523 auto &SE = *MemCheckExp.getSE();
1524 // Memory runtime check generation creates compares that use expanded
1525 // values. Remove them before running the SCEVExpanderCleaner.
1526 for (auto &I : make_early_inc_range(reverse(*MemCheckBlock))) {
1527 if (MemCheckExp.isInsertedInstruction(&I))
1528 continue;
1529 SE.forgetValue(&I);
1530 I.eraseFromParent();
1531 }
1532 MemCheckCleaner.cleanup();
1533 MemCheckBlock->eraseFromParent();
1534 MemCheckBlock = nullptr;
1535 MemRuntimeCheckCond = nullptr;
1536 }
1537};
1538} // namespace
1539
1541 return Style == TailFoldingStyle::Data ||
1543}
1544
1548
1549// Return true if \p OuterLp is an outer loop annotated with hints for explicit
1550// vectorization. The loop needs to be annotated with #pragma omp simd
1551// simdlen(#) or #pragma clang vectorize(enable) vectorize_width(#). If the
1552// vector length information is not provided, vectorization is not considered
1553// explicit. Interleave hints are not allowed either. These limitations will be
1554// relaxed in the future.
1555// Please, note that we are currently forced to abuse the pragma 'clang
1556// vectorize' semantics. This pragma provides *auto-vectorization hints*
1557// (i.e., LV must check that vectorization is legal) whereas pragma 'omp simd'
1558// provides *explicit vectorization hints* (LV can bypass legal checks and
1559// assume that vectorization is legal). However, both hints are implemented
1560// using the same metadata (llvm.loop.vectorize, processed by
1561// LoopVectorizeHints). This will be fixed in the future when the native IR
1562// representation for pragma 'omp simd' is introduced.
1563static bool isExplicitVecOuterLoop(const VectorizeOptions &Opts, Loop *OuterLp,
1565 assert(!OuterLp->isInnermost() && "This is not an outer loop");
1566 LoopVectorizeHints Hints(Opts, OuterLp, true /*DisableInterleaving*/, *ORE);
1567
1568 // Only outer loops with an explicit vectorization hint are supported.
1569 // Unannotated outer loops are ignored.
1571 return false;
1572
1573 Function *Fn = OuterLp->getHeader()->getParent();
1574 if (!Hints.allowVectorization(Fn, OuterLp,
1575 true /*VectorizeOnlyWhenForced*/)) {
1576 LLVM_DEBUG(dbgs() << "LV: Loop hints prevent outer loop vectorization.\n");
1577 return false;
1578 }
1579
1580 if (Hints.getInterleave() > 1) {
1581 // TODO: Interleave support is future work.
1582 LLVM_DEBUG(dbgs() << "LV: Not vectorizing: Interleave is not supported for "
1583 "outer loops.\n");
1584 Hints.emitRemarkWithHints();
1585 return false;
1586 }
1587
1588 return true;
1589}
1590
1591static void collectSupportedLoops(const VectorizeOptions &Opts, Loop &L,
1594 // Collect inner loops and outer loops without irreducible control flow. For
1595 // now, only collect outer loops that have explicit vectorization hints. If we
1596 // are stress testing the VPlan H-CFG construction, we collect the outermost
1597 // loop of every loop nest.
1598 if (L.isInnermost() || Opts.vplan_build_outerloop_stress_test ||
1599 (Opts.enable_vplan_native_path &&
1600 isExplicitVecOuterLoop(Opts, &L, ORE))) {
1601 LoopBlocksRPO RPOT(&L);
1602 RPOT.perform(LI);
1604 V.push_back(&L);
1605 // TODO: Collect inner loops inside marked outer loops in case
1606 // vectorization fails for the outer loop. Do not invoke
1607 // 'containsIrreducibleCFG' again for inner loops when the outer loop is
1608 // already known to be reducible. We can use an inherited attribute for
1609 // that.
1610 return;
1611 }
1612 }
1613 for (Loop *InnerL : L)
1614 collectSupportedLoops(Opts, *InnerL, LI, ORE, V);
1615}
1616
1617//===----------------------------------------------------------------------===//
1618// Implementation of LoopVectorizationLegality, InnerLoopVectorizer and
1619// LoopVectorizationCostModel and LoopVectorizationPlanner.
1620//===----------------------------------------------------------------------===//
1621
1622/// For the given VF and UF and maximum trip count computed for the loop, return
1623/// whether the induction variable might overflow in the vectorized loop. If not,
1624/// then we know a runtime overflow check always evaluates to false and can be
1625/// removed.
1627 const VectorizeOptions &Opts, const LoopVectorizationCostModel *Cost,
1628 ElementCount VF, std::optional<unsigned> UF = std::nullopt) {
1629 // Always be conservative if we don't know the exact unroll factor.
1630 uint64_t MaxUF = UF ? *UF
1631 : std::max(Cost->TTI.getMaxInterleaveFactor(VF, false),
1632 Cost->TTI.getMaxInterleaveFactor(VF, true));
1633
1634 IntegerType *IdxTy = Cost->Legal->getWidestInductionType();
1635 APInt MaxUIntTripCount = IdxTy->getMask();
1636
1637 // We know the runtime overflow check is known false iff the (max) trip-count
1638 // is known and (max) trip-count + (VF * UF) does not overflow in the type of
1639 // the vector loop induction variable.
1640 if (std::optional<ElementCount> TC = getSmallBestKnownTC(
1641 Opts, Cost->PSE, Cost->TheLoop,
1642 /*CanUseConstantMax=*/true, /*CanExcludeZeroTrips=*/false,
1643 /*ComputeUpperBoundOnly=*/true)) {
1644 // Compute the maximum runtime values of VF and the trip count.
1645 std::optional<uint64_t> MaxStep =
1646 getMaxRuntimeElementCount(VF * MaxUF, *Cost->TheFunction);
1647 std::optional<uint64_t> MaxTC =
1648 getMaxRuntimeElementCount(*TC, *Cost->TheFunction);
1649 if (!MaxStep || !MaxTC)
1650 return false;
1651
1652 // Bail out if the maximum trip count is not representable in the induction
1653 // variable's type.
1654 if (MaxUIntTripCount.ult(*MaxTC))
1655 return false;
1656
1657 return (MaxUIntTripCount - *MaxTC).ugt(*MaxStep);
1658 }
1659
1660 return false;
1661}
1662
1663// Return whether we allow using masked interleave-groups (for dealing with
1664// strided loads/stores that reside in predicated blocks, or for dealing
1665// with gaps).
1666static bool useMaskedInterleavedAccesses(const VectorizeOptions &Opts,
1667 const TargetTransformInfo &TTI) {
1668 // If an override option has been passed in for interleaved accesses, use it.
1669 return valueOr(Opts.enable_masked_interleaved_mem_accesses,
1670 TTI.enableMaskedInterleavedAccessVectorization());
1671}
1672
1673/// Replace \p VPBB with a VPIRBasicBlock wrapping \p IRBB. All recipes from \p
1674/// VPBB are moved to the end of the newly created VPIRBasicBlock. All
1675/// predecessors and successors of VPBB, if any, are rewired to the new
1676/// VPIRBasicBlock. If \p VPBB may be unreachable, \p Plan must be passed.
1678 BasicBlock *IRBB,
1679 VPlan *Plan = nullptr) {
1680 if (!Plan)
1681 Plan = VPBB->getPlan();
1682 VPIRBasicBlock *IRVPBB = Plan->createEmptyVPIRBasicBlock(IRBB);
1683 auto IP = IRVPBB->begin();
1684 for (auto &R : make_early_inc_range(VPBB->phis()))
1685 R.moveBefore(*IRVPBB, IP);
1686
1687 for (auto &R :
1689 R.moveBefore(*IRVPBB, IRVPBB->end());
1690
1691 VPBlockUtils::reassociateBlocks(VPBB, IRVPBB);
1692 // VPBB is now dead and will be cleaned up when the plan gets destroyed.
1693 return IRVPBB;
1694}
1695
1697 BasicBlock *VectorPH = OrigLoop->getLoopPreheader();
1698 assert(VectorPH && "Invalid loop structure");
1699
1700 // NOTE: The Plan's scalar preheader VPBB isn't replaced with a VPIRBasicBlock
1701 // wrapping the newly created scalar preheader here at the moment, because the
1702 // Plan's scalar preheader may be unreachable at this point. Instead it is
1703 // replaced in executePlan.
1704 return SplitBlock(VectorPH, VectorPH->getTerminator(), DT, LI, nullptr,
1705 Twine(Prefix) + "scalar.ph");
1706}
1707
1708/// Knowing that loop \p L executes a single vector iteration, add instructions
1709/// that will get simplified and thus should not have any cost to \p
1710/// InstsToIgnore.
1713 SmallPtrSetImpl<Instruction *> &InstsToIgnore) {
1714 auto *Cmp = L->getLatchCmpInst();
1715 if (Cmp)
1716 InstsToIgnore.insert(Cmp);
1717 for (PHINode *IV : IL.keys()) {
1718 // The induction is free: a widened induction generates a vector phi with
1719 // its start value and an increment that is dead without a backedge.
1720 InstsToIgnore.insert(IV);
1721
1722 // Get next iteration value of the induction variable.
1723 Instruction *IVInst =
1724 cast<Instruction>(IV->getIncomingValueForBlock(L->getLoopLatch()));
1725 if (all_of(IVInst->users(),
1726 [&](const User *U) { return U == IV || U == Cmp; }))
1727 InstsToIgnore.insert(IVInst);
1728 }
1729}
1730
1732 // Create a new IR basic block for the scalar preheader.
1733 BasicBlock *ScalarPH = createScalarPreheader("");
1734 return ScalarPH->getSinglePredecessor();
1735}
1736
1737namespace {
1738
1739struct CSEDenseMapInfo {
1740 static bool canHandle(const Instruction *I) {
1743 }
1744
1745 static unsigned getHashValue(const Instruction *I) {
1746 assert(canHandle(I) && "Unknown instruction!");
1747 return hash_combine(I->getOpcode(),
1748 hash_combine_range(I->operand_values()));
1749 }
1750
1751 static bool isEqual(const Instruction *LHS, const Instruction *RHS) {
1752 return LHS->isIdenticalTo(RHS);
1753 }
1754};
1755
1756} // end anonymous namespace
1757
1758/// FIXME: This legacy common-subexpression-elimination routine is scheduled for
1759/// removal, in favor of the VPlan-based one.
1760static void legacyCSE(BasicBlock *BB) {
1761 // Perform simple cse.
1763 for (Instruction &In : llvm::make_early_inc_range(*BB)) {
1764 if (!CSEDenseMapInfo::canHandle(&In))
1765 continue;
1766
1767 // Check if we can replace this instruction with any of the
1768 // visited instructions.
1769 if (Instruction *V = CSEMap.lookup(&In)) {
1770 In.replaceAllUsesWith(V);
1771 In.eraseFromParent();
1772 continue;
1773 }
1774
1775 CSEMap[&In] = &In;
1776 }
1777}
1778
1779/// This function attempts to return a value that represents the ElementCount
1780/// at runtime. For fixed-width VFs we know this precisely at compile
1781/// time, but for scalable VFs we calculate it based on an estimate of the
1782/// vscale value.
1784 std::optional<unsigned> VScale) {
1785 unsigned EstimatedVF = VF.getKnownMinValue();
1786 if (VF.isScalable())
1787 if (VScale)
1788 EstimatedVF *= *VScale;
1789 assert(EstimatedVF >= 1 && "Estimated VF shouldn't be less than 1");
1790 return EstimatedVF;
1791}
1792
1793/// Returns the vector library variant function of \p CI usable at \p VF,
1794/// respecting \p MaskRequired, or nullptr if none is found: a mapping with
1795/// matching VF, masked if required, whose vector function is declared in the
1796/// module.
1798 bool MaskRequired,
1799 const TargetLibraryInfo *TLI) {
1800 if (!TLI || CI.isNoBuiltin())
1801 return nullptr;
1802 for (const VFInfo &Info : VFDatabase::getMappings(CI))
1803 if (Info.Shape.VF == VF && (!MaskRequired || Info.isMasked()))
1804 if (Function *F = CI.getModule()->getFunction(Info.VectorName))
1805 return F;
1806 return nullptr;
1807}
1808
1809/// Returns true iff \p CI has a library vector variant usable at \p VF.
1811 bool MaskRequired,
1812 const TargetLibraryInfo *TLI) {
1813 return getVectorLibraryVariantFor(CI, VF, MaskRequired, TLI) != nullptr;
1814}
1815
1818 ElementCount VF) const {
1819 Type *RetTy = CI->getType();
1821 for (auto &ArgOp : CI->args())
1822 Tys.push_back(ArgOp->getType());
1823
1824 InstructionCost ScalarCallCost = TTI.getCallInstrCost(
1825 CI->getCalledFunction(), RetTy, Tys, Config.CostKind);
1826
1827 // Cost of the scalar call (scalar VF) or its scalarization (vector VF). The
1828 // scalarization cost is only meaningful for fixed VFs.
1831 : ScalarCallCost * VF.getKnownMinValue() +
1832 getScalarizationOverhead(CI, VF);
1833
1834 // The call may be vectorized at this VF, via a vector intrinsic or a vector
1835 // library variant.
1837 Cost = std::min(Cost, getVectorIntrinsicCost(CI, VF));
1838
1839 if (Function *Variant =
1841 Cost = std::min(Cost,
1842 TTI.getCallInstrCost(
1843 /*F=*/nullptr, Variant->getReturnType(),
1844 Variant->getFunctionType()->params(), Config.CostKind));
1845
1846 return Cost;
1847}
1848
1850 if (VF.isScalar() || !canVectorizeTy(Ty))
1851 return Ty;
1852 return toVectorizedTy(Ty, VF);
1853}
1854
1857 ElementCount VF) const {
1859 assert(ID && "Expected intrinsic call!");
1860 Type *RetTy = maybeVectorizeType(CI->getType(), VF);
1861 FastMathFlags FMF;
1862 if (auto *FPMO = dyn_cast<FPMathOperator>(CI))
1863 FMF = FPMO->getFastMathFlags();
1864
1867 SmallVector<Type *> ParamTys;
1868 std::transform(FTy->param_begin(), FTy->param_end(),
1869 std::back_inserter(ParamTys),
1870 [&](Type *Ty) { return maybeVectorizeType(Ty, VF); });
1871
1872 IntrinsicCostAttributes CostAttrs(ID, RetTy, Arguments, ParamTys, FMF,
1875 return TTI.getIntrinsicInstrCost(CostAttrs, Config.CostKind);
1876}
1877
1879 // Don't apply optimizations below when no (vector) loop remains, as they all
1880 // require one at the moment.
1881 VPBasicBlock *HeaderVPBB =
1882 vputils::getFirstLoopHeader(*State.Plan, State.VPDT);
1883 if (!HeaderVPBB)
1884 return;
1885
1886 BasicBlock *HeaderBB = State.CFG.VPBB2IRBB[HeaderVPBB];
1887
1888 // Remove redundant induction instructions.
1889 legacyCSE(HeaderBB);
1890}
1891
1892void LoopVectorizationCostModel::collectLoopScalars(ElementCount VF) {
1893 // We should not collect Scalars more than once per VF. Right now, this
1894 // function is called from collectUniformsAndScalars(), which already does
1895 // this check. Collecting Scalars for VF=1 does not make any sense.
1896 assert(VF.isVector() && !Scalars.contains(VF) &&
1897 "This function should not be visited twice for the same VF");
1898
1899 // This avoids any chances of creating a REPLICATE recipe during planning
1900 // since that would result in generation of scalarized code during execution,
1901 // which is not supported for scalable vectors.
1902 if (VF.isScalable()) {
1903 Scalars[VF].insert_range(Uniforms[VF]);
1904 return;
1905 }
1906
1908
1909 // These sets are used to seed the analysis with pointers used by memory
1910 // accesses that will remain scalar.
1912 SmallPtrSet<Instruction *, 8> PossibleNonScalarPtrs;
1913 auto *Latch = TheLoop->getLoopLatch();
1914
1915 // A helper that returns true if the use of Ptr by MemAccess will be scalar.
1916 // The pointer operands of loads and stores will be scalar as long as the
1917 // memory access is not a gather/scatter or histogram operation. The value
1918 // operand of a store will remain scalar if the store is scalarized.
1919 auto IsScalarUse = [&](Instruction *MemAccess, Value *Ptr) {
1920 InstWidening WideningDecision = getWideningDecision(MemAccess, VF);
1921 assert(WideningDecision != CM_Unknown &&
1922 "Widening decision should be ready at this moment");
1923 auto *Store = dyn_cast<StoreInst>(MemAccess);
1924 if (Store && Ptr == Store->getValueOperand())
1925 return WideningDecision == CM_Scalarize;
1926 assert(Ptr == getLoadStorePointerOperand(MemAccess) &&
1927 "Ptr is neither a value or pointer operand");
1928 return WideningDecision != CM_GatherScatter &&
1929 !(Store && Legal->getHistogramInfo(Store));
1930 };
1931
1932 // A helper that returns true if the given value is a getelementptr
1933 // instruction contained in the loop.
1934 auto IsLoopVaryingGEP = [&](Value *V) {
1935 return isa<GetElementPtrInst>(V) && !TheLoop->isLoopInvariant(V);
1936 };
1937
1938 // A helper that evaluates a memory access's use of a pointer. If the use will
1939 // be a scalar use and the pointer is only used by memory accesses, we place
1940 // the pointer in ScalarPtrs. Otherwise, the pointer is placed in
1941 // PossibleNonScalarPtrs.
1942 auto EvaluatePtrUse = [&](Instruction *MemAccess, Value *Ptr) {
1943 // We only care about bitcast and getelementptr instructions contained in
1944 // the loop.
1945 if (!IsLoopVaryingGEP(Ptr))
1946 return;
1947
1948 // If the pointer has already been identified as scalar (e.g., if it was
1949 // also identified as uniform), there's nothing to do.
1950 auto *I = cast<Instruction>(Ptr);
1951 if (Worklist.count(I))
1952 return;
1953
1954 // If the use of the pointer will be a scalar use, and all users of the
1955 // pointer are memory accesses, place the pointer in ScalarPtrs. Otherwise,
1956 // place the pointer in PossibleNonScalarPtrs.
1957 if (IsScalarUse(MemAccess, Ptr) &&
1959 ScalarPtrs.insert(I);
1960 else
1961 PossibleNonScalarPtrs.insert(I);
1962 };
1963
1964 // We seed the scalars analysis with three classes of instructions: (1)
1965 // instructions marked uniform-after-vectorization and (2) bitcast,
1966 // getelementptr and (pointer) phi instructions used by memory accesses
1967 // requiring a scalar use.
1968 //
1969 // (1) Add to the worklist all instructions that have been identified as
1970 // uniform-after-vectorization.
1971 Worklist.insert_range(Uniforms[VF]);
1972
1973 // (2) Add to the worklist all bitcast and getelementptr instructions used by
1974 // memory accesses requiring a scalar use. The pointer operands of loads and
1975 // stores will be scalar unless the operation is a gather or scatter.
1976 // The value operand of a store will remain scalar if the store is scalarized.
1977 for (auto *BB : TheLoop->blocks())
1978 for (auto &I : *BB) {
1979 if (auto *Load = dyn_cast<LoadInst>(&I)) {
1980 EvaluatePtrUse(Load, Load->getPointerOperand());
1981 } else if (auto *Store = dyn_cast<StoreInst>(&I)) {
1982 EvaluatePtrUse(Store, Store->getPointerOperand());
1983 EvaluatePtrUse(Store, Store->getValueOperand());
1984 }
1985 }
1986 for (auto *I : ScalarPtrs)
1987 if (!PossibleNonScalarPtrs.count(I)) {
1988 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *I << "\n");
1989 Worklist.insert(I);
1990 }
1991
1992 // Insert the forced scalars.
1993 // FIXME: Currently VPWidenPHIRecipe() often creates a dead vector
1994 // induction variable when the PHI user is scalarized.
1995 auto ForcedScalar = ForcedScalars.find(VF);
1996 if (ForcedScalar != ForcedScalars.end())
1997 for (auto *I : ForcedScalar->second) {
1998 LLVM_DEBUG(dbgs() << "LV: Found (forced) scalar instruction: " << *I << "\n");
1999 Worklist.insert(I);
2000 }
2001
2002 // Expand the worklist by looking through any bitcasts and getelementptr
2003 // instructions we've already identified as scalar. This is similar to the
2004 // expansion step in collectLoopUniforms(); however, here we're only
2005 // expanding to include additional bitcasts and getelementptr instructions.
2006 unsigned Idx = 0;
2007 while (Idx != Worklist.size()) {
2008 Instruction *Dst = Worklist[Idx++];
2009 if (!IsLoopVaryingGEP(Dst->getOperand(0)))
2010 continue;
2011 auto *Src = cast<Instruction>(Dst->getOperand(0));
2012 if (llvm::all_of(Src->users(), [&](User *U) -> bool {
2013 auto *J = cast<Instruction>(U);
2014 return !TheLoop->contains(J) || Worklist.count(J) ||
2015 ((isa<LoadInst>(J) || isa<StoreInst>(J)) &&
2016 IsScalarUse(J, Src));
2017 })) {
2018 Worklist.insert(Src);
2019 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *Src << "\n");
2020 }
2021 }
2022
2023 // An induction variable will remain scalar if all users of the induction
2024 // variable and induction variable update remain scalar.
2025 for (const auto &Induction : Legal->getInductionVars()) {
2026 auto *Ind = Induction.first;
2027 auto *IndUpdate = cast<Instruction>(Ind->getIncomingValueForBlock(Latch));
2028
2029 // If tail-folding is applied, the primary induction variable will be used
2030 // to feed a vector compare.
2031 if (Ind == Legal->getPrimaryInduction() && foldTailByMasking())
2032 continue;
2033
2034 // Returns true if \p Indvar is a pointer induction that is used directly by
2035 // load/store instruction \p I.
2036 auto IsDirectLoadStoreFromPtrIndvar = [&](Instruction *Indvar,
2037 Instruction *I) {
2038 return Induction.second.getKind() ==
2041 Indvar == getLoadStorePointerOperand(I) && IsScalarUse(I, Indvar);
2042 };
2043
2044 // Determine if all users of the induction variable are scalar after
2045 // vectorization.
2046 bool ScalarInd = all_of(Ind->users(), [&](User *U) -> bool {
2047 auto *I = cast<Instruction>(U);
2048 return I == IndUpdate || !TheLoop->contains(I) || Worklist.count(I) ||
2049 IsDirectLoadStoreFromPtrIndvar(Ind, I);
2050 });
2051 if (!ScalarInd)
2052 continue;
2053
2054 // If the induction variable update is a fixed-order recurrence, neither the
2055 // induction variable or its update should be marked scalar after
2056 // vectorization.
2057 auto *IndUpdatePhi = dyn_cast<PHINode>(IndUpdate);
2058 if (IndUpdatePhi && Legal->isFixedOrderRecurrence(IndUpdatePhi))
2059 continue;
2060
2061 // Determine if all users of the induction variable update instruction are
2062 // scalar after vectorization.
2063 bool ScalarIndUpdate = all_of(IndUpdate->users(), [&](User *U) -> bool {
2064 auto *I = cast<Instruction>(U);
2065 return I == Ind || !TheLoop->contains(I) || Worklist.count(I) ||
2066 IsDirectLoadStoreFromPtrIndvar(IndUpdate, I);
2067 });
2068 if (!ScalarIndUpdate)
2069 continue;
2070
2071 // The induction variable and its update instruction will remain scalar.
2072 Worklist.insert(Ind);
2073 Worklist.insert(IndUpdate);
2074 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *Ind << "\n");
2075 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *IndUpdate
2076 << "\n");
2077 }
2078
2079 Scalars[VF].insert_range(Worklist);
2080}
2081
2089
2091 ElementCount VF) const {
2093 return Config.isLegalGatherOrScatter(isa<LoadInst>(I), getLoadStoreType(I),
2095}
2096
2098 ElementCount VF) {
2099 if (!isPredicatedInst(I))
2100 return false;
2101
2102 // Do we have a non-scalar lowering for this predicated
2103 // instruction? No - it is scalar with predication.
2104 switch(I->getOpcode()) {
2105 default:
2106 return true;
2107 case Instruction::Call: {
2108 if (VF.isScalar())
2109 return true;
2110 auto *CI = cast<CallInst>(I);
2111 // A vector intrinsic or library variant lowering avoids scalarization.
2112 return !getVectorIntrinsicIDForCall(CI, TLI) &&
2114 }
2115 case Instruction::Load:
2116 case Instruction::Store: {
2117 bool IsConsecutive = Legal->isConsecutivePtr(getLoadStoreType(I),
2119 return !(IsConsecutive && isLegalMaskedLoadOrStore(I, VF)) &&
2121 }
2122 case Instruction::UDiv:
2123 case Instruction::SDiv:
2124 case Instruction::SRem:
2125 case Instruction::URem: {
2126 // We have the option to use the llvm.masked.udiv intrinsics to avoid
2127 // predication. The cost based decision here will always select the masked
2128 // intrinsics for scalable vectors as scalarization isn't legal.
2129 const auto [ScalarCost, MaskedCost] = getDivRemSpeculationCost(I, VF);
2130 return isDivRemScalarWithPredication(ScalarCost, MaskedCost);
2131 }
2132 }
2133}
2134
2136 return Legal->isMaskRequired(I, foldTailByMasking());
2137}
2138
2139// TODO: Fold into LoopVectorizationLegality::isMaskRequired.
2141 // TODO: We can use the loop-preheader as context point here and get
2142 // context sensitive reasoning for isSafeToSpeculativelyExecute.
2146 return false;
2147
2148 // If the instruction was executed conditionally in the original scalar loop,
2149 // predication is needed with a mask whose lanes are all possibly inactive.
2150 if (Legal->blockNeedsPredication(I->getParent()))
2151 return true;
2152
2153 // If we're not folding the tail by masking and not vectorizing a loop with
2154 // uncountable exits and side effects, predication is unnecessary.
2155 if (!foldTailByMasking() && !Legal->hasUncountableExitWithSideEffects())
2156 return false;
2157
2158 // All that remain are instructions with side-effects originally executed in
2159 // the loop unconditionally, but now execute under a tail-fold mask (only)
2160 // having at least one active lane (the first). If the side-effects of the
2161 // instruction are invariant, executing it w/o (the tail-folding) mask is safe
2162 // - it will cause the same side-effects as when masked.
2163 switch(I->getOpcode()) {
2164 default:
2166 "instruction should have been considered by earlier checks");
2167 case Instruction::Call:
2168 // Side-effects of a Call are assumed to be non-invariant, needing a
2169 // (fold-tail) mask.
2171 "should have returned earlier for calls not needing a mask");
2172 return true;
2173 case Instruction::Load:
2174 // If the address is loop invariant no predication is needed.
2175 return !Legal->isInvariant(getLoadStorePointerOperand(I));
2176 case Instruction::Store: {
2177 // For stores, we need to prove both speculation safety (which follows from
2178 // the same argument as loads), but also must prove the value being stored
2179 // is correct. The easiest form of the later is to require that all values
2180 // stored are the same.
2181 return !(Legal->isInvariant(getLoadStorePointerOperand(I)) &&
2182 TheLoop->isLoopInvariant(cast<StoreInst>(I)->getValueOperand()));
2183 }
2184 case Instruction::UDiv:
2185 case Instruction::URem:
2186 // If the divisor is loop-invariant no predication is needed.
2187 return !Legal->isInvariant(I->getOperand(1));
2188 case Instruction::SDiv:
2189 case Instruction::SRem:
2190 // Conservative for now, since masked-off lanes may be poison and could
2191 // trigger signed overflow.
2192 return true;
2193 }
2194}
2195
2199 return 1;
2200 // If the block wasn't originally predicated then return early to avoid
2201 // computing BlockFrequencyInfo unnecessarily.
2202 if (!Legal->blockNeedsPredication(BB))
2203 return 1;
2204
2205 uint64_t HeaderFreq =
2206 getBFI().getBlockFreq(TheLoop->getHeader()).getFrequency();
2207 uint64_t BBFreq = getBFI().getBlockFreq(BB).getFrequency();
2208 assert(HeaderFreq >= BBFreq &&
2209 "Header has smaller block freq than dominated BB?");
2210 return std::round((double)HeaderFreq / BBFreq);
2211}
2212
2214 switch (Opcode) {
2215 case Instruction::UDiv:
2216 return Intrinsic::masked_udiv;
2217 case Instruction::SDiv:
2218 return Intrinsic::masked_sdiv;
2219 case Instruction::URem:
2220 return Intrinsic::masked_urem;
2221 case Instruction::SRem:
2222 return Intrinsic::masked_srem;
2223 default:
2224 llvm_unreachable("Unexpected opcode");
2225 }
2226}
2227
2228std::pair<InstructionCost, InstructionCost>
2230 ElementCount VF) {
2231 assert(I->getOpcode() == Instruction::UDiv ||
2232 I->getOpcode() == Instruction::SDiv ||
2233 I->getOpcode() == Instruction::SRem ||
2234 I->getOpcode() == Instruction::URem);
2236
2237 // Scalarization isn't legal for scalable vector types
2238 InstructionCost ScalarizationCost = InstructionCost::getInvalid();
2239 if (!VF.isScalable()) {
2240 // Get the scalarization cost and scale this amount by the probability of
2241 // executing the predicated block. If the instruction is not predicated,
2242 // we fall through to the next case.
2243 ScalarizationCost = 0;
2244
2245 // These instructions have a non-void type, so account for the phi nodes
2246 // that we will create. This cost is likely to be zero. The phi node
2247 // cost, if any, should be scaled by the block probability because it
2248 // models a copy at the end of each predicated block.
2249 ScalarizationCost += VF.getFixedValue() *
2250 TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
2251
2252 // The cost of the non-predicated instruction.
2253 ScalarizationCost +=
2254 VF.getFixedValue() * TTI.getArithmeticInstrCost(
2255 I->getOpcode(), I->getType(), Config.CostKind);
2256
2257 // The cost of insertelement and extractelement instructions needed for
2258 // scalarization.
2259 ScalarizationCost += getScalarizationOverhead(I, VF);
2260
2261 // Scale the cost by the probability of executing the predicated blocks.
2262 // This assumes the predicated block for each vector lane is equally
2263 // likely.
2264 ScalarizationCost =
2265 ScalarizationCost /
2266 getPredBlockCostDivisor(Config.CostKind, I->getParent());
2267 }
2268
2269 auto *VecTy = toVectorTy(I->getType(), VF);
2270 auto *MaskTy = toVectorTy(Type::getInt1Ty(I->getContext()), VF);
2271 IntrinsicCostAttributes ICA(getMaskedDivRemIntrinsic(I->getOpcode()), VecTy,
2272 {VecTy, VecTy, MaskTy});
2273 InstructionCost MaskedCost = TTI.getIntrinsicInstrCost(ICA, Config.CostKind);
2274 return {ScalarizationCost, MaskedCost};
2275}
2276
2278 Instruction *I, ElementCount VF) const {
2279 assert(isAccessInterleaved(I) && "Expecting interleaved access.");
2281 "Decision should not be set yet.");
2282 auto *Group = getInterleavedAccessGroup(I);
2283 assert(Group && "Must have a group.");
2284 unsigned InterleaveFactor = Group->getFactor();
2285
2286 // If the instruction's allocated size doesn't equal its type size, it
2287 // requires padding and will be scalarized.
2288 auto &DL = I->getDataLayout();
2289 auto *ScalarTy = getLoadStoreType(I);
2290 if (hasIrregularType(ScalarTy, DL))
2291 return false;
2292
2293 // For scalable vectors, the interleave factors must be <= 8 since we require
2294 // the (de)interleaveN intrinsics instead of shufflevectors.
2295 if (VF.isScalable() && InterleaveFactor > 8)
2296 return false;
2297
2298 // If the group involves a non-integral pointer, we may not be able to
2299 // losslessly cast all values to a common type.
2300 bool ScalarNI = DL.isNonIntegralPointerType(ScalarTy);
2301 for (Instruction *Member : Group->members()) {
2302 auto *MemberTy = getLoadStoreType(Member);
2303 bool MemberNI = DL.isNonIntegralPointerType(MemberTy);
2304 // Don't coerce non-integral pointers to integers or vice versa.
2305 if (MemberNI != ScalarNI)
2306 // TODO: Consider adding special nullptr value case here
2307 return false;
2308 if (MemberNI && ScalarNI &&
2309 ScalarTy->getPointerAddressSpace() !=
2310 MemberTy->getPointerAddressSpace())
2311 return false;
2312 }
2313
2314 // Check if masking is required.
2315 // A Group may need masking for one of two reasons: it resides in a block that
2316 // needs predication, or it was decided to use masking to deal with gaps
2317 // (either a gap at the end of a load-access that may result in a speculative
2318 // load, or any gaps in a store-access).
2319 bool PredicatedAccessRequiresMasking =
2321 bool LoadAccessWithGapsRequiresEpilogMasking =
2322 isa<LoadInst>(I) && Group->requiresScalarEpilogue() &&
2324 bool StoreAccessWithGapsRequiresMasking =
2325 isa<StoreInst>(I) && !Group->isFull();
2326 if (!PredicatedAccessRequiresMasking &&
2327 !LoadAccessWithGapsRequiresEpilogMasking &&
2328 !StoreAccessWithGapsRequiresMasking)
2329 return true;
2330
2331 // If masked interleaving is required, we expect that the user/target had
2332 // enabled it, because otherwise it either wouldn't have been created or
2333 // it should have been invalidated by the CostModel.
2335 "Masked interleave-groups for predicated accesses are not enabled.");
2336
2337 if (Group->isReverse())
2338 return false;
2339
2340 // TODO: Support interleaved access that requires a gap mask for scalable VFs.
2341 bool NeedsMaskForGaps = LoadAccessWithGapsRequiresEpilogMasking ||
2342 StoreAccessWithGapsRequiresMasking;
2343 if (VF.isScalable() && NeedsMaskForGaps)
2344 return false;
2345
2346 return isLegalMaskedLoadOrStore(I, VF);
2347}
2348
2349std::optional<LoopVectorizationCostModel::InstWidening>
2351 ElementCount VF) {
2352 // Get and ensure we have a valid memory instruction.
2353 assert((isa<LoadInst, StoreInst>(I)) && "Invalid memory instruction");
2354
2355 auto *Ptr = getLoadStorePointerOperand(I);
2356 auto *ScalarTy = getLoadStoreType(I);
2357
2358 // In order to be widened, the pointer should be consecutive, first of all.
2359 int Stride = Legal->isConsecutivePtr(ScalarTy, Ptr);
2360 if (!Stride)
2361 return std::nullopt;
2362
2363 // If the instruction is a store located in a predicated block, it will be
2364 // scalarized.
2365 if (isScalarWithPredication(I, VF))
2366 return std::nullopt;
2367
2368 // If the instruction's allocated size doesn't equal it's type size, it
2369 // requires padding and will be scalarized.
2370 auto &DL = I->getDataLayout();
2371 if (hasIrregularType(ScalarTy, DL))
2372 return std::nullopt;
2373
2374 return Stride == 1 ? CM_Widen : CM_Widen_Reverse;
2375}
2376
2377void LoopVectorizationCostModel::collectLoopUniforms(ElementCount VF) {
2378 // We should not collect Uniforms more than once per VF. Right now,
2379 // this function is called from collectUniformsAndScalars(), which
2380 // already does this check. Collecting Uniforms for VF=1 does not make any
2381 // sense.
2382
2383 assert(VF.isVector() && !Uniforms.contains(VF) &&
2384 "This function should not be visited twice for the same VF");
2385
2386 // Visit the list of Uniforms. If we find no uniform value, we won't
2387 // analyze again. Uniforms.count(VF) will return 1.
2388 Uniforms[VF].clear();
2389
2390 // Now we know that the loop is vectorizable!
2391 // Collect instructions inside the loop that will remain uniform after
2392 // vectorization.
2393
2394 // Global values, params and instructions outside of current loop are out of
2395 // scope.
2396 auto IsOutOfScope = [&](Value *V) -> bool {
2398 return (!I || !TheLoop->contains(I));
2399 };
2400
2401 // Worklist containing uniform instructions demanding lane 0.
2402 SetVector<Instruction *> Worklist;
2403
2404 // Add uniform instructions demanding lane 0 to the worklist. Instructions
2405 // that require predication must not be considered uniform after
2406 // vectorization, because that would create an erroneous replicating region
2407 // where only a single instance out of VF should be formed.
2408 auto AddToWorklistIfAllowed = [&](Instruction *I) -> void {
2409 if (IsOutOfScope(I)) {
2410 LLVM_DEBUG(dbgs() << "LV: Found not uniform due to scope: "
2411 << *I << "\n");
2412 return;
2413 }
2414 if (isPredicatedInst(I)) {
2415 LLVM_DEBUG(
2416 dbgs() << "LV: Found not uniform due to requiring predication: " << *I
2417 << "\n");
2418 return;
2419 }
2420 LLVM_DEBUG(dbgs() << "LV: Found uniform instruction: " << *I << "\n");
2421 Worklist.insert(I);
2422 };
2423
2424 // Start with the conditional branches exiting the loop. If the branch
2425 // condition is an instruction contained in the loop that is only used by the
2426 // branch, it is uniform. Note conditions from uncountable early exits are not
2427 // uniform.
2429 TheLoop->getExitingBlocks(Exiting);
2430 for (BasicBlock *E : Exiting) {
2431 if (Legal->hasUncountableEarlyExit() && TheLoop->getLoopLatch() != E)
2432 continue;
2433 auto *Cmp = dyn_cast<Instruction>(E->getTerminator()->getOperand(0));
2434 if (!Cmp || !TheLoop->contains(Cmp) || !Cmp->hasOneUse())
2435 continue;
2436
2437 // If we have an exit condition that is actually two conditions (one
2438 // countable and the other uncountable) combined via an or, only add the
2439 // countable comparison as a uniform value.
2440 if (Legal->hasUncountableExitWithSideEffects() &&
2441 TheLoop->getLoopLatch() == E) {
2442 if (Instruction *Countable =
2443 Legal->findCountableComparisonInCombinedCondition(Cmp)) {
2444 if (Countable->hasOneUse())
2445 AddToWorklistIfAllowed(Countable);
2446 continue;
2447 }
2448 }
2449
2450 // Normal exit comparisons are uniform.
2451 AddToWorklistIfAllowed(Cmp);
2452 }
2453
2454 auto PrevVF = VF.divideCoefficientBy(2);
2455 // Return true if all lanes perform the same memory operation, and we can
2456 // thus choose to execute only one.
2457 auto IsUniformMemOpUse = [&](Instruction *I) {
2458 // If the value was already known to not be uniform for the previous
2459 // (smaller VF), it cannot be uniform for the larger VF.
2460 if (PrevVF.isVector()) {
2461 auto Iter = Uniforms.find(PrevVF);
2462 if (Iter != Uniforms.end() && !Iter->second.contains(I))
2463 return false;
2464 }
2465 if (!isUniformMemOp(*I, VF))
2466 return false;
2467 if (isa<LoadInst>(I))
2468 // Loading the same address always produces the same result - at least
2469 // assuming aliasing and ordering which have already been checked.
2470 return true;
2471 // Storing the same value on every iteration.
2472 return TheLoop->isLoopInvariant(cast<StoreInst>(I)->getValueOperand());
2473 };
2474
2475 auto IsUniformDecision = [&](Instruction *I, ElementCount VF) {
2476 InstWidening WideningDecision = getWideningDecision(I, VF);
2477 assert(WideningDecision != CM_Unknown &&
2478 "Widening decision should be ready at this moment");
2479
2480 if (IsUniformMemOpUse(I))
2481 return true;
2482
2483 return (WideningDecision == CM_Widen ||
2484 WideningDecision == CM_Widen_Reverse ||
2485 WideningDecision == CM_Interleave);
2486 };
2487
2488 // Returns true if Ptr is the pointer operand of a memory access instruction
2489 // I, I is known to not require scalarization, and the pointer is not also
2490 // stored.
2491 auto IsVectorizedMemAccessUse = [&](Instruction *I, Value *Ptr) -> bool {
2492 if (isa<StoreInst>(I) && I->getOperand(0) == Ptr)
2493 return false;
2494 return getLoadStorePointerOperand(I) == Ptr &&
2495 (IsUniformDecision(I, VF) || Legal->isInvariant(Ptr));
2496 };
2497
2498 // Holds a list of values which are known to have at least one uniform use.
2499 // Note that there may be other uses which aren't uniform. A "uniform use"
2500 // here is something which only demands lane 0 of the unrolled iterations;
2501 // it does not imply that all lanes produce the same value (e.g. this is not
2502 // the usual meaning of uniform)
2503 SetVector<Value *> HasUniformUse;
2504
2505 // Scan the loop for instructions which are either a) known to have only
2506 // lane 0 demanded or b) are uses which demand only lane 0 of their operand.
2507 for (auto *BB : TheLoop->blocks())
2508 for (auto &I : *BB) {
2509 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) {
2510 switch (II->getIntrinsicID()) {
2511 case Intrinsic::sideeffect:
2512 case Intrinsic::experimental_noalias_scope_decl:
2513 case Intrinsic::assume:
2514 case Intrinsic::lifetime_start:
2515 case Intrinsic::lifetime_end:
2516 if (TheLoop->hasLoopInvariantOperands(&I))
2517 AddToWorklistIfAllowed(&I);
2518 break;
2519 default:
2520 break;
2521 }
2522 }
2523
2524 if (auto *EVI = dyn_cast<ExtractValueInst>(&I)) {
2525 if (IsOutOfScope(EVI->getAggregateOperand())) {
2526 AddToWorklistIfAllowed(EVI);
2527 continue;
2528 }
2529 // Only ExtractValue instructions where the aggregate value comes from a
2530 // call are allowed to be non-uniform.
2531 assert(isa<CallInst>(EVI->getAggregateOperand()) &&
2532 "Expected aggregate value to be call return value");
2533 }
2534
2535 // If there's no pointer operand, there's nothing to do.
2536 auto *Ptr = getLoadStorePointerOperand(&I);
2537 if (!Ptr)
2538 continue;
2539
2540 // If the pointer can be proven to be uniform, always add it to the
2541 // worklist.
2542 if (isa<Instruction>(Ptr) && isUniform(Ptr, VF))
2543 AddToWorklistIfAllowed(cast<Instruction>(Ptr));
2544
2545 if (IsUniformMemOpUse(&I))
2546 AddToWorklistIfAllowed(&I);
2547
2548 if (IsVectorizedMemAccessUse(&I, Ptr))
2549 HasUniformUse.insert(Ptr);
2550 }
2551
2552 // Add to the worklist any operands which have *only* uniform (e.g. lane 0
2553 // demanding) users. Since loops are assumed to be in LCSSA form, this
2554 // disallows uses outside the loop as well.
2555 for (auto *V : HasUniformUse) {
2556 if (IsOutOfScope(V))
2557 continue;
2558 auto *I = cast<Instruction>(V);
2559 bool UsersAreMemAccesses = all_of(I->users(), [&](User *U) -> bool {
2560 auto *UI = cast<Instruction>(U);
2561 return TheLoop->contains(UI) && IsVectorizedMemAccessUse(UI, V);
2562 });
2563 if (UsersAreMemAccesses)
2564 AddToWorklistIfAllowed(I);
2565 }
2566
2567 // Expand Worklist in topological order: whenever a new instruction
2568 // is added , its users should be already inside Worklist. It ensures
2569 // a uniform instruction will only be used by uniform instructions.
2570 unsigned Idx = 0;
2571 while (Idx != Worklist.size()) {
2572 Instruction *I = Worklist[Idx++];
2573
2574 for (auto *OV : I->operand_values()) {
2575 // isOutOfScope operands cannot be uniform instructions.
2576 if (IsOutOfScope(OV))
2577 continue;
2578 // First order recurrence Phi's should typically be considered
2579 // non-uniform.
2580 auto *OP = dyn_cast<PHINode>(OV);
2581 if (OP && Legal->isFixedOrderRecurrence(OP))
2582 continue;
2583 // If all the users of the operand are uniform, then add the
2584 // operand into the uniform worklist.
2585 auto *OI = cast<Instruction>(OV);
2586 if (llvm::all_of(OI->users(), [&](User *U) -> bool {
2587 auto *J = cast<Instruction>(U);
2588 return Worklist.count(J) || IsVectorizedMemAccessUse(J, OI);
2589 }))
2590 AddToWorklistIfAllowed(OI);
2591 }
2592 }
2593
2594 // For an instruction to be added into Worklist above, all its users inside
2595 // the loop should also be in Worklist. However, this condition cannot be
2596 // true for phi nodes that form a cyclic dependence. We must process phi
2597 // nodes separately. An induction variable will remain uniform if all users
2598 // of the induction variable and induction variable update remain uniform.
2599 // The code below handles both pointer and non-pointer induction variables.
2600 BasicBlock *Latch = TheLoop->getLoopLatch();
2601 for (PHINode *Ind : Legal->getInductionVars().keys()) {
2602 auto *IndUpdate = cast<Instruction>(Ind->getIncomingValueForBlock(Latch));
2603
2604 // Determine if all users of the induction variable are uniform after
2605 // vectorization.
2606 bool UniformInd = all_of(Ind->users(), [&](User *U) -> bool {
2607 auto *I = cast<Instruction>(U);
2608 return I == IndUpdate || !TheLoop->contains(I) || Worklist.count(I) ||
2609 IsVectorizedMemAccessUse(I, Ind);
2610 });
2611 if (!UniformInd)
2612 continue;
2613
2614 // Determine if all users of the induction variable update instruction are
2615 // uniform after vectorization.
2616 bool UniformIndUpdate = all_of(IndUpdate->users(), [&](User *U) -> bool {
2617 auto *I = cast<Instruction>(U);
2618 return I == Ind || Worklist.count(I) ||
2619 IsVectorizedMemAccessUse(I, IndUpdate);
2620 });
2621 if (!UniformIndUpdate)
2622 continue;
2623
2624 // The induction variable and its update instruction will remain uniform.
2625 AddToWorklistIfAllowed(Ind);
2626 AddToWorklistIfAllowed(IndUpdate);
2627 }
2628
2629 Uniforms[VF].insert_range(Worklist);
2630}
2631
2632FixedScalableVFPair
2634 // Make sure once we return PartialAliasMaskingStatus is not "NotDecided".
2635 scope_exit EnsureAliasMaskingStatusIsDecidedOnReturn([this] {
2636 if (PartialAliasMaskingStatus == AliasMaskingStatus::NotDecided)
2637 PartialAliasMaskingStatus = AliasMaskingStatus::Disabled;
2638 });
2639
2640 // For outer loops, use simple type-based heuristic VF. No cost model or
2641 // memory dependence analysis is available.
2642 if (!TheLoop->isInnermost()) {
2643 return Config.computeVPlanOuterloopVF(UserVF);
2644 }
2645
2646 if (Legal->getRuntimePointerChecking()->Need && TTI.hasBranchDivergence()) {
2647 // TODO: It may be useful to do since it's still likely to be dynamically
2648 // uniform if the target can skip.
2650 "Not inserting runtime ptr check for divergent target",
2651 "runtime pointer checks needed. Not enabled for divergent target",
2652 "CantVersionLoopWithDivergentTarget", ORE, TheLoop);
2654 }
2655
2656 ScalarEvolution *SE = PSE.getSE();
2658 unsigned MaxTC = PSE.getSmallConstantMaxTripCount();
2659 if (!MaxTC && EpilogueLoweringStatus == CM_EpilogueAllowed)
2661 LLVM_DEBUG(dbgs() << "LV: Found trip count: " << TC << '\n');
2662 if (TC != ElementCount::getFixed(MaxTC))
2663 LLVM_DEBUG(dbgs() << "LV: Found maximum trip count: " << MaxTC << '\n');
2664 if (TC.isScalar()) {
2666 "Single iteration (non) loop",
2667 "loop trip count is one, irrelevant for vectorization",
2668 "SingleIterationLoop", ORE, TheLoop);
2670 }
2671
2672 // If BTC matches the widest induction type and is -1 then the trip count
2673 // computation will wrap to 0 and the vector trip count will be 0. Do not try
2674 // to vectorize.
2675 const SCEV *BTC = SE->getBackedgeTakenCount(TheLoop);
2676 if (!isa<SCEVCouldNotCompute>(BTC) &&
2677 BTC->getType()->getScalarSizeInBits() >=
2678 Legal->getWidestInductionType()->getScalarSizeInBits() &&
2680 SE->getMinusOne(BTC->getType()))) {
2682 "Trip count computation wrapped",
2683 "backedge-taken count is -1, loop trip count wrapped to 0",
2684 "TripCountWrapped", ORE, TheLoop);
2686 }
2687
2688 assert(WideningDecisions.empty() && Uniforms.empty() && Scalars.empty() &&
2689 "No cost-modeling decisions should have been taken at this point");
2690
2691 switch (EpilogueLoweringStatus) {
2692 case CM_EpilogueAllowed:
2693 return Config.computeFeasibleMaxVF(MaxTC, UserVF, UserIC, false,
2696 [[fallthrough]];
2698 LLVM_DEBUG(dbgs() << "LV: tail-folding hint/switch found.\n"
2699 << "LV: Not allowing epilogue, creating tail-folded "
2700 << "vector loop.\n");
2701 break;
2703 // fallthrough as a special case of OptForSize
2705 if (EpilogueLoweringStatus == CM_EpilogueNotAllowedOptSize)
2706 LLVM_DEBUG(dbgs() << "LV: Not allowing epilogue due to -Os/-Oz.\n");
2707 else
2708 LLVM_DEBUG(dbgs() << "LV: Not allowing epilogue due to low trip "
2709 << "count.\n");
2710
2711 // Bail if runtime checks are required, which are not good when optimising
2712 // for size.
2713 if (Config.runtimeChecksRequired())
2715
2716 break;
2717 }
2718
2719 // Now try the tail folding
2720
2721 // Invalidate interleave groups that require an epilogue if we can't mask
2722 // the interleave-group.
2723 if (!useMaskedInterleavedAccesses(Opts, TTI)) {
2724 // Note: There is no need to invalidate any cost modeling decisions here, as
2725 // none were taken so far (see assertion above).
2726 InterleaveInfo.invalidateGroupsRequiringScalarEpilogue();
2727 }
2728
2729 FixedScalableVFPair MaxFactors = Config.computeFeasibleMaxVF(
2730 MaxTC, UserVF, UserIC, true, requiresScalarEpilogue(true));
2731
2732 // Avoid tail folding if the trip count is known to be a multiple of any VF
2733 // we choose.
2734 std::optional<uint64_t> MaxPowerOf2RuntimeVF =
2735 MaxFactors.FixedVF.getFixedValue();
2736 if (MaxFactors.ScalableVF) {
2737 if (std::optional<uint64_t> MaxRuntimeScalableVF =
2739 MaxPowerOf2RuntimeVF =
2740 std::max(*MaxPowerOf2RuntimeVF, *MaxRuntimeScalableVF);
2741 else
2742 MaxPowerOf2RuntimeVF = std::nullopt; // Stick with tail-folding for now.
2743 }
2744
2745 auto NoScalarEpilogueNeeded = [this, &UserIC](uint64_t MaxRuntimeVF) {
2746 // Return false if the loop is neither a single-latch-exit loop nor an
2747 // early-exit loop as tail-folding is not supported in that case.
2748 if (TheLoop->getExitingBlock() != TheLoop->getLoopLatch() &&
2749 !Legal->hasUncountableEarlyExit())
2750 return false;
2751 uint64_t MaxVFtimesIC = MaxRuntimeVF * std::max<uint64_t>(UserIC, 1);
2752 ScalarEvolution *SE = PSE.getSE();
2753 // Calling getSymbolicMaxBackedgeTakenCount enables support for loops
2754 // with uncountable exits. For countable loops, the symbolic maximum must
2755 // remain identical to the known back-edge taken count.
2756 const SCEV *BackedgeTakenCount = PSE.getSymbolicMaxBackedgeTakenCount();
2757 assert((Legal->hasUncountableEarlyExit() ||
2758 BackedgeTakenCount == PSE.getBackedgeTakenCount()) &&
2759 "Invalid loop count");
2760 const SCEV *ExitCount = SE->getAddExpr(
2761 BackedgeTakenCount, SE->getOne(BackedgeTakenCount->getType()));
2762 const SCEV *Rem = SE->getURemExpr(
2763 SE->applyLoopGuards(ExitCount, TheLoop),
2764 SE->getConstant(BackedgeTakenCount->getType(), MaxVFtimesIC));
2765 return Rem->isZero();
2766 };
2767
2768 if (MaxPowerOf2RuntimeVF > 0u) {
2769 assert((UserVF.isNonZero() || isPowerOf2_64(*MaxPowerOf2RuntimeVF)) &&
2770 "MaxFixedVF must be a power of 2");
2771 if (NoScalarEpilogueNeeded(*MaxPowerOf2RuntimeVF)) {
2772 // Accept MaxFixedVF if we do not have a tail.
2773 LLVM_DEBUG(dbgs() << "LV: No tail will remain for any chosen VF.\n");
2774 return MaxFactors;
2775 }
2776 }
2777
2778 auto ExpectedTC = getSmallBestKnownTC(Opts, PSE, TheLoop);
2779 if (ExpectedTC && ExpectedTC->isFixed() &&
2780 ExpectedTC->getFixedValue() <=
2781 TTI.getMinTripCountTailFoldingThreshold()) {
2782 // If we have a low-trip-count, and the fixed-width VF is known to divide
2783 // the trip count the fixed-width factor in preference to allow the
2784 // generation of a non-predicated loop.
2785 if (EpilogueLoweringStatus == CM_EpilogueNotAllowedLowTripLoop &&
2786 NoScalarEpilogueNeeded(MaxFactors.FixedVF.getFixedValue())) {
2787 LLVM_DEBUG(dbgs() << "LV: Picking a fixed-width so that no tail will "
2788 "remain for any chosen VF.\n");
2789 MaxFactors.ScalableVF = ElementCount::getScalable(0);
2790 return MaxFactors;
2791 }
2792
2793 // Allow cases where the ExactTC == (VF * IC) + 1.
2794 //
2795 // This produces 1 vector iteration, and 1 scalar iteration with no
2796 // remainder. Later passes will eliminate the loop and leave straight-line
2797 // code as the both iteration counts are statically known.
2798 //
2799 // If a function is marked as minsize/optsize or OptForSize is set, do not
2800 // allow this form of transformation as this will increase CodeSize.
2801 //
2802 // For loops with small bodies, the cost model is not currently reliable
2803 // enough to accurately determine if vectorization is beneficial.
2804 unsigned EffectiveIC = UserIC > 0 ? UserIC : 1;
2805 unsigned MaxVFForTC = llvm::bit_floor(TC.getFixedValue());
2806 if (TC.getFixedValue() - MaxVFForTC == 1 && MaxVFForTC / EffectiveIC > 1 &&
2807 MaxVFForTC <= (MaxFactors.FixedVF.getFixedValue() * EffectiveIC) &&
2808 !Config.OptForSize) {
2809 unsigned NumOfInstructions = llvm::sum_of(
2810 llvm::map_range(TheLoop->blocks(),
2811 [](BasicBlock *BB) { return BB->size(); }),
2812 unsigned(0));
2813 if (NumOfInstructions > Opts.low_trip_count_loop_body_size_limit) {
2814 unsigned VF = MaxVFForTC / EffectiveIC;
2815 LLVM_DEBUG(dbgs() << "LV: Picking MaxVF=" << VF
2816 << " with 1 scalar iteration remaining.\n");
2817 MaxFactors.FixedVF = ElementCount::getFixed(VF);
2818 MaxFactors.ScalableVF = ElementCount::getScalable(0);
2819 return MaxFactors;
2820 }
2821 }
2822
2824 "The trip count is below the minial threshold value.",
2825 "loop trip count is too low, avoiding vectorization", "LowTripCount",
2826 ORE, TheLoop);
2828 }
2829
2830 // If we don't know the precise trip count, or if the trip count that we
2831 // found modulo the vectorization factor is not zero, try to fold the tail
2832 // by masking.
2833 // FIXME: look for a smaller MaxVF that does divide TC rather than masking.
2834 bool ContainsScalableVF = MaxFactors.ScalableVF.isNonZero();
2835 setTailFoldingStyle(ContainsScalableVF, UserIC);
2836 if (foldTailByMasking()) {
2837 if (foldTailWithEVL()) {
2838 LLVM_DEBUG(
2839 dbgs()
2840 << "LV: tail is folded with EVL, forcing unroll factor to be 1. Will "
2841 "try to generate VP Intrinsics with scalable vector "
2842 "factors only.\n");
2843 // Tail folded loop using VP intrinsics restricts the VF to be scalable
2844 // for now.
2845 // TODO: extend it for fixed vectors, if required.
2846 assert(ContainsScalableVF && "Expected scalable vector factor.");
2847
2848 MaxFactors.FixedVF = ElementCount::getFixed(1);
2849 } else {
2851 }
2852 return MaxFactors;
2853 }
2854
2855 // If there was a tail-folding hint/switch, but we can't fold the tail by
2856 // masking, fallback to a vectorization with an epilogue.
2857 if (EpilogueLoweringStatus == CM_EpilogueNotNeededFoldTail) {
2858 LLVM_DEBUG(dbgs() << "LV: Cannot fold tail by masking: vectorize with an "
2859 "epilogue instead.\n");
2860 EpilogueLoweringStatus = CM_EpilogueAllowed;
2861 return MaxFactors;
2862 }
2863
2864 if (EpilogueLoweringStatus == CM_EpilogueNotAllowedFoldTail) {
2865 LLVM_DEBUG(dbgs() << "LV: Can't fold tail by masking: don't vectorize\n");
2867 }
2868
2869 if (TC.isZero()) {
2871 "unable to calculate the loop count due to complex control flow",
2872 "UnknownLoopCountComplexCFG", ORE, TheLoop);
2874 }
2875
2877 "Cannot optimize for size and vectorize at the same time.",
2878 "cannot optimize for size and vectorize at the same time. "
2879 "Enable vectorization of this loop with '#pragma clang loop "
2880 "vectorize(enable)' when compiling with -Os/-Oz",
2881 "NoTailLoopWithOptForSize", ORE, TheLoop);
2883}
2884
2887 using RecipeVFPair = std::pair<VPRecipeBase *, ElementCount>;
2888 SmallVector<RecipeVFPair> InvalidCosts;
2889 for (const auto &Plan : VPlans) {
2890 for (ElementCount VF : Plan->vectorFactors()) {
2891 // The VPlan-based cost model is designed for computing vector cost.
2892 // Querying VPlan-based cost model with a scarlar VF will cause some
2893 // errors because we expect the VF is vector for most of the widen
2894 // recipes.
2895 if (VF.isScalar())
2896 continue;
2897
2898 VPCostContext CostCtx(*TLI, *Plan, *CM, Config,
2899 /*ReusePrintingSlotTracker=*/true);
2900 precomputeCosts(*Plan, VF, CostCtx);
2901 auto Iter = vp_depth_first_deep(Plan->getVectorLoopRegion()->getEntry());
2903 for (auto &R : *VPBB) {
2904 if (!R.cost(VF, CostCtx).isValid())
2905 InvalidCosts.emplace_back(&R, VF);
2906 }
2907 }
2908 }
2909 }
2910 if (InvalidCosts.empty())
2911 return;
2912
2913 // Emit a report of VFs with invalid costs in the loop.
2914
2915 // Group the remarks per recipe, keeping the recipe order from InvalidCosts.
2917 unsigned I = 0;
2918 for (auto &Pair : InvalidCosts)
2919 if (Numbering.try_emplace(Pair.first, I).second)
2920 ++I;
2921
2922 // Sort the list, first on recipe(number) then on VF.
2923 sort(InvalidCosts, [&Numbering](RecipeVFPair &A, RecipeVFPair &B) {
2924 unsigned NA = Numbering[A.first];
2925 unsigned NB = Numbering[B.first];
2926 if (NA != NB)
2927 return NA < NB;
2928 return ElementCount::isKnownLT(A.second, B.second);
2929 });
2930
2931 // For a list of ordered recipe-VF pairs:
2932 // [(load, VF1), (load, VF2), (store, VF1)]
2933 // group the recipes together to emit separate remarks for:
2934 // load (VF1, VF2)
2935 // store (VF1)
2936 auto Tail = ArrayRef<RecipeVFPair>(InvalidCosts);
2937 auto Subset = ArrayRef<RecipeVFPair>();
2938 do {
2939 if (Subset.empty())
2940 Subset = Tail.take_front(1);
2941
2942 VPRecipeBase *R = Subset.front().first;
2943
2944 unsigned Opcode =
2946 .Case([](const VPHeaderPHIRecipe *R) { return Instruction::PHI; })
2947 .Case(
2948 [](const VPWidenStoreRecipe *R) { return Instruction::Store; })
2949 .Case([](const VPWidenLoadRecipe *R) { return Instruction::Load; })
2950 .Case<VPWidenCallRecipe, VPWidenIntrinsicRecipe>(
2951 [](const auto *R) { return Instruction::Call; })
2954 [](const auto *R) { return R->getOpcode(); })
2955 .Case([](const VPInterleaveRecipe *R) {
2956 return R->getStoredValues().empty() ? Instruction::Load
2957 : Instruction::Store;
2958 })
2959 .Case([](const VPReductionRecipe *R) {
2960 return RecurrenceDescriptor::getOpcode(R->getRecurrenceKind());
2961 });
2962
2963 // If the next recipe is different, or if there are no other pairs,
2964 // emit a remark for the collated subset. e.g.
2965 // [(load, VF1), (load, VF2))]
2966 // to emit:
2967 // remark: invalid costs for 'load' at VF=(VF1, VF2)
2968 if (Subset == Tail || Tail[Subset.size()].first != R) {
2969 std::string OutString;
2970 raw_string_ostream OS(OutString);
2971 assert(!Subset.empty() && "Unexpected empty range");
2972 OS << "Recipe with invalid costs prevented vectorization at VF=(";
2973 for (const auto &Pair : Subset)
2974 OS << (Pair.second == Subset.front().second ? "" : ", ") << Pair.second;
2975 OS << "):";
2976 if (Opcode == Instruction::Call) {
2977 StringRef Name = "";
2978 if (auto *Int = dyn_cast<VPWidenIntrinsicRecipe>(R)) {
2979 Name = Int->getIntrinsicName();
2980 } else {
2981 auto *WidenCall = dyn_cast<VPWidenCallRecipe>(R);
2982 Function *CalledFn =
2983 WidenCall
2984 ? WidenCall->getCalledScalarFunction()
2985 : cast<Function>(R->getLastOperand()->getLiveInIRValue());
2986 Name = CalledFn->getName();
2987 }
2988 OS << " call to " << Name;
2989 } else
2990 OS << " " << Instruction::getOpcodeName(Opcode);
2991 reportVectorizationInfo(OutString, "InvalidCost", ORE, OrigLoop, nullptr,
2992 R->getDebugLoc());
2993 Tail = Tail.drop_front(Subset.size());
2994 Subset = {};
2995 } else
2996 // Grow the subset by one element
2997 Subset = Tail.take_front(Subset.size() + 1);
2998 } while (!Tail.empty());
2999}
3000
3001/// Check if any recipe of \p Plan will generate a vector value, which will be
3002/// assigned a vector register.
3004 const TargetTransformInfo &TTI) {
3005 assert(VF.isVector() && "Checking a scalar VF?");
3006 DenseSet<VPRecipeBase *> EphemeralRecipes;
3007 collectEphemeralRecipesForVPlan(Plan, EphemeralRecipes);
3008 // Set of already visited types.
3009 DenseSet<Type *> Visited;
3012 for (VPRecipeBase &R : *VPBB) {
3013 if (EphemeralRecipes.contains(&R))
3014 continue;
3015 // Continue early if the recipe is considered to not produce a vector
3016 // result. Note that this includes VPInstruction where some opcodes may
3017 // produce a vector, to preserve existing behavior as VPInstructions model
3018 // aspects not directly mapped to existing IR instructions.
3019 switch (R.getVPRecipeID()) {
3020 case VPRecipeBase::VPDerivedIVSC:
3021 case VPRecipeBase::VPScalarIVStepsSC:
3022 case VPRecipeBase::VPReplicateSC:
3023 case VPRecipeBase::VPInstructionSC:
3024 case VPRecipeBase::VPCurrentIterationPHISC:
3025 case VPRecipeBase::VPVectorPointerSC:
3026 case VPRecipeBase::VPVectorEndPointerSC:
3027 case VPRecipeBase::VPExpandSCEVSC:
3028 case VPRecipeBase::VPPredInstPHISC:
3029 case VPRecipeBase::VPBranchOnMaskSC:
3030 continue;
3031 case VPRecipeBase::VPReductionSC:
3032 case VPRecipeBase::VPActiveLaneMaskPHISC:
3033 case VPRecipeBase::VPWidenCallSC:
3034 case VPRecipeBase::VPWidenCanonicalIVSC:
3035 case VPRecipeBase::VPWidenCastSC:
3036 case VPRecipeBase::VPWidenGEPSC:
3037 case VPRecipeBase::VPWidenIntrinsicSC:
3038 case VPRecipeBase::VPWidenMemIntrinsicSC:
3039 case VPRecipeBase::VPWidenSC:
3040 case VPRecipeBase::VPBlendSC:
3041 case VPRecipeBase::VPFirstOrderRecurrencePHISC:
3042 case VPRecipeBase::VPHistogramSC:
3043 case VPRecipeBase::VPWidenPHISC:
3044 case VPRecipeBase::VPWidenIntOrFpInductionSC:
3045 case VPRecipeBase::VPWidenPointerInductionSC:
3046 case VPRecipeBase::VPReductionPHISC:
3047 case VPRecipeBase::VPInterleaveEVLSC:
3048 case VPRecipeBase::VPInterleaveSC:
3049 case VPRecipeBase::VPWidenLoadEVLSC:
3050 case VPRecipeBase::VPWidenLoadSC:
3051 case VPRecipeBase::VPWidenStoreEVLSC:
3052 case VPRecipeBase::VPWidenStoreSC:
3053 break;
3054 default:
3055 llvm_unreachable("unhandled recipe");
3056 }
3057
3058 auto WillGenerateTargetVectors = [&TTI, VF](Type *VectorTy) {
3059 unsigned NumLegalParts = TTI.getNumberOfParts(VectorTy);
3060 if (!NumLegalParts)
3061 return false;
3062 if (VF.isScalable()) {
3063 // <vscale x 1 x iN> is assumed to be profitable over iN because
3064 // scalable registers are a distinct register class from scalar
3065 // ones. If we ever find a target which wants to lower scalable
3066 // vectors back to scalars, we'll need to update this code to
3067 // explicitly ask TTI about the register class uses for each part.
3068 return NumLegalParts <= VF.getKnownMinValue();
3069 }
3070 // Two or more elements that share a register - are vectorized.
3071 return NumLegalParts < VF.getFixedValue();
3072 };
3073
3074 // If no def nor is a store, e.g., branches, continue - no value to check.
3075 if (R.getNumDefinedValues() == 0 &&
3077 continue;
3078 // For multi-def recipes, currently only interleaved loads, suffice to
3079 // check first def only.
3080 // For stores check their stored value; for interleaved stores suffice
3081 // the check first stored value only. In all cases this is the second
3082 // operand.
3083 VPValue *ToCheck =
3084 R.getNumDefinedValues() >= 1 ? R.getVPValue(0) : R.getOperand(1);
3085 Type *ScalarTy = ToCheck->getScalarType();
3086 if (!Visited.insert({ScalarTy}).second)
3087 continue;
3088 Type *WideTy = toVectorizedTy(ScalarTy, VF);
3089 if (any_of(getContainedTypes(WideTy), WillGenerateTargetVectors))
3090 return true;
3091 }
3092 }
3093
3094 return false;
3095}
3096
3097static bool hasReplicatorRegion(VPlan &Plan) {
3099 Plan.getVectorLoopRegion()->getEntry())),
3100 [](auto *VPRB) { return VPRB->isReplicator(); });
3101}
3102
3103/// Returns true if the VPlan contains a VPReductionPHIRecipe with
3104/// FindLast recurrence kind.
3105static bool hasFindLastReductionPhi(VPlan &Plan) {
3108 [](VPReductionPHIRecipe &RedPhi) {
3109 return RecurrenceDescriptor::isFindLastRecurrenceKind(
3110 RedPhi.getRecurrenceKind());
3111 });
3112}
3113
3114/// Determine how to lower the epilogue for the vector epilogue loop.
3115/// Check if there are any conflicts that prevent tail-folding the epilogue.
3116/// \return CM_EpilogueNotNeededFoldTail if epilogue tail-folding is possible,
3117/// otherwise CM_EpilogueAllowed.
3119 const VectorizeOptions &Opts, const LoopVectorizationCostModel &MainCM,
3120 const Loop *L, OptimizationRemarkEmitter *ORE,
3123 // Epilogue TF is only enabled when explicitly requested via command line.
3124 if (Opts.epilogue_tail_folding_policy != TailFoldingPolicyTy::PreferFoldTail)
3125 return CM_EpilogueAllowed;
3126
3127 if (!Opts.enable_epilogue_vectorization) {
3129 "Options conflict, epilogue vectorization is disallowed while "
3130 "epilogue tail-folding allowed!",
3131 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3132 return CM_EpilogueAllowed;
3133 }
3134
3135 if (!Hints.getWidth() || !hasForcedEpilogueVF()) {
3136 reportVectorizationInfo("For now, epilogue tail-folding can't be "
3137 "applied without forced main/epilogue loop VF",
3138 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3139 return CM_EpilogueAllowed;
3140 }
3141
3143 reportVectorizationInfo("For now, epilogue tail-folding can't be applied "
3144 "when VF of the main loop <= VF of the epilogue",
3145 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3146 return CM_EpilogueAllowed;
3147 }
3148
3149 if (!L->isInnermost()) {
3151 "Epilogue tail-folding is not supported for outer loop",
3152 "InvalidTailFoldedEpilogue", ORE, L);
3153 return CM_EpilogueAllowed;
3154 }
3155
3156 // If scalar epilogue is explicitly required, we can't apply TF.
3157 if (MainCM.requiresScalarEpilogue(/*IsVectorizing*/ true)) {
3159 "Epilogue tail-folding can't be applied because scalar epilogue is "
3160 "required. Fall back to a normal epilogue",
3161 "InvalidTailFoldedEpilogue", ORE, L);
3162 return CM_EpilogueAllowed;
3163 }
3164
3165 // If having epilogue is NOT allowed, then no epilogue to apply TF for.
3166 if (!MainCM.isEpilogueAllowed()) {
3167 reportVectorizationInfo("Not applying tail-folding to the epilogue, since "
3168 "no epilogue is allowed.",
3169 "InvalidTailFoldedEpilogue", ORE, L);
3170 return CM_EpilogueAllowed;
3171 }
3172
3173 if (L->getExitingBlock() != L->getLoopLatch() ||
3176 "Epilogue tail-folding is not supported yet for early-exit loops",
3177 "InvalidTailFoldedEpilogue", ORE, L);
3178 return CM_EpilogueAllowed;
3179 }
3180
3181 // The epilogue reuses the main loop's interleave groups, so it can't be
3182 // tail-folded if the target can't mask interleaved accesses.
3183 // TODO: Add support once the epilogue has its own IAI, separate from the main
3184 // loop's.
3185 if (MainCM.InterleaveInfo.hasGroups() &&
3188 "Epilogue tail-folding is not supported with interleaved accesses "
3189 "when masking them isn't supported",
3190 "InvalidTailFoldedEpilogue", ORE, L);
3191 return CM_EpilogueAllowed;
3192 }
3193
3194 if (Opts.force_partial_aliasing_vectorization) {
3196 "Epilogue tail-folding is not supported with alias masking",
3197 "InvalidTailFoldedEpilogue", ORE, L);
3198 return CM_EpilogueAllowed;
3199 }
3200
3201 if (!LVL.getReductionVars().empty()) {
3203 "Epilogue tail-folding is not supported with reductions",
3204 "InvalidTailFoldedEpilogue", ORE, L);
3205 return CM_EpilogueAllowed;
3206 }
3207
3208 if (!LVL.getFixedOrderRecurrences().empty()) {
3210 "Epilogue tail-folding is not supported with fixed-order recurrence",
3211 "InvalidTailFoldedEpilogue", ORE, L);
3212 return CM_EpilogueAllowed;
3213 }
3214
3215 // TODO: This is conservative: it rejects any target that prefers EVL, even
3216 // for fixed-width epilogue VFs where EVL won't be chosen. Move this check to
3217 // where the epilogue's TF style is known once epilogue TF is supported.
3218 TailFoldingStyle TFStyle = Opts.force_tail_folding_style.value_or(
3219 TTI->getPreferredTailFoldingStyle());
3220 // TODO: Remove once EVL recipes support cloning.
3221 if (TFStyle == TailFoldingStyle::DataWithEVL) {
3222 reportVectorizationInfo("Epilogue tail-folding is not supported yet with "
3223 "EVL-based tail-folding",
3224 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3225 return CM_EpilogueAllowed;
3226 }
3227
3228 // We can apply tail-folding on the vectorized epilogue loop.
3230}
3231
3233 const ElementCount VF, const unsigned IC) const {
3234 // FIXME: We need a much better cost-model to take different parameters such
3235 // as register pressure, code size increase and cost of extra branches into
3236 // account. For now we apply a very crude heuristic and only consider loops
3237 // with vectorization factors larger than a certain value.
3238
3239 // Allow the target to opt out.
3240 if (!TTI.preferEpilogueVectorization(VF * IC))
3241 return false;
3242
3243 unsigned MinVFThreshold = Opts.epilogue_vectorization_minimum_VF.value_or(
3244 TTI.getEpilogueVectorizationMinVF());
3245 return estimateElementCount(VF * IC, getVScaleForTuning()) >= MinVFThreshold;
3246}
3247
3249 VPlan &MainPlan, ElementCount MainLoopVF, unsigned IC,
3250 bool ScalarEpilogueAllowed) {
3251 if (!Opts.enable_epilogue_vectorization) {
3252 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization is disabled.\n");
3253 return nullptr;
3254 }
3255
3256 if (!ScalarEpilogueAllowed) {
3257 LLVM_DEBUG(dbgs() << "LEV: Unable to vectorize epilogue because no "
3258 "epilogue is allowed.\n");
3259 return nullptr;
3260 }
3261
3262 if (vputils::findIncomingAliasMask(MainPlan)) {
3263 LLVM_DEBUG(
3264 dbgs()
3265 << "LEV: Epilogue vectorization not supported with alias masking.\n");
3266 return nullptr;
3267 }
3268
3269 // Not really a cost consideration, but check for unsupported cases here to
3270 // simplify the logic.
3271 if (!isCandidateForEpilogueVectorization(MainPlan)) {
3272 LLVM_DEBUG(dbgs() << "LEV: Unable to vectorize epilogue because the loop "
3273 "is not a supported candidate.\n");
3274 return nullptr;
3275 }
3276
3277 if (hasForcedEpilogueVF()) {
3279 Config.getVScaleForTuning()) >=
3280 IC * estimateElementCount(MainLoopVF, Config.getVScaleForTuning())) {
3281 // Note that the main loop leaves IC * MainLoopVF iterations iff a scalar
3282 // epilogue is required, but then the epilogue loop also requires a scalar
3283 // epilogue.
3284 LLVM_DEBUG(dbgs() << "LEV: Forced epilogue VF results in dead epilogue "
3285 "vector loop, skipping vectorizing epilogue.\n");
3286 return nullptr;
3287 }
3288
3289 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization factor is forced.\n");
3291 std::unique_ptr<VPlan> Clone(
3293 Clone->setVF(EpilogueVectorizationForceVF);
3294 return Clone;
3295 }
3296
3297 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization forced factor is not "
3298 "viable.\n");
3299 return nullptr;
3300 }
3301
3302 if (OrigLoop->getHeader()->getParent()->hasOptSize()) {
3303 LLVM_DEBUG(
3304 dbgs() << "LEV: Epilogue vectorization skipped due to opt for size.\n");
3305 return nullptr;
3306 }
3307
3308 if (!Config.isEpilogueVectorizationProfitable(MainLoopVF, IC)) {
3309 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization is not profitable for "
3310 "this loop\n");
3311 return nullptr;
3312 }
3313
3314 // Check if a plan's vector loop processes fewer iterations than VF (e.g. when
3315 // interleave groups have been narrowed) narrowInterleaveGroups) and return
3316 // the adjusted, effective VF.
3317 using namespace VPlanPatternMatch;
3318 auto GetEffectiveVF = [](VPlan &Plan, ElementCount VF) -> ElementCount {
3319 auto *Exiting = Plan.getVectorLoopRegion()->getExitingBasicBlock();
3320 if (match(&Exiting->back(),
3321 m_BranchOnCount(m_Add(m_CanonicalIV(), m_Specific(&Plan.getUF())),
3322 m_VPValue())))
3323 return ElementCount::get(1, VF.isScalable());
3324 return VF;
3325 };
3326
3327 // Check if the main loop processes fewer than MainLoopVF elements per
3328 // iteration (e.g. due to narrowing interleave groups). Adjust MainLoopVF
3329 // as needed.
3330 MainLoopVF = GetEffectiveVF(MainPlan, MainLoopVF);
3331
3332 // If MainLoopVF = vscale x 2, and vscale is expected to be 4, then we know
3333 // the main loop handles 8 lanes per iteration. We could still benefit from
3334 // vectorizing the epilogue loop with VF=4.
3335 ElementCount EstimatedRuntimeVF = ElementCount::getFixed(
3336 estimateElementCount(MainLoopVF, Config.getVScaleForTuning()));
3337
3338 Type *TCType = Legal->getWidestInductionType();
3339 const SCEV *RemainingIterations = nullptr;
3340 unsigned MaxTripCount = 0;
3341 const SCEV *TC = vputils::getSCEVExprForVPValue(MainPlan.getTripCount(), PSE);
3342 assert(!isa<SCEVCouldNotCompute>(TC) && "Trip count SCEV must be computable");
3343 const SCEV *KnownMinTC;
3344 bool ScalableTC = match(TC, m_scev_c_Mul(m_SCEV(KnownMinTC), m_SCEVVScale()));
3345 bool ScalableRemIter = false;
3346 ScalarEvolution &SE = *PSE.getSE();
3347 // Use versions of TC and VF in which both are either scalable or fixed.
3348 if (ScalableTC == MainLoopVF.isScalable()) {
3349 ScalableRemIter = ScalableTC;
3350 RemainingIterations =
3351 SE.getURemExpr(TC, SE.getElementCount(TCType, MainLoopVF * IC));
3352 } else if (ScalableTC) {
3353 const SCEV *EstimatedTC = SE.getMulExpr(
3354 KnownMinTC,
3355 SE.getConstant(TCType, Config.getVScaleForTuning().value_or(1)));
3356 RemainingIterations = SE.getURemExpr(
3357 EstimatedTC, SE.getElementCount(TCType, MainLoopVF * IC));
3358 } else
3359 RemainingIterations =
3360 SE.getURemExpr(TC, SE.getElementCount(TCType, EstimatedRuntimeVF * IC));
3361
3362 // No iterations left to process in the epilogue.
3363 if (RemainingIterations->isZero())
3364 return nullptr;
3365
3366 if (MainLoopVF.isFixed()) {
3367 MaxTripCount = MainLoopVF.getFixedValue() * IC - 1;
3368 if (SE.isKnownPredicate(CmpInst::ICMP_ULT, RemainingIterations,
3369 SE.getConstant(TCType, MaxTripCount))) {
3370 MaxTripCount = SE.getUnsignedRangeMax(RemainingIterations).getZExtValue();
3371 }
3372 LLVM_DEBUG(dbgs() << "LEV: Maximum Trip Count for Epilogue: "
3373 << MaxTripCount << "\n");
3374 }
3375
3376 auto SkipVF = [&](const SCEV *VF, const SCEV *RemIter) -> bool {
3377 return SE.isKnownPredicate(CmpInst::ICMP_UGT, VF, RemIter);
3378 };
3380 VPlan *BestPlan = nullptr;
3381 for (auto &NextVF : ProfitableVFs) {
3382 // Skip candidate VFs without a corresponding VPlan.
3383 if (!hasPlanWithVF(NextVF.Width))
3384 continue;
3385
3386 VPlan &CurrentPlan = getPlanFor(NextVF.Width);
3387 ElementCount EffectiveVF = GetEffectiveVF(CurrentPlan, NextVF.Width);
3388 // Skip fixed vector VFs > than the estimated runtime VF, or any VF > than
3389 // the VF of the main loop.
3390 if ((!EffectiveVF.isScalable() && MainLoopVF.isScalable() &&
3391 ElementCount::isKnownGT(EffectiveVF, EstimatedRuntimeVF)) ||
3392 ElementCount::isKnownGT(EffectiveVF, MainLoopVF))
3393 continue;
3394
3395 // If EffectiveVF is greater than the number of remaining iterations, the
3396 // epilogue loop would be dead. Skip such factors. If the epilogue plan
3397 // also has narrowed interleave groups, use the effective VF since
3398 // the epilogue step will be reduced to its IC.
3399 // TODO: We should also consider comparing against a scalable
3400 // RemainingIterations when SCEV be able to evaluate non-canonical
3401 // vscale-based expressions.
3402 if (!ScalableRemIter) {
3403 // Handle the case where EffectiveVF and RemainingIterations are in
3404 // different numerical spaces.
3405 if (EffectiveVF.isScalable())
3406 EffectiveVF = ElementCount::getFixed(
3407 estimateElementCount(EffectiveVF, Config.getVScaleForTuning()));
3408 if (SkipVF(SE.getElementCount(TCType, EffectiveVF), RemainingIterations))
3409 continue;
3410 }
3411
3412 if (Result.Width.isScalar() ||
3413 isMoreProfitable(NextVF, Result, MaxTripCount,
3414 !MainPlan.hasTailFolded(),
3415 /*IsEpilogue*/ true)) {
3416 Result = NextVF;
3417 BestPlan = &CurrentPlan;
3418 }
3419 }
3420
3421 if (!BestPlan)
3422 return nullptr;
3423
3424 LLVM_DEBUG(dbgs() << "LEV: Vectorizing epilogue loop with VF = "
3425 << Result.Width << "\n");
3426 std::unique_ptr<VPlan> Clone(BestPlan->duplicate());
3427 Clone->setVF(Result.Width);
3428 return Clone;
3429}
3430
3431unsigned
3433 InstructionCost LoopCost) {
3434 // -- The interleave heuristics --
3435 // We interleave the loop in order to expose ILP and reduce the loop overhead.
3436 // There are many micro-architectural considerations that we can't predict
3437 // at this level. For example, frontend pressure (on decode or fetch) due to
3438 // code size, or the number and capabilities of the execution ports.
3439 //
3440 // We use the following heuristics to select the interleave count:
3441 // 1. If the code has reductions, then we interleave to break the cross
3442 // iteration dependency.
3443 // 2. If the loop is really small, then we interleave to reduce the loop
3444 // overhead.
3445 // 3. We don't interleave if we think that we will spill registers to memory
3446 // due to the increased register pressure.
3447
3448 // Do not interleave tail-folded loops, as the overhead of multiple
3449 // instructions to calculate the predicate is likely not beneficial.
3450 // If an epilogue is not allowed for any other reason, do not interleave.
3451 if (!CM->isEpilogueAllowed())
3452 return 1;
3453
3456 LLVM_DEBUG(dbgs() << "LV: Loop requires variable-length step. "
3457 "Unroll factor forced to be 1.\n");
3458 return 1;
3459 }
3460
3461 // We used the distance for the interleave count.
3462 if (!Legal->isSafeForAnyVectorWidth())
3463 return 1;
3464
3465 // We don't attempt to perform interleaving for loops with uncountable early
3466 // exits because the VPInstruction::AnyOf code cannot currently handle
3467 // multiple parts.
3468 if (Plan.hasEarlyExit())
3469 return 1;
3470
3471 const bool HasReductions =
3474
3475 // FIXME: implement interleaving for FindLast transform correctly.
3476 if (hasFindLastReductionPhi(Plan))
3477 return 1;
3478
3479 VPRegisterUsage R = calculateRegisterUsageForPlan(Plan, {VF}, TTI)[0];
3480
3481 // If we did not calculate the cost for VF (because the user selected the VF)
3482 // then we calculate the cost of VF here.
3483 if (LoopCost == 0) {
3484 if (VF.isScalar())
3485 LoopCost = CM->expectedCost(VF);
3486 else
3487 LoopCost = cost(Plan, VF, &R);
3488 assert(LoopCost.isValid() && "Expected to have chosen a VF with valid cost");
3489
3490 // Loop body is free and there is no need for interleaving.
3491 if (LoopCost == 0)
3492 return 1;
3493 }
3494
3495 // We divide by these constants so assume that we have at least one
3496 // instruction that uses at least one register.
3497 for (auto &Pair : R.MaxLocalUsers) {
3498 Pair.second = std::max(Pair.second, 1U);
3499 }
3500
3501 // We calculate the interleave count using the following formula.
3502 // Subtract the number of loop invariants from the number of available
3503 // registers. These registers are used by all of the interleaved instances.
3504 // Next, divide the remaining registers by the number of registers that is
3505 // required by the loop, in order to estimate how many parallel instances
3506 // fit without causing spills. All of this is rounded down if necessary to be
3507 // a power of two. We want power of two interleave count to simplify any
3508 // addressing operations or alignment considerations.
3509 // We also want power of two interleave counts to ensure that the induction
3510 // variable of the vector loop wraps to zero, when tail is folded by masking;
3511 // this currently happens when OptForSize, in which case IC is set to 1 above.
3512 unsigned IC = UINT_MAX;
3513
3514 for (const auto &Pair : R.MaxLocalUsers) {
3515 unsigned TargetNumRegisters = TTI.getNumberOfRegisters(Pair.first);
3516 LLVM_DEBUG(dbgs() << "LV: The target has " << TargetNumRegisters
3517 << " registers of "
3518 << TTI.getRegisterClassName(Pair.first)
3519 << " register class\n");
3520 TargetNumRegisters = (VF.isScalar() ? Opts.force_target_num_scalar_regs
3521 : Opts.force_target_num_vector_regs)
3522 .value_or(TargetNumRegisters);
3523 unsigned MaxLocalUsers = Pair.second;
3524 unsigned LoopInvariantRegs = 0;
3525 if (R.LoopInvariantRegs.contains(Pair.first))
3526 LoopInvariantRegs = R.LoopInvariantRegs[Pair.first];
3527
3528 unsigned TmpIC = llvm::bit_floor((TargetNumRegisters - LoopInvariantRegs) /
3529 MaxLocalUsers);
3530 // Don't count the induction variable as interleaved.
3531 if (Opts.enable_ind_var_reg_heur) {
3532 TmpIC = llvm::bit_floor((TargetNumRegisters - LoopInvariantRegs - 1) /
3533 std::max(1U, (MaxLocalUsers - 1)));
3534 }
3535
3536 IC = std::min(IC, TmpIC);
3537 }
3538
3539 // Clamp the interleave ranges to reasonable counts.
3540 bool HasUnorderedReductions =
3541 HasReductions &&
3544 [](VPReductionPHIRecipe &RedR) { return RedR.isOrdered(); });
3545 unsigned MaxInterleaveCount =
3546 TTI.getMaxInterleaveFactor(VF, HasUnorderedReductions);
3547 LLVM_DEBUG(dbgs() << "LV: MaxInterleaveFactor for the target is "
3548 << MaxInterleaveCount << "\n");
3549
3550 // Check if the user has overridden the max.
3551 MaxInterleaveCount = (VF.isScalar() ? Opts.force_target_max_scalar_interleave
3552 : Opts.force_target_max_vector_interleave)
3553 .value_or(MaxInterleaveCount);
3554
3555 // Try to get the exact trip count, or an estimate based on profiling data or
3556 // ConstantMax from PSE, failing that.
3557 auto BestKnownTC =
3558 getSmallBestKnownTC(Opts, PSE, OrigLoop,
3559 /*CanUseConstantMax=*/true,
3560 /*CanExcludeZeroTrips=*/CM->isEpilogueAllowed());
3561
3562 // For fixed length VFs treat a scalable trip count as unknown.
3563 if (BestKnownTC && (BestKnownTC->isFixed() || VF.isScalable())) {
3564 // Re-evaluate trip counts and VFs to be in the same numerical space.
3565 unsigned AvailableTC =
3566 estimateElementCount(*BestKnownTC, Config.getVScaleForTuning());
3567 unsigned EstimatedVF =
3568 estimateElementCount(VF, Config.getVScaleForTuning());
3569
3570 // At least one iteration must be scalar when this constraint holds. So the
3571 // maximum available iterations for interleaving is one less.
3572 if (Plan.requiresScalarEpilogue())
3573 --AvailableTC;
3574
3575 unsigned InterleaveCountLB = bit_floor(std::max(
3576 1u, std::min(AvailableTC / (EstimatedVF * 2), MaxInterleaveCount)));
3577
3578 if (getSmallConstantTripCount(PSE.getSE(), OrigLoop).isNonZero()) {
3579 // If the best known trip count is exact, we select between two
3580 // prospective ICs, where
3581 //
3582 // 1) the aggressive IC is capped by the trip count divided by VF
3583 // 2) the conservative IC is capped by the trip count divided by (VF * 2)
3584 //
3585 // The final IC is selected in a way that the epilogue loop trip count is
3586 // minimized while maximizing the IC itself, so that we either run the
3587 // vector loop at least once if it generates a small epilogue loop, or
3588 // else we run the vector loop at least twice.
3589
3590 unsigned InterleaveCountUB = bit_floor(std::max(
3591 1u, std::min(AvailableTC / EstimatedVF, MaxInterleaveCount)));
3592 MaxInterleaveCount = InterleaveCountLB;
3593
3594 if (InterleaveCountUB != InterleaveCountLB) {
3595 unsigned TailTripCountUB =
3596 (AvailableTC % (EstimatedVF * InterleaveCountUB));
3597 unsigned TailTripCountLB =
3598 (AvailableTC % (EstimatedVF * InterleaveCountLB));
3599 // If both produce same scalar tail, maximize the IC to do the same work
3600 // in fewer vector loop iterations
3601 if (TailTripCountUB == TailTripCountLB)
3602 MaxInterleaveCount = InterleaveCountUB;
3603 }
3604 } else {
3605 // If trip count is an estimated compile time constant, limit the
3606 // IC to be capped by the trip count divided by VF * 2, such that the
3607 // vector loop runs at least twice to make interleaving seem profitable
3608 // when there is an epilogue loop present. Since exact Trip count is not
3609 // known we choose to be conservative in our IC estimate.
3610 MaxInterleaveCount = InterleaveCountLB;
3611 }
3612 }
3613
3614 assert(MaxInterleaveCount > 0 &&
3615 "Maximum interleave count must be greater than 0");
3616
3617 // Clamp the calculated IC to be between the 1 and the max interleave count
3618 // that the target and trip count allows.
3619 if (IC > MaxInterleaveCount)
3620 IC = MaxInterleaveCount;
3621 else
3622 // Make sure IC is greater than 0.
3623 IC = std::max(1u, IC);
3624
3625 assert(IC > 0 && "Interleave count must be greater than 0.");
3626
3627 // Interleave if we vectorized this loop and there is a reduction that could
3628 // benefit from interleaving.
3629 if (VF.isVector() && HasReductions) {
3630 LLVM_DEBUG(dbgs() << "LV: Interleaving because of reductions.\n");
3631 return IC;
3632 }
3633
3634 // For any scalar loop that either requires runtime checks or tail-folding we
3635 // are better off leaving this to the unroller. Note that if we've already
3636 // vectorized the loop we will have done the runtime check and so interleaving
3637 // won't require further checks.
3638 bool ScalarInterleavingRequiresPredication =
3639 (VF.isScalar() && any_of(OrigLoop->blocks(), [this](BasicBlock *BB) {
3640 return Legal->blockNeedsPredication(BB);
3641 }));
3642 bool ScalarInterleavingRequiresRuntimePointerCheck =
3643 (VF.isScalar() && Legal->getRuntimePointerChecking()->Need);
3644
3645 // We want to interleave small loops in order to reduce the loop overhead and
3646 // potentially expose ILP opportunities.
3647 LLVM_DEBUG(dbgs() << "LV: Loop cost is " << LoopCost << '\n'
3648 << "LV: IC is " << IC << '\n'
3649 << "LV: VF is " << VF << '\n');
3650 const bool AggressivelyInterleave =
3651 TTI.enableAggressiveInterleaving(HasReductions);
3652 if (!ScalarInterleavingRequiresRuntimePointerCheck &&
3653 !ScalarInterleavingRequiresPredication &&
3654 LoopCost < Opts.small_loop_cost) {
3655 // We assume that the cost overhead is 1 and we use the cost model
3656 // to estimate the cost of the loop and interleave until the cost of the
3657 // loop overhead is about 5% of the cost of the loop.
3658 unsigned SmallIC =
3659 std::min(IC, (unsigned)llvm::bit_floor<uint64_t>(Opts.small_loop_cost /
3660 LoopCost.getValue()));
3661
3662 // Interleave until store/load ports (estimated by max interleave count) are
3663 // saturated.
3664 unsigned NumStores = 0;
3665 unsigned NumLoads = 0;
3668 for (VPRecipeBase &R : *VPBB) {
3670 NumLoads++;
3671 continue;
3672 }
3674 NumStores++;
3675 continue;
3676 }
3677
3678 if (auto *InterleaveR = dyn_cast<VPInterleaveRecipe>(&R)) {
3679 if (unsigned StoreOps = InterleaveR->getNumStoreOperands())
3680 NumStores += StoreOps;
3681 else
3682 NumLoads += InterleaveR->getNumDefinedValues();
3683 continue;
3684 }
3685 if (auto *RepR = dyn_cast<VPReplicateRecipe>(&R)) {
3686 NumLoads += isa<LoadInst>(RepR->getUnderlyingInstr());
3687 NumStores += isa<StoreInst>(RepR->getUnderlyingInstr());
3688 continue;
3689 }
3690 if (isa<VPHistogramRecipe>(&R)) {
3691 NumLoads++;
3692 NumStores++;
3693 continue;
3694 }
3695 }
3696 }
3697 unsigned StoresIC = IC / (NumStores ? NumStores : 1);
3698 unsigned LoadsIC = IC / (NumLoads ? NumLoads : 1);
3699
3700 // There is little point in interleaving for reductions containing selects
3701 // and compares when VF=1 since it may just create more overhead than it's
3702 // worth for loops with small trip counts. This is because we still have to
3703 // do the final reduction after the loop.
3704 bool HasSelectCmpReductions =
3705 HasReductions &&
3708 [](VPReductionPHIRecipe &RedR) {
3709 return RecurrenceDescriptor::isAnyOfRecurrenceKind(
3710 RedR.getRecurrenceKind()) ||
3711 RecurrenceDescriptor::isFindIVRecurrenceKind(
3712 RedR.getRecurrenceKind());
3713 });
3714 if (HasSelectCmpReductions) {
3715 LLVM_DEBUG(dbgs() << "LV: Not interleaving select-cmp reductions.\n");
3716 return 1;
3717 }
3718
3719 // If we have a scalar reduction (vector reductions are already dealt with
3720 // by this point), we can increase the critical path length if the loop
3721 // we're interleaving is inside another loop. For tree-wise reductions
3722 // set the limit to 2, and for ordered reductions it's best to disable
3723 // interleaving entirely.
3724 if (HasReductions && OrigLoop->getLoopDepth() > 1) {
3725 bool HasOrderedReductions =
3728 [](VPReductionPHIRecipe &RedR) { return RedR.isOrdered(); });
3729 if (HasOrderedReductions) {
3730 LLVM_DEBUG(
3731 dbgs() << "LV: Not interleaving scalar ordered reductions.\n");
3732 return 1;
3733 }
3734
3735 unsigned F = Opts.max_nested_scalar_reduction_interleave;
3736 SmallIC = std::min(SmallIC, F);
3737 StoresIC = std::min(StoresIC, F);
3738 LoadsIC = std::min(LoadsIC, F);
3739 }
3740
3741 if (Opts.enable_loadstore_runtime_interleave &&
3742 std::max(StoresIC, LoadsIC) > SmallIC) {
3743 LLVM_DEBUG(
3744 dbgs() << "LV: Interleaving to saturate store or load ports.\n");
3745 return std::max(StoresIC, LoadsIC);
3746 }
3747
3748 // If there are scalar reductions and TTI has enabled aggressive
3749 // interleaving for reductions, we will interleave to expose ILP.
3750 if (VF.isScalar() && AggressivelyInterleave) {
3751 LLVM_DEBUG(dbgs() << "LV: Interleaving to expose ILP.\n");
3752 // Interleave no less than SmallIC but not as aggressive as the normal IC
3753 // to satisfy the rare situation when resources are too limited.
3754 return std::max(IC / 2, SmallIC);
3755 }
3756
3757 LLVM_DEBUG(dbgs() << "LV: Interleaving to reduce branch cost.\n");
3758 return SmallIC;
3759 }
3760
3761 // Interleave if this is a large loop (small loops are already dealt with by
3762 // this point) that could benefit from interleaving.
3763 if (AggressivelyInterleave) {
3764 LLVM_DEBUG(dbgs() << "LV: Interleaving to expose ILP.\n");
3765 return IC;
3766 }
3767
3768 LLVM_DEBUG(dbgs() << "LV: Not Interleaving.\n");
3769 return 1;
3770}
3771
3773 Instruction *I, ElementCount VF) const {
3774 // TODO: Cost model for emulated masked load/store is completely
3775 // broken. This hack guides the cost model to use an artificially
3776 // high enough value to practically disable vectorization with such
3777 // operations, except where previously deployed legality hack allowed
3778 // using very low cost values. This is to avoid regressions coming simply
3779 // from moving "masked load/store" check from legality to cost model.
3780 // Masked Load/Gather emulation was previously never allowed.
3781 // Limited number of Masked Store/Scatter emulation was allowed.
3783 "Expecting a scalar emulated instruction");
3784 return isa<LoadInst>(I) ||
3785 (isa<StoreInst>(I) && NumPredStores > Opts.vectorize_num_stores_pred);
3786}
3787
3789 assert(VF.isVector() && "Expected VF >= 2");
3790
3791 // If we've already collected the instructions to scalarize or the predicated
3792 // BBs after vectorization, there's nothing to do. Collection may already have
3793 // occurred if we have a user-selected VF and are now computing the expected
3794 // cost for interleaving.
3795 if (InstsToScalarize.contains(VF) ||
3796 PredicatedBBsAfterVectorization.contains(VF))
3797 return;
3798
3799 // Initialize a mapping for VF in InstsToScalalarize. If we find that it's
3800 // not profitable to scalarize any instructions, the presence of VF in the
3801 // map will indicate that we've analyzed it already.
3802 ScalarCostsTy &ScalarCostsVF = InstsToScalarize[VF];
3803
3804 // Find all the instructions that are scalar with predication in the loop and
3805 // determine if it would be better to not if-convert the blocks they are in.
3806 // If so, we also record the instructions to scalarize.
3807 for (BasicBlock *BB : TheLoop->blocks()) {
3809 continue;
3810 for (Instruction &I : *BB)
3811 if (isScalarWithPredication(&I, VF)) {
3812 ScalarCostsTy ScalarCosts;
3813 // Do not apply discount logic for:
3814 // 1. Scalars after vectorization, as there will only be a single copy
3815 // of the instruction.
3816 // 2. Scalable VF, as that would lead to invalid scalarization costs.
3817 // 3. Emulated masked memrefs, if a hacked cost is needed.
3818 if (!isScalarAfterVectorization(&I, VF) && !VF.isScalable() &&
3820 computePredInstDiscount(&I, ScalarCosts, VF) >= 0) {
3821 for (const auto &[I, IC] : ScalarCosts)
3822 ScalarCostsVF.insert({I, IC});
3823 }
3824 // Remember that BB will remain after vectorization.
3825 PredicatedBBsAfterVectorization[VF].insert(BB);
3826 for (auto *Pred : predecessors(BB)) {
3827 if (Pred->getSingleSuccessor() == BB)
3828 PredicatedBBsAfterVectorization[VF].insert(Pred);
3829 }
3830 }
3831 }
3832}
3833
3834InstructionCost LoopVectorizationCostModel::computePredInstDiscount(
3835 Instruction *PredInst, ScalarCostsTy &ScalarCosts, ElementCount VF) {
3836 assert(!isUniformAfterVectorization(PredInst, VF) &&
3837 "Instruction marked uniform-after-vectorization will be predicated");
3838
3839 // Initialize the discount to zero, meaning that the scalar version and the
3840 // vector version cost the same.
3841 InstructionCost Discount = 0;
3842
3843 // Holds instructions to analyze. The instructions we visit are mapped in
3844 // ScalarCosts. Those instructions are the ones that would be scalarized if
3845 // we find that the scalar version costs less.
3847
3848 // Returns true if the given instruction can be scalarized.
3849 auto CanBeScalarized = [&](Instruction *I) -> bool {
3850 // We only attempt to scalarize instructions forming a single-use chain
3851 // from the original predicated block that would otherwise be vectorized.
3852 // Although not strictly necessary, we give up on instructions we know will
3853 // already be scalar to avoid traversing chains that are unlikely to be
3854 // beneficial.
3855 if (!I->hasOneUse() || PredInst->getParent() != I->getParent() ||
3856 isScalarAfterVectorization(I, VF))
3857 return false;
3858
3859 // If the instruction is scalar with predication, it will be analyzed
3860 // separately. We ignore it within the context of PredInst.
3861 if (isScalarWithPredication(I, VF))
3862 return false;
3863
3864 // If any of the instruction's operands are uniform after vectorization,
3865 // the instruction cannot be scalarized. This prevents, for example, a
3866 // masked load from being scalarized.
3867 //
3868 // We assume we will only emit a value for lane zero of an instruction
3869 // marked uniform after vectorization, rather than VF identical values.
3870 // Thus, if we scalarize an instruction that uses a uniform, we would
3871 // create uses of values corresponding to the lanes we aren't emitting code
3872 // for. This behavior can be changed by allowing getScalarValue to clone
3873 // the lane zero values for uniforms rather than asserting.
3874 for (Use &U : I->operands())
3875 if (auto *J = dyn_cast<Instruction>(U.get()))
3876 if (isUniformAfterVectorization(J, VF))
3877 return false;
3878
3879 // Otherwise, we can scalarize the instruction.
3880 return true;
3881 };
3882
3883 // Compute the expected cost discount from scalarizing the entire expression
3884 // feeding the predicated instruction. We currently only consider expressions
3885 // that are single-use instruction chains.
3886 Worklist.push_back(PredInst);
3887 while (!Worklist.empty()) {
3888 Instruction *I = Worklist.pop_back_val();
3889
3890 // If we've already analyzed the instruction, there's nothing to do.
3891 if (ScalarCosts.contains(I))
3892 continue;
3893
3894 // Cannot scalarize fixed-order recurrence phis at the moment.
3895 if (isa<PHINode>(I) && Legal->isFixedOrderRecurrence(cast<PHINode>(I)))
3896 continue;
3897
3898 // Compute the cost of the vector instruction. Note that this cost already
3899 // includes the scalarization overhead of the predicated instruction.
3900 InstructionCost VectorCost = getInstructionCost(I, VF);
3901
3902 // Compute the cost of the scalarized instruction. This cost is the cost of
3903 // the instruction as if it wasn't if-converted and instead remained in the
3904 // predicated block. We will scale this cost by block probability after
3905 // computing the scalarization overhead.
3906 InstructionCost ScalarCost =
3907 VF.getFixedValue() * getInstructionCost(I, ElementCount::getFixed(1));
3908
3909 // Compute the scalarization overhead of needed insertelement instructions
3910 // and phi nodes.
3911 if (isScalarWithPredication(I, VF) && !I->getType()->isVoidTy()) {
3912 Type *WideTy = toVectorizedTy(I->getType(), VF);
3913 for (Type *VectorTy : getContainedTypes(WideTy)) {
3914 ScalarCost += TTI.getScalarizationOverhead(
3916 /*Insert=*/true,
3917 /*Extract=*/false, Config.CostKind);
3918 }
3919 ScalarCost += VF.getFixedValue() *
3920 TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
3921 }
3922
3923 // Compute the scalarization overhead of needed extractelement
3924 // instructions. For each of the instruction's operands, if the operand can
3925 // be scalarized, add it to the worklist; otherwise, account for the
3926 // overhead.
3927 for (Use &U : I->operands())
3928 if (auto *J = dyn_cast<Instruction>(U.get())) {
3929 assert(canVectorizeTy(J->getType()) &&
3930 "Instruction has non-scalar type");
3931 if (CanBeScalarized(J))
3932 Worklist.push_back(J);
3933 else if (needsExtract(J, VF)) {
3934 Type *WideTy = toVectorizedTy(J->getType(), VF);
3935 for (Type *VectorTy : getContainedTypes(WideTy)) {
3936 ScalarCost += TTI.getScalarizationOverhead(
3937 cast<VectorType>(VectorTy),
3938 APInt::getAllOnes(VF.getFixedValue()), /*Insert*/ false,
3939 /*Extract*/ true, Config.CostKind);
3940 }
3941 }
3942 }
3943
3944 // Scale the total scalar cost by block probability.
3945 ScalarCost /= getPredBlockCostDivisor(Config.CostKind, I->getParent());
3946
3947 // Compute the discount. A non-negative discount means the vector version
3948 // of the instruction costs more, and scalarizing would be beneficial.
3949 Discount += VectorCost - ScalarCost;
3950 ScalarCosts[I] = ScalarCost;
3951 }
3952
3953 return Discount;
3954}
3955
3958 assert(VF.isScalar() && "must only be called for scalar VFs");
3959
3960 // For each block.
3961 for (BasicBlock *BB : TheLoop->blocks()) {
3962 InstructionCost BlockCost;
3963
3964 // For each instruction in the old loop.
3965 for (Instruction &I : *BB) {
3966 // Skip ignored values.
3967 if (ValuesToIgnore.count(&I) ||
3968 (VF.isVector() && VecValuesToIgnore.count(&I)))
3969 continue;
3970
3972
3973 // Check if we should override the cost.
3974 if (C.isValid() && Opts.force_target_instruction_cost)
3975 C = InstructionCost(*Opts.force_target_instruction_cost);
3976
3977 BlockCost += C;
3978 LLVM_DEBUG(dbgs() << "LV: Found an estimated cost of " << C << " for VF "
3979 << VF << " For instruction: " << I << '\n');
3980 }
3981
3982 // In the scalar loop, we may not always execute the predicated block, if it
3983 // is an if-else block. Thus, scale the block's cost by the probability of
3984 // executing it. getPredBlockCostDivisor will return 1 for blocks that are
3985 // only predicated by the header mask when folding the tail.
3986 Cost += BlockCost / getPredBlockCostDivisor(Config.CostKind, BB);
3987 }
3988
3989 return Cost;
3990}
3991
3992/// Gets the address access SCEV for Ptr, if it should be used for cost modeling
3993/// according to isAddressSCEVForCost.
3994///
3995/// This SCEV can be sent to the Target in order to estimate the address
3996/// calculation cost.
3998 Value *Ptr,
4000 const Loop *TheLoop) {
4001 const SCEV *Addr = PSE.getSCEV(Ptr);
4002 return vputils::isAddressSCEVForCost(Addr, *PSE.getSE(), TheLoop) ? Addr
4003 : nullptr;
4004}
4005
4007LoopVectorizationCostModel::getMemInstScalarizationCost(Instruction *I,
4008 ElementCount VF) {
4009 assert(VF.isVector() &&
4010 "Scalarization cost of instruction implies vectorization.");
4011 if (VF.isScalable())
4012 return InstructionCost::getInvalid();
4013
4014 Type *ValTy = getLoadStoreType(I);
4015 auto *SE = PSE.getSE();
4016
4017 unsigned AS = getLoadStoreAddressSpace(I);
4019 Type *PtrTy = toVectorTy(Ptr->getType(), VF);
4020 // NOTE: PtrTy is a vector to signal `TTI::getAddressComputationCost`
4021 // that it is being called from this specific place.
4022
4023 // Figure out whether the access is strided and get the stride value
4024 // if it's known in compile time
4025 const SCEV *PtrSCEV = getAddressAccessSCEV(Ptr, PSE, TheLoop);
4026
4027 // Get the cost of the scalar memory instruction and address computation.
4029 VF.getFixedValue() *
4030 TTI.getAddressComputationCost(PtrTy, SE, PtrSCEV, Config.CostKind);
4031
4032 // Don't pass *I here, since it is scalar but will actually be part of a
4033 // vectorized loop where the user of it is a vectorized instruction.
4035 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4036 Cost += VF.getFixedValue() *
4037 TTI.getMemoryOpCost(I->getOpcode(), ValTy->getScalarType(), Alignment,
4038 AS, Config.CostKind, OpInfo);
4039
4040 // Get the overhead of the extractelement and insertelement instructions
4041 // we might create due to scalarization.
4043
4044 // If we have a predicated load/store, it will need extra i1 extracts and
4045 // conditional branches, but may not be executed for each vector lane. Scale
4046 // the cost by the probability of executing the predicated block.
4047 if (isPredicatedInst(I)) {
4048 Cost /= getPredBlockCostDivisor(Config.CostKind, I->getParent());
4049
4050 // Add the cost of an i1 extract and a branch
4051 auto *VecI1Ty =
4052 VectorType::get(IntegerType::getInt1Ty(ValTy->getContext()), VF);
4054 VecI1Ty, APInt::getAllOnes(VF.getFixedValue()),
4055 /*Insert=*/false, /*Extract=*/true, Config.CostKind);
4056 Cost += TTI.getCFInstrCost(Instruction::CondBr, Config.CostKind);
4057
4058 if (useEmulatedMaskMemRefHack(I, VF))
4059 // Artificially setting to a high enough value to practically disable
4060 // vectorization with such operations.
4061 Cost = 3000000;
4062 }
4063
4064 return Cost;
4065}
4066
4067InstructionCost LoopVectorizationCostModel::getConsecutiveMemOpCost(
4068 Instruction *I, ElementCount VF, InstWidening Kind) {
4069 assert((Kind == CM_Widen || Kind == CM_Widen_Reverse) &&
4070 "Expected a consecutive widening decision");
4071 Type *ValTy = getLoadStoreType(I);
4072 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4073 unsigned AS = getLoadStoreAddressSpace(I);
4074
4077 if (isMaskRequired(I)) {
4078 unsigned IID = I->getOpcode() == Instruction::Load
4079 ? Intrinsic::masked_load
4080 : Intrinsic::masked_store;
4082 MemIntrinsicCostAttributes(IID, VectorTy, Alignment, AS),
4083 Config.CostKind);
4084 } else {
4085 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4086 Cost += TTI.getMemoryOpCost(I->getOpcode(), VectorTy, Alignment, AS,
4087 Config.CostKind, OpInfo, I);
4088 }
4089
4090 if (Kind == CM_Widen_Reverse)
4092 VectorTy, Config.CostKind, {}, 0);
4093 return Cost;
4094}
4095
4097LoopVectorizationCostModel::getUniformMemOpCost(Instruction *I,
4098 ElementCount VF) const {
4099 assert(isUniformMemOp(*I, VF));
4100
4101 Type *ValTy = getLoadStoreType(I);
4103 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4105 unsigned AS = getLoadStoreAddressSpace(I);
4106 if (isa<LoadInst>(I)) {
4107 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4108 Config.CostKind) +
4109 TTI.getMemoryOpCost(Instruction::Load, ValTy, Alignment, AS,
4110 Config.CostKind) +
4112 VectorTy, Config.CostKind);
4113 }
4114 StoreInst *SI = cast<StoreInst>(I);
4115
4116 bool IsLoopInvariantStoreValue = Legal->isInvariant(SI->getValueOperand());
4117 // TODO: We have existing tests that request the cost of extracting element
4118 // VF.getKnownMinValue() - 1 from a scalable vector. This does not represent
4119 // the actual generated code, which involves extracting the last element of
4120 // a scalable vector where the lane to extract is unknown at compile time.
4122 TTI.getAddressComputationCost(PtrTy, nullptr, nullptr, Config.CostKind) +
4123 TTI.getMemoryOpCost(Instruction::Store, ValTy, Alignment, AS,
4124 Config.CostKind);
4125 if (!IsLoopInvariantStoreValue)
4126 Cost += TTI.getIndexedVectorInstrCostFromEnd(Instruction::ExtractElement,
4127 VectorTy, Config.CostKind, 0);
4128 return Cost;
4129}
4130
4132LoopVectorizationCostModel::getGatherScatterCost(Instruction *I,
4133 ElementCount VF) const {
4134 Type *ValTy = getLoadStoreType(I);
4135 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4138 Type *PtrTy = Ptr->getType();
4139
4140 if (!isUniform(Ptr, VF))
4141 PtrTy = toVectorTy(PtrTy, VF);
4142
4143 unsigned IID = I->getOpcode() == Instruction::Load
4144 ? Intrinsic::masked_gather
4145 : Intrinsic::masked_scatter;
4146 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4147 Config.CostKind) +
4149 MemIntrinsicCostAttributes(IID, VectorTy, Ptr, isMaskRequired(I),
4150 Alignment, I),
4151 Config.CostKind);
4152}
4153
4155LoopVectorizationCostModel::getInterleaveGroupCost(Instruction *I,
4156 ElementCount VF) const {
4157 const auto *Group = getInterleavedAccessGroup(I);
4158 assert(Group && "Fail to get an interleaved access group.");
4159
4160 Instruction *InsertPos = Group->getInsertPos();
4161 Type *ValTy = getLoadStoreType(InsertPos);
4162 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4163 unsigned AS = getLoadStoreAddressSpace(InsertPos);
4164
4165 unsigned InterleaveFactor = Group->getFactor();
4166 auto *WideVecTy = VectorType::get(ValTy, VF * InterleaveFactor);
4167
4168 // Holds the indices of existing members in the interleaved group.
4169 SmallVector<unsigned, 4> Indices;
4170 for (unsigned IF = 0; IF < InterleaveFactor; IF++)
4171 if (Group->getMember(IF))
4172 Indices.push_back(IF);
4173
4174 // Calculate the cost of the whole interleaved group.
4175 bool UseMaskForGaps =
4176 (Group->requiresScalarEpilogue() && !isEpilogueAllowed()) ||
4177 (isa<StoreInst>(I) && !Group->isFull());
4179 InsertPos->getOpcode(), WideVecTy, Group->getFactor(), Indices,
4180 Group->getAlign(), AS, Config.CostKind, isMaskRequired(I),
4181 UseMaskForGaps);
4182
4183 if (Group->isReverse()) {
4184 // TODO: Add support for reversed masked interleaved access.
4185 assert(!isMaskRequired(I) &&
4186 "Reverse masked interleaved access not supported.");
4187 Cost += Group->getNumMembers() *
4189 VectorTy, Config.CostKind, {}, 0);
4190 }
4191 return Cost;
4192}
4193
4195LoopVectorizationCostModel::getMemoryInstructionCost(Instruction *I,
4196 ElementCount VF) {
4197 // Calculate scalar cost only. Vectorization cost should be ready at this
4198 // moment.
4199 if (VF.isScalar()) {
4200 Type *ValTy = getLoadStoreType(I);
4203 unsigned AS = getLoadStoreAddressSpace(I);
4204
4205 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4206 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4207 Config.CostKind) +
4208 TTI.getMemoryOpCost(I->getOpcode(), ValTy, Alignment, AS,
4209 Config.CostKind, OpInfo, I);
4210 }
4211 return getWideningCost(I, VF);
4212}
4213
4215LoopVectorizationCostModel::getScalarizationOverhead(Instruction *I,
4216 ElementCount VF) const {
4217
4218 // There is no mechanism yet to create a scalable scalarization loop,
4219 // so this is currently Invalid.
4220 if (VF.isScalable())
4221 return InstructionCost::getInvalid();
4222
4223 if (VF.isScalar())
4224 return 0;
4225
4227 Type *RetTy = toVectorizedTy(I->getType(), VF);
4228 if (!RetTy->isVoidTy() &&
4230
4232 if (isa<LoadInst>(I))
4233 VIC = TTI::VectorInstrContext::Load;
4234 else if (isa<StoreInst>(I))
4235 VIC = TTI::VectorInstrContext::Store;
4236
4237 for (Type *VectorTy : getContainedTypes(RetTy)) {
4240 /*Insert=*/true, /*Extract=*/false, Config.CostKind,
4241 /*ForPoisonSrc=*/true, {}, VIC);
4242 }
4243 }
4244
4245 // Some targets keep addresses scalar.
4247 return Cost;
4248
4249 // Some targets support efficient element stores.
4251 return Cost;
4252
4253 // Collect operands to consider.
4254 CallInst *CI = dyn_cast<CallInst>(I);
4255 Instruction::op_range Ops = CI ? CI->args() : I->operands();
4256
4257 // Skip operands that do not require extraction/scalarization and do not incur
4258 // any overhead.
4260 for (auto *V : filterExtractingOperands(Ops, VF))
4261 Tys.push_back(maybeVectorizeType(V->getType(), VF));
4262
4264 ? TTI::VectorInstrContext::Store
4266 return Cost +
4267 TTI.getOperandsScalarizationOverhead(Tys, Config.CostKind, OperandVIC);
4268}
4269
4271 if (VF.isScalar())
4272 return;
4273
4274 // TODO: We should generate better code and update the cost model for
4275 // predicated uniform stores. Today they are treated as any other
4276 // predicated store (see added test cases in
4277 // invariant-store-vectorization.ll).
4278 NumPredStores = 0;
4279 for (BasicBlock *BB : TheLoop->blocks())
4280 for (Instruction &I : *BB)
4282 ++NumPredStores;
4283
4284 for (BasicBlock *BB : TheLoop->blocks()) {
4285 // For each instruction in the old loop.
4286 for (Instruction &I : *BB) {
4288
4289 // Ignore if no pointer found or a widening decision has already been
4290 // made.
4291 if (!Ptr || (getWideningDecision(&I, VF) != CM_Unknown))
4292 continue;
4293
4294 LLVM_DEBUG(dbgs() << "LV: Memory widening: calculating best strategy for "
4295 << I << '\n');
4296 if (isUniformMemOp(I, VF)) {
4297 auto IsLegalToScalarize = [&]() {
4298 if (!VF.isScalable())
4299 // Scalarization of fixed length vectors "just works".
4300 return true;
4301
4302 // We have dedicated lowering for unpredicated uniform loads and
4303 // stores. Note that even with tail folding we know that at least
4304 // one lane is active (i.e. generalized predication is not possible
4305 // here), and the logic below depends on this fact.
4306 if (!foldTailByMasking())
4307 return true;
4308
4309 // For scalable vectors, a uniform memop load is always
4310 // uniform-by-parts and we know how to scalarize that.
4311 if (isa<LoadInst>(I))
4312 return true;
4313
4314 // A uniform store isn't neccessarily uniform-by-part
4315 // and we can't assume scalarization.
4316 auto &SI = cast<StoreInst>(I);
4317 return TheLoop->isLoopInvariant(SI.getValueOperand());
4318 };
4319
4320 const InstructionCost GatherScatterCost =
4321 isLegalGatherOrScatter(&I, VF) ? getGatherScatterCost(&I, VF)
4323
4324 // Load: Scalar load + broadcast
4325 // Store: Scalar store + isLoopInvariantStoreValue ? 0 : extract
4326 // FIXME: This cost is a significant under-estimate for tail folded
4327 // memory ops.
4328 const InstructionCost ScalarizationCost =
4329 IsLegalToScalarize() ? getUniformMemOpCost(&I, VF)
4331
4332 // Choose better solution for the current VF, Note that Invalid
4333 // costs compare as maximumal large. If both are invalid, we get
4334 // scalable invalid which signals a failure and a vectorization abort.
4335 LLVM_DEBUG(dbgs() << "LV: Memory widening: uniform memory op has "
4336 "GatherScatterCost = "
4337 << GatherScatterCost << ", ScalarizationCost = "
4338 << ScalarizationCost << '\n');
4339 if (GatherScatterCost < ScalarizationCost)
4340 setWideningDecision(&I, VF, CM_GatherScatter, GatherScatterCost);
4341 else
4342 setWideningDecision(&I, VF, CM_Scalarize, ScalarizationCost);
4343 continue;
4344 }
4345
4346 // We assume that widening is the best solution when possible.
4347 if (std::optional<InstWidening> Decision =
4349 InstructionCost WidenCost = getConsecutiveMemOpCost(&I, VF, *Decision);
4350 LLVM_DEBUG(
4351 dbgs() << "LV: Memory widening: can be widened normally with cost "
4352 << WidenCost << '\n');
4353 setWideningDecision(&I, VF, *Decision, WidenCost);
4354 continue;
4355 }
4356
4357 // Choose between Interleaving, Gather/Scatter or Scalarization.
4359 unsigned NumAccesses = 1;
4360 if (isAccessInterleaved(&I)) {
4361 const auto *Group = getInterleavedAccessGroup(&I);
4362 assert(Group && "Fail to get an interleaved access group.");
4363
4364 NumAccesses = Group->getNumMembers();
4366 InterleaveCost = getInterleaveGroupCost(&I, VF);
4367 }
4368
4369 InstructionCost GatherScatterCost =
4371 ? getGatherScatterCost(&I, VF) * NumAccesses
4373
4374 InstructionCost ScalarizationCost =
4375 getMemInstScalarizationCost(&I, VF) * NumAccesses;
4376
4377 // Choose better solution for the current VF,
4378 // write down this decision and use it during vectorization.
4380 InstWidening Decision;
4381 if (InterleaveCost <= GatherScatterCost &&
4382 InterleaveCost < ScalarizationCost) {
4383 Decision = CM_Interleave;
4384 Cost = InterleaveCost;
4385 } else if (GatherScatterCost < ScalarizationCost) {
4386 Decision = CM_GatherScatter;
4387 Cost = GatherScatterCost;
4388 } else {
4389 Decision = CM_Scalarize;
4390 Cost = ScalarizationCost;
4391 }
4392 LLVM_DEBUG(
4393 dbgs() << "LV: Memory widening: InterleaveCost = " << InterleaveCost
4394 << ", GatherScatterCost = " << GatherScatterCost
4395 << ", ScalarizationCost = " << ScalarizationCost << '\n');
4396
4397 // If the instructions belongs to an interleave group, the whole group
4398 // receives the same decision. The whole group receives the cost, but
4399 // the cost will actually be assigned to one instruction.
4400 if (const auto *Group = getInterleavedAccessGroup(&I)) {
4401 if (Decision == CM_Scalarize) {
4402 for (Instruction *I : Group->members())
4403 setWideningDecision(I, VF, Decision,
4404 getMemInstScalarizationCost(I, VF));
4405 } else {
4406 setWideningDecision(Group, VF, Decision, Cost);
4407 }
4408 } else
4409 setWideningDecision(&I, VF, Decision, Cost);
4410 }
4411 }
4412
4413 // Make sure that any load of address and any other address computation
4414 // remains scalar unless there is gather/scatter support. This avoids
4415 // inevitable extracts into address registers, and also has the benefit of
4416 // activating LSR more, since that pass can't optimize vectorized
4417 // addresses.
4418 if (TTI.prefersVectorizedAddressing())
4419 return;
4420
4421 // Start with all scalar pointer uses.
4423 for (BasicBlock *BB : TheLoop->blocks())
4424 for (Instruction &I : *BB) {
4425 Instruction *PtrDef =
4427 if (PtrDef && TheLoop->contains(PtrDef) &&
4429 AddrDefs.insert(PtrDef);
4430 }
4431
4432 // Add all instructions used to generate the addresses.
4434 append_range(Worklist, AddrDefs);
4435 while (!Worklist.empty()) {
4436 Instruction *I = Worklist.pop_back_val();
4437 for (auto &Op : I->operands())
4438 if (auto *InstOp = dyn_cast<Instruction>(Op))
4439 if (TheLoop->contains(InstOp) && !isa<PHINode>(InstOp) &&
4440 AddrDefs.insert(InstOp))
4441 Worklist.push_back(InstOp);
4442 }
4443
4444 auto UpdateMemOpUserCost = [this, VF](LoadInst *LI) {
4445 // If there are direct memory op users of the newly scalarized load,
4446 // their cost may have changed because there's no scalarization
4447 // overhead for the operand. Update it.
4448 for (User *U : LI->users()) {
4450 continue;
4452 continue;
4453 auto UI = cast<Instruction>(U);
4454 LLVM_DEBUG(
4455 dbgs() << "LV: Memory widening: updating decision for load user "
4456 << *UI << '\n');
4458 UI, VF, CM_Scalarize,
4459 getMemInstScalarizationCost(cast<Instruction>(U), VF));
4460 }
4461 };
4462 for (auto *I : AddrDefs) {
4463 if (isa<LoadInst>(I)) {
4464 // Setting the desired widening decision should ideally be handled in
4465 // by cost functions, but since this involves the task of finding out
4466 // if the loaded register is involved in an address computation, it is
4467 // instead changed here when we know this is the case.
4468 InstWidening Decision = getWideningDecision(I, VF);
4469 if (!isPredicatedInst(I) &&
4470 (Decision == CM_Widen || Decision == CM_Widen_Reverse ||
4471 (!isUniformMemOp(*I, VF) && Decision == CM_Scalarize))) {
4472 // Scalarize a widened load of address or update the cost of a scalar
4473 // load of an address.
4474 LLVM_DEBUG(dbgs() << "LV: Memory widening: updating decision for load "
4475 << *I << '\n');
4477 I, VF, CM_Scalarize,
4478 (VF.getKnownMinValue() *
4479 getMemoryInstructionCost(I, ElementCount::getFixed(1))));
4480 UpdateMemOpUserCost(cast<LoadInst>(I));
4481 } else if (const auto *Group = getInterleavedAccessGroup(I)) {
4482 // Scalarize all members of this interleaved group when any member
4483 // is used as an address. The address-used load skips scalarization
4484 // overhead, other members include it.
4485 for (Instruction *Member : Group->members()) {
4486 InstructionCost Cost = AddrDefs.contains(Member)
4487 ? (VF.getKnownMinValue() *
4488 getMemoryInstructionCost(
4489 Member, ElementCount::getFixed(1)))
4490 : getMemInstScalarizationCost(Member, VF);
4491 LLVM_DEBUG(
4492 dbgs()
4493 << "LV: Memory widening: updating decision for interleave member "
4494 << *Member << '\n');
4496 UpdateMemOpUserCost(cast<LoadInst>(Member));
4497 }
4498 }
4499 } else {
4500 // Cannot scalarize fixed-order recurrence phis at the moment.
4501 if (isa<PHINode>(I) && Legal->isFixedOrderRecurrence(cast<PHINode>(I)))
4502 continue;
4503
4504 // Make sure I gets scalarized and a cost estimate without
4505 // scalarization overhead.
4506 ForcedScalars[VF].insert(I);
4507 }
4508 }
4509}
4510
4512 if (!Legal->isInvariant(Op))
4513 return false;
4514 // Consider Op invariant, if it or its operands aren't predicated
4515 // instruction in the loop. In that case, it is not trivially hoistable.
4516 auto *OpI = dyn_cast<Instruction>(Op);
4517 return !OpI || !TheLoop->contains(OpI) ||
4518 (!isPredicatedInst(OpI) &&
4519 (!isa<PHINode>(OpI) || OpI->getParent() != TheLoop->getHeader()) &&
4520 all_of(OpI->operands(),
4521 [this](Value *Op) { return shouldConsiderInvariant(Op); }));
4522}
4523
4526 ElementCount VF) {
4527 // If we know that this instruction will remain uniform, check the cost of
4528 // the scalar version.
4530 VF = ElementCount::getFixed(1);
4531
4532 if (VF.isVector() && isProfitableToScalarize(I, VF))
4533 return InstsToScalarize[VF][I];
4534
4535 // Forced scalars do not have any scalarization overhead.
4536 auto ForcedScalar = ForcedScalars.find(VF);
4537 if (VF.isVector() && ForcedScalar != ForcedScalars.end()) {
4538 auto InstSet = ForcedScalar->second;
4539 if (InstSet.count(I))
4541 VF.getKnownMinValue();
4542 }
4543
4544 const auto &MinBWs = Config.getMinimalBitwidths();
4545 uint64_t InstrMinBWs = MinBWs.lookup(I);
4546 Type *RetTy = I->getType();
4548 RetTy = IntegerType::get(RetTy->getContext(), InstrMinBWs);
4549 auto *SE = PSE.getSE();
4550
4551 Type *VectorTy;
4552 if (isScalarAfterVectorization(I, VF)) {
4553 [[maybe_unused]] auto HasSingleCopyAfterVectorization =
4554 [this](Instruction *I, ElementCount VF) -> bool {
4555 if (VF.isScalar())
4556 return true;
4557
4558 auto Scalarized = InstsToScalarize.find(VF);
4559 assert(Scalarized != InstsToScalarize.end() &&
4560 "VF not yet analyzed for scalarization profitability");
4561 return !Scalarized->second.count(I) &&
4562 llvm::all_of(I->users(), [&](User *U) {
4563 auto *UI = cast<Instruction>(U);
4564 return !Scalarized->second.count(UI);
4565 });
4566 };
4567
4568 // With the exception of GEPs and PHIs, after scalarization there should
4569 // only be one copy of the instruction generated in the loop. This is
4570 // because the VF is either 1, or any instructions that need scalarizing
4571 // have already been dealt with by the time we get here. As a result,
4572 // it means we don't have to multiply the instruction cost by VF.
4573 assert(I->getOpcode() == Instruction::GetElementPtr ||
4574 I->getOpcode() == Instruction::PHI ||
4575 (I->getOpcode() == Instruction::BitCast &&
4576 I->getType()->isPointerTy()) ||
4577 HasSingleCopyAfterVectorization(I, VF));
4578 VectorTy = RetTy;
4579 } else
4580 VectorTy = toVectorizedTy(RetTy, VF);
4581
4582 if (VF.isVector() && VectorTy->isVectorTy() &&
4583 !TTI.getNumberOfParts(VectorTy))
4585
4586 // TODO: We need to estimate the cost of intrinsic calls.
4587 switch (I->getOpcode()) {
4588 case Instruction::GetElementPtr:
4589 // We mark this instruction as zero-cost because the cost of GEPs in
4590 // vectorized code depends on whether the corresponding memory instruction
4591 // is scalarized or not. Therefore, we handle GEPs with the memory
4592 // instruction cost.
4593 return 0;
4594 case Instruction::UncondBr:
4595 case Instruction::CondBr: {
4596 // In cases of scalarized and predicated instructions, there will be VF
4597 // predicated blocks in the vectorized loop. Each branch around these
4598 // blocks requires also an extract of its vector compare i1 element.
4599 // Note that the conditional branch from the loop latch will be replaced by
4600 // a single branch controlling the loop, so there is no extra overhead from
4601 // scalarization.
4602 bool ScalarPredicatedBB = false;
4604 if (VF.isVector() && BI &&
4605 (PredicatedBBsAfterVectorization[VF].count(BI->getSuccessor(0)) ||
4606 PredicatedBBsAfterVectorization[VF].count(BI->getSuccessor(1))) &&
4607 BI->getParent() != TheLoop->getLoopLatch())
4608 ScalarPredicatedBB = true;
4609
4610 if (ScalarPredicatedBB) {
4611 // Not possible to scalarize scalable vector with predicated instructions.
4612 if (VF.isScalable())
4614 // Return cost for branches around scalarized and predicated blocks.
4615 auto *VecI1Ty =
4617 return (TTI.getScalarizationOverhead(
4618 VecI1Ty, APInt::getAllOnes(VF.getFixedValue()),
4619 /*Insert*/ false, /*Extract*/ true, Config.CostKind) +
4620 (TTI.getCFInstrCost(Instruction::CondBr, Config.CostKind) *
4621 VF.getFixedValue()));
4622 }
4623
4624 if (I->getParent() == TheLoop->getLoopLatch() || VF.isScalar())
4625 // The back-edge branch will remain, as will all scalar branches.
4626 return TTI.getCFInstrCost(Instruction::UncondBr, Config.CostKind);
4627
4628 // This branch will be eliminated by if-conversion.
4629 return 0;
4630 // Note: We currently assume zero cost for an unconditional branch inside
4631 // a predicated block since it will become a fall-through, although we
4632 // may decide in the future to call TTI for all branches.
4633 }
4634 case Instruction::Switch: {
4635 if (VF.isScalar())
4636 return TTI.getCFInstrCost(Instruction::Switch, Config.CostKind);
4637 auto *Switch = cast<SwitchInst>(I);
4638 return Switch->getNumCases() *
4639 TTI.getCmpSelInstrCost(
4640 Instruction::ICmp,
4641 toVectorTy(Switch->getCondition()->getType(), VF),
4642 toVectorTy(Type::getInt1Ty(I->getContext()), VF),
4643 CmpInst::ICMP_EQ, Config.CostKind);
4644 }
4645 case Instruction::PHI: {
4646 auto *Phi = cast<PHINode>(I);
4647
4648 // First-order recurrences are replaced by vector shuffles inside the loop.
4649 if (VF.isVector() && Legal->isFixedOrderRecurrence(Phi)) {
4650 return TTI.getShuffleCost(
4652 cast<VectorType>(VectorTy), Config.CostKind, {}, -1);
4653 }
4654
4655 // Phi nodes in non-header blocks (not inductions, reductions, etc.) are
4656 // converted into select instructions. We require N - 1 selects per phi
4657 // node, where N is the number of incoming values.
4658 if (VF.isVector() && Phi->getParent() != TheLoop->getHeader()) {
4659 Type *ResultTy = Phi->getType();
4660
4661 // All instructions in an Any-of reduction chain are narrowed to bool.
4662 // Check if that is the case for this phi node.
4663 auto *HeaderUser = cast_if_present<PHINode>(
4664 find_singleton<User>(Phi->users(), [this](User *U, bool) -> User * {
4665 auto *Phi = dyn_cast<PHINode>(U);
4666 if (Phi && Phi->getParent() == TheLoop->getHeader())
4667 return Phi;
4668 return nullptr;
4669 }));
4670 if (HeaderUser) {
4671 auto &ReductionVars = Legal->getReductionVars();
4672 auto Iter = ReductionVars.find(HeaderUser);
4673 if (Iter != ReductionVars.end() &&
4675 Iter->second.getRecurrenceKind()))
4676 ResultTy = Type::getInt1Ty(Phi->getContext());
4677 }
4678 return (Phi->getNumIncomingValues() - 1) *
4679 TTI.getCmpSelInstrCost(
4680 Instruction::Select, toVectorTy(ResultTy, VF),
4681 toVectorTy(Type::getInt1Ty(Phi->getContext()), VF),
4682 CmpInst::BAD_ICMP_PREDICATE, Config.CostKind);
4683 }
4684
4685 // When tail folding with EVL, if the phi is part of an out of loop
4686 // reduction then it will be transformed into a wide vp_merge.
4687 if (VF.isVector() && foldTailWithEVL() &&
4688 Legal->getReductionVars().contains(Phi) &&
4689 !Config.isInLoopReduction(Phi)) {
4691 Intrinsic::vp_merge, toVectorTy(Phi->getType(), VF),
4692 {toVectorTy(Type::getInt1Ty(Phi->getContext()), VF)});
4693 return TTI.getIntrinsicInstrCost(ICA, Config.CostKind);
4694 }
4695
4696 return TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
4697 }
4698 case Instruction::UDiv:
4699 case Instruction::SDiv:
4700 case Instruction::URem:
4701 case Instruction::SRem:
4702 if (VF.isVector() && isPredicatedInst(I)) {
4703 const auto [ScalarCost, MaskedCost] = getDivRemSpeculationCost(I, VF);
4704 return isDivRemScalarWithPredication(ScalarCost, MaskedCost) ? ScalarCost
4705 : MaskedCost;
4706 }
4707 // We've proven all lanes safe to speculate, fall through.
4708 [[fallthrough]];
4709 case Instruction::Add:
4710 case Instruction::Sub: {
4711 auto Info = Legal->getHistogramInfo(I);
4712 if (Info && VF.isVector()) {
4713 const HistogramInfo *HGram = Info.value();
4714 // Assume that a non-constant update value (or a constant != 1) requires
4715 // a multiply, and add that into the cost.
4717 ConstantInt *RHS = dyn_cast<ConstantInt>(I->getOperand(1));
4718 if (!RHS || RHS->getZExtValue() != 1)
4719 MulCost = TTI.getArithmeticInstrCost(Instruction::Mul, VectorTy,
4720 Config.CostKind);
4721
4722 // Find the cost of the histogram operation itself.
4723 Type *PtrTy = VectorType::get(HGram->Load->getPointerOperandType(), VF);
4724 Type *ScalarTy = I->getType();
4725 Type *MaskTy = VectorType::get(Type::getInt1Ty(I->getContext()), VF);
4726 IntrinsicCostAttributes ICA(Intrinsic::experimental_vector_histogram_add,
4727 Type::getVoidTy(I->getContext()),
4728 {PtrTy, ScalarTy, MaskTy});
4729
4730 // Add the costs together with the add/sub operation.
4731 return TTI.getIntrinsicInstrCost(ICA, Config.CostKind) + MulCost +
4732 TTI.getArithmeticInstrCost(I->getOpcode(), VectorTy,
4733 Config.CostKind);
4734 }
4735 [[fallthrough]];
4736 }
4737 case Instruction::FAdd:
4738 case Instruction::FSub:
4739 case Instruction::Mul:
4740 case Instruction::FMul:
4741 case Instruction::FDiv:
4742 case Instruction::FRem:
4743 case Instruction::Shl:
4744 case Instruction::LShr:
4745 case Instruction::AShr:
4746 case Instruction::And:
4747 case Instruction::Or:
4748 case Instruction::Xor: {
4749 // If we're speculating on the stride being 1, the multiplication may
4750 // fold away. We can generalize this for all operations using the notion
4751 // of neutral elements. (TODO)
4752 if (I->getOpcode() == Instruction::Mul &&
4753 ((TheLoop->isLoopInvariant(I->getOperand(0)) &&
4754 PSE.getSCEV(I->getOperand(0))->isOne()) ||
4755 (TheLoop->isLoopInvariant(I->getOperand(1)) &&
4756 PSE.getSCEV(I->getOperand(1))->isOne())))
4757 return 0;
4758
4759 // Certain instructions can be cheaper to vectorize if they have a constant
4760 // second vector operand. One example of this are shifts on x86.
4761 Value *Op2 = I->getOperand(1);
4762 if (!isa<Constant>(Op2) && TheLoop->isLoopInvariant(Op2) &&
4763 PSE.getSE()->isSCEVable(Op2->getType()) &&
4764 isa<SCEVConstant>(PSE.getSCEV(Op2))) {
4765 Op2 = cast<SCEVConstant>(PSE.getSCEV(Op2))->getValue();
4766 }
4767 auto Op2Info = TTI.getOperandInfo(Op2);
4768 if (Op2Info.Kind == TargetTransformInfo::OK_AnyValue &&
4771
4772 SmallVector<const Value *, 4> Operands(I->operand_values());
4773 return TTI.getArithmeticInstrCost(
4774 I->getOpcode(), VectorTy, Config.CostKind,
4775 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4776 Op2Info, Operands, I, TLI);
4777 }
4778 case Instruction::FNeg: {
4779 return TTI.getArithmeticInstrCost(
4780 I->getOpcode(), VectorTy, Config.CostKind,
4781 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4782 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4783 I->getOperand(0), I);
4784 }
4785 case Instruction::Select: {
4787 const SCEV *CondSCEV = SE->getSCEV(SI->getCondition());
4788 bool ScalarCond = (SE->isLoopInvariant(CondSCEV, TheLoop));
4789
4790 const Value *Op0, *Op1;
4791 using namespace llvm::PatternMatch;
4792 if (!ScalarCond && (match(I, m_LogicalAnd(m_Value(Op0), m_Value(Op1))) ||
4793 match(I, m_LogicalOr(m_Value(Op0), m_Value(Op1))))) {
4794 // select x, y, false --> x & y
4795 // select x, true, y --> x | y
4796 const auto [Op1VK, Op1VP] = TTI::getOperandInfo(Op0);
4797 const auto [Op2VK, Op2VP] = TTI::getOperandInfo(Op1);
4798 assert(Op0->getType()->getScalarSizeInBits() == 1 &&
4799 Op1->getType()->getScalarSizeInBits() == 1);
4800
4801 return TTI.getArithmeticInstrCost(
4802 match(I, m_LogicalOr()) ? Instruction::Or : Instruction::And,
4803 VectorTy, Config.CostKind, {Op1VK, Op1VP}, {Op2VK, Op2VP}, {Op0, Op1},
4804 I);
4805 }
4806
4807 Type *CondTy = SI->getCondition()->getType();
4808 if (!ScalarCond)
4809 CondTy = VectorType::get(CondTy, VF);
4810
4812 if (auto *Cmp = dyn_cast<CmpInst>(SI->getCondition()))
4813 Pred = Cmp->getPredicate();
4814 return TTI.getCmpSelInstrCost(
4815 I->getOpcode(), VectorTy, CondTy, Pred, Config.CostKind,
4816 {TTI::OK_AnyValue, TTI::OP_None}, {TTI::OK_AnyValue, TTI::OP_None}, I);
4817 }
4818 case Instruction::ICmp:
4819 case Instruction::FCmp: {
4820 Type *ValTy = I->getOperand(0)->getType();
4821
4823 [[maybe_unused]] Instruction *Op0AsInstruction =
4824 dyn_cast<Instruction>(I->getOperand(0));
4825 assert((!canTruncateToMinimalBitwidth(Op0AsInstruction, VF) ||
4826 InstrMinBWs == MinBWs.lookup(Op0AsInstruction)) &&
4827 "if both the operand and the compare are marked for "
4828 "truncation, they must have the same bitwidth");
4829 ValTy = IntegerType::get(ValTy->getContext(), InstrMinBWs);
4830 }
4831
4832 VectorTy = toVectorTy(ValTy, VF);
4833 return TTI.getCmpSelInstrCost(
4834 I->getOpcode(), VectorTy, CmpInst::makeCmpResultType(VectorTy),
4835 cast<CmpInst>(I)->getPredicate(), Config.CostKind,
4836 {TTI::OK_AnyValue, TTI::OP_None}, {TTI::OK_AnyValue, TTI::OP_None}, I);
4837 }
4838 case Instruction::Store:
4839 case Instruction::Load: {
4840 ElementCount Width = VF;
4841 if (Width.isVector()) {
4842 InstWidening Decision = getWideningDecision(I, Width);
4843 assert(Decision != CM_Unknown &&
4844 "CM decision should be taken at this point");
4847 if (Decision == CM_Scalarize)
4848 Width = ElementCount::getFixed(1);
4849 }
4850 VectorTy = toVectorTy(getLoadStoreType(I), Width);
4851 return getMemoryInstructionCost(I, VF);
4852 }
4853 case Instruction::BitCast:
4854 if (I->getType()->isPointerTy())
4855 return 0;
4856 [[fallthrough]];
4857 case Instruction::ZExt:
4858 case Instruction::SExt:
4859 case Instruction::FPToUI:
4860 case Instruction::FPToSI:
4861 case Instruction::FPExt:
4862 case Instruction::PtrToInt:
4863 case Instruction::IntToPtr:
4864 case Instruction::SIToFP:
4865 case Instruction::UIToFP:
4866 case Instruction::Trunc:
4867 case Instruction::FPTrunc: {
4868 // Computes the CastContextHint from a Load/Store instruction.
4869 auto ComputeCCH = [&](Instruction *I) -> TTI::CastContextHint {
4871 "Expected a load or a store!");
4872
4873 if (VF.isScalar() || !TheLoop->contains(I))
4875
4876 switch (getWideningDecision(I, VF)) {
4888 llvm_unreachable("Instr did not go through cost modelling?");
4891 }
4892
4893 llvm_unreachable("Unhandled case!");
4894 };
4895
4896 unsigned Opcode = I->getOpcode();
4898 // For Trunc, the context is the only user, which must be a StoreInst.
4899 if (Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) {
4900 if (I->hasOneUse())
4901 if (StoreInst *Store = dyn_cast<StoreInst>(*I->user_begin()))
4902 CCH = ComputeCCH(Store);
4903 }
4904 // For Z/Sext, the context is the operand, which must be a LoadInst.
4905 else if (Opcode == Instruction::ZExt || Opcode == Instruction::SExt ||
4906 Opcode == Instruction::FPExt) {
4907 if (LoadInst *Load = dyn_cast<LoadInst>(I->getOperand(0)))
4908 CCH = ComputeCCH(Load);
4909 }
4910
4911 // We optimize the truncation of induction variables having constant
4912 // integer steps. The cost of these truncations is the same as the scalar
4913 // operation.
4914 if (isOptimizableIVTruncate(I, VF)) {
4915 auto *Trunc = cast<TruncInst>(I);
4916 return TTI.getCastInstrCost(Instruction::Trunc, Trunc->getDestTy(),
4917 Trunc->getSrcTy(), CCH, Config.CostKind,
4918 Trunc);
4919 }
4920
4921 Type *SrcScalarTy = I->getOperand(0)->getType();
4922 Instruction *Op0AsInstruction = dyn_cast<Instruction>(I->getOperand(0));
4923 if (canTruncateToMinimalBitwidth(Op0AsInstruction, VF))
4924 SrcScalarTy = IntegerType::get(SrcScalarTy->getContext(),
4925 MinBWs.lookup(Op0AsInstruction));
4926 Type *SrcVecTy =
4927 VectorTy->isVectorTy() ? toVectorTy(SrcScalarTy, VF) : SrcScalarTy;
4928
4930 // If the result type is <= the source type, there will be no extend
4931 // after truncating the users to the minimal required bitwidth.
4932 if (VectorTy->getScalarSizeInBits() <= SrcVecTy->getScalarSizeInBits() &&
4933 (I->getOpcode() == Instruction::ZExt ||
4934 I->getOpcode() == Instruction::SExt))
4935 return 0;
4936 }
4937
4938 return TTI.getCastInstrCost(Opcode, VectorTy, SrcVecTy, CCH,
4939 Config.CostKind, I);
4940 }
4941 case Instruction::Call:
4942 return getVectorCallCost(cast<CallInst>(I), VF);
4943 case Instruction::ExtractValue:
4944 return TTI.getInstructionCost(I, Config.CostKind);
4945 case Instruction::Alloca:
4946 // We cannot easily widen alloca to a scalable alloca, as
4947 // the result would need to be a vector of pointers.
4948 if (VF.isScalable())
4950 return TTI.getArithmeticInstrCost(Instruction::Mul, RetTy, Config.CostKind);
4951 case Instruction::Freeze:
4952 return TTI::TCC_Free;
4953 default:
4954 // This opcode is unknown. Assume that it is the same as 'mul'.
4955 return TTI.getArithmeticInstrCost(Instruction::Mul, VectorTy,
4956 Config.CostKind);
4957 } // end of switch.
4958}
4959
4961 // Ignore ephemeral values.
4963
4964 SmallVector<Value *, 4> DeadInterleavePointerOps;
4966
4967 // If a scalar epilogue is required, users outside the loop won't use
4968 // live-outs from the vector loop but from the scalar epilogue. Ignore them if
4969 // that is the case.
4970 bool RequiresScalarEpilogue = requiresScalarEpilogue(true);
4971 auto IsLiveOutDead = [this, RequiresScalarEpilogue](User *U) {
4972 return RequiresScalarEpilogue &&
4973 !TheLoop->contains(cast<Instruction>(U)->getParent());
4974 };
4975
4977 DFS.perform(LI);
4978 for (BasicBlock *BB : reverse(make_range(DFS.beginRPO(), DFS.endRPO())))
4979 for (Instruction &I : reverse(*BB)) {
4980 if (VecValuesToIgnore.contains(&I) || ValuesToIgnore.contains(&I))
4981 continue;
4982
4983 // Add instructions that would be trivially dead and are only used by
4984 // values already ignored to DeadOps to seed worklist.
4986 all_of(I.users(), [this, IsLiveOutDead](User *U) {
4987 return VecValuesToIgnore.contains(U) ||
4988 ValuesToIgnore.contains(U) || IsLiveOutDead(U);
4989 }))
4990 DeadOps.push_back(&I);
4991
4992 // For interleave groups, we only create a pointer for the start of the
4993 // interleave group. Queue up addresses of group members except the insert
4994 // position for further processing.
4995 if (isAccessInterleaved(&I)) {
4996 auto *Group = getInterleavedAccessGroup(&I);
4997 if (Group->getInsertPos() == &I)
4998 continue;
4999 Value *PointerOp = getLoadStorePointerOperand(&I);
5000 DeadInterleavePointerOps.push_back(PointerOp);
5001 }
5002
5003 // Queue branches for analysis. They are dead, if their successors only
5004 // contain dead instructions.
5005 if (isa<CondBrInst>(&I))
5006 DeadOps.push_back(&I);
5007 }
5008
5009 // Mark ops feeding interleave group members as free, if they are only used
5010 // by other dead computations.
5011 for (unsigned I = 0; I != DeadInterleavePointerOps.size(); ++I) {
5012 auto *Op = dyn_cast<Instruction>(DeadInterleavePointerOps[I]);
5013 if (!Op || !TheLoop->contains(Op) || any_of(Op->users(), [this](User *U) {
5014 Instruction *UI = cast<Instruction>(U);
5015 return !VecValuesToIgnore.contains(U) &&
5016 (!isAccessInterleaved(UI) ||
5017 getInterleavedAccessGroup(UI)->getInsertPos() == UI);
5018 }))
5019 continue;
5020 VecValuesToIgnore.insert(Op);
5021 append_range(DeadInterleavePointerOps, Op->operands());
5022 }
5023
5024 // Mark ops that would be trivially dead and are only used by ignored
5025 // instructions as free.
5026 BasicBlock *Header = TheLoop->getHeader();
5027
5028 // Returns true if the block contains only dead instructions. Such blocks will
5029 // be removed by VPlan-to-VPlan transforms and won't be considered by the
5030 // VPlan-based cost model, so skip them in the legacy cost-model as well.
5031 auto IsEmptyBlock = [this](BasicBlock *BB) {
5032 return all_of(*BB, [this](Instruction &I) {
5033 return ValuesToIgnore.contains(&I) || VecValuesToIgnore.contains(&I) ||
5035 });
5036 };
5037 SmallPtrSet<Instruction *, 16> ProcessedDeadOps;
5038 for (unsigned I = 0; I != DeadOps.size(); ++I) {
5039 auto *Op = dyn_cast<Instruction>(DeadOps[I]);
5040
5041 // Check if the branch should be considered dead.
5042 if (auto *Br = dyn_cast_or_null<CondBrInst>(Op)) {
5043 BasicBlock *ThenBB = Br->getSuccessor(0);
5044 BasicBlock *ElseBB = Br->getSuccessor(1);
5045 // Don't considers branches leaving the loop for simplification.
5046 if (!TheLoop->contains(ThenBB) || !TheLoop->contains(ElseBB))
5047 continue;
5048 bool ThenEmpty = IsEmptyBlock(ThenBB);
5049 bool ElseEmpty = IsEmptyBlock(ElseBB);
5050 if ((ThenEmpty && ElseEmpty) ||
5051 (ThenEmpty && ThenBB->getSingleSuccessor() == ElseBB &&
5052 ElseBB->phis().empty()) ||
5053 (ElseEmpty && ElseBB->getSingleSuccessor() == ThenBB &&
5054 ThenBB->phis().empty())) {
5055 VecValuesToIgnore.insert(Br);
5056 DeadOps.push_back(Br->getCondition());
5057 }
5058 continue;
5059 }
5060
5061 // Skip any op that shouldn't be considered dead.
5062 if (!Op || !TheLoop->contains(Op) ||
5063 (isa<PHINode>(Op) && Op->getParent() == Header) ||
5065 any_of(Op->users(), [this, IsLiveOutDead](User *U) {
5066 return !VecValuesToIgnore.contains(U) &&
5067 !ValuesToIgnore.contains(U) && !IsLiveOutDead(U);
5068 }))
5069 continue;
5070
5071 // If all of Op's users are in ValuesToIgnore, add it to ValuesToIgnore
5072 // which applies for both scalar and vector versions. Otherwise it is only
5073 // dead in vector versions, so only add it to VecValuesToIgnore.
5074 bool BecameScalarDead = false;
5075 if (all_of(Op->users(),
5076 [this](User *U) { return ValuesToIgnore.contains(U); }))
5077 BecameScalarDead = ValuesToIgnore.insert(Op).second;
5078
5079 VecValuesToIgnore.insert(Op);
5080 // Shared operands may be queued more than once. Propagate deadness once,
5081 // and again if an instruction previously dead only in the vector loop
5082 // becomes dead in the scalar loop too.
5083 if (ProcessedDeadOps.insert(Op).second || BecameScalarDead)
5084 append_range(DeadOps, Op->operands());
5085 }
5086
5087 // Ignore type-promoting instructions we identified during reduction
5088 // detection.
5089 for (const RecurrenceDescriptor &RedDes :
5090 Legal->getReductionVars().values()) {
5091 VecValuesToIgnore.insert_range(RedDes.getCastInsts());
5092 }
5093 // Ignore type-casting instructions we identified during induction
5094 // detection.
5095 for (const InductionDescriptor &IndDes : Legal->getInductionVars().values())
5096 VecValuesToIgnore.insert_range(IndDes.getCastInsts());
5097}
5098
5099void LoopVectorizationPlanner::plan(ElementCount UserVF, unsigned UserIC) {
5100 CM->collectValuesToIgnore();
5101 Config.collectElementTypesForWidening(&CM->ValuesToIgnore);
5102
5103 FixedScalableVFPair MaxFactors = CM->computeMaxVF(UserVF, UserIC);
5104 if (!MaxFactors) // Cases that should not to be vectorized nor interleaved.
5105 return;
5106
5107 Config.collectInLoopReductions();
5108 // Cases that may be vectorized may be optimized by unit stride predicates.
5109 // TODO: Currently unit stride predicates are added unconditionally, even if
5110 // they are not used for the selected VF (e.g. when only interleaving).
5111 if (MaxFactors.FixedVF.isVector() || MaxFactors.ScalableVF.isVector())
5112 Legal->collectUnitStridePredicates();
5113
5114 auto VPlan1 = tryToBuildVPlan1();
5115 if (!VPlan1)
5116 return;
5117
5118 LLVM_DEBUG(dbgs() << "LV: VPlan created successfully. Loop can be "
5119 "vectorized.\n");
5120
5121 if (!OrigLoop->isInnermost()) {
5122 // For outer loops, computeMaxVF returns a single non-scalar VF; build a
5123 // plan for that VF only.
5124 ElementCount VF =
5125 MaxFactors.FixedVF ? MaxFactors.FixedVF : MaxFactors.ScalableVF;
5126 buildVPlans(*VPlan1, VF, VF);
5128 return;
5129 }
5130
5131 // Compute the minimal bitwidths required for integer operations in the loop
5132 // for later use by the cost model.
5133 Config.computeMinimalBitwidths();
5134
5135 // Invalidate interleave groups if all blocks of loop will be predicated.
5136 if (CM->blockNeedsPredicationForAnyReason(OrigLoop->getHeader()) &&
5137 !useMaskedInterleavedAccesses(Opts, TTI)) {
5138 LLVM_DEBUG(
5139 dbgs()
5140 << "LV: Invalidate all interleaved groups due to fold-tail by masking "
5141 "which requires masked-interleaved support.\n");
5142 if (CM->InterleaveInfo.invalidateGroups())
5143 // Invalidating interleave groups also requires invalidating all decisions
5144 // based on them, which includes widening decisions and uniform and scalar
5145 // values.
5146 CM->invalidateCostModelingDecisions();
5147 }
5148
5149 if (CM->foldTailByMasking())
5150 Legal->prepareToFoldTailByMasking();
5151
5152 ElementCount MaxUserVF =
5153 UserVF.isScalable() ? MaxFactors.ScalableVF : MaxFactors.FixedVF;
5154 if (UserVF) {
5155 if (!ElementCount::isKnownLE(UserVF, MaxUserVF)) {
5157 "UserVF ignored because it may be larger than the maximal safe VF",
5158 "InvalidUserVF", ORE, OrigLoop);
5159 } else {
5161 "VF needs to be a power of two");
5162 // Collect the instructions (and their associated costs) that will be more
5163 // profitable to scalarize.
5164 CM->collectNonVectorizedAndSetWideningDecisions(UserVF);
5165 buildVPlans(*VPlan1, UserVF, UserVF);
5167 if (EpilogueUserVF.isVector() &&
5168 ElementCount::isKnownLT(EpilogueUserVF, UserVF)) {
5169 CM->collectNonVectorizedAndSetWideningDecisions(EpilogueUserVF);
5170 buildVPlans(*VPlan1, EpilogueUserVF, EpilogueUserVF);
5171 }
5172 if (!VPlans.empty() && VPlans.front()->getSingleVF() == UserVF) {
5173 // For scalar VF, skip VPlan cost check as VPlan cost is designed for
5174 // vector VFs only.
5175 if (UserVF.isScalar() ||
5176 cost(*VPlans.front(), UserVF, /*RU=*/nullptr).isValid()) {
5177 LLVM_DEBUG(dbgs() << "LV: Using user VF " << UserVF << ".\n");
5179 return;
5180 }
5181 }
5182 VPlans.clear();
5183 reportVectorizationInfo("UserVF ignored because of invalid costs.",
5184 "InvalidCost", ORE, OrigLoop);
5185 }
5186 }
5187
5188 // Collect the Vectorization Factor Candidates.
5189 SmallVector<ElementCount> VFCandidates;
5190 for (auto VF = ElementCount::getFixed(1);
5191 ElementCount::isKnownLE(VF, MaxFactors.FixedVF); VF *= 2)
5192 VFCandidates.push_back(VF);
5193 for (auto VF = ElementCount::getScalable(1);
5194 ElementCount::isKnownLE(VF, MaxFactors.ScalableVF); VF *= 2)
5195 VFCandidates.push_back(VF);
5196
5197 for (const auto &VF : VFCandidates) {
5198 // Collect Uniform and Scalar instructions after vectorization with VF.
5199 CM->collectNonVectorizedAndSetWideningDecisions(VF);
5200 }
5201
5202 buildVPlans(*VPlan1, ElementCount::getFixed(1), MaxFactors.FixedVF);
5203 buildVPlans(*VPlan1, ElementCount::getScalable(1), MaxFactors.ScalableVF);
5204
5206}
5207
5211 bool ReusePrintingSlotTracker)
5212 : Opts(Config.getOpts()), TTI(Config.getTTI()), TLI(TLI),
5213 LLVMCtx(Plan.getContext()), CM(CM), Config(Config),
5214 CostKind(Config.CostKind), PSE(Config.getPSE()), L(Config.getLoop()) {
5215#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5216 if (ReusePrintingSlotTracker)
5217 PlanForSlotTracker = &Plan;
5218#endif
5219}
5220
5222 ElementCount VF) const {
5223 InstructionCost Cost = CM.getInstructionCost(UI, VF);
5224 if (Cost.isValid() && Opts.force_target_instruction_cost)
5225 return InstructionCost(*Opts.force_target_instruction_cost);
5226 return Cost;
5227}
5228
5229bool VPCostContext::skipCostComputation(Instruction *UI, bool IsVector) const {
5230 return CM.ValuesToIgnore.contains(UI) ||
5231 (IsVector && CM.VecValuesToIgnore.contains(UI)) ||
5232 SkipCostComputation.contains(UI);
5233}
5234
5240
5242 return CM.isScalarWithPredication(I, VF) ||
5243 CM.isUniformAfterVectorization(I, VF) || CM.isForcedScalar(I, VF) ||
5244 (VF.isVector() && CM.isProfitableToScalarize(I, VF));
5245}
5246
5248 return CM.isMaskRequired(I);
5249}
5250
5254 return TC && TC->getValue().ule(VF.getKnownMinValue());
5255}
5256
5258LoopVectorizationPlanner::precomputeCosts(VPlan &Plan, ElementCount VF,
5259 VPCostContext &CostCtx) const {
5261
5262 // If the vector loop gets executed exactly once with the given VF, ignore the
5263 // costs of comparison and induction instructions, as they'll get simplified
5264 // away.
5265 // TODO: Remove this code after stepping away from the legacy cost model and
5266 // adding code to simplify VPlans before calculating their costs.
5267 auto TC = getSmallConstantTripCount(PSE.getSE(), OrigLoop);
5268 if (TC == VF && !Plan.hasTailFolded())
5269 addFullyUnrolledInstructionsToIgnore(OrigLoop, Legal->getInductionVars(),
5270 CostCtx.SkipCostComputation);
5271
5272 // Pre-compute the costs for branches except for the backedge, as the number
5273 // of replicate regions in a VPlan may not directly match the number of
5274 // branches, which would lead to different decisions.
5275 // TODO: Compute cost of branches for each replicate region in the VPlan,
5276 // which is more accurate than the legacy cost model.
5277 for (BasicBlock *BB : OrigLoop->blocks()) {
5278 if (CostCtx.skipCostComputation(BB->getTerminator(), VF.isVector()))
5279 continue;
5280 CostCtx.SkipCostComputation.insert(BB->getTerminator());
5281 if (BB == OrigLoop->getLoopLatch())
5282 continue;
5283 auto BranchCost = CostCtx.getLegacyCost(BB->getTerminator(), VF);
5284 Cost += BranchCost;
5285 }
5286
5287 // Don't apply special costs when instruction cost is forced to make sure the
5288 // forced cost is used for each recipe.
5289 if (Opts.force_target_instruction_cost)
5290 return Cost;
5291
5292 // Pre-compute costs for instructions that are forced-scalar or profitable to
5293 // scalarize. For most such instructions, their scalarization costs are
5294 // accounted for here using the legacy cost model. However, some opcodes
5295 // are excluded from these precomputed scalarization costs and are instead
5296 // modeled later by the VPlan cost model (see UseVPlanCostModel below).
5297 for (Instruction *ForcedScalar : CostCtx.CM.ForcedScalars[VF]) {
5298 if (CostCtx.skipCostComputation(ForcedScalar, VF.isVector()))
5299 continue;
5300 CostCtx.SkipCostComputation.insert(ForcedScalar);
5301 InstructionCost ForcedCost = CostCtx.getLegacyCost(ForcedScalar, VF);
5302 LLVM_DEBUG({
5303 dbgs() << "Cost of " << ForcedCost << " for VF " << VF
5304 << ": forced scalar " << *ForcedScalar << "\n";
5305 });
5306 Cost += ForcedCost;
5307 }
5308
5309 // Don't apply legacy scalarization costs if nothing remains scalar &
5310 // predicated.
5311 if (!hasReplicatorRegion(Plan))
5312 return Cost;
5313
5314 auto UseVPlanCostModel = [](Instruction *I) -> bool {
5315 switch (I->getOpcode()) {
5316 case Instruction::SDiv:
5317 case Instruction::UDiv:
5318 case Instruction::SRem:
5319 case Instruction::URem:
5320 return true;
5321 default:
5322 return false;
5323 }
5324 };
5325 for (const auto &[Scalarized, ScalarCost] : CostCtx.CM.InstsToScalarize[VF]) {
5326 if (UseVPlanCostModel(Scalarized) ||
5327 CostCtx.skipCostComputation(Scalarized, VF.isVector()))
5328 continue;
5329 CostCtx.SkipCostComputation.insert(Scalarized);
5330 LLVM_DEBUG({
5331 dbgs() << "Cost of " << ScalarCost << " for VF " << VF
5332 << ": profitable to scalarize " << *Scalarized << "\n";
5333 });
5334 Cost += ScalarCost;
5335 }
5336
5337 return Cost;
5338}
5339
5340#ifndef NDEBUG
5341/// Returns the frequency with which \p VPBB executes, as recorded on its
5342/// recipes. All recipes of a block share the same frequency.
5343static std::optional<VPExecutionFrequency>
5345 if (VPBB->empty())
5346 return std::nullopt;
5347 return cast<VPInstruction>(&VPBB->front())->getExecutionFrequency();
5348}
5349#endif
5350
5351InstructionCost LoopVectorizationPlanner::cost(VPlan &Plan, ElementCount VF,
5352 VPRegisterUsage *RU) const {
5353 VPCostContext CostCtx(*TLI, Plan, *CM, Config,
5354 /*ReusePrintingSlotTracker=*/true);
5355 InstructionCost Cost = precomputeCosts(Plan, VF, CostCtx);
5356 LLVM_DEBUG(dbgs() << "Precomputed costs for VF " << VF << ": " << Cost
5357 << '\n');
5358
5359 // Now compute and add the VPlan-based cost.
5360 Cost += Plan.cost(VF, CostCtx);
5361
5362 // Add the cost of spills due to excess register usage
5363 if (RU && Config.shouldConsiderRegPressureForVF(VF)) {
5364 InstructionCost SpillCost = RU->spillCost(
5365 TTI, Config.CostKind, Opts.force_target_num_vector_regs.value_or(0));
5366 LLVM_DEBUG(dbgs() << "Spill costs for VF " << VF << ": " << SpillCost
5367 << '\n');
5368 Cost += SpillCost;
5369 }
5370
5371#ifndef NDEBUG
5372 unsigned EstimatedWidth =
5373 estimateElementCount(VF, Config.getVScaleForTuning());
5374 LLVM_DEBUG(dbgs() << "Cost for VF " << VF << ": " << Cost
5375 << " (Estimated cost per lane: ");
5376 if (Cost.isValid()) {
5377 APFloat CostPerLane(APFloat::IEEEdouble());
5378 APFloat EstimatedWidthAsAPFloat(APFloat::IEEEdouble());
5379 (void)CostPerLane.convertFromAPInt(APInt(64, (uint64_t)Cost.getValue()),
5380 false, APFloat::rmTowardZero);
5381 (void)EstimatedWidthAsAPFloat.convertFromAPInt(
5382 APInt(64, (uint64_t)EstimatedWidth), false, APFloat::rmTowardZero);
5383 (void)CostPerLane.divide(EstimatedWidthAsAPFloat, APFloat::rmTowardZero);
5384
5385 SmallString<16> Str;
5386 CostPerLane.toString(Str, 3);
5387 LLVM_DEBUG(dbgs() << Str);
5388 } else /* No point dividing an invalid cost - it will still be invalid */
5389 LLVM_DEBUG(dbgs() << "Invalid");
5390 LLVM_DEBUG(dbgs() << ")\n");
5391#endif
5392 return Cost;
5393}
5394
5395std::pair<VectorizationFactor, VPlan *>
5397 if (VPlans.empty())
5398 return {VectorizationFactor::Disabled(), nullptr};
5399 // If there is a single VPlan with a single VF, return it directly.
5400 VPlan &FirstPlan = *VPlans[0];
5401
5402 ElementCount UserVF = Config.getHints().getWidth();
5403 if (VPlans.size() == 1) {
5404 // For outer loops, the plan has a single vector VF determined by the
5405 // heuristic.
5406 assert((FirstPlan.hasScalarVFOnly() || hasPlanWithVF(UserVF) ||
5407 FirstPlan.isOuterLoop()) &&
5408 "must have a single scalar VF, UserVF or an outer loop");
5409 return {VectorizationFactor(FirstPlan.getSingleVF(), 0, 0), &FirstPlan};
5410 }
5411
5412 if (hasPlanWithVF(UserVF) && hasForcedEpilogueVF() && VPlans.size() == 2) {
5413 assert(VPlans[0]->getSingleVF() == UserVF &&
5414 "expected second plan to be for the forced UserVF");
5415 assert(VPlans[1]->getSingleVF() == EpilogueVectorizationForceVF &&
5416 "expected first plan to be for the forced epilogue VF");
5417 return {VectorizationFactor(UserVF, 0, 0), VPlans[0].get()};
5418 }
5419
5420 LLVM_DEBUG(dbgs() << "LV: Computing best VF using cost kind: "
5421 << (Config.CostKind == TTI::TCK_RecipThroughput
5422 ? "Reciprocal Throughput\n"
5423 : Config.CostKind == TTI::TCK_Latency
5424 ? "Instruction Latency\n"
5425 : Config.CostKind == TTI::TCK_CodeSize ? "Code Size\n"
5426 : Config.CostKind == TTI::TCK_SizeAndLatency
5427 ? "Code Size and Latency\n"
5428 : "Unknown\n"));
5429
5431 assert(FirstPlan.hasVF(ScalarVF) &&
5432 "More than a single plan/VF w/o any plan having scalar VF");
5433
5434 // TODO: Compute scalar cost using VPlan-based cost model.
5435 InstructionCost ScalarCost = CM->expectedCost(ScalarVF);
5436 LLVM_DEBUG(dbgs() << "LV: Scalar loop costs: " << ScalarCost << ".\n");
5437 VectorizationFactor ScalarFactor(ScalarVF, ScalarCost, ScalarCost);
5438 VectorizationFactor BestFactor = ScalarFactor;
5439
5440 bool ForceVectorization =
5441 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
5442 if (ForceVectorization) {
5443 // Ignore scalar width, because the user explicitly wants vectorization.
5444 // Initialize cost to max so that VF = 2 is, at least, chosen during cost
5445 // evaluation.
5446 BestFactor.Cost = InstructionCost::getMax();
5447 }
5448
5449 VPlan *PlanForBestVF = &FirstPlan;
5450 ElementCount ExactTC = getSmallConstantTripCount(PSE.getSE(), OrigLoop);
5451
5452 for (auto &P : VPlans) {
5453 ArrayRef<ElementCount> VFs(P->vectorFactors().begin(),
5454 P->vectorFactors().end());
5455
5456 // For loops where the Trip Count is below the TailFoldingThreshold, only
5457 // consider the largest VF to result in at most one vector iteration, and at
5458 // most one scalar iteration.
5459 // FIXME: Encode this decision directly in LVPlanner.
5460 if (!ForceVectorization && P->hasScalarTail() && ExactTC.isFixed() &&
5461 ExactTC.getFixedValue() > 0 &&
5462 ExactTC.getFixedValue() <= TTI.getMinTripCountTailFoldingThreshold()) {
5463 VFs = VFs.take_back(1);
5464 }
5465
5467 bool ConsiderRegPressure = any_of(VFs, [this](ElementCount VF) {
5468 return Config.shouldConsiderRegPressureForVF(VF);
5469 });
5470 if (ConsiderRegPressure)
5471 RUs = calculateRegisterUsageForPlan(*P, VFs, TTI);
5472
5473 for (unsigned I = 0; I < VFs.size(); I++) {
5474 ElementCount VF = VFs[I];
5475 if (VF.isScalar())
5476 continue;
5477 if (!ForceVectorization && !willGenerateVectors(*P, VF, TTI)) {
5478 LLVM_DEBUG(
5479 dbgs()
5480 << "LV: Not considering vector loop of width " << VF
5481 << " because it will not generate any vector instructions.\n");
5482 continue;
5483 }
5484 if (Config.OptForSize && !ForceVectorization && hasReplicatorRegion(*P)) {
5485 LLVM_DEBUG(
5486 dbgs()
5487 << "LV: Not considering vector loop of width " << VF
5488 << " because it would cause replicated blocks to be generated,"
5489 << " which isn't allowed when optimizing for size.\n");
5490 continue;
5491 }
5492
5494 cost(*P, VF, ConsiderRegPressure ? &RUs[I] : nullptr);
5495 VectorizationFactor CurrentFactor(VF, Cost, ScalarCost);
5496
5497 if (isMoreProfitable(CurrentFactor, BestFactor, P->hasScalarTail())) {
5498 BestFactor = CurrentFactor;
5499 PlanForBestVF = P.get();
5500 }
5501
5502 // If profitable add it to ProfitableVF list.
5503 if (isMoreProfitable(CurrentFactor, ScalarFactor, P->hasScalarTail()))
5504 ProfitableVFs.push_back(CurrentFactor);
5505 }
5506 }
5507
5508 VPlan &BestPlan = *PlanForBestVF;
5509
5510 assert((BestFactor.Width.isScalar() || BestFactor.ScalarCost > 0) &&
5511 "when vectorizing, the scalar cost must be computed.");
5512
5513 LLVM_DEBUG(dbgs() << "LV: Selecting VF: " << BestFactor.Width << ".\n");
5514 return {BestFactor, &BestPlan};
5515}
5516
5518 Loop *L, LoopInfo *LI, DominatorTree *DT, const TargetLibraryInfo *TLI,
5520 std::unique_ptr<LoopVectorizationCostModel> CM, VFSelectionContext &Config,
5523 std::function<const BranchProbabilityInfo &()> GetBPI)
5524 : Opts(Config.getOpts()), OrigLoop(L), LI(LI), DT(DT), TLI(TLI), TTI(TTI),
5525 Legal(Legal), CM(std::move(CM)), Config(Config), IAI(IAI), PSE(PSE),
5526 ORE(ORE), GetBPI(GetBPI) {}
5527
5529
5531
5533 ElementCount BestVF, unsigned BestUF, VPlan &BestVPlan,
5535 EpilogueVectorizationKind EpilogueVecKind) {
5536 assert(BestVPlan.hasVF(BestVF) &&
5537 "Trying to execute plan with unsupported VF");
5538 assert(BestVPlan.hasUF(BestUF) &&
5539 "Trying to execute plan with unsupported UF");
5540 if (BestVPlan.hasEarlyExit())
5541 ++LoopsEarlyExitVectorized;
5542
5544 *PSE.getSE(), TTI, Config.CostKind, BestVF, BestUF);
5545 if (!BestVPlan.hasTailFolded() &&
5546 TTI.hasMultiVectorLoadStore(BestUF,
5549 BestUF, TTI);
5550 // TODO: Move to VPlan transform stage once the transition to the VPlan-based
5551 // cost model is complete for better cost estimates.
5552 RUN_VPLAN_PASS(VPlanTransforms::unrollByUF, BestVPlan, BestUF);
5556 bool HasBranchWeights =
5557 hasBranchWeightMD(*OrigLoop->getLoopLatch()->getTerminator());
5558 if (HasBranchWeights) {
5559 std::optional<unsigned> VScale = Config.getVScaleForTuning();
5561 BestVPlan, BestVF, VScale);
5562 }
5563
5564 if (vputils::findIncomingAliasMask(BestVPlan)) {
5565 assert(BestVPlan.hasTailFolded() && "Expected tail folding to be enabled");
5567 *Legal->getRuntimePointerChecking()->getDiffChecks(),
5568 HasBranchWeights);
5569 ++LoopsPartialAliasVectorized;
5570 }
5571
5572 // Retrieving VectorPH now when it's easier while VPlan still has Regions.
5573 VPBasicBlock *VectorPH = cast<VPBasicBlock>(BestVPlan.getVectorPreheader());
5574
5576 BestVF, BestUF, PSE);
5577 RUN_VPLAN_PASS(VPlanTransforms::optimizeForVFAndUF, BestVPlan, BestVF, BestUF,
5578 PSE);
5580 // Check if scalar epilogue is required, before simplifying constant branches.
5581 const bool RequiresScalarEpilogue = BestVPlan.requiresScalarEpilogue();
5582 if (EpilogueVecKind == EpilogueVectorizationKind::None)
5584 /*OnlyLatches=*/false);
5585 if (BestVPlan.getEntry()->getSingleSuccessor() ==
5586 BestVPlan.getScalarPreheader()) {
5587 // TODO: The vector loop would be dead, should not even try to vectorize.
5588 ORE->emit([&]() {
5589 return OptimizationRemarkAnalysis(DEBUG_TYPE, "VectorizationDead",
5590 OrigLoop->getStartLoc(),
5591 OrigLoop->getHeader())
5592 << "Created vector loop never executes due to insufficient trip "
5593 "count.";
5594 });
5596 }
5597
5599
5601 // Convert the exit condition to AVLNext == 0 for EVL tail folded loops.
5603 // Regions are dissolved after optimizing for VF and UF, which completely
5604 // removes unneeded loop regions first.
5605 const bool HasTailFolded = BestVPlan.hasTailFolded();
5607 // Expand BranchOnTwoConds after dissolution, when latch has direct access to
5608 // its successors.
5610 // Convert loops with variable-length stepping after regions are dissolved.
5612 // Remove dead back-edges for single-iteration loops with BranchOnCond(true).
5613 // Only process loop latches to avoid removing edges from the middle block,
5614 // which may be needed for epilogue vectorization.
5616 /*OnlyLatches=*/true);
5618 VectorPH);
5619 std::optional<uint64_t> MaxRuntimeStep = getMaxRuntimeElementCount(
5620 BestVF * BestUF, *OrigLoop->getHeader()->getParent());
5621
5622 assert((LI->getUniqueLatchExitBlock(*OrigLoop) || RequiresScalarEpilogue) &&
5623 "loops not exiting via the latch without required epilogue?");
5625 VectorPH, HasTailFolded, RequiresScalarEpilogue,
5626 &BestVPlan.getVFxUF(), MaxRuntimeStep);
5628 BestVF);
5629 // Limit expansions to VPInstruction to when not vectorizing the epilogue.
5630 // Currently this code path still relies on code re-using SCEVs expanded
5631 // directly to IR instructions.
5632 if (EpilogueVecKind == EpilogueVectorizationKind::None)
5634 *PSE.getSE());
5638 // Removing branches and incoming values may expose additional simplification
5639 // opportunities.
5641 /*OnlyLatches=*/EpilogueVecKind !=
5644 RUN_VPLAN_PASS(VPlanTransforms::simplifyKnownEVL, BestVPlan, BestVF, PSE);
5645
5646 // 0. Generate SCEV-dependent code in the entry, including TripCount, before
5647 // making any changes to the CFG.
5648 DenseMap<const SCEV *, Value *> ExpandedSCEVs =
5649 RUN_VPLAN_PASS(VPlanTransforms::expandSCEVs, BestVPlan, *PSE.getSE());
5650
5651 // Perform the actual loop transformation.
5652 VPTransformState State(&TTI, BestVF, LI, DT, ILV.AC, ILV.Builder, &BestVPlan,
5653 OrigLoop->getParentLoop());
5654
5655#ifdef EXPENSIVE_CHECKS
5656 assert(DT->verify(DominatorTree::VerificationLevel::Fast));
5657#endif
5658
5659 // 1. Set up the skeleton for vectorization, including vector pre-header and
5660 // middle block. The vector loop is created during VPlan execution.
5661 State.CFG.PrevBB = ILV.createVectorizedLoopSkeleton();
5662 if (VPBasicBlock *ScalarPH = BestVPlan.getScalarPreheader())
5663 replaceVPBBWithIRVPBB(ScalarPH, State.CFG.PrevBB->getSingleSuccessor(),
5664 &BestVPlan);
5666
5667 assert(verifyVPlanIsValid(BestVPlan) && "final VPlan is invalid");
5668
5669 // After vectorization, the exit blocks of the original loop will have
5670 // additional predecessors. Invalidate SCEVs for the exit phis in case SE
5671 // looked through single-entry phis.
5672 ScalarEvolution &SE = *PSE.getSE();
5673 for (VPIRBasicBlock *Exit : BestVPlan.getExitBlocks()) {
5674 if (!Exit->hasPredecessors())
5675 continue;
5676 for (VPRecipeBase &PhiR : Exit->phis())
5678 &cast<VPIRPhi>(PhiR).getIRPhi());
5679 }
5680
5681 // Query whether the target wants loops it vectorizes to remain eligible for
5682 // runtime unrolling. Do this here, on the original loop and before its SCEV
5683 // is forgotten below.
5685 TTI.getUnrollingPreferences(OrigLoop, SE, UP, ORE);
5686 bool UnrollVectorizedLoop = UP.UnrollVectorizedLoop;
5687
5688 // Forget the original loop and block dispositions.
5689 SE.forgetLoop(OrigLoop);
5691
5692 //===------------------------------------------------===//
5693 //
5694 // Notice: any optimization or new instruction that go
5695 // into the code below should also be implemented in
5696 // the cost-model.
5697 //
5698 //===------------------------------------------------===//
5699
5700 // Retrieve loop information before executing the plan, which may remove the
5701 // original loop, if it becomes unreachable.
5702 MDNode *LID = OrigLoop->getLoopID();
5703 unsigned OrigLoopInvocationWeight = 0;
5704 std::optional<unsigned> OrigAverageTripCount =
5705 getLoopEstimatedTripCount(OrigLoop, &OrigLoopInvocationWeight);
5706
5707 BestVPlan.execute(&State);
5708
5709 // 2.6. Maintain Loop Hints
5710 // Keep all loop hints from the original loop on the vector loop (we'll
5711 // replace the vectorizer-specific hints below).
5712 VPBasicBlock *HeaderVPBB = vputils::getFirstLoopHeader(BestVPlan, State.VPDT);
5713 // Add metadata to disable runtime unrolling a scalar loop when there
5714 // are no runtime checks about strides and memory. A scalar loop that is
5715 // rarely used is not worth unrolling.
5716 bool DisableRuntimeUnroll = !ILV.RTChecks.hasChecks() && !BestVF.isScalar();
5718 HeaderVPBB ? LI->getLoopFor(State.CFG.VPBB2IRBB.lookup(HeaderVPBB))
5719 : nullptr,
5720 HeaderVPBB, BestVPlan,
5721 EpilogueVecKind == EpilogueVectorizationKind::Epilogue, LID,
5722 OrigAverageTripCount, OrigLoopInvocationWeight,
5723 estimateElementCount(BestVF * BestUF, Config.getVScaleForTuning()),
5724 DisableRuntimeUnroll, UnrollVectorizedLoop);
5725
5726 // 3. Fix the vectorized code: take care of header phi's, live-outs,
5727 // predication, updating analyses.
5728 ILV.fixVectorizedLoop(State);
5729
5730 // Wrap the generated blocks in VPIRBasicBlocks, so they can be used in the
5731 // epilogue plan.
5732 if (EpilogueVecKind == EpilogueVectorizationKind::MainLoop)
5734 vp_depth_first_shallow(BestVPlan.getEntry()))))
5735 if (!isa<VPIRBasicBlock>(VPBB))
5736 replaceVPBBWithIRVPBB(VPBB, State.CFG.VPBB2IRBB.at(VPBB), &BestVPlan);
5737
5738 return ExpandedSCEVs;
5739}
5740
5741//===--------------------------------------------------------------------===//
5742// EpilogueVectorizerEpilogueLoop
5743//===--------------------------------------------------------------------===//
5744
5745/// This function creates a new scalar preheader, using the previous one as
5746/// entry block to the epilogue VPlan. The minimum iteration check is being
5747/// represented in VPlan.
5749 BasicBlock *NewScalarPH = createScalarPreheader("vec.epilog.");
5750 BasicBlock *OriginalScalarPH = NewScalarPH->getSinglePredecessor();
5751 OriginalScalarPH->setName("vec.epilog.iter.check");
5752 VPIRBasicBlock *NewEntry = Plan.createVPIRBasicBlock(OriginalScalarPH);
5753 VPBasicBlock *OldEntry = Plan.getEntry();
5754 for (auto &R : make_early_inc_range(*OldEntry)) {
5755 // Skip moving VPIRInstructions (including VPIRPhis), which are unmovable by
5756 // defining.
5757 if (isa<VPIRInstruction>(&R))
5758 continue;
5759 R.moveBefore(*NewEntry, NewEntry->end());
5760 }
5761
5762 VPBlockUtils::reassociateBlocks(OldEntry, NewEntry);
5763
5765
5766 // Model the skeleton from the main vector loop in the epilogue plan.
5768 NewEntry);
5769
5770 return OriginalScalarPH;
5771}
5772
5774 return CM.isPredicatedInst(I);
5775}
5776
5778 return CM.TTI.prefersVectorizedAddressing();
5779}
5780
5782 VFRange &Range) {
5783 assert((VPI->getOpcode() == Instruction::Load ||
5784 VPI->getOpcode() == Instruction::Store) &&
5785 "Must be called with either a load or store");
5787
5788 auto WillWiden = [&](ElementCount VF) -> bool {
5790 CM.getWideningDecision(I, VF);
5792 "CM decision should be taken at this point.");
5794 return true;
5795 if (CM.isScalarAfterVectorization(I, VF) ||
5796 CM.isProfitableToScalarize(I, VF))
5797 return false;
5799 };
5800
5802 return nullptr;
5803
5804 // If a mask is not required, drop it - use unmasked version for safe loads.
5805 // TODO: Determine if mask is needed in VPlan.
5806 VPValue *Mask = CM.isMaskRequired(I) ? VPI->getMask() : nullptr;
5807
5808 // Determine if the pointer operand of the access is either consecutive or
5809 // reverse consecutive.
5811 CM.getWideningDecision(I, Range.Start);
5813 bool Consecutive =
5815
5816 VPValue *Ptr = VPI->getOpcode() == Instruction::Load ? VPI->getOperand(0)
5817 : VPI->getOperand(1);
5818 Builder.setInsertPoint(VPI);
5819 if (Consecutive) {
5820 Ptr = Builder.createConsecutiveVectorPointer(Ptr, getLoadStoreType(I),
5821 Reverse, VPI->getDebugLoc());
5822 }
5823
5824 if (Reverse && Mask)
5825 Mask = Builder.createNaryOp(VPInstruction::Reverse, Mask, I->getDebugLoc());
5826
5827 if (VPI->getOpcode() == Instruction::Load) {
5828 auto *Load = cast<LoadInst>(I);
5829 auto *LoadR = Builder.createWidenLoad(*Load, Ptr, Mask, Consecutive, *VPI,
5830 Load->getDebugLoc());
5831 if (Reverse)
5832 return Builder.createNaryOp(VPInstruction::Reverse, LoadR,
5833 LoadR->getDebugLoc());
5834 return LoadR;
5835 }
5836
5838 VPValue *StoredVal = VPI->getOperand(0);
5839 if (Reverse)
5840 StoredVal = Builder.createNaryOp(VPInstruction::Reverse, StoredVal,
5841 Store->getDebugLoc());
5842 return Builder.createWidenStore(*Store, Ptr, StoredVal, Mask, Consecutive,
5843 *VPI, Store->getDebugLoc());
5844}
5845
5846bool VPRecipeBuilder::shouldWiden(Instruction *I, VFRange &Range) const {
5848 "Instruction should have been handled earlier");
5849 // Instruction should be widened, unless it is scalar after vectorization,
5850 // scalarization is profitable or it is predicated.
5851 auto WillScalarize = [this, I](ElementCount VF) -> bool {
5852 return CM.isScalarAfterVectorization(I, VF) ||
5853 CM.isProfitableToScalarize(I, VF) ||
5854 CM.isScalarWithPredication(I, VF);
5855 };
5857 Range);
5858}
5859
5860VPRecipeWithIRFlags *VPRecipeBuilder::tryToWiden(VPInstruction *VPI) {
5861 auto *I = VPI->getUnderlyingInstr();
5862 switch (VPI->getOpcode()) {
5863 default:
5864 return nullptr;
5865 case Instruction::SDiv:
5866 case Instruction::UDiv:
5867 case Instruction::SRem:
5868 case Instruction::URem:
5869 // If not provably safe, use a masked intrinsic.
5870 if (CM.isPredicatedInst(I))
5871 return new VPWidenIntrinsicRecipe(
5873 I->getType(), {}, {}, VPI->getDebugLoc());
5874 [[fallthrough]];
5875 case Instruction::Add:
5876 case Instruction::And:
5877 case Instruction::AShr:
5878 case Instruction::FAdd:
5879 case Instruction::FCmp:
5880 case Instruction::FDiv:
5881 case Instruction::FMul:
5882 case Instruction::FNeg:
5883 case Instruction::FRem:
5884 case Instruction::FSub:
5885 case Instruction::ICmp:
5886 case Instruction::LShr:
5887 case Instruction::Mul:
5888 case Instruction::Or:
5889 case Instruction::Select:
5890 case Instruction::Shl:
5891 case Instruction::Sub:
5892 case Instruction::Xor:
5893 case Instruction::Freeze:
5894 case Instruction::ExtractValue:
5895 return new VPWidenRecipe(*I, VPI->operandsWithoutMask(), *VPI, *VPI,
5896 VPI->getDebugLoc());
5897 };
5898}
5899
5901 if (VPI->getOpcode() != Instruction::Store)
5902 return nullptr;
5903
5904 auto HistInfo =
5905 Legal->getHistogramInfo(cast<StoreInst>(VPI->getUnderlyingInstr()));
5906 if (!HistInfo)
5907 return nullptr;
5908
5909 const HistogramInfo *HI = *HistInfo;
5910
5912 // Bucket address.
5913 HGramOps.push_back(VPI->getOperand(1));
5914 // Increment value.
5915 HGramOps.push_back(Plan.getOrAddLiveIn(HI->Update->getOperand(1)));
5916
5917 // In case of predicated execution (due to tail-folding, or conditional
5918 // execution, or both), pass the relevant mask.
5919 if (CM.isMaskRequired(HI->Store))
5920 HGramOps.push_back(VPI->getMask());
5921
5922 return new VPHistogramRecipe(HI->UpdateKind, HGramOps,
5923 cast<VPIRMetadata>(*VPI), VPI->getDebugLoc());
5924}
5925
5927 VPInstruction *VPI, VPBuilder &FinalRedStoresBuilder) {
5928 StoreInst *SI;
5929 if ((SI = dyn_cast<StoreInst>(VPI->getUnderlyingInstr())) &&
5930 Legal->isInvariantAddressOfReduction(SI->getPointerOperand())) {
5931 // Only create recipe for the final invariant store of the reduction.
5932 if (Legal->isInvariantStoreOfReduction(SI)) {
5933 VPValue *Val = VPI->getOperand(0);
5934 VPValue *Addr = VPI->getOperand(1);
5935 // We need to store the exiting value of the reduction, so use the blend
5936 // if tail folded.
5937 if (auto *Blend = VPlanPatternMatch::findUserOf<VPBlendRecipe>(Val))
5938 Val = Blend;
5939 [[maybe_unused]] auto *Rdx =
5941 assert((isa<VPIRValue>(Val) || !Rdx || Rdx->getBackedgeValue() == Val) &&
5942 "Store of reduction thats not the backedge value?");
5943 auto *Recipe = new VPReplicateRecipe(
5944 SI, {Val, Addr}, true /* IsUniform */, nullptr /*Mask*/, *VPI, *VPI,
5945 VPI->getDebugLoc());
5946 FinalRedStoresBuilder.insert(Recipe);
5947 }
5948 VPI->eraseFromParent();
5949 return true;
5950 }
5951
5952 return false;
5953}
5954
5956 VFRange &Range) {
5957 auto *I = VPI->getUnderlyingInstr();
5959 [&](ElementCount VF) { return CM.isUniformAfterVectorization(I, VF); },
5960 Range);
5961
5962 bool IsPredicated = CM.isPredicatedInst(I);
5963
5964 // Even if the instruction is not marked as uniform, there are certain
5965 // intrinsic calls that can be effectively treated as such, so we check for
5966 // them here. Conservatively, we only do this for scalable vectors, since
5967 // for fixed-width VFs we can always fall back on full scalarization.
5968 if (!IsUniform && Range.Start.isScalable() && isa<IntrinsicInst>(I)) {
5969 switch (cast<IntrinsicInst>(I)->getIntrinsicID()) {
5970 case Intrinsic::assume:
5971 case Intrinsic::lifetime_start:
5972 case Intrinsic::lifetime_end:
5973 // For scalable vectors if one of the operands is variant then we still
5974 // want to mark as uniform, which will generate one instruction for just
5975 // the first lane of the vector. We can't scalarize the call in the same
5976 // way as for fixed-width vectors because we don't know how many lanes
5977 // there are.
5978 //
5979 // The reasons for doing it this way for scalable vectors are:
5980 // 1. For the assume intrinsic generating the instruction for the first
5981 // lane is still be better than not generating any at all. For
5982 // example, the input may be a splat across all lanes.
5983 // 2. For the lifetime start/end intrinsics the pointer operand only
5984 // does anything useful when the input comes from a stack object,
5985 // which suggests it should always be uniform. For non-stack objects
5986 // the effect is to poison the object, which still allows us to
5987 // remove the call.
5988 IsUniform = true;
5989 break;
5990 default:
5991 break;
5992 }
5993 }
5994 VPValue *BlockInMask = nullptr;
5995 if (!IsPredicated) {
5996 // Finalize the recipe for Instr, first if it is not predicated.
5997 LLVM_DEBUG(dbgs() << "LV: Scalarizing:" << *I << "\n");
5998 } else {
5999 LLVM_DEBUG(dbgs() << "LV: Scalarizing and predicating:" << *I << "\n");
6000 // Instructions marked for predication are replicated and a mask operand is
6001 // added initially. Masked replicate recipes will later be placed under an
6002 // if-then construct to prevent side-effects. Generate recipes to compute
6003 // the block mask for this region.
6004 BlockInMask = VPI->getMask();
6005 }
6006
6007 // Note that there is some custom logic to mark some intrinsics as uniform
6008 // manually above for scalable vectors, which this assert needs to account for
6009 // as well.
6010 assert((Range.Start.isScalar() || !IsUniform || !IsPredicated ||
6011 (Range.Start.isScalable() && isa<IntrinsicInst>(I))) &&
6012 "Should not predicate a uniform recipe");
6013 if (IsUniform) {
6015 VPI->getOpcode(), VPI->operandsWithoutMask(), BlockInMask, *VPI, *VPI,
6016 VPI->getDebugLoc(), VPI->getScalarType(), I);
6017 }
6018 auto *Recipe = new VPReplicateRecipe(I, VPI->operandsWithoutMask(),
6019 /*IsSingleScalar=*/false, BlockInMask,
6020 *VPI, *VPI, VPI->getDebugLoc());
6021 return Recipe;
6022}
6023
6026 VFRange &Range) {
6027 assert(!R->isPhi() && "phis must be handled earlier");
6028 auto *VPI = cast<VPInstruction>(R);
6029 assert(VPI->getOpcode() != Instruction::Call &&
6030 "Call should have been handled by makeCallWideningDecisions");
6031
6032 // All widen recipes below deal only with VF > 1.
6034 [&](ElementCount VF) { return VF.isScalar(); }, Range))
6035 return nullptr;
6036
6037 Instruction *Instr = R->getUnderlyingInstr();
6038 assert(!is_contained({Instruction::Load, Instruction::Store},
6039 VPI->getOpcode()) &&
6040 "Should have been handled prior to this!");
6041
6042 // An extractvalue takes the shape of its operand: we cannot extract a lane
6043 // from a widened struct, nor build a struct from replicated lanes.
6044 if (VPI->getOpcode() == Instruction::ExtractValue &&
6046 if (VPRecipeBase *OpR = VPI->getOperand(0)->getDefiningRecipe())
6048 return tryToWiden(VPI);
6049 if (VPI->getOpcode() == Instruction::ExtractValue)
6050 return new VPReplicateRecipe(Instr, VPI->operandsWithoutMask(),
6052 /*Mask=*/nullptr, *VPI, *VPI,
6053 VPI->getDebugLoc());
6054
6055 if (!shouldWiden(Instr, Range))
6056 return nullptr;
6057
6058 if (VPI->getOpcode() == Instruction::GetElementPtr) {
6059 auto *GEP = cast<GetElementPtrInst>(Instr);
6060 return new VPWidenGEPRecipe(GEP->getSourceElementType(),
6061 VPI->operandsWithoutMask(), *VPI,
6062 VPI->getDebugLoc(), GEP);
6063 }
6064
6065 if (Instruction::isCast(VPI->getOpcode())) {
6066 auto *CI = cast<CastInst>(Instr);
6067 return new VPWidenCastRecipe(CI->getOpcode(), VPI->getOperand(0),
6068 VPI->getScalarType(), CI, *VPI, *VPI,
6069 VPI->getDebugLoc());
6070 }
6071
6072 return tryToWiden(VPI);
6073}
6074
6075// To allow RUN_VPLAN_PASS to print the VPlan after VF/UF independent
6076// optimizations.
6078
6079#ifndef NDEBUG
6080/// Cross-check the execution frequencies recorded in \p Plan against
6081/// BlockFrequencyInfo for the blocks of \p OrigLoop.
6082/// FIXME: Temporary verification aid, to be removed.
6083static bool verifyExecutionFrequenciesMatchBFI(VPlan &Plan, Loop *OrigLoop,
6084 LoopInfo *LI,
6086 // Limited to loops with the latch as only exiting block
6087 if (OrigLoop->getExitingBlock() != OrigLoop->getLoopLatch())
6088 return true;
6089
6090 // Visit the loop body in the same order as recordExecutionFrequencies. Both
6091 // are reverse post-orders of the same CFG, so indices correspond.
6094 assert(Blocks.size() == OrigLoop->getNumBlocks() &&
6095 "loop body and original loop must have the same blocks");
6096
6097 LoopBlocksRPO OrigRPO(OrigLoop);
6098 OrigRPO.perform(LI);
6099
6100 // Only request the expensive BFI once the cheap bail-outs are past.
6101 BlockFrequencyInfo &BFI = CM.getBFI();
6102 uint64_t HeaderFreq = BFI.getBlockFreq(OrigLoop->getHeader()).getFrequency();
6103 if (HeaderFreq == 0)
6104 return true;
6105
6106 // BFI's fixed-point mass propagation loses up to 1 ULP per edge, so bound the
6107 // error by the number of edges in the region.
6108 uint64_t Edges = 0;
6109 for (const VPBasicBlock *VPBB : Blocks)
6110 Edges += VPBB->getNumSuccessors();
6111 uint64_t Tolerance = Edges + BranchProbability::getDenominator() / HeaderFreq;
6112
6113 for (const auto &[VPBB, BB] :
6114 zip_equal(drop_begin(Blocks), drop_begin(OrigRPO))) {
6115 // Nothing to check for blocks without a recorded frequency.
6116 std::optional<VPExecutionFrequency> Freq =
6118 if (!Freq)
6119 continue;
6121
6122 // Clamp to the header's frequency, which BFI's rounding may exceed.
6125 std::min(BBFreq, HeaderFreq), HeaderFreq);
6126 if (AbsoluteDifference(Computed.getNumerator(), Expected.getNumerator()) <=
6127 Tolerance)
6128 continue;
6129
6130 errs() << "Block frequency mismatch for " << VPBB->getName() << ": VPlan "
6131 << Computed << ", BlockFrequencyInfo " << Expected << "\n";
6132 return false;
6133 }
6134 return true;
6135}
6136#endif
6137
6138VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan1() {
6139 bool IsInnerLoop = OrigLoop->isInnermost();
6140
6141 // Set up loop versioning for inner loops with memory runtime checks.
6142 // Outer loops don't have LoopAccessInfo since canVectorizeMemory() is not
6143 // called for them.
6144 std::optional<LoopVersioning> LVer;
6145 if (IsInnerLoop) {
6146 const LoopAccessInfo *LAI = Legal->getLAI();
6147 LVer.emplace(*LAI, LAI->getRuntimePointerChecking()->getChecks(), OrigLoop,
6148 LI, DT, PSE.getSE());
6149 if (!LAI->getRuntimePointerChecking()->getChecks().empty() &&
6151 // Only use noalias metadata when using memory checks guaranteeing no
6152 // overlap across all iterations.
6153 LVer->prepareNoAliasMetadata();
6154 }
6155 }
6156
6157 // Create initial base VPlan0, to serve as common starting point for all
6158 // candidates built later for specific VF ranges.
6159 auto VPlan0 = VPlanTransforms::buildVPlan0(
6160 OrigLoop, *LI, Legal->getWidestInductionType(), PSE,
6161 LVer ? &*LVer : nullptr, GetBPI);
6162
6163 VPDominatorTree VPDT(*VPlan0);
6164 if (const LoopAccessInfo *LAI = Legal->getLAI())
6166 LAI->getSymbolicStrides(), VPDT);
6169 if (IsInnerLoop) {
6171 assert(verifyExecutionFrequenciesMatchBFI(*VPlan0, OrigLoop, LI, *CM) &&
6172 "execution frequencies do not match the loop's block frequencies");
6173 }
6174
6175 // Create recipes for header phis. For outer loops, reductions, recurrences
6176 // and in-loop reductions are empty since legality doesn't detect them.
6177 if (!RUN_VPLAN_PASS(
6178 VPlanTransforms::createHeaderPhiRecipes, *VPlan0, PSE, *OrigLoop, ORE,
6179 VPDT, Legal->getInductionVars(), Legal->getReductionVars(),
6180 Legal->getFixedOrderRecurrences(), Config.getInLoopReductions(),
6181 Config.getHints().allowReordering())) {
6182 return nullptr;
6183 }
6184
6185 if (const LoopAccessInfo *LAI = Legal->getLAI())
6187 LAI->getSymbolicStrides(), VPDT);
6188
6189 // Add surviving induction predicates to PSE and check constraints.
6190 bool ForceVectorization =
6191 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
6192 bool OptForSize =
6193 !ForceVectorization &&
6194 (CM->EpilogueLoweringStatus == CM_EpilogueNotAllowedOptSize ||
6195 CM->EpilogueLoweringStatus == CM_EpilogueNotAllowedLowTripLoop);
6196 unsigned SCEVCheckThreshold = ForceVectorization
6197 ? Opts.pragma_vectorize_scev_check_threshold
6198 : Opts.vectorize_scev_check_threshold;
6200 OptForSize, SCEVCheckThreshold, ORE, OrigLoop))
6201 return nullptr;
6202
6204
6205 // If we're vectorizing a loop with an uncountable exit, make sure that the
6206 // recipes are safe to handle.
6207 // TODO: Remove this once we can properly check the VPlan itself for both
6208 // the presence of an uncountable exit and the presence of stores in
6209 // the loop inside handleUncountableEarlyExits itself.
6210 if (Legal->hasUncountableEarlyExit()) {
6212 OrigLoop))
6213 return nullptr;
6214
6215 // TODO: Check target preference for style.
6216 UncountableExitStyle EEStyle =
6217 Legal->hasUncountableExitWithSideEffects()
6221 ORE, OrigLoop, PSE, *DT, Legal->getAssumptionCache(),
6222 EEStyle)) {
6223 return nullptr;
6224 }
6225 } else {
6227 }
6228
6230 getDebugLocFromInstOrOperands(Legal->getPrimaryInduction()));
6231 if (CM->foldTailByMasking())
6233
6235
6236 return VPlan0;
6237}
6238
6239void LoopVectorizationPlanner::buildVPlans(VPlan &VPlan1, ElementCount MinVF,
6240 ElementCount MaxVF) {
6241 if (ElementCount::isKnownGT(MinVF, MaxVF))
6242 return;
6243
6244 auto MaxVFTimes2 = MaxVF * 2;
6245 for (ElementCount VF = MinVF; ElementCount::isKnownLT(VF, MaxVFTimes2);) {
6246 VFRange SubRange = {VF, MaxVFTimes2};
6247 auto Plan =
6248 tryToBuildVPlan(std::unique_ptr<VPlan>(VPlan1.duplicate()), SubRange);
6249 VF = SubRange.End;
6250
6251 if (!Plan)
6252 continue;
6253
6254 // Now optimize the initial VPlan.
6258 Config.getMinimalBitwidths());
6260 // TODO: try to put addExplicitVectorLength close to addActiveLaneMask
6261 if (CM->foldTailWithEVL()) {
6263 Config.getMaxSafeElements());
6265 }
6266
6267 if (auto P =
6269 VPlans.push_back(std::move(P));
6270
6271 TailFoldingStyle Style = CM->getTailFoldingStyle();
6273 useActiveLaneMask(Style),
6275
6277 assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
6278 VPlans.push_back(std::move(Plan));
6279 }
6280}
6281
6282VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan(VPlanPtr Plan,
6283 VFRange &Range) {
6284
6285 // For outer loops, the plan only needs basic recipe conversion and induction
6286 // live-out optimization; the full inner-loop recipe building below does not
6287 // apply (no widening decisions, interleave groups, reductions, etc.).
6288 if (Plan->isOuterLoop()) {
6289 for (ElementCount VF : Range)
6290 Plan->addVF(VF);
6292 *Plan, *TLI, PSE, OrigLoop))
6293 return nullptr;
6295 OrigLoop);
6296 return Plan;
6297 }
6298
6299 using namespace llvm::VPlanPatternMatch;
6300 SmallPtrSet<const InterleaveGroup<Instruction> *, 1> InterleaveGroups;
6301
6302 // ---------------------------------------------------------------------------
6303 // Build initial VPlan: Scan the body of the loop in a topological order to
6304 // visit each basic block after having visited its predecessor basic blocks.
6305 // ---------------------------------------------------------------------------
6306
6307 bool RequiresScalarEpilogueCheck =
6309 [this](ElementCount VF) {
6310 return !CM->requiresScalarEpilogue(VF.isVector());
6311 },
6312 Range);
6313 // Update the branch in the middle block if a scalar epilogue is required.
6314 VPBasicBlock *MiddleVPBB = Plan->getMiddleBlock();
6315 if (!RequiresScalarEpilogueCheck && MiddleVPBB->getNumSuccessors() == 2) {
6316 auto *BranchOnCond = cast<VPInstruction>(MiddleVPBB->getTerminator());
6317 assert(MiddleVPBB->getSuccessors()[1] == Plan->getScalarPreheader() &&
6318 "second successor must be scalar preheader");
6319 BranchOnCond->setOperand(0, Plan->getFalse());
6320 }
6321
6322 // Don't use getDecisionAndClampRange here, because we don't know the UF
6323 // so this function is better to be conservative, rather than to split
6324 // it up into different VPlans.
6325 // TODO: Consider using getDecisionAndClampRange here to split up VPlans.
6326 bool IVUpdateMayOverflow = false;
6327 for (ElementCount VF : Range)
6328 IVUpdateMayOverflow |= !isIndvarOverflowCheckKnownFalse(Opts, CM.get(), VF);
6329
6330 TailFoldingStyle Style = CM->getTailFoldingStyle();
6331 // Use NUW for the induction increment if we proved that it won't overflow in
6332 // the vector loop or when not folding the tail. In the later case, we know
6333 // that the canonical induction increment will not overflow as the vector trip
6334 // count is >= increment and a multiple of the increment.
6335 VPRegionBlock *LoopRegion = Plan->getVectorLoopRegion();
6336 bool HasNUW = !IVUpdateMayOverflow || Style == TailFoldingStyle::None;
6337 if (!HasNUW) {
6338 auto *IVInc =
6339 LoopRegion->getExitingBasicBlock()->getTerminator()->getOperand(0);
6340 assert(match(IVInc,
6341 m_VPInstruction<Instruction::Add>(
6342 m_Specific(LoopRegion->getCanonicalIV()), m_VPValue())) &&
6343 "Did not find the canonical IV increment");
6344 LoopRegion->clearCanonicalIVNUW(cast<VPInstruction>(IVInc));
6345 }
6346
6347 // ---------------------------------------------------------------------------
6348 // Pre-construction: record ingredients whose recipes we'll need to further
6349 // process after constructing the initial VPlan.
6350 // ---------------------------------------------------------------------------
6351
6352 // For each interleave group which is relevant for this (possibly trimmed)
6353 // Range, add it to the set of groups to be later applied to the VPlan and add
6354 // placeholders for its members' Recipes which we'll be replacing with a
6355 // single VPInterleaveRecipe.
6356 for (InterleaveGroup<Instruction> *IG : IAI.getInterleaveGroups()) {
6357 auto ApplyIG = [IG, this](ElementCount VF) -> bool {
6358 bool Result = (VF.isVector() && // Query is illegal for VF == 1
6359 CM->getWideningDecision(IG->getInsertPos(), VF) ==
6361 // For scalable vectors, the interleave factors must be <= 8 since we
6362 // require the (de)interleaveN intrinsics instead of shufflevectors.
6363 assert((!Result || !VF.isScalable() || IG->getFactor() <= 8) &&
6364 "Unsupported interleave factor for scalable vectors");
6365 return Result;
6366 };
6367 if (!getDecisionAndClampRange(ApplyIG, Range))
6368 continue;
6369 InterleaveGroups.insert(IG);
6370 }
6371
6372 // ---------------------------------------------------------------------------
6373 // Construct wide recipes and apply predication for original scalar
6374 // VPInstructions in the loop.
6375 // ---------------------------------------------------------------------------
6376 VPRecipeBuilder RecipeBuilder(*Plan, Legal, *CM, Builder);
6377
6379 Range.Start);
6380
6381 VPCostContext CostCtx(*TLI, *Plan, *CM, Config);
6382
6384 RecipeBuilder, CostCtx);
6385
6387
6388 // Widened calls may only use the first lane of some operands.
6390 RecipeBuilder, CostCtx))
6392
6394 PSE);
6395
6396 // Convert remaining VPInstructions to widen or replicate recipes.
6397 // TODO: This legacy code should eventually be migrated to VPlan.
6398 VPBasicBlock *HeaderVPBB = LoopRegion->getEntryBasicBlock();
6399 for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
6400 vp_depth_first_shallow(HeaderVPBB))) {
6401 // All types but VPInstructions are already widened and don't need extra
6402 // processing. We process VPInstructions below.
6403 assert(
6404 all_of(
6405 make_range(VPBB->getFirstNonPhi(), VPBB->end()),
6406 IsaPred<VPWidenCanonicalIVRecipe, VPBlendRecipe, VPReductionRecipe,
6407 VPReplicateRecipe, VPWidenLoadRecipe, VPWidenStoreRecipe,
6408 VPWidenCallRecipe, VPWidenIntrinsicRecipe,
6409 VPVectorPointerRecipe, VPVectorEndPointerRecipe,
6410 VPHistogramRecipe, VPInstruction>) &&
6411 "Unexpected recipe");
6412 for (VPInstruction &VPI :
6414 // We represent single-scalar casts directly as VPInstructions.
6415 if (Instruction::isCast(VPI.getOpcode()) &&
6417 continue;
6418
6419 // Only VPInstrutions with an underlying value need to be processed.
6420 if (!VPI.getUnderlyingValue())
6421 continue;
6422
6423 Builder.setInsertPoint(&VPI);
6424
6425 VPRecipeBase *Recipe =
6426 RecipeBuilder.tryToCreateWidenNonPhiRecipe(&VPI, Range);
6427 if (!Recipe)
6428 Recipe = RecipeBuilder.handleReplication(&VPI, Range);
6429 Builder.insert(Recipe);
6430
6431 if (Recipe->getNumDefinedValues() == 1) {
6432 VPI.replaceAllUsesWith(Recipe->getVPSingleValue());
6433 } else {
6434 assert(Recipe->getNumDefinedValues() == 0 &&
6435 "Unexpected multidef recipe");
6436 }
6437 VPI.eraseFromParent();
6438 }
6439 }
6440
6441 assert(isa<VPRegionBlock>(LoopRegion) &&
6442 !LoopRegion->getEntryBasicBlock()->empty() &&
6443 "entry block must be set to a VPRegionBlock having a non-empty entry "
6444 "VPBasicBlock");
6445
6447 Range);
6448
6449 // ---------------------------------------------------------------------------
6450 // Transform initial VPlan: Apply previously taken decisions, in order, to
6451 // bring the VPlan to its final state.
6452 // ---------------------------------------------------------------------------
6453
6454 addReductionResultComputation(Plan, Range.Start);
6455
6456 // Optimize FindIV reductions to use sentinel-based approach when possible.
6458 *OrigLoop);
6460 OrigLoop);
6461
6462 // Apply mandatory transformation to handle reductions with multiple in-loop
6463 // uses if possible, bail out otherwise.
6465 OrigLoop))
6466 return nullptr;
6467 // Apply mandatory transformation to handle FP maxnum/minnum reduction with
6468 // NaNs if possible, bail out otherwise.
6470 return nullptr;
6471
6472 // Create whole-vector selects for find-last recurrences.
6474 return nullptr;
6475
6477
6478 // Create partial reduction recipes for scaled reductions and transform
6479 // recipes to abstract recipes if it is legal and beneficial and clamp the
6480 // range for better cost estimation.
6482 Range);
6484 Range);
6485
6486 // Interleave memory: for each Interleave Group we marked earlier as relevant
6487 // for this VPlan, replace the Recipes widening its memory instructions with a
6488 // single VPInterleaveRecipe at its insertion point.
6490 InterleaveGroups, CM->isEpilogueAllowed());
6491
6492 // Convert memory recipes to strided access recipes if the strided access is
6493 // legal and profitable.
6495 *OrigLoop, CostCtx, Range);
6496
6497 // Ensure scalar VF plans only contain VF=1, as required by hasScalarVFOnly.
6498 if (Range.Start.isScalar())
6499 Range.End = Range.Start * 2;
6500
6501 for (ElementCount VF : Range)
6502 Plan->addVF(VF);
6503 Plan->setName("Initial VPlan");
6504
6506
6507 if (CM->maskPartialAliasing())
6509
6510 assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
6511 return Plan;
6512}
6513
6514void LoopVectorizationPlanner::addReductionResultComputation(
6515 VPlanPtr &Plan, ElementCount MinVF) {
6516 using namespace VPlanPatternMatch;
6517 VPRegionBlock *VectorLoopRegion = Plan->getVectorLoopRegion();
6518 VPBasicBlock *MiddleVPBB = Plan->getMiddleBlock();
6519 VPBasicBlock *LatchVPBB = VectorLoopRegion->getExitingBasicBlock();
6520 Builder.setInsertPoint(&*std::prev(std::prev(LatchVPBB->end())));
6521 VPBasicBlock::iterator IP = MiddleVPBB->getFirstNonPhi();
6522 VPValue *HeaderMask = Plan->getVectorLoopRegion()->getHeaderMask();
6523 for (VPRecipeBase &R : make_early_inc_range(
6524 Plan->getVectorLoopRegion()->getEntryBasicBlock()->phis())) {
6525 VPReductionPHIRecipe *PhiR = dyn_cast<VPReductionPHIRecipe>(&R);
6526 if (!PhiR)
6527 continue;
6528
6529 // Clean up reductions that have become invariant.
6530 if (PhiR->getBackedgeValue() == PhiR) {
6531 PhiR->replaceAllUsesWith(PhiR->getStartValue());
6532 PhiR->eraseFromParent();
6533 continue;
6534 }
6535
6536 RecurKind RecurrenceKind = PhiR->getRecurrenceKind();
6537 const RecurrenceDescriptor &RdxDesc = Legal->getRecurrenceDescriptor(
6539 Type *PhiTy = PhiR->getScalarType();
6540
6541 // Convert a VPBlendRecipe backedge to a select.
6542 if (auto *Blend = dyn_cast<VPBlendRecipe>(PhiR->getBackedgeValue())) {
6543 if (Blend->getNumIncomingValues() == 2 &&
6544 Blend->getMask(0) == HeaderMask) {
6545 auto *Sel = VPBuilder(Blend).createSelect(
6546 Blend->getMask(0), Blend->getIncomingValue(0),
6547 Blend->getIncomingValue(1), {}, "", *Blend);
6548 Blend->replaceAllUsesWith(Sel);
6549 Blend->eraseFromParent();
6550 }
6551 }
6552
6553 auto *OrigExitingVPV = PhiR->getBackedgeValue();
6554 auto *NewExitingVPV = OrigExitingVPV;
6555
6556 // Remove the predicated select if the target doesn't want it.
6557 VPValue *V;
6558 if (!CM->usePredicatedReductionSelect(
6559 RecurrenceKind, PhiR->hasUsesOutsideReductionChain()) &&
6560 match(PhiR->getBackedgeValue(),
6561 m_Select(m_Specific(HeaderMask), m_VPValue(V), m_Specific(PhiR))))
6562 PhiR->setBackedgeValue(V);
6563
6564 // We want code in the middle block to appear to execute on the location of
6565 // the scalar loop's latch terminator because: (a) it is all compiler
6566 // generated, (b) these instructions are always executed after evaluating
6567 // the latch conditional branch, and (c) other passes may add new
6568 // predecessors which terminate on this line. This is the easiest way to
6569 // ensure we don't accidentally cause an extra step back into the loop while
6570 // debugging.
6571 DebugLoc ExitDL = OrigLoop->getLoopLatch()->getTerminator()->getDebugLoc();
6572
6573 // TODO: At the moment ComputeReductionResult also drives creation of the
6574 // bc.merge.rdx phi nodes, hence it needs to be created unconditionally here
6575 // even for in-loop reductions, until the reduction resume value handling is
6576 // also modeled in VPlan.
6577 VPInstruction *FinalReductionResult;
6578 VPBuilder::InsertPointGuard Guard(Builder);
6579 Builder.setInsertPoint(MiddleVPBB, IP);
6580 // For AnyOf reductions, find the select among PhiR's users and convert
6581 // the reduction phi to operate on bools before creating the final
6582 // reduction result.
6583 if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RecurrenceKind)) {
6584 auto *AnyOfSelect = cast<VPSingleDefRecipe>(
6586 VPValue *Start = PhiR->getStartValue();
6587 bool TrueValIsPhi = AnyOfSelect->getOperand(1) == PhiR;
6588 // NewVal is the non-phi operand of the select.
6589 VPValue *NewVal = TrueValIsPhi ? AnyOfSelect->getOperand(2)
6590 : AnyOfSelect->getOperand(1);
6591
6592 // Adjust AnyOf reductions; replace the reduction phi for the selected
6593 // value with a boolean reduction phi node to check if the condition is
6594 // true in any iteration. The final value is selected by the final
6595 // ComputeReductionResult.
6596 VPValue *Cmp = AnyOfSelect->getOperand(0);
6597 // If the compare is checking the reduction PHI node, adjust it to check
6598 // the start value.
6599 if (VPRecipeBase *CmpR = Cmp->getDefiningRecipe())
6600 CmpR->replaceUsesOfWith(PhiR, PhiR->getStartValue());
6601 Builder.setInsertPoint(AnyOfSelect);
6602
6603 // If the true value of the select is the reduction phi, the new value
6604 // is selected if the negated condition is true in any iteration.
6605 if (TrueValIsPhi)
6606 Cmp = Builder.createNot(Cmp);
6607
6608 // Build a fresh i1 chain (phi, or, and i1 versions of any blend/select
6609 // the exiting value flows through).
6610 auto *NewPhiR =
6611 PhiR->cloneWithOperands(Plan->getFalse(), Plan->getFalse());
6612 NewPhiR->insertBefore(PhiR);
6613 VPValue *NewExiting = Builder.createOr(NewPhiR, Cmp);
6614
6615 // The exiting value may flow through a chain of VPBlendRecipes and
6616 // select recipes (VPInstruction, VPWidenRecipe or VPReplicateRecipe with
6617 // Select opcode) before reaching OrigExitingVPV. Clone each chain link
6618 // in topological order so each clone refers to the already-rewritten i1
6619 // operands via Substitutions.
6620 DenseMap<VPValue *, VPValue *> Substitutions = {{AnyOfSelect, NewExiting},
6621 {PhiR, NewPhiR}};
6622 std::function<void(VPSingleDefRecipe *)> CloneChain =
6623 [&](VPSingleDefRecipe *Old) {
6624 if (Substitutions.contains(Old))
6625 return;
6627 for (VPValue *Op : Old->operands()) {
6628 if (isa<VPBlendRecipe>(Op) ||
6630 CloneChain(cast<VPSingleDefRecipe>(Op));
6631 NewOps.push_back(Substitutions.lookup_or(Op, Op));
6632 }
6633 VPSingleDefRecipe *New;
6634 if (auto *B = dyn_cast<VPBlendRecipe>(Old))
6635 New = B->cloneWithOperands(NewOps);
6636 else if (auto *W = dyn_cast<VPWidenRecipe>(Old))
6637 New = W->cloneWithOperands(NewOps);
6638 else if (auto *Rep = dyn_cast<VPReplicateRecipe>(Old))
6639 New = Rep->cloneWithOperands(NewOps);
6640 else
6641 New = cast<VPInstruction>(Old)->cloneWithOperands(NewOps);
6642 New->insertBefore(Old);
6643 Substitutions[Old] = New;
6644 };
6645
6646 if (OrigExitingVPV != AnyOfSelect) {
6647 CloneChain(cast<VPSingleDefRecipe>(OrigExitingVPV));
6648 NewExiting = Substitutions.lookup(OrigExitingVPV);
6649 }
6650 NewPhiR->setOperand(1, NewExiting);
6651 PhiR->replaceAllUsesWith(Plan->getPoison(PhiR->getScalarType()));
6652
6653 Builder.setInsertPoint(MiddleVPBB, IP);
6654 FinalReductionResult =
6655 Builder.createAnyOfReduction(NewExiting, NewVal, Start, ExitDL);
6656 } else {
6657 // If the vector reduction can be performed in a smaller type, we
6658 // truncate then extend the loop exit value to enable InstCombine to
6659 // evaluate the entire expression in the smaller type.
6660 VPValue *ReductionOp = NewExitingVPV;
6661 Instruction::CastOps ExtendOpc = Instruction::CastOpsEnd;
6662 if (MinVF.isVector() && PhiTy != RdxDesc.getRecurrenceType()) {
6663 assert(!PhiR->isInLoop() && "Unexpected truncated inloop reduction!");
6665 "Unexpected truncated min-max recurrence!");
6666 Type *RdxTy = RdxDesc.getRecurrenceType();
6667 ExtendOpc = RdxDesc.isSigned() ? Instruction::SExt : Instruction::ZExt;
6668 {
6669 VPBuilder::InsertPointGuard Guard(Builder);
6670 Builder.setInsertPoint(
6671 NewExitingVPV->getDefiningRecipe()->getParent(),
6672 std::next(NewExitingVPV->getDefiningRecipe()->getIterator()));
6673 ReductionOp =
6674 Builder.createWidenCast(Instruction::Trunc, NewExitingVPV, RdxTy);
6675 VPWidenCastRecipe *Extnd =
6676 Builder.createWidenCast(ExtendOpc, ReductionOp, PhiTy);
6677 if (PhiR->getOperand(1) == NewExitingVPV)
6678 PhiR->setOperand(1, Extnd);
6679 }
6680 }
6681
6682 VPIRFlags Flags(RecurrenceKind, PhiR->isOrdered(), PhiR->isInLoop(),
6683 PhiR->getFastMathFlagsOrNone());
6684 FinalReductionResult = Builder.createNaryOp(
6685 VPInstruction::ComputeReductionResult, {ReductionOp}, Flags, ExitDL);
6686 if (ExtendOpc != Instruction::CastOpsEnd)
6687 FinalReductionResult = Builder.createScalarCast(
6688 ExtendOpc, FinalReductionResult, PhiTy, {});
6689 }
6690
6691 // Update all users outside the vector region. Also replace redundant
6692 // extracts.
6693 for (auto *U : to_vector(OrigExitingVPV->users())) {
6694 auto *Parent = cast<VPRecipeBase>(U)->getParent();
6695 if (FinalReductionResult == U || Parent->getParent())
6696 continue;
6697 // Skip ComputeReductionResult and FindIV reductions when they are not the
6698 // final result.
6699 if (match(U, m_VPInstruction<VPInstruction::ComputeReductionResult>()) ||
6701 match(U, m_VPInstruction<Instruction::ICmp>())))
6702 continue;
6703 U->replaceUsesOfWith(OrigExitingVPV, FinalReductionResult);
6704
6705 // Look through ExtractLastPart.
6707 U = cast<VPInstruction>(U)->getSingleUser();
6708
6711 cast<VPInstruction>(U)->replaceAllUsesWith(FinalReductionResult);
6712 }
6713
6714 RecurKind RK = PhiR->getRecurrenceKind();
6719 VPBuilder PHBuilder(Plan->getVectorPreheader());
6720 VPValue *Iden = Plan->getOrAddLiveIn(
6721 getRecurrenceIdentity(RK, PhiTy, PhiR->getFastMathFlagsOrNone()));
6722 auto *ScaleFactorVPV = Plan->getConstantInt(32, 1);
6723 VPValue *StartV = PHBuilder.createNaryOp(
6725 {PhiR->getStartValue(), Iden, ScaleFactorVPV}, *PhiR);
6726 PhiR->setOperand(0, StartV);
6727 }
6728 }
6729
6731}
6732
6734 VPlan &Plan, GeneratedRTChecks &RTChecks, bool HasBranchWeights) const {
6735 const auto &[SCEVCheckCond, SCEVCheckBlock] = RTChecks.getSCEVChecks();
6736 if (SCEVCheckBlock && SCEVCheckBlock->hasNPredecessors(0)) {
6737 assert((!Config.OptForSize ||
6738 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled) &&
6739 "Cannot SCEV check stride or overflow when optimizing for size");
6741 SCEVCheckBlock, HasBranchWeights);
6742 }
6743 const auto &[MemCheckCond, MemCheckBlock] = RTChecks.getMemRuntimeChecks();
6744 if (MemCheckBlock && MemCheckBlock->hasNPredecessors(0)) {
6745 // VPlan-native path does not do any analysis for runtime checks
6746 // currently.
6747 assert((!Opts.enable_vplan_native_path || !Plan.isOuterLoop()) &&
6748 "Runtime checks are not supported for outer loops yet");
6749
6750 if (Config.OptForSize) {
6751 assert(
6752 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled &&
6753 "Cannot emit memory checks when optimizing for size, unless forced "
6754 "to vectorize.");
6755 ORE->emit([&]() {
6756 return OptimizationRemarkAnalysis(DEBUG_TYPE, "VectorizationCodeSize",
6757 OrigLoop->getStartLoc(),
6758 OrigLoop->getHeader())
6759 << "Code-size may be reduced by not forcing "
6760 "vectorization, or by source-code modifications "
6761 "eliminating the need for runtime checks "
6762 "(e.g., adding 'restrict').";
6763 });
6764 }
6765 // VPSCEVExpander expands AddRecs in the plan's entry, not the check block.
6766 auto IsUnsupported = IsaPred<SCEVAddRecExpr>;
6767 // Diff checks are not modelled in VPlan yet, and the VPlan expander cannot
6768 // hoist bounds out of an enclosing loop.
6769 const auto &RtPtrChecking = *Legal->getRuntimePointerChecking();
6770 if (RtPtrChecking.getDiffChecks() || OrigLoop->getParentLoop() ||
6771 any_of(RtPtrChecking.CheckingGroups,
6772 [&](const RuntimeCheckingPtrGroup &CG) {
6773 return SCEVExprContains(CG.Low, IsUnsupported) ||
6774 SCEVExprContains(CG.High, IsUnsupported);
6775 }))
6777 MemCheckCond, MemCheckBlock, HasBranchWeights);
6778
6779 // Erase the temporary IR before recipe expansion can reuse its values.
6780 RTChecks.eraseMemCheckBlock();
6782 RtPtrChecking.getChecks(), *PSE.getSE(),
6783 OrigLoop->getStartLoc(), HasBranchWeights);
6784 }
6785}
6786
6788 VPlan &Plan, ElementCount VF, unsigned UF,
6789 ElementCount MinProfitableTripCount) const {
6790 const uint32_t *BranchWeights =
6791 hasBranchWeightMD(*OrigLoop->getLoopLatch()->getTerminator())
6793 : nullptr;
6795 MinProfitableTripCount, Plan.requiresScalarEpilogue(),
6796 Plan.hasTailFolded(), OrigLoop, BranchWeights,
6797 OrigLoop->getLoopPredecessor()->getTerminator()->getDebugLoc(),
6798 PSE, Plan.getEntry());
6799}
6800
6801// Determine how to lower the epilogue, which depends on 1) optimising
6802// for minimum code-size, 2) tail-folding compiler options, 3) loop
6803// hints forcing tail-folding, and 4) a TTI hook that analyses whether the loop
6804// is suitable for tail-folding.
6805// This function determines epilogue lowering for the main vector loop while
6806// epilogue lowering for the tail-folded epilogue path will be handled
6807// separately in getEpilogueTailLowering.
6808static EpilogueLowering
6809getEpilogueLowering(const VectorizeOptions &Opts, Function *F, Loop *L,
6810 LoopVectorizeHints &Hints, bool OptForSize,
6813 InterleavedAccessInfo *IAI) {
6814 // 1) OptSize takes precedence over all other options, i.e. if this is set,
6815 // don't look at hints or options, and don't request an epilogue.
6816 if (F->hasOptSize() ||
6817 (OptForSize && Hints.getForce() != LoopVectorizeHints::FK_Enabled))
6819
6820 // 2) If set, obey the directives
6821 if (Opts.tail_folding_policy) {
6822 switch (*Opts.tail_folding_policy) {
6824 return CM_EpilogueAllowed;
6829 };
6830 }
6831
6832 // 3) If set, obey the hints
6833 switch (Hints.getPredicate()) {
6837 return CM_EpilogueAllowed;
6838 };
6839
6840 // 4) if the TTI hook indicates this is profitable, request tail-folding.
6841 TailFoldingInfo TFI(TLI, &LVL, IAI);
6842 if (TTI->preferTailFoldingOverEpilogue(&TFI))
6844
6845 return CM_EpilogueAllowed;
6846}
6847
6848// Emit a remark if there are stores to floats that required a floating point
6849// extension. If the vectorized loop was generated with floating point there
6850// will be a performance penalty from the conversion overhead and the change in
6851// the vector width.
6854 for (BasicBlock *BB : L->getBlocks()) {
6855 for (Instruction &Inst : *BB) {
6856 if (auto *S = dyn_cast<StoreInst>(&Inst)) {
6857 if (S->getValueOperand()->getType()->isFloatTy())
6858 Worklist.push_back(S);
6859 }
6860 }
6861 }
6862
6863 // Traverse the floating point stores upwards searching, for floating point
6864 // conversions.
6867 while (!Worklist.empty()) {
6868 auto *I = Worklist.pop_back_val();
6869 if (!L->contains(I))
6870 continue;
6871 if (!Visited.insert(I).second)
6872 continue;
6873
6874 // Emit a remark if the floating point store required a floating
6875 // point conversion.
6876 // TODO: More work could be done to identify the root cause such as a
6877 // constant or a function return type and point the user to it.
6878 if (isa<FPExtInst>(I) && EmittedRemark.insert(I).second)
6879 ORE->emit([&]() {
6880 return OptimizationRemarkAnalysis(LV_NAME, "VectorMixedPrecision",
6881 I->getDebugLoc(), L->getHeader())
6882 << "floating point conversion changes vector width. "
6883 << "Mixed floating point precision requires an up/down "
6884 << "cast that will negatively impact performance.";
6885 });
6886
6887 for (Use &Op : I->operands())
6888 if (auto *OpI = dyn_cast<Instruction>(Op))
6889 Worklist.push_back(OpI);
6890 }
6891}
6892
6893/// For loops with uncountable early exits, find the cost of doing work when
6894/// exiting the loop early, such as calculating the final exit values of
6895/// variables used outside the loop.
6896/// TODO: This is currently overly pessimistic because the loop may not take
6897/// the early exit, but better to keep this conservative for now. In future,
6898/// it might be possible to relax this by using branch probabilities.
6900 VPlan &Plan, ElementCount VF) {
6901 InstructionCost Cost = 0;
6902 for (auto *ExitVPBB : Plan.getExitBlocks()) {
6903 for (auto *PredVPBB : ExitVPBB->getPredecessors()) {
6904 // If the predecessor is not the middle.block, then it must be the
6905 // vector.early.exit block, which may contain work to calculate the exit
6906 // values of variables used outside the loop.
6907 if (PredVPBB != Plan.getMiddleBlock()) {
6908 LLVM_DEBUG(dbgs() << "Calculating cost of work in exit block "
6909 << PredVPBB->getName() << ":\n");
6910 Cost += PredVPBB->cost(VF, CostCtx);
6911 }
6912 }
6913 }
6914 return Cost;
6915}
6916
6917/// This function determines whether or not it's still profitable to vectorize
6918/// the loop given the extra work we have to do outside of the loop:
6919/// 1. Perform the runtime checks before entering the loop to ensure it's safe
6920/// to vectorize.
6921/// 2. In the case of loops with uncountable early exits, we may have to do
6922/// extra work when exiting the loop early, such as calculating the final
6923/// exit values of variables used outside the loop.
6924/// 3. The middle block.
6925static bool isOutsideLoopWorkProfitable(GeneratedRTChecks &Checks,
6926 VectorizationFactor &VF, Loop *L,
6928 VPCostContext &CostCtx, VPlan &Plan,
6929 EpilogueLowering SEL,
6930 std::optional<unsigned> VScale) {
6931 InstructionCost RtC = Checks.getCost();
6932 if (!RtC.isValid())
6933 return false;
6934
6935 // When interleaving only scalar and vector cost will be equal, which in turn
6936 // would lead to a divide by 0. Fall back to hard threshold.
6937 if (VF.Width.isScalar()) {
6938 // TODO: Should we rename VectorizeMemoryCheckThreshold?
6940 LLVM_DEBUG(
6941 dbgs()
6942 << "LV: Interleaving only is not profitable due to runtime checks\n");
6943 return false;
6944 }
6945 return true;
6946 }
6947
6948 // The scalar cost should only be 0 when vectorizing with a user specified
6949 // VF/IC. In those cases, runtime checks should always be generated.
6950 uint64_t ScalarC = VF.ScalarCost.getValue();
6951 if (ScalarC == 0)
6952 return true;
6953
6954 InstructionCost TotalCost = RtC;
6955 // Add on the cost of any work required in the vector early exit block, if
6956 // one exists.
6957 TotalCost += calculateEarlyExitCost(CostCtx, Plan, VF.Width);
6958 TotalCost += Plan.getMiddleBlock()->cost(VF.Width, CostCtx);
6959
6960 // First, compute the minimum iteration count required so that the vector
6961 // loop outperforms the scalar loop.
6962 // The total cost of the scalar loop is
6963 // ScalarC * TC
6964 // where
6965 // * TC is the actual trip count of the loop.
6966 // * ScalarC is the cost of a single scalar iteration.
6967 //
6968 // The total cost of the vector loop is
6969 // TotalCost + VecC * (TC / VF) + EpiC
6970 // where
6971 // * TotalCost is the sum of the costs cost of
6972 // - the generated runtime checks, i.e. RtC
6973 // - performing any additional work in the vector.early.exit block for
6974 // loops with uncountable early exits.
6975 // - the middle block, if ExpectedTC <= VF.Width.
6976 // * VecC is the cost of a single vector iteration.
6977 // * TC is the actual trip count of the loop
6978 // * VF is the vectorization factor
6979 // * EpiCost is the cost of the generated epilogue, including the cost
6980 // of the remaining scalar operations.
6981 //
6982 // Vectorization is profitable once the total vector cost is less than the
6983 // total scalar cost:
6984 // TotalCost + VecC * (TC / VF) + EpiC < ScalarC * TC
6985 //
6986 // Now we can compute the minimum required trip count TC as
6987 // VF * (TotalCost + EpiC) / (ScalarC * VF - VecC) < TC
6988 //
6989 // For now we assume the epilogue cost EpiC = 0 for simplicity. Note that
6990 // the computations are performed on doubles, not integers and the result
6991 // is rounded up, hence we get an upper estimate of the TC.
6992 unsigned IntVF = estimateElementCount(VF.Width, VScale);
6993 uint64_t Div = ScalarC * IntVF - VF.Cost.getValue();
6994 uint64_t MinTC1 =
6995 Div == 0 ? 0 : divideCeil(TotalCost.getValue() * IntVF, Div);
6996
6997 // Second, compute a minimum iteration count so that the cost of the
6998 // runtime checks is only a fraction of the total scalar loop cost. This
6999 // adds a loop-dependent bound on the overhead incurred if the runtime
7000 // checks fail. In case the runtime checks fail, the cost is RtC + ScalarC
7001 // * TC. To bound the runtime check to be a fraction 1/X of the scalar
7002 // cost, compute
7003 // RtC < ScalarC * TC * (1 / X) ==> RtC * X / ScalarC < TC
7004 uint64_t MinTC2 = divideCeil(RtC.getValue() * 10, ScalarC);
7005
7006 // Now pick the larger minimum. If it is not a multiple of VF and an epilogue
7007 // is allowed, choose the next closest multiple of VF. This should partly
7008 // compensate for ignoring the epilogue cost.
7009 uint64_t MinTC = std::max(MinTC1, MinTC2);
7010 if (SEL == CM_EpilogueAllowed)
7011 MinTC = alignTo(MinTC, IntVF);
7013
7014 LLVM_DEBUG(
7015 dbgs() << "LV: Minimum required TC for runtime checks to be profitable:"
7016 << VF.MinProfitableTripCount << "\n");
7017
7018 // Skip vectorization if the expected trip count is less than the minimum
7019 // required trip count.
7020 if (auto ExpectedTC = getSmallBestKnownTC(CostCtx.Opts, PSE, L)) {
7021 if (ElementCount::isKnownLT(*ExpectedTC, VF.MinProfitableTripCount)) {
7022 LLVM_DEBUG(dbgs() << "LV: Vectorization is not beneficial: expected "
7023 "trip count < minimum profitable VF ("
7024 << *ExpectedTC << " < " << VF.MinProfitableTripCount
7025 << ")\n");
7026
7027 return false;
7028 }
7029 }
7030 return true;
7031}
7032
7034 : InterleaveOnlyWhenForced(Opts.InterleaveOnlyWhenForced),
7035 VectorizeOnlyWhenForced(Opts.VectorizeOnlyWhenForced) {}
7036
7037/// ResumeForEpilogue markers in the main plan, used by the epilogue plan.
7043
7044/// Prepare \p MainPlan for vectorizing the main vector loop during epilogue
7045/// vectorization.
7047 using namespace VPlanPatternMatch;
7048 // When vectorizing the epilogue, FindFirstIV & FindLastIV reductions can
7049 // introduce multiple uses of undef/poison. If the reduction start value may
7050 // be undef or poison it needs to be frozen and the frozen start has to be
7051 // used when computing the reduction result. We also need to use the frozen
7052 // value in the resume phi generated by the main vector loop, as this is also
7053 // used to compute the reduction result after the epilogue vector loop. The
7054 // epilogue plan re-uses the frozen values.
7055 VPBuilder Builder(MainPlan.getEntry());
7056 for (VPInstruction &VPI :
7058 VPValue *OrigStart;
7059 if (!matchFindIVResult(&VPI, m_VPValue(), m_VPValue(OrigStart)))
7060 continue;
7062 continue;
7063 VPInstruction *Freeze = Builder.createFreeze(OrigStart, {}, "fr");
7064 VPI.setOperand(2, Freeze);
7065 OrigStart->replaceUsesWithIf(Freeze, IsaPred<VPPhi>);
7066 }
7067
7068 VPValue *VectorTC = nullptr;
7069 auto *Term =
7071 [[maybe_unused]] bool MatchedTC =
7072 match(Term, m_BranchOnCount(m_VPValue(), m_VPValue(VectorTC)));
7073 assert(MatchedTC && "must match vector trip count");
7074
7075 VPBasicBlock *MiddleVPBB = MainPlan.getMiddleBlock();
7076 VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
7077 VPInstruction *VectorTCMarker = MiddleBuilder.createNaryOp(
7079 {VectorTC, MainPlan.getZero(VectorTC->getScalarType())});
7080
7081 // If there is a suitable resume value for the canonical induction in the
7082 // scalar (which will become vector) epilogue loop, use it and move it to the
7083 // beginning of the scalar preheader. Otherwise create it below.
7084 VPBasicBlock *MainScalarPH = MainPlan.getScalarPreheader();
7085 auto ResumePhiIter =
7086 find_if(MainScalarPH->phis(), [VectorTC](VPRecipeBase &R) {
7087 return match(&R, m_VPInstruction<Instruction::PHI>(m_Specific(VectorTC),
7088 m_ZeroInt()));
7089 });
7090 VPPhi *ResumePhi = nullptr;
7091 if (ResumePhiIter == MainScalarPH->phis().end()) {
7093 "canonical IV must exist");
7094 Type *Ty = VectorTC->getScalarType();
7095 VPBuilder ScalarPHBuilder(MainScalarPH, MainScalarPH->begin());
7096 ResumePhi = ScalarPHBuilder.createScalarPhi(
7097 {VectorTC, MainPlan.getZero(Ty)}, {}, "vec.epilog.resume.val");
7098 } else {
7099 ResumePhi = cast<VPPhi>(&*ResumePhiIter);
7100 ResumePhi->setName("vec.epilog.resume.val");
7101 if (&MainScalarPH->front() != ResumePhi)
7102 ResumePhi->moveBefore(*MainScalarPH, MainScalarPH->begin());
7103 }
7104
7105 // Create a ResumeForEpilogue for the canonical IV resume and its bypass value
7106 // as the first non-phi, to keep them alive for the epilogue.
7107 VPBuilder ResumeBuilder(MainScalarPH);
7108 VPInstruction *CanIVResume = ResumeBuilder.createNaryOp(
7109 VPInstruction::ResumeForEpilogue, {ResumePhi, ResumePhi->getOperand(1)});
7110
7111 // Create ResumeForEpilogue instructions for the resume phis of the
7112 // VPIRPhis and their bypass values in the scalar header of the main plan and
7113 // return them so they can be used as resume values when vectorizing the
7114 // epilogue.
7115 auto ResumeValues = to_vector(
7116 map_range(MainPlan.getScalarHeader()->phis(), [&](VPRecipeBase &R) {
7117 assert(isa<VPIRPhi>(R) &&
7118 "only VPIRPhis expected in the scalar header");
7119 VPValue *MainResumePhi = R.getOperand(0);
7120 VPValue *Bypass = MainResumePhi->getDefiningRecipe()->getOperand(1);
7121 return ResumeBuilder.createNaryOp(VPInstruction::ResumeForEpilogue,
7122 {MainResumePhi, Bypass});
7123 }));
7124 return {CanIVResume, VectorTCMarker, std::move(ResumeValues)};
7125}
7126
7127/// Prepare \p Plan for vectorizing the epilogue loop. That is, re-use expanded
7128/// SCEVs from \p ExpandedSCEVs and set resume values for header recipes.
7130 VPlan &MainPlan, VPlan &Plan, Loop *L, const SCEV2ValueTy &ExpandedSCEVs,
7131 ElementCount MainLoopVF, unsigned MainLoopUF, ElementCount EpilogueVF,
7134 // Build a map from the scalar-header PHI to the ResumeForEpilogue markers
7135 // from the main plan.
7136 // TODO: Replace the IR PHI key.
7137 DenseMap<PHINode *, VPInstruction *> IRPhiToResumeForEpi;
7138 for (auto [HeaderPhi, ResumeForEpi] :
7139 zip_equal(MainPlan.getScalarHeader()->phis(), Markers.ResumeValues))
7140 IRPhiToResumeForEpi[&cast<VPIRPhi>(HeaderPhi).getIRPhi()] = ResumeForEpi;
7141 VPRegionBlock *VectorLoop = Plan.getVectorLoopRegion();
7142 VPBasicBlock *Header = VectorLoop->getEntryBasicBlock();
7143 Header->setName("vec.epilog.vector.body");
7144
7145 VPValue *IV = VectorLoop->getCanonicalIV();
7146 // When vectorizing the epilogue loop, the canonical induction needs to start
7147 // at the resume value from the main vector loop. Find the resume value
7148 // created during execution of the main VPlan. Add this resume value as an
7149 // offset to the canonical IV of the epilogue loop.
7150 VPValue *VPV = Plan.getOrAddLiveIn(Markers.CanIVResume->getUnderlyingValue());
7151 assert(all_of(IV->users(),
7152 [](const VPUser *U) {
7153 if (isa<VPScalarIVStepsRecipe, VPDerivedIVRecipe>(U))
7154 return true;
7155 auto *VPI = dyn_cast<VPInstruction>(U);
7156 if (!VPI)
7157 return false;
7158 // Only users linear in the canonical IV (e.g. scaling it by
7159 // a stride) stay correct when offsetting it below; others,
7160 // like header masks, may need an epilogue-relative IV.
7161 return Instruction::isCast(VPI->getOpcode()) ||
7162 is_contained({Instruction::Add, Instruction::Mul,
7163 Instruction::Shl},
7164 VPI->getOpcode());
7165 }) &&
7166 "the canonical IV should only be used by its increment, casts, "
7167 "stride scaling, ScalarIVSteps or DerivedIV when resetting the start "
7168 "value");
7169 VPBuilder Builder(Header, Header->getFirstNonPhi());
7170 VPInstruction *Add = Builder.createAdd(IV, VPV);
7171 // Replace all users of the canonical IV and its increment with the offset
7172 // version, except for the Add itself and the canonical IV increment.
7174 assert(Increment && "Must have a canonical IV increment at this point");
7175 IV->replaceUsesWithIf(
7176 Add, [Add, Increment](VPUser *U) { return U != Add && U != Increment; });
7177 VPInstruction *OffsetIVInc =
7179 Increment->replaceAllUsesWith(OffsetIVInc);
7180 OffsetIVInc->setOperand(0, Increment);
7181
7182 // Resume values must be created in the vector preheader.
7183 VPBasicBlock *VectorPH = Plan.getVectorPreheader();
7184 VPBuilder PHBuilder(VectorPH, VectorPH->getFirstNonPhi());
7185
7186 // Ensure that the start values for all header phi recipes are updated before
7187 // vectorizing the epilogue loop.
7188 for (VPRecipeBase &R : Header->phis()) {
7189 VPValue *ResumeVPV = nullptr;
7190 // TODO: Move setting of resume values to prepareToExecute.
7191 if (auto *ReductionPhi = dyn_cast<VPReductionPHIRecipe>(&R)) {
7192 // Find the reduction result by searching users of the phi or its backedge
7193 // value.
7194 auto IsReductionResult = [](VPRecipeBase *R) {
7195 auto *VPI = dyn_cast<VPInstruction>(R);
7196 return VPI && VPI->getOpcode() == VPInstruction::ComputeReductionResult;
7197 };
7198 auto *RdxResult = cast<VPInstruction>(
7199 vputils::findRecipe(ReductionPhi->getBackedgeValue(), IsReductionResult));
7200 assert(RdxResult && "expected to find reduction result");
7201
7202 VPInstruction *ResumeForEpi = IRPhiToResumeForEpi.at(
7203 cast<PHINode>(ReductionPhi->getUnderlyingInstr()));
7204
7205 // Check for FindIV pattern by looking for icmp user of RdxResult.
7206 // The pattern is: select(icmp ne RdxResult, Sentinel), RdxResult, Start
7207 using namespace VPlanPatternMatch;
7208 VPValue *SentinelVPV = nullptr;
7209 bool IsFindIV = any_of(RdxResult->users(), [&](VPUser *U) {
7210 return match(U, VPlanPatternMatch::m_SpecificICmp(
7211 ICmpInst::ICMP_NE, m_Specific(RdxResult),
7212 m_VPValue(SentinelVPV)));
7213 });
7214
7215 RecurKind RK = ReductionPhi->getRecurrenceKind();
7216 ResumeVPV = Plan.getOrAddLiveIn(ResumeForEpi->getUnderlyingValue());
7217 if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RK) || IsFindIV) {
7218 VPValue *BypassOp = ResumeForEpi->getOperand(1);
7219 assert((isa<VPIRValue>(BypassOp) ||
7221 BypassOp,
7223 "expected live-in or Freeze");
7224 VPValue *StartV = Plan.getOrAddLiveIn(BypassOp->getUnderlyingValue());
7226 // VPReductionPHIRecipes for AnyOf reductions expect a boolean as
7227 // start value; compare the final value from the main vector loop
7228 // to the start value.
7229 ResumeVPV = PHBuilder.createICmp(CmpInst::ICMP_NE, ResumeVPV, StartV);
7230 } else {
7231 assert(isa<VPIRValue>(SentinelVPV) &&
7232 "sentinel must be a live-in to be used in the preheader");
7233 // Use the start value frozen for the main plan, if any, when
7234 // computing the reduction result.
7235 if (match(BypassOp, m_Freeze(m_VPValue())))
7236 for (VPUser *U : RdxResult->users()) {
7237 auto *VPI = dyn_cast<VPInstruction>(U);
7238 if (VPI && matchFindIVResult(VPI, m_VPValue(), m_VPValue()))
7239 VPI->setOperand(2, StartV);
7240 }
7241
7242 // Adjust resume: select(icmp eq ResumeVPV, StartV), Sentinel,
7243 // ResumeVPV
7244 VPValue *Cmp =
7245 PHBuilder.createICmp(CmpInst::ICMP_EQ, ResumeVPV, StartV);
7246 ResumeVPV = PHBuilder.createSelect(Cmp, SentinelVPV, ResumeVPV);
7247 }
7248 // TODO: materializeBroadcasts does not cover values in the vector
7249 // preheader.
7250 ReductionPhi->setStartValue(
7251 PHBuilder.createNaryOp(VPInstruction::Broadcast, ResumeVPV));
7252 continue;
7253 }
7254 if (auto *VPI = dyn_cast<VPInstruction>(ReductionPhi->getStartValue())) {
7256 "unexpected start value");
7257 // Partial sub-reductions always start at 0 and account for the
7258 // reduction start value in a final subtraction. Update it to use the
7259 // resume value from the main vector loop.
7260 if (ReductionPhi->getVFScaleFactor() > 1 &&
7262 auto *Sub = cast<VPInstruction>(RdxResult->getSingleUser());
7263 assert((Sub->getOpcode() == Instruction::Sub ||
7264 Sub->getOpcode() == Instruction::FSub) &&
7265 "Unexpected opcode");
7266 assert(isa<VPIRValue>(Sub->getOperand(0)) &&
7267 "Expected operand to match the original start value of the "
7268 "reduction");
7269 // For integer sub-reductions, verify start value is zero.
7270 // For FP sub-reductions, verify start value is negative zero.
7271 [[maybe_unused]] auto StartValueIsIdentity = [&] {
7272 Value *IdentityValue =
7273 getRecurrenceIdentity(RK, ResumeVPV->getScalarType(),
7274 ReductionPhi->getFastMathFlagsOrNone());
7275 auto *StartValue = dyn_cast<VPIRValue>(VPI->getOperand(0));
7276 return StartValue && StartValue->getValue() == IdentityValue;
7277 };
7278 assert(StartValueIsIdentity() &&
7279 "Expected start value for partial sub-reduction to be zero "
7280 "(or negative zero)");
7281
7282 Sub->setOperand(0, ResumeVPV);
7283 } else {
7284 // The start vector may be shared by multiple reductions, so create
7285 // a new one using the resume.
7286 auto *NewStart = cast<VPInstruction>(VPI->clone());
7287 NewStart->setOperand(0, ResumeVPV);
7288 NewStart->insertBefore(VPI);
7289 ReductionPhi->setStartValue(NewStart);
7290 }
7291 continue;
7292 }
7293 } else {
7294 // Retrieve the induction resume value via ResumeForEpilogue.
7295 PHINode *IndPhi = cast<VPWidenInductionRecipe>(&R)->getPHINode();
7296 ResumeVPV = Plan.getOrAddLiveIn(
7297 IRPhiToResumeForEpi.at(IndPhi)->getUnderlyingValue());
7298 }
7299 assert(ResumeVPV && "Must have a resume value");
7300 cast<VPHeaderPHIRecipe>(&R)->setStartValue(ResumeVPV);
7301 }
7302
7303 // Re-use the trip count and steps expanded for the main loop, as skeleton
7304 // creation needs it as a value that dominates both the scalar and vector
7305 // epilogue loops.
7306 // TODO: This is a workaround needed for epilogue vectorization and it
7307 // should be removed once induction resume value creation is done
7308 // directly in VPlan.
7310 make_isa_range<VPExpandSCEVRecipe>(*Plan.getEntry()))) {
7311 assert(ExpandedSCEVs.contains(ExpandR.getSCEV()) &&
7312 "Epilogue plan needs a SCEV not expanded for the main loop");
7313 VPValue *ExpandedVal =
7314 Plan.getOrAddLiveIn(ExpandedSCEVs.lookup(ExpandR.getSCEV()));
7315 ExpandR.replaceAllUsesWith(ExpandedVal);
7316 if (Plan.getTripCount() == &ExpandR)
7317 Plan.resetTripCount(ExpandedVal);
7318 ExpandR.eraseFromParent();
7319 }
7320
7321 auto VScale = Config.getVScaleForTuning();
7322 unsigned MainLoopStep = estimateElementCount(MainLoopVF * MainLoopUF, VScale);
7323 unsigned EpilogueLoopStep = estimateElementCount(EpilogueVF, VScale);
7325 Plan.getOrAddLiveIn(Markers.VectorTC->getUnderlyingValue()),
7326 Plan.requiresScalarEpilogue(), EpilogueVF, MainLoopStep,
7327 EpilogueLoopStep, SE);
7328}
7329
7330static void
7332 ArrayRef<VPInstruction *> ResumeValues) {
7333 auto *ScalarPH = cast<VPIRBasicBlock>(BestEpiPlan.getScalarPreheader());
7334 BasicBlock *PH = ScalarPH->getIRBasicBlock();
7335 if (ScalarPH->hasPredecessors()) {
7336 // Fix resume values for inductions and reductions from the additional
7337 // bypass block using the incoming values from the main loop's resume phis.
7338 // ResumeValues correspond 1:1 with the scalar loop header phis.
7339 for (auto [ResumeV, HeaderPhi] :
7340 zip(ResumeValues, BestEpiPlan.getScalarHeader()->phis())) {
7341 auto *HeaderPhiR = cast<VPIRPhi>(&HeaderPhi);
7342 auto *EpiResumePhi =
7343 cast<PHINode>(HeaderPhiR->getIRPhi().getIncomingValueForBlock(PH));
7344 if (EpiResumePhi->getBasicBlockIndex(BypassBlock) == -1)
7345 continue;
7346 auto *MainResumePhi = cast<PHINode>(ResumeV->getUnderlyingValue());
7347 EpiResumePhi->setIncomingValueForBlock(
7348 BypassBlock, MainResumePhi->getIncomingValueForBlock(BypassBlock));
7349 }
7350 }
7351}
7352
7353/// Connect the epilogue vector loop generated for \p EpiPlan to the main vector
7354/// loop, after both plans have executed, updating the branch from the iteration
7355/// count check of the main loop, as well as updating various phis.
7357 VPIRBasicBlock *VecEpilogueIterCheckVPBB,
7358 ArrayRef<VPInstruction *> ResumeValues) {
7359 ArrayRef<VPBlockBase *> Preds = VecEpilogueIterCheckVPBB->getPredecessors();
7360 BasicBlock *MainLoopIterationCountCheck =
7361 cast<VPIRBasicBlock>(Preds.front())->getIRBasicBlock();
7362 BasicBlock *VecEpilogueIterationCountCheck =
7363 VecEpilogueIterCheckVPBB->getIRBasicBlock();
7364 BasicBlock *VecEpiloguePreHeader =
7365 cast<CondBrInst>(VecEpilogueIterationCountCheck->getTerminator())
7366 ->getSuccessor(1);
7367 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager);
7368
7369 MainLoopIterationCountCheck->getTerminator()->replaceSuccessorWith(
7370 VecEpilogueIterationCountCheck, VecEpiloguePreHeader);
7371 DTU.applyUpdates({{DominatorTree::Delete, MainLoopIterationCountCheck,
7372 VecEpilogueIterationCountCheck},
7373 {DominatorTree::Insert, MainLoopIterationCountCheck,
7374 VecEpiloguePreHeader}});
7375
7376 // The vec.epilog.iter.check block may contain Phi nodes from inductions
7377 // or reductions which merge control-flow from the latch block and the
7378 // middle block. Update the incoming values here and move the Phi into the
7379 // preheader.
7380 SmallVector<PHINode *, 4> PhisInBlock(
7381 llvm::make_pointer_range(VecEpilogueIterationCountCheck->phis()));
7382
7383 for (PHINode *Phi : PhisInBlock) {
7384 Phi->moveBefore(VecEpiloguePreHeader->getFirstNonPHIIt());
7385 Phi->replaceIncomingBlockWith(
7386 VecEpilogueIterationCountCheck->getSinglePredecessor(),
7387 VecEpilogueIterationCountCheck);
7388 }
7389
7390 // VecEpilogueIterationCountCheck conditionally skips over the epilogue loop
7391 // after executing the main loop. We need to update the resume values of
7392 // inductions and reductions during epilogue vectorization.
7393 fixScalarResumeValuesFromBypass(VecEpilogueIterationCountCheck, EpiPlan,
7394 ResumeValues);
7395
7396 // Remove dead phis that were moved to the epilogue preheader but are unused
7397 // (e.g., resume phis for inductions not widened in the epilogue vector loop).
7398 for (PHINode &Phi : make_early_inc_range(VecEpiloguePreHeader->phis()))
7399 if (Phi.use_empty())
7400 Phi.eraseFromParent();
7401}
7402
7404 const VectorizeOptions &Opts =
7405 L->getHeader()->getContext().getLibraryOptions().get<VectorizeOptions>();
7406 assert((Opts.enable_vplan_native_path || L->isInnermost()) &&
7407 "VPlan-native path is not enabled. Only process inner loops.");
7408
7409 LLVM_DEBUG(dbgs() << "\nLV: Checking a loop in '"
7410 << L->getHeader()->getParent()->getName() << "' from "
7411 << L->getLocStr() << "\n");
7412
7413 LoopVectorizeHints Hints(
7414 Opts, L, InterleaveOnlyWhenForced || !Opts.interleave_loops, *ORE, TTI);
7415
7416 LLVM_DEBUG(
7417 dbgs() << "LV: Loop hints:"
7418 << " force="
7420 ? "disabled"
7422 ? "enabled"
7423 : "?"))
7424 << " width=" << Hints.getWidth()
7425 << " interleave=" << Hints.getInterleave() << "\n");
7426
7427 // Function containing loop
7428 Function *F = L->getHeader()->getParent();
7429
7430 // Looking at the diagnostic output is the only way to determine if a loop
7431 // was vectorized (other than looking at the IR or machine code), so it
7432 // is important to generate an optimization remark for each loop. Most of
7433 // these messages are generated as OptimizationRemarkAnalysis. Remarks
7434 // generated as OptimizationRemark and OptimizationRemarkMissed are
7435 // less verbose reporting vectorized loops and unvectorized loops that may
7436 // benefit from vectorization, respectively.
7437
7438 if (!Hints.allowVectorization(
7439 F, L, VectorizeOnlyWhenForced || !Opts.vectorize_loops)) {
7440 LLVM_DEBUG(dbgs() << "LV: Loop hints prevent vectorization.\n");
7441 return false;
7442 }
7443
7444 PredicatedScalarEvolution PSE(*SE, *L);
7445
7446 // Query this against the original loop and save it here because the profile
7447 // of the original loop header may change as the transformation happens.
7448 bool OptForSize = llvm::shouldOptimizeForSize(
7449 L->getHeader(), PSI,
7450 PSI && PSI->hasProfileSummary() ? &GetBFI() : nullptr,
7452
7453 // Check if it is legal to vectorize the loop.
7454 LoopVectorizationRequirements Requirements;
7455 LoopVectorizationLegality LVL(Opts, L, PSE, DT, TTI, TLI, F, *LAIs, LI, ORE,
7456 &Requirements, &Hints, DB, AC,
7457 /*AllowRuntimeSCEVChecks=*/!OptForSize, AA);
7458 if (!LVL.canVectorize(Opts.enable_vplan_native_path)) {
7459 LLVM_DEBUG(dbgs() << "LV: Not vectorizing: Cannot prove legality.\n");
7460 Hints.emitRemarkWithHints();
7461 return false;
7462 }
7463
7464 bool IsInnerLoop = L->isInnermost();
7465
7466 // Outer loops require a computable trip count.
7467 if (!IsInnerLoop && isa<SCEVCouldNotCompute>(PSE.getBackedgeTakenCount())) {
7468 LLVM_DEBUG(dbgs() << "LV: cannot compute the outer-loop trip count\n");
7469 return false;
7470 }
7471
7472 if (LVL.hasUncountableEarlyExit()) {
7473 if (!Opts.enable_early_exit_vectorization) {
7474 reportVectorizationFailure("Auto-vectorization of loops with uncountable "
7475 "early exit is not enabled",
7476 "UncountableEarlyExitLoopsDisabled", ORE, L);
7477 return false;
7478 }
7480 !Opts.enable_early_exit_vectorization_with_side_effects) {
7481 reportVectorizationFailure("Auto-vectorization of loops with uncountable "
7482 "early exit and side effects is not enabled",
7483 "UncountableEarlyExitSideEffectLoopsDisabled",
7484 ORE, L);
7485 return false;
7486 }
7487 }
7488
7489 InterleavedAccessInfo IAI(PSE, L, DT, LI, LVL.getLAI(), OptForSize);
7490 // If an override option has been passed in for interleaved accesses, use it.
7491 bool UseInterleaved =
7492 IsInnerLoop && valueOr(Opts.enable_interleaved_mem_accesses,
7493 TTI->enableInterleavedAccessVectorization());
7494
7495 // Analyze interleaved memory accesses.
7496 if (UseInterleaved)
7498
7499 if (LVL.hasUncountableEarlyExit()) {
7500 BasicBlock *LoopLatch = L->getLoopLatch();
7501 if (IAI.requiresScalarEpilogue() ||
7502 any_of(LVL.getCountableExitingBlocks(), not_equal_to(LoopLatch))) {
7503 reportVectorizationFailure("Auto-vectorization of early exit loops "
7504 "requiring a scalar epilogue is unsupported",
7505 "UncountableEarlyExitUnsupported", ORE, L);
7506 return false;
7507 }
7508 }
7509
7510 // Check the function attributes and profiles to find out if this function
7511 // should be optimized for size.
7512 EpilogueLowering SEL =
7513 getEpilogueLowering(Opts, F, L, Hints, OptForSize, TTI, TLI, LVL, &IAI);
7514
7515 // Check the loop for a trip count threshold: vectorize loops with a tiny trip
7516 // count by optimizing for size, to minimize overheads.
7517 auto ExpectedTC = getSmallBestKnownTC(Opts, PSE, L);
7518 if (ExpectedTC && ExpectedTC->isFixed() &&
7519 ExpectedTC->getFixedValue() < Opts.vectorizer_min_trip_count) {
7520 LLVM_DEBUG(dbgs() << "LV: Found a loop with a very small trip count. "
7521 << "This loop is worth vectorizing only if no scalar "
7522 << "iteration overheads are incurred.");
7524 LLVM_DEBUG(dbgs() << " But vectorizing was explicitly forced.\n");
7525 else {
7526 LLVM_DEBUG(dbgs() << "\n");
7527 // Tail-folded loops are efficient even when the loop
7528 // iteration count is low. However, setting the epilogue policy to
7529 // `CM_EpilogueNotAllowedLowTripLoop` prevents vectorizing loops
7530 // with runtime checks. It's more effective to let
7531 // `isOutsideLoopWorkProfitable` determine if vectorization is
7532 // beneficial for the loop. If the trip count is below the target's
7533 // minimum for tail-folding, the tail cannot be folded, so treat it like
7534 // any other low trip count loop.
7535 if (SEL != CM_EpilogueNotNeededFoldTail ||
7536 ExpectedTC->getFixedValue() <=
7537 TTI->getMinTripCountTailFoldingThreshold())
7539 }
7540 }
7541
7542 // Check the function attributes to see if implicit floats or vectors are
7543 // allowed.
7544 if (F->hasFnAttribute(Attribute::NoImplicitFloat)) {
7546 "Can't vectorize when the NoImplicitFloat attribute is used",
7547 "loop not vectorized due to NoImplicitFloat attribute",
7548 "NoImplicitFloat", ORE, L);
7549 Hints.emitRemarkWithHints();
7550 return false;
7551 }
7552
7553 // Check if the target supports potentially unsafe FP vectorization.
7554 // FIXME: Add a check for the type of safety issue (denormal, signaling)
7555 // for the target we're vectorizing for, to make sure none of the
7556 // additional fp-math flags can help.
7557 if (Hints.isPotentiallyUnsafe() &&
7558 TTI->isFPVectorizationPotentiallyUnsafe()) {
7560 "Potentially unsafe FP op prevents vectorization",
7561 "loop not vectorized due to unsafe FP support.", "UnsafeFP", ORE, L);
7562 Hints.emitRemarkWithHints();
7563 return false;
7564 }
7565
7566 // If the flag is set, use that instead and override the TTI behaviour.
7567 bool AllowOrderedReductions =
7568 valueOr(Opts.force_ordered_reductions, TTI->enableOrderedReductions());
7569 if (!LVL.canVectorizeFPMath(AllowOrderedReductions)) {
7570 ORE->emit([&]() {
7571 auto *ExactFPMathInst = Requirements.getExactFPInst();
7572 return OptimizationRemarkAnalysisFPCommute(DEBUG_TYPE, "CantReorderFPOps",
7573 ExactFPMathInst->getDebugLoc(),
7574 ExactFPMathInst->getParent())
7575 << "loop not vectorized: cannot prove it is safe to reorder "
7576 "floating-point operations";
7577 });
7578 LLVM_DEBUG(dbgs() << "LV: loop not vectorized: cannot prove it is safe to "
7579 "reorder floating-point operations\n");
7580 Hints.emitRemarkWithHints();
7581 return false;
7582 }
7583
7584 // Use the cost model.
7585 VFSelectionContext Config(Opts, *TTI, &LVL, L, *F, PSE, DB, ORE, &Hints,
7586 OptForSize);
7587 // Use the planner for vectorization.
7589 L, LI, DT, TLI, *TTI, &LVL,
7590 std::make_unique<LoopVectorizationCostModel>(
7591 SEL, L, PSE, LI, &LVL, *TTI, TLI, AC, ORE, GetBFI, F, IAI, Config),
7592 Config, IAI, PSE, ORE, GetBPI);
7593
7594 EpilogueLowering EpilogueTailLoweringStatus = getEpilogueTailLowering(
7595 Opts, LVP.getCostModel(), L, ORE, LVL, Hints, TTI);
7596 if (EpilogueTailLoweringStatus ==
7598 // TODO: Apply tail-folding on the vectorized epilogue loop.
7599 LLVM_DEBUG(dbgs() << "LV: epilogue tail-folding is not supported yet\n");
7601 "The epilogue-tail-folding policy prefer-fold-tail is not supported "
7602 "yet, fall back to a normal epilogue",
7603 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
7604 }
7605
7606 // Get user vectorization factor and interleave count.
7607 ElementCount UserVF = Hints.getWidth();
7608 unsigned UserIC = Hints.getInterleave();
7609 // Outer loops don't have LoopAccessInfo, so skip the safety check and reset
7610 // UserIC (interleaving is not supported for outer loops).
7611 if (!IsInnerLoop)
7612 UserIC = 0;
7613 else if (UserIC > 1 && !LVL.isSafeForAnyVectorWidth())
7614 UserIC = 1;
7615
7616 // Plan how to best vectorize.
7617 LVP.plan(UserVF, UserIC);
7618 auto [VF, BestPlanPtr] = LVP.computeBestVF();
7619 unsigned IC = 1;
7620
7621 // For VPlan build stress testing of outer loops, bail after plan
7622 // construction.
7623 if (!IsInnerLoop && Opts.vplan_build_outerloop_stress_test)
7624 return false;
7625
7626 if (IsInnerLoop && ORE->allowExtraAnalysis(LV_NAME))
7628
7629 assert((IsInnerLoop || !LVP.getCostModel().maskPartialAliasing()) &&
7630 "Did not expect to alias-mask outer loop");
7631
7632 GeneratedRTChecks Checks(Opts, PSE, DT, LI, TTI, Config.CostKind,
7634 if (IsInnerLoop && LVP.hasPlanWithVF(VF.Width)) {
7635 // Select the interleave count.
7636 IC = LVP.selectInterleaveCount(*BestPlanPtr, VF.Width, VF.Cost);
7637
7638 unsigned SelectedIC = UserIC > 0 ? UserIC : IC;
7639 // Optimistically generate runtime checks if they are needed. Drop them if
7640 // they turn out to not be profitable.
7641 if (VF.Width.isVector() || SelectedIC > 1) {
7642 Checks.create(L, *LVL.getLAI(), PSE.getPredicate(), VF.Width, SelectedIC,
7643 *ORE);
7644
7645 // Bail out early if either the SCEV or memory runtime checks are known to
7646 // fail. In that case, the vector loop would never execute.
7647 using namespace llvm::PatternMatch;
7648 if ((Checks.getSCEVChecks().first &&
7649 match(Checks.getSCEVChecks().first, m_One())) ||
7650 (Checks.getMemRuntimeChecks().first &&
7651 match(Checks.getMemRuntimeChecks().first, m_One()))) {
7653 "runtime checks are known to fail, so we will never enter the "
7654 "vector loop",
7655 "RuntimeChecksNeverEnterVectorLoop", ORE, L);
7656 return false;
7657 }
7658 }
7659
7660 // Check if it is profitable to vectorize with runtime checks.
7661 bool ForceVectorization =
7663 VPCostContext CostCtx(*TLI, *BestPlanPtr, LVP.getCostModel(), Config,
7664 /*ReusePrintingSlotTracker=*/true);
7665 if (!ForceVectorization &&
7666 !isOutsideLoopWorkProfitable(Checks, VF, L, PSE, CostCtx, *BestPlanPtr,
7667 SEL, Config.getVScaleForTuning())) {
7668 ORE->emit([&]() {
7670 DEBUG_TYPE, "CantReorderMemOps", L->getStartLoc(),
7671 L->getHeader())
7672 << "loop not vectorized: cannot prove it is safe to reorder "
7673 "memory operations";
7674 });
7675 LLVM_DEBUG(dbgs() << "LV: Too many memory checks needed.\n");
7676 Hints.emitRemarkWithHints();
7677 return false;
7678 }
7679 }
7680
7681 // Identify the diagnostic messages that should be produced.
7682 std::pair<StringRef, std::string> VecDiagMsg, IntDiagMsg;
7683 bool VectorizeLoop = true, InterleaveLoop = true;
7684 if (VF.Width.isScalar()) {
7685 if (LVP.hasVectorPlan()) {
7686 LLVM_DEBUG(
7687 dbgs() << "LV: Vectorization is possible but not beneficial.\n");
7688 VecDiagMsg = {
7689 "VectorizationNotBeneficial",
7690 "the cost-model indicates that vectorization is not beneficial"};
7691 } else {
7692 LLVM_DEBUG(dbgs() << "LV: Vectorization is not possible. Failed to "
7693 "create any vector VPlans.\n");
7694 VecDiagMsg = {"VectorizationNotPossible",
7695 "vectorization is not possible"};
7696 }
7697 VectorizeLoop = false;
7698 }
7699
7700 if (UserIC == 1 && Hints.getInterleave() > 1) {
7702 "UserIC should only be ignored due to unsafe dependencies");
7703 LLVM_DEBUG(dbgs() << "LV: Ignoring user-specified interleave count.\n");
7704 IntDiagMsg = {"InterleavingUnsafe",
7705 "Ignoring user-specified interleave count due to possibly "
7706 "unsafe dependencies in the loop."};
7707 InterleaveLoop = false;
7708 } else if (!LVP.hasPlanWithVF(VF.Width) && UserIC > 1) {
7709 // Tell the user interleaving was avoided up-front, despite being explicitly
7710 // requested.
7711 LLVM_DEBUG(dbgs() << "LV: Ignoring UserIC, because vectorization and "
7712 "interleaving should be avoided up front\n");
7713 IntDiagMsg = {"InterleavingAvoided",
7714 "Ignoring UserIC, because interleaving was avoided up front"};
7715 InterleaveLoop = false;
7716 } else if (IC == 1 && UserIC <= 1) {
7717 // Tell the user interleaving is not beneficial.
7718 if (LVP.hasAPlan()) {
7719 LLVM_DEBUG(dbgs() << "LV: Interleaving is not beneficial.\n");
7720 IntDiagMsg = {
7721 "InterleavingNotBeneficial",
7722 "the cost-model indicates that interleaving is not beneficial"};
7723 if (UserIC == 1) {
7724 IntDiagMsg.first = "InterleavingNotBeneficialAndDisabled";
7725 IntDiagMsg.second +=
7726 " and is explicitly disabled or interleave count is set to 1";
7727 }
7728 } else {
7729 LLVM_DEBUG(dbgs() << "LV: Interleaving is not possible. Failed to create"
7730 << " any vplans\n");
7731 IntDiagMsg = {"InterleavingNotPossible", "interleaving is not possible"};
7732 }
7733 InterleaveLoop = false;
7734 } else if (IC > 1 && UserIC == 1) {
7735 // Tell the user interleaving is beneficial, but it explicitly disabled.
7736 LLVM_DEBUG(dbgs() << "LV: Interleaving is beneficial but is explicitly "
7737 "disabled.\n");
7738 IntDiagMsg = {"InterleavingBeneficialButDisabled",
7739 "the cost-model indicates that interleaving is beneficial "
7740 "but is explicitly disabled or interleave count is set to 1"};
7741 InterleaveLoop = false;
7742 }
7743
7744 // If there is a histogram in the loop, do not just interleave without
7745 // vectorizing. The order of operations will be incorrect without the
7746 // histogram intrinsics, which are only used for recipes with VF > 1.
7747 if (!VectorizeLoop && InterleaveLoop && LVL.hasHistograms()) {
7748 LLVM_DEBUG(dbgs() << "LV: Not interleaving without vectorization due "
7749 << "to histogram operations.\n");
7750 IntDiagMsg = {
7751 "HistogramPreventsScalarInterleaving",
7752 "Unable to interleave without vectorization due to constraints on "
7753 "the order of histogram operations"};
7754 InterleaveLoop = false;
7755 }
7756
7757 // Override IC if user provided an interleave count.
7758 IC = UserIC > 0 ? UserIC : IC;
7759
7760 if (LVP.getCostModel().maskPartialAliasing()) {
7761 LLVM_DEBUG(
7762 dbgs()
7763 << "LV: Not interleaving due to partial aliasing vectorization.\n");
7764 IntDiagMsg = {
7765 "PartialAliasingVectorization",
7766 "Unable to interleave due to partial aliasing vectorization."};
7767 InterleaveLoop = false;
7768 IC = 1;
7769 }
7770
7771 // FIXME: Enable interleaving for EE-with-side-effects.
7772 if (InterleaveLoop && LVL.hasUncountableExitWithSideEffects()) {
7773 LLVM_DEBUG(dbgs() << "LV: Not interleaving due to EE with side effects.\n");
7774 IntDiagMsg = {"EEWithSideEffectsPreventsInterleaving",
7775 "Unable to interleave due to early exit with side effects."};
7776 InterleaveLoop = false;
7777 IC = 1;
7778 }
7779
7780 // Emit diagnostic messages, if any.
7781 if (!VectorizeLoop && !InterleaveLoop) {
7782 // Do not vectorize or interleaving the loop.
7783 ORE->emit([&]() {
7784 return OptimizationRemarkMissed(LV_NAME, VecDiagMsg.first,
7785 L->getStartLoc(), L->getHeader())
7786 << VecDiagMsg.second;
7787 });
7788 ORE->emit([&]() {
7789 return OptimizationRemarkMissed(LV_NAME, IntDiagMsg.first,
7790 L->getStartLoc(), L->getHeader())
7791 << IntDiagMsg.second;
7792 });
7793 return false;
7794 }
7795
7796 if (!VectorizeLoop && InterleaveLoop) {
7797 LLVM_DEBUG(dbgs() << "LV: Interleave Count is " << IC << '\n');
7798 ORE->emit([&]() {
7799 return OptimizationRemarkAnalysis(LV_NAME, VecDiagMsg.first,
7800 L->getStartLoc(), L->getHeader())
7801 << VecDiagMsg.second;
7802 });
7803 } else if (VectorizeLoop && !InterleaveLoop) {
7804 LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
7805 << ") in " << L->getLocStr() << '\n');
7806 ORE->emit([&]() {
7807 return OptimizationRemarkAnalysis(LV_NAME, IntDiagMsg.first,
7808 L->getStartLoc(), L->getHeader())
7809 << IntDiagMsg.second;
7810 });
7811 } else if (VectorizeLoop && InterleaveLoop) {
7812 LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
7813 << ") in " << L->getLocStr() << '\n');
7814 LLVM_DEBUG(dbgs() << "LV: Interleave Count is " << IC << '\n');
7815 }
7816
7817 // Report the vectorization decision.
7818 if (VF.Width.isScalar()) {
7819 using namespace ore;
7820 assert(IC > 1);
7821 ORE->emit([&]() {
7822 return OptimizationRemark(LV_NAME, "Interleaved", L->getStartLoc(),
7823 L->getHeader())
7824 << "interleaved loop (interleaved count: "
7825 << NV("InterleaveCount", IC) << ")";
7826 });
7827 } else {
7828 // Report the vectorization decision.
7829 reportVectorization(ORE, L, VF.Width, IC);
7830 }
7831 if (ORE->allowExtraAnalysis(LV_NAME))
7833
7834 // If we decided that it is *legal* to interleave or vectorize the loop, then
7835 // do it.
7836
7837 // Whether a scalar epilogue may be created is decided by the epilogue
7838 // lowering policy.
7839 // TODO: Also move check to be based on VPlan.
7840 bool ScalarEpilogueAllowed = LVP.getCostModel().isEpilogueAllowed();
7841
7842 // Destroy the cost model before executing any plan, so that code generation
7843 // cannot rely on cost-modeling decisions.
7844 LVP.clearCostModel();
7845
7846 VPlan &BestPlan = *BestPlanPtr;
7847 // Consider vectorizing the epilogue too if it's profitable.
7848 std::unique_ptr<VPlan> EpiPlan =
7849 LVP.selectBestEpiloguePlan(BestPlan, VF.Width, IC, ScalarEpilogueAllowed);
7850 bool HasBranchWeights =
7851 hasBranchWeightMD(*L->getLoopLatch()->getTerminator());
7852 if (EpiPlan) {
7853 VPlan &BestEpiPlan = *EpiPlan;
7854 VPlan &BestMainPlan = BestPlan;
7855 ElementCount EpilogueVF = BestEpiPlan.getSingleVF();
7856
7857 // The first pass vectorizes the main loop and creates a scalar epilogue
7858 // to be vectorized by executing the plan (potentially with a different
7859 // factor) again shortly afterwards.
7860 BestEpiPlan.getMiddleBlock()->setName("vec.epilog.middle.block");
7861 BestEpiPlan.getVectorPreheader()->setName("vec.epilog.ph");
7863
7864 // Add minimum iteration check for the epilogue plan, followed by runtime
7865 // checks for the main plan.
7866 LVP.addMinimumIterationCheck(BestMainPlan, EpilogueVF, /*UF=*/1,
7868 LVP.attachRuntimeChecks(BestMainPlan, Checks, HasBranchWeights);
7870 VF.Width, IC, BestMainPlan.requiresScalarEpilogue(), L,
7871 HasBranchWeights ? MinItersBypassWeights : nullptr,
7872 L->getLoopPredecessor()->getTerminator()->getDebugLoc(),
7873 PSE);
7874
7875 LLVM_DEBUG({
7876 dbgs() << "Create Skeleton for epilogue vectorized loop (first pass)\n"
7877 << "Main Loop VF:" << VF.Width << ", Main Loop UF:" << IC
7878 << ", Epilogue Loop VF:" << EpilogueVF << ", Epilogue Loop UF:1\n";
7879 });
7880 InnerLoopVectorizer MainILV(L, PSE, LI, DT, TTI, AC, VF.Width, IC, Checks,
7881 BestMainPlan);
7882 auto ExpandedSCEVs = LVP.executePlan(
7883 VF.Width, IC, BestMainPlan, MainILV, DT,
7885 ++LoopsVectorized;
7887 dbgs() << "intermediate fn:\n" << *L->getHeader()->getParent() << "\n";
7888 });
7889
7890 BasicBlock *EntryBB =
7891 cast<VPIRBasicBlock>(BestMainPlan.getEntry())->getIRBasicBlock();
7892 EntryBB->setName("iter.check");
7893
7894 // Second pass vectorizes the epilogue and adjusts the control flow
7895 // edges from the first pass.
7896 EpilogueVectorizerEpilogueLoop EpilogILV(L, PSE, LI, DT, TTI, AC,
7897 EpilogueVF, /*UnrollFactor=*/1,
7898 Checks, BestEpiPlan, BestMainPlan);
7899 preparePlanForEpilogueVectorLoop(BestMainPlan, BestEpiPlan, L,
7900 ExpandedSCEVs, VF.Width, IC, EpilogueVF,
7901 LVP, Config, *PSE.getSE(), Markers);
7903 LLVM_DEBUG({
7904 dbgs() << "Create Skeleton for epilogue vectorized loop (second pass)\n"
7905 << "Epilogue Loop VF:" << EpilogueVF << ", Epilogue Loop UF:1\n";
7906 });
7907 LVP.executePlan(
7908 EpilogueVF, /*BestUF=*/1, BestEpiPlan, EpilogILV, DT,
7911 dbgs() << "final fn:\n" << *L->getHeader()->getParent() << "\n";
7912 });
7913 connectEpilogueVectorLoop(BestEpiPlan, DT,
7915 Markers.ResumeValues);
7916 ++LoopsEpilogueVectorized;
7917 } else {
7918 InnerLoopVectorizer LB(L, PSE, LI, DT, TTI, AC, VF.Width, IC, Checks,
7919 BestPlan);
7920 LVP.addMinimumIterationCheck(BestPlan, VF.Width, IC,
7921 VF.MinProfitableTripCount);
7922 LVP.attachRuntimeChecks(BestPlan, Checks, HasBranchWeights);
7923
7924 if (!IsInnerLoop)
7925 LLVM_DEBUG(dbgs() << "Vectorizing outer loop in \"" << F->getName()
7926 << "\"\n");
7927 LVP.executePlan(VF.Width, IC, BestPlan, LB, DT);
7928 ++LoopsVectorized;
7929 }
7930
7931 assert(DT->verify(DominatorTree::VerificationLevel::Fast) &&
7932 "DT not preserved correctly");
7933
7934 return true;
7935}
7936
7938 CFGChanged = false;
7939
7940 // Don't attempt if
7941 // 1. the target claims to have no vector registers, and
7942 // 2. interleaving won't help ILP.
7943 //
7944 // The second condition is necessary because, even if the target has no
7945 // vector registers, loop vectorization may still enable scalar
7946 // interleaving.
7947 if (!TTI->getNumberOfRegisters(TTI->getRegisterClassForType(true)) &&
7948 (TTI->getMaxInterleaveFactor(ElementCount::getFixed(1), false) < 2 ||
7949 TTI->getMaxInterleaveFactor(ElementCount::getFixed(1), true) < 2))
7950 return LoopVectorizeResult(false, false);
7951
7952 bool Changed = false;
7953
7954 // The vectorizer requires loops to be in simplified form.
7955 // Since simplification may add new inner loops, it has to run before the
7956 // legality and profitability checks. This means running the loop vectorizer
7957 // will simplify all loops, regardless of whether anything end up being
7958 // vectorized.
7959 for (const auto &L : *LI)
7960 Changed |= CFGChanged |=
7961 simplifyLoop(L, DT, LI, SE, AC, nullptr, false /* PreserveLCSSA */);
7962
7963 // Build up a worklist of inner-loops to vectorize. This is necessary as
7964 // the act of vectorizing or partially unrolling a loop creates new loops
7965 // and can invalidate iterators across the loops.
7966 SmallVector<Loop *, 8> Worklist;
7967
7968 const VectorizeOptions &Opts =
7969 F.getContext().getLibraryOptions().get<VectorizeOptions>();
7970 for (Loop *L : *LI)
7971 collectSupportedLoops(Opts, *L, LI, ORE, Worklist);
7972
7973 LoopsAnalyzed += Worklist.size();
7974
7975 // Now walk the identified inner loops.
7976 while (!Worklist.empty()) {
7977 Loop *L = Worklist.pop_back_val();
7978
7979 // For the inner loops we actually process, form LCSSA to simplify the
7980 // transform.
7981 Changed |= formLCSSARecursively(*L, *DT, LI, SE);
7982
7984
7985 if (Changed) {
7986 LAIs->clear();
7987
7988#ifndef NDEBUG
7989 if (VerifySCEV)
7990 SE->verify();
7991#endif
7992 }
7993 }
7994
7995 // Verify once per function rather than once per processed loop, which would
7996 // make the pass quadratic in the number of loops.
7997 assert((!Changed || !verifyFunction(F, &dbgs())) &&
7998 "Invalid IR produced by LoopVectorize");
7999
8000 // Process each loop nest in the function.
8002}
8003
8006 LI = &AM.getResult<LoopAnalysis>(F);
8007 // There are no loops in the function. Return before computing other
8008 // expensive analyses.
8009 if (LI->empty())
8010 return PreservedAnalyses::all();
8019 AA = &AM.getResult<AAManager>(F);
8020
8021 auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
8022 PSI = MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
8023 // CycleInfo cached by an earlier pass is invalidated when the CFG changes.
8024 // Both BlockFrequencyAnalysis and BranchProbabilityAnalysis depend on it, so
8025 // drop the stale result before either is (re-)computed.
8026 auto ClearStaleCycleInfo = [this, &AM, &F] {
8029 };
8030 GetBFI = [&AM, &F, ClearStaleCycleInfo]() -> BlockFrequencyInfo & {
8031 ClearStaleCycleInfo();
8033 };
8034 GetBPI = [&AM, &F, ClearStaleCycleInfo]() -> const BranchProbabilityInfo & {
8035 ClearStaleCycleInfo();
8037 };
8038 LoopVectorizeResult Result = runImpl(F);
8039 if (!Result.MadeAnyChange)
8040 return PreservedAnalyses::all();
8042
8043 if (isAssignmentTrackingEnabled(*F.getParent())) {
8044 for (auto &BB : F)
8046 }
8047
8048 PA.preserve<LoopAnalysis>();
8052
8053 if (Result.MadeCFGChange) {
8054 // Making CFG changes likely means a loop got vectorized. Indicate that
8055 // extra simplification passes should be run.
8056 // TODO: MadeCFGChanges is not a prefect proxy. Extra passes should only
8057 // be run if runtime checks have been added.
8060 } else {
8062 }
8063 return PA;
8064}
8065
8067 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
8068 static_cast<PassInfoMixin<LoopVectorizePass> *>(this)->printPipeline(
8069 OS, MapClassName2PassName);
8070
8071 OS << '<';
8072 OS << (InterleaveOnlyWhenForced ? "" : "no-") << "interleave-forced-only;";
8073 OS << (VectorizeOnlyWhenForced ? "" : "no-") << "vectorize-forced-only;";
8074 OS << '>';
8075}
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
static unsigned getIntrinsicID(const SDNode *N)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
AMDGPU Lower Kernel Arguments
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static bool isEqual(const Function &Caller, const Function &Callee)
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This is the interface for LLVM's primary stateless and local alias analysis.
static bool IsEmptyBlock(MachineBasicBlock *MBB)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
static InstructionCost getCost(Instruction &Inst, TTI::TargetCostKind CostKind, TargetTransformInfo &TTI)
Definition CostModel.cpp:73
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
This file defines the DenseMap class.
#define DEBUG_TYPE
This is the interface for a simple mod/ref and alias analysis over globals.
Hexagon Common GEP
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This defines the Use class.
static bool hasNoUnsignedWrap(BinaryOperator &I)
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static cl::opt< ElementCount, true > VectorizationFactor("force-vector-width", cl::Hidden, cl::desc("Sets the SIMD width. Zero is autoselect."), cl::location(VectorizerParams::VectorizationFactor))
This header provides classes for managing per-loop analyses.
static const char * VerboseDebug
#define LV_NAME
This file defines the LoopVectorizationLegality class.
This file provides a LoopVectorizationPlanner class.
static unsigned getMaxTCFromNonZeroRange(PredicatedScalarEvolution &PSE, Loop *L)
Get the maximum trip count for L from the SCEV unsigned range, excluding zero from the range.
static Type * maybeVectorizeType(Type *Ty, ElementCount VF)
static ElementCount getSmallConstantTripCount(ScalarEvolution *SE, const Loop *L)
A version of ScalarEvolution::getSmallConstantTripCount that returns an ElementCount to include loops...
static void legacyCSE(BasicBlock *BB)
FIXME: This legacy common-subexpression-elimination routine is scheduled for removal,...
static VPIRBasicBlock * replaceVPBBWithIRVPBB(VPBasicBlock *VPBB, BasicBlock *IRBB, VPlan *Plan=nullptr)
Replace VPBB with a VPIRBasicBlock wrapping IRBB.
static void fixScalarResumeValuesFromBypass(BasicBlock *BypassBlock, VPlan &BestEpiPlan, ArrayRef< VPInstruction * > ResumeValues)
static Intrinsic::ID getMaskedDivRemIntrinsic(unsigned Opcode)
static DebugLoc getDebugLocFromInstOrOperands(Instruction *I)
Look for a meaningful debug location on the instruction or its operands.
static EpilogueLowering getEpilogueTailLowering(const VectorizeOptions &Opts, const LoopVectorizationCostModel &MainCM, const Loop *L, OptimizationRemarkEmitter *ORE, LoopVectorizationLegality &LVL, const LoopVectorizeHints &Hints, TargetTransformInfo *TTI)
Determine how to lower the epilogue for the vector epilogue loop.
static bool useActiveLaneMaskForControlFlow(TailFoldingStyle Style)
static std::optional< VPExecutionFrequency > getRecordedExecutionFrequency(const VPBasicBlock *VPBB)
Returns the frequency with which VPBB executes, as recorded on its recipes.
static void collectSupportedLoops(const VectorizeOptions &Opts, Loop &L, LoopInfo *LI, OptimizationRemarkEmitter *ORE, SmallVectorImpl< Loop * > &V)
static unsigned estimateElementCount(ElementCount VF, std::optional< unsigned > VScale)
This function attempts to return a value that represents the ElementCount at runtime.
static bool hasVectorLibraryVariantFor(const CallInst &CI, ElementCount VF, bool MaskRequired, const TargetLibraryInfo *TLI)
Returns true iff CI has a library vector variant usable at VF.
static constexpr uint32_t MinItersBypassWeights[]
static void preparePlanForEpilogueVectorLoop(VPlan &MainPlan, VPlan &Plan, Loop *L, const SCEV2ValueTy &ExpandedSCEVs, ElementCount MainLoopVF, unsigned MainLoopUF, ElementCount EpilogueVF, LoopVectorizationPlanner &LVP, VFSelectionContext &Config, ScalarEvolution &SE, const MainPlanResumeMarkers &Markers)
Prepare Plan for vectorizing the epilogue loop.
static Function * getVectorLibraryVariantFor(const CallInst &CI, ElementCount VF, bool MaskRequired, const TargetLibraryInfo *TLI)
Returns the vector library variant function of CI usable at VF, respecting MaskRequired,...
static bool isExplicitVecOuterLoop(const VectorizeOptions &Opts, Loop *OuterLp, OptimizationRemarkEmitter *ORE)
static bool hasForcedEpilogueVF()
static void printOptimizedVPlan(VPlan &)
static bool isIndvarOverflowCheckKnownFalse(const VectorizeOptions &Opts, const LoopVectorizationCostModel *Cost, ElementCount VF, std::optional< unsigned > UF=std::nullopt)
For the given VF and UF and maximum trip count computed for the loop, return whether the induction va...
static const SCEV * getAddressAccessSCEV(Value *Ptr, PredicatedScalarEvolution &PSE, const Loop *TheLoop)
Gets the address access SCEV for Ptr, if it should be used for cost modeling according to isAddressSC...
static EpilogueLowering getEpilogueLowering(const VectorizeOptions &Opts, Function *F, Loop *L, LoopVectorizeHints &Hints, bool OptForSize, TargetTransformInfo *TTI, TargetLibraryInfo *TLI, LoopVectorizationLegality &LVL, InterleavedAccessInfo *IAI)
static std::optional< ElementCount > getSmallBestKnownTC(const VectorizeOptions &Opts, PredicatedScalarEvolution &PSE, Loop *L, bool CanUseConstantMax=true, bool CanExcludeZeroTrips=false, bool ComputeUpperBoundOnly=false)
Returns "best known" trip count, which is either a valid positive trip count or std::nullopt when an ...
static bool useMaskedInterleavedAccesses(const VectorizeOptions &Opts, const TargetTransformInfo &TTI)
static bool useActiveLaneMask(TailFoldingStyle Style)
static bool hasReplicatorRegion(VPlan &Plan)
static void addFullyUnrolledInstructionsToIgnore(Loop *L, const LoopVectorizationLegality::InductionList &IL, SmallPtrSetImpl< Instruction * > &InstsToIgnore)
Knowing that loop L executes a single vector iteration, add instructions that will get simplified and...
static bool hasFindLastReductionPhi(VPlan &Plan)
Returns true if the VPlan contains a VPReductionPHIRecipe with FindLast recurrence kind.
static bool verifyExecutionFrequenciesMatchBFI(VPlan &Plan, Loop *OrigLoop, LoopInfo *LI, LoopVectorizationCostModel &CM)
Cross-check the execution frequencies recorded in Plan against BlockFrequencyInfo for the blocks of O...
static bool isOutsideLoopWorkProfitable(GeneratedRTChecks &Checks, VectorizationFactor &VF, Loop *L, PredicatedScalarEvolution &PSE, VPCostContext &CostCtx, VPlan &Plan, EpilogueLowering SEL, std::optional< unsigned > VScale)
This function determines whether or not it's still profitable to vectorize the loop given the extra w...
static InstructionCost calculateEarlyExitCost(VPCostContext &CostCtx, VPlan &Plan, ElementCount VF)
For loops with uncountable early exits, find the cost of doing work when exiting the loop early,...
static void checkMixedPrecision(Loop *L, OptimizationRemarkEmitter *ORE)
static cl::opt< ElementCount > EpilogueVectorizationForceVF("epilogue-vectorization-force-VF", cl::init(ElementCount::getFixed(1)), cl::Hidden, cl::desc("When epilogue vectorization is enabled, and a value greater than " "1 is specified, forces the given VF for all applicable epilogue " "loops. Note: This allows all scalable VFs >= vscale x 1."))
static void connectEpilogueVectorLoop(VPlan &EpiPlan, DominatorTree *DT, VPIRBasicBlock *VecEpilogueIterCheckVPBB, ArrayRef< VPInstruction * > ResumeValues)
Connect the epilogue vector loop generated for EpiPlan to the main vector loop, after both plans have...
static bool willGenerateVectors(VPlan &Plan, ElementCount VF, const TargetTransformInfo &TTI)
Check if any recipe of Plan will generate a vector value, which will be assigned a vector register.
static MainPlanResumeMarkers preparePlanForMainVectorLoop(VPlan &MainPlan)
Prepare MainPlan for vectorizing the main vector loop during epilogue vectorization.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file implements a map that provides insertion order iteration.
This file contains the declarations for metadata subclasses.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
This file contains the declarations for profiling metadata utility functions.
R600 Emit Clause Markers
const SmallVectorImpl< MachineOperand > & Cond
SI Fold Operands
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file contains some templates that are useful if you are working with the STL at all.
#define OP(OPC)
Definition Instruction.h:46
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
#define DEBUG_WITH_TYPE(TYPE,...)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
Definition Debug.h:72
This pass exposes codegen information to IR-level passes.
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
This file implements the TypeSwitch template, which mimics a switch() statement whose cases are type ...
This file contains the declarations of different VPlan-related auxiliary helpers.
This file provides utility VPlan to VPlan transformations.
#define RUN_VPLAN_PASS(PASS,...)
#define RUN_VPLAN_PASS_NO_VERIFY(PASS,...)
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:
Value * RHS
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
A manager for alias analyses.
static constexpr roundingMode rmTowardZero
Definition APFloat.h:365
static const fltSemantics & IEEEdouble()
Definition APFloat.h:305
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1532
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
void clearAnalysis(IRUnitT &IR)
Directly clear a cached analysis for an IR unit.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
const T & front() const
Get the first element.
Definition ArrayRef.h:144
size_t size() const
Get the array size.
Definition ArrayRef.h:141
ArrayRef< T > take_back(size_t N=1) const
Return a copy of *this with only the last N elements.
Definition ArrayRef.h:225
A function analysis which provides an AssumptionCache.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:515
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
LLVM_ABI const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
Analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
static uint32_t getDenominator()
uint32_t getNumerator() const
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
bool isNoBuiltin() const
Return true if the call should not be treated as a call to a builtin.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
This class represents a function call, abstracting a target machine's calling convention.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
Conditional Branch instruction.
BasicBlock * getSuccessor(unsigned i) const
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
This class represents a range of values.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
Analysis pass which computes a CycleInfo.
A debug info location.
Definition DebugLoc.h:126
static DebugLoc getTemporary()
Definition DebugLoc.h:152
static DebugLoc getUnknown()
Definition DebugLoc.h:153
An analysis that produces DemandedBits for a function.
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:758
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:767
void insert_range(Range &&R)
Inserts range of 'std::pair<KeyT, ValueT>' values into the map.
Definition DenseMap.h:895
ValueT lookup_or(const_arg_type_t< KeyT > Val, U &&Default) const
Definition DenseMap.h:804
iterator end()
Definition DenseMap.h:687
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:794
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:857
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
void changeImmediateDominator(DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom)
changeImmediateDominator - This method is used to update the dominator tree information when a node's...
void eraseNode(NodeT *BB)
eraseNode - Removes a node from the dominator tree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
constexpr bool isVector() const
One or more elements.
Definition TypeSize.h:320
static constexpr ElementCount getScalable(ScalarTy MinVal)
Definition TypeSize.h:308
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:305
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:311
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:316
A specialized derived class of inner loop vectorizer that performs vectorization of epilogue loops in...
BasicBlock * createVectorizedLoopSkeleton() final
Implements the interface for creating a vectorized skeleton using the epilogue loop strategy (i....
EpilogueVectorizerEpilogueLoop(Loop *OrigLoop, PredicatedScalarEvolution &PSE, LoopInfo *LI, DominatorTree *DT, const TargetTransformInfo *TTI, AssumptionCache *AC, ElementCount VecWidth, unsigned UnrollFactor, GeneratedRTChecks &Checks, VPlan &Plan, VPlan &MainPlan)
Tagged union holding either a T or a Error.
Definition Error.h:485
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
Class to represent function types.
param_iterator param_begin() const
param_iterator param_end() const
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:212
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:111
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2918
A struct for saving information about induction variables.
@ IK_PtrInduction
Pointer induction var. Step = C.
InnerLoopVectorizer vectorizes loops which contain only one basic block to a specified vectorization ...
const TargetTransformInfo * TTI
Target Transform Info.
friend class LoopVectorizationPlanner
PredicatedScalarEvolution & PSE
A wrapper around ScalarEvolution used to add runtime SCEV checks.
LoopInfo * LI
Loop Info.
DominatorTree * DT
Dominator Tree.
InnerLoopVectorizer(Loop *OrigLoop, PredicatedScalarEvolution &PSE, LoopInfo *LI, DominatorTree *DT, const TargetTransformInfo *TTI, AssumptionCache *AC, ElementCount VecWidth, unsigned UnrollFactor, GeneratedRTChecks &RTChecks, VPlan &Plan)
void fixVectorizedLoop(VPTransformState &State)
Fix the vectorized code, taking care of header phi's, and more.
virtual BasicBlock * createVectorizedLoopSkeleton()
Creates a basic block for the scalar preheader.
AssumptionCache * AC
Assumption Cache.
IRBuilder Builder
The builder that we use.
VPBasicBlock * VectorPHVPBB
The vector preheader block of Plan, used as target for check blocks introduced during skeleton creati...
unsigned UF
The vectorization unroll factor to use.
GeneratedRTChecks & RTChecks
Structure to hold information about generated runtime checks, responsible for cleaning the checks,...
virtual ~InnerLoopVectorizer()=default
ElementCount VF
The vectorization SIMD factor to use.
Loop * OrigLoop
The original loop.
BasicBlock * createScalarPreheader(StringRef Prefix)
Create and return a new IR basic block for the scalar preheader whose name is prefixed with Prefix.
static InstructionCost getInvalid(CostType Val=0)
static InstructionCost getMax()
CostType getValue() const
This function is intended to be used as sparingly as possible, since the class provides the full rang...
bool isCast() const
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
iterator_range< user_iterator > users()
const char * getOpcodeName() const
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
LLVM_ABI APInt getMask() const
For example, this is 0xFF for an 8 bit integer, 0xFFFF for i16, etc.
Definition Type.cpp:362
The group of interleaved loads/stores sharing the same stride and close to each other.
auto members() const
Return an iterator range over the non-null members of this group, in index order.
InstTy * getInsertPos() const
uint32_t getNumMembers() const
Drive the analysis of interleaved memory accesses in the loop.
bool requiresScalarEpilogue() const
Returns true if an interleaved group that may access memory out-of-bounds requires a scalar epilogue ...
bool hasGroups() const
Returns true if we have any interleave groups.
LLVM_ABI void analyzeInterleaving(bool EnableMaskedInterleavedGroup)
Analyze the interleaved accesses and collect them in interleave groups.
An instruction for reading from memory.
Type * getPointerOperandType() const
This analysis provides dependence information for the memory accesses of a loop.
const RuntimePointerChecking * getRuntimePointerChecking() const
unsigned getNumRuntimePointerChecks() const
Number of memchecks required to prove independence of otherwise may-alias pointers.
const SymbolicStrideMap & getSymbolicStrides() const
If an access has a symbolic strides, this maps the pointer value to the stride symbol.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:594
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
bool isInnermost() const
Return true if the loop does not contain any (natural) loops.
unsigned getNumBlocks() const
Get the number of blocks in this loop in constant time.
BlockT * getHeader() const
iterator_range< block_iterator > blocks() const
BlockT * getExitingBlock() const
If getExitingBlocks would return exactly one block, return that block.
Store the result of a depth first search within basic blocks contained by a single loop.
RPOIterator beginRPO() const
Reverse iterate over the cached postorder blocks.
LLVM_ABI void perform(const LoopInfo *LI)
Traverse the loop blocks and store the DFS result.
RPOIterator endRPO() const
Wrapper class to LoopBlocksDFS that provides a standard begin()/end() interface for the DFS reverse p...
void perform(const LoopInfo *LI)
Traverse the loop blocks and store the DFS result.
void removeBlock(BlockT *BB)
This method completely removes BB from all data structures, including all of the Loop objects it is n...
LoopVectorizationCostModel - estimates the expected speedups due to vectorization.
bool isPredicatedInst(Instruction *I) const
Returns true if I is an instruction that needs to be predicated at runtime.
void collectValuesToIgnore()
Collect values we want to ignore in the cost model.
BlockFrequencyInfo * BFI
The BlockFrequencyInfo returned from GetBFI.
BlockFrequencyInfo & getBFI()
Returns the BlockFrequencyInfo for the function if cached, otherwise fetches it via GetBFI.
bool isForcedScalar(Instruction *I, ElementCount VF) const
Returns true if I has been forced to be scalarized at VF.
bool isUniformAfterVectorization(Instruction *I, ElementCount VF) const
Returns true if I is known to be uniform after vectorization.
void collectNonVectorizedAndSetWideningDecisions(ElementCount VF)
Collect values that will not be widened, including Uniforms, Scalars, and Instructions to Scalarize f...
static constexpr StringLiteral getInstWideningStr(InstWidening W)
bool isMaskRequired(Instruction *I) const
Wrapper function for LoopVectorizationLegality::isMaskRequired, that passes the Instruction I and if ...
PredicatedScalarEvolution & PSE
Predicated scalar evolution analysis.
const TargetTransformInfo & TTI
Vector target information.
LoopVectorizationLegality * Legal
Vectorization legality.
uint64_t getPredBlockCostDivisor(TargetTransformInfo::TargetCostKind CostKind, const BasicBlock *BB)
A helper function that returns how much we should divide the cost of a predicated block by.
std::optional< InstWidening > memoryInstructionCanBeWidened(Instruction *I, ElementCount VF)
If I is a memory instruction with a consecutive pointer that can be widened, returns the widening kin...
InstructionCost getInstructionCost(Instruction *I, ElementCount VF)
Returns the execution time cost of an instruction for a given vector width.
bool interleavedAccessCanBeWidened(Instruction *I, ElementCount VF) const
Returns true if I is a memory instruction in an interleaved-group of memory accesses that can be vect...
const TargetLibraryInfo * TLI
Target Library Info.
const InterleaveGroup< Instruction > * getInterleavedAccessGroup(Instruction *Instr) const
Get the interleaved access group that Instr belongs to.
InstructionCost getVectorIntrinsicCost(CallInst *CI, ElementCount VF) const
Estimate cost of an intrinsic call instruction CI if it were vectorized with factor VF.
bool maskPartialAliasing() const
Returns true if all loop blocks should have partial aliases masked.
bool isScalarAfterVectorization(Instruction *I, ElementCount VF) const
Returns true if I is known to be scalar after vectorization.
bool isOptimizableIVTruncate(Instruction *I, ElementCount VF)
Return True if instruction I is an optimizable truncate whose operand is an induction variable.
bool isLegalGatherOrScatter(Instruction *I, ElementCount VF) const
Returns true if the target machine supports gather or scatter for I's data type and alignment.
FixedScalableVFPair computeMaxVF(ElementCount UserVF, unsigned UserIC)
Loop * TheLoop
The loop that we evaluate.
InterleavedAccessInfo & InterleaveInfo
The interleave access information contains groups of interleaved accesses with the same stride and cl...
SmallPtrSet< const Value *, 16 > ValuesToIgnore
Values to ignore in the cost model.
LoopVectorizationCostModel(EpilogueLowering SEL, Loop *L, PredicatedScalarEvolution &PSE, LoopInfo *LI, LoopVectorizationLegality *Legal, const TargetTransformInfo &TTI, const TargetLibraryInfo *TLI, AssumptionCache *AC, OptimizationRemarkEmitter *ORE, std::function< BlockFrequencyInfo &()> GetBFI, const Function *F, InterleavedAccessInfo &IAI, VFSelectionContext &Config)
void invalidateCostModelingDecisions()
Invalidates decisions already taken by the cost model.
bool isAccessInterleaved(Instruction *Instr) const
Check if Instr belongs to any interleaved access group.
void setTailFoldingStyle(bool IsScalableVF, unsigned UserIC)
Selects and saves TailFoldingStyle.
OptimizationRemarkEmitter * ORE
Interface to emit optimization remarks.
LoopInfo * LI
Loop Info analysis.
bool usePredicatedReductionSelect(RecurKind RecurrenceKind, bool HasUsesOutsideReductionChain) const
Returns true if the predicated reduction select should be used to set the incoming value for the redu...
bool requiresScalarEpilogue(bool IsVectorizing) const
Returns true if we're required to use a scalar epilogue for at least the final iteration of the origi...
SmallPtrSet< const Value *, 16 > VecValuesToIgnore
Values to ignore in the cost model when VF > 1.
bool useEmulatedMaskMemRefHack(Instruction *I, ElementCount VF) const
Returns true if an artificially high cost for emulated masked memrefs should be used.
bool isLegalMaskedLoadOrStore(Instruction *I, ElementCount VF) const
Returns true if the target machine supports masked loads or stores for I's data type and alignment.
bool isProfitableToScalarize(Instruction *I, ElementCount VF) const
void setWideningDecision(const InterleaveGroup< Instruction > *Grp, ElementCount VF, InstWidening W, InstructionCost Cost)
Save vectorization decision W and Cost taken by the cost model for interleaving group Grp and vector ...
bool isEpilogueAllowed() const
Returns true if an epilogue is allowed (e.g., not prevented by optsize or a loop hint annotation).
bool canTruncateToMinimalBitwidth(Instruction *I, ElementCount VF) const
bool shouldConsiderInvariant(Value *Op)
Returns true if Op should be considered invariant and if it is trivially hoistable.
bool foldTailByMasking() const
Returns true if all loop blocks should be masked to fold tail loop.
bool foldTailWithEVL() const
Returns true if VP intrinsics with explicit vector length support should be generated in the tail fol...
bool blockNeedsPredicationForAnyReason(BasicBlock *BB) const
Returns true if the instructions in this block requires predication for any reason,...
AssumptionCache * AC
Assumption cache.
void setWideningDecision(Instruction *I, ElementCount VF, InstWidening W, InstructionCost Cost)
Save vectorization decision W and Cost taken by the cost model for instruction I and vector width VF.
InstWidening
Decision that was taken during cost calculation for memory instruction.
@ CM_InvalidatedDecision
A widening decision that has been invalidated after replacing the corresponding recipe during VPlan t...
std::pair< InstructionCost, InstructionCost > getDivRemSpeculationCost(Instruction *I, ElementCount VF)
Return the costs for our two available strategies for lowering a div/rem operation which requires spe...
InstructionCost getVectorCallCost(CallInst *CI, ElementCount VF) const
Estimate cost of a call instruction CI if it were vectorized with factor VF.
bool isScalarWithPredication(Instruction *I, ElementCount VF)
Returns true if I is an instruction which requires predication and for which our chosen predication s...
std::function< BlockFrequencyInfo &()> GetBFI
A function to lazily fetch BlockFrequencyInfo.
InstructionCost expectedCost(ElementCount VF)
Returns the expected execution cost.
void setCostBasedWideningDecision(ElementCount VF)
Memory access instruction may be vectorized in more than one way.
bool isDivRemScalarWithPredication(InstructionCost ScalarCost, InstructionCost MaskedCost) const
Given costs for both strategies, return true if the scalar predication lowering should be used for di...
InstWidening getWideningDecision(Instruction *I, ElementCount VF) const
Return the cost model decision for the given instruction I and vector width VF.
InstructionCost getWideningCost(Instruction *I, ElementCount VF)
Return the vectorization cost for the given instruction I and vector width VF.
TailFoldingStyle getTailFoldingStyle() const
Returns the TailFoldingStyle that is best for the current loop.
void collectInstsToScalarize(ElementCount VF)
Collects the instructions to scalarize for each predicated instruction in the loop.
LoopVectorizationLegality checks if it is legal to vectorize a loop, and to what vectorization factor...
MapVector< PHINode *, InductionDescriptor > InductionList
InductionList saves induction variables and maps them to the induction descriptor.
RecurrenceSet & getFixedOrderRecurrences()
Return the fixed-order recurrences found in the loop.
LLVM_ABI bool canVectorize(bool UseVPlanNativePath)
Returns true if it is legal to vectorize this loop.
bool hasUncountableExitWithSideEffects() const
Returns true if this is an early exit loop with state-changing or potentially-faulting operations and...
LLVM_ABI bool canVectorizeFPMath(bool EnableStrictReductions)
Returns true if it is legal to vectorize the FP math operations in this loop.
const SmallVector< BasicBlock *, 4 > & getCountableExitingBlocks() const
Returns all exiting blocks with a countable exit, i.e.
const ReductionList & getReductionVars() const
Returns the reduction variables found in the loop.
bool hasUncountableEarlyExit() const
Returns true if the loop has uncountable early exits, i.e.
bool hasHistograms() const
Returns a list of all known histogram operations in the loop.
const LoopAccessInfo * getLAI() const
Planner drives the vectorization process after having passed Legality checks.
DenseMap< const SCEV *, Value * > executePlan(ElementCount VF, unsigned UF, VPlan &BestPlan, InnerLoopVectorizer &LB, DominatorTree *DT, EpilogueVectorizationKind EpilogueVecKind=EpilogueVectorizationKind::None)
EpilogueVectorizationKind
Generate the IR code for the vectorized loop captured in VPlan BestPlan according to the best selecte...
@ MainLoop
Vectorizing the main loop of epilogue vectorization.
void clearCostModel()
Destroy the cost model.
VPlan & getPlanFor(ElementCount VF) const
Return the VPlan for VF.
Definition VPlan.cpp:1639
void updateLoopMetadataAndProfileInfo(Loop *VectorLoop, VPBasicBlock *HeaderVPBB, const VPlan &Plan, bool VectorizingEpilogue, MDNode *OrigLoopID, std::optional< unsigned > OrigAverageTripCount, unsigned OrigLoopInvocationWeight, unsigned EstimatedVFxUF, bool DisableRuntimeUnroll, bool UnrollVectorizedLoop)
Update loop metadata and profile info for both the scalar remainder loop and VectorLoop,...
Definition VPlan.cpp:1690
bool hasAPlan() const
Returns true if there is at least one VPlan.
LoopVectorizationCostModel & getCostModel()
Return the cost model. Must not be called after clearCostModel().
void attachRuntimeChecks(VPlan &Plan, GeneratedRTChecks &RTChecks, bool HasBranchWeights) const
Attach the runtime checks of RTChecks to Plan.
unsigned selectInterleaveCount(VPlan &Plan, ElementCount VF, InstructionCost LoopCost)
bool hasVectorPlan() const
Return true if there is at least one VPlan for a vector VF.
void emitInvalidCostRemarks(OptimizationRemarkEmitter *ORE)
Emit remarks for recipes with invalid costs in the available VPlans.
LoopVectorizationPlanner(Loop *L, LoopInfo *LI, DominatorTree *DT, const TargetLibraryInfo *TLI, const TargetTransformInfo &TTI, LoopVectorizationLegality *Legal, std::unique_ptr< LoopVectorizationCostModel > CM, VFSelectionContext &Config, InterleavedAccessInfo &IAI, PredicatedScalarEvolution &PSE, OptimizationRemarkEmitter *ORE, std::function< const BranchProbabilityInfo &()> GetBPI)
static bool getDecisionAndClampRange(const std::function< bool(ElementCount)> &Predicate, VFRange &Range)
Test a Predicate on a Range of VF's.
Definition VPlan.cpp:1625
void printPlans(raw_ostream &O)
Definition VPlan.cpp:1794
std::unique_ptr< VPlan > selectBestEpiloguePlan(VPlan &MainPlan, ElementCount MainLoopVF, unsigned IC, bool ScalarEpilogueAllowed)
void plan(ElementCount UserVF, unsigned UserIC)
Build VPlans for the specified UserVF and UserIC if they are non-zero or all applicable candidate VFs...
void addMinimumIterationCheck(VPlan &Plan, ElementCount VF, unsigned UF, ElementCount MinProfitableTripCount) const
Create a check to Plan to see if the vector loop should be executed based on its trip count.
bool hasPlanWithVF(ElementCount VF) const
Look through the existing plans and return true if we have one with vectorization factor VF.
std::pair< VectorizationFactor, VPlan * > computeBestVF()
Compute and return the most profitable vectorization factor and the corresponding best VPlan.
This holds vectorization requirements that must be verified late in the process.
Utility class for getting and setting loop vectorizer hints in the form of loop metadata.
LLVM_ABI bool allowVectorization(Function *F, Loop *L, bool VectorizeOnlyWhenForced) const
LLVM_ABI void emitRemarkWithHints() const
Dumps all the hint information.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Metadata node.
Definition Metadata.h:1081
bool empty() const
Definition MapVector.h:79
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition MapVector.h:126
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
Diagnostic information for optimization analysis remarks related to pointer aliasing.
Diagnostic information for optimization analysis remarks related to floating-point non-commutativity.
Diagnostic information for optimization analysis remarks.
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for missed-optimization remarks.
Diagnostic information for applied optimization remarks.
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
ScalarEvolution * getSE() const
Returns the ScalarEvolution analysis used.
LLVM_ABI const SCEVPredicate & getPredicate() const
LLVM_ABI unsigned getSmallConstantMaxTripCount()
Returns the upper bound of the loop trip count as a normal unsigned value, or 0 if the trip count is ...
LLVM_ABI const SCEV * getBackedgeTakenCount()
Get the (predicated) backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSCEV(Value *V)
Returns the SCEV expression of V, in the context of the current SCEV predicate.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
Type * getRecurrenceType() const
Returns the type of the recurrence.
static bool isFindLastRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static bool isAnyOfRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static LLVM_ABI bool isSubRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is for a sub operation.
bool isSigned() const
Returns true if all source operands of the recurrence are SExtInsts.
static bool isFindIVRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static bool isMinMaxRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is any min/max kind.
Holds information about the memory runtime legality checks to verify that a group of pointers do not ...
std::optional< ArrayRef< PointerDiffInfo > > getDiffChecks() const
const SmallVectorImpl< RuntimePointerCheck > & getChecks() const
Returns the checks that generateChecks created.
This class uses information about analyze scalars to rewrite expressions in canonical form.
ScalarEvolution * getSE()
bool isInsertedInstruction(Instruction *I) const
Return true if the specified instruction was inserted by the code rewriter.
LLVM_ABI Value * expandCodeForPredicate(const SCEVPredicate *Pred, Instruction *Loc)
Generates a code sequence that evaluates this predicate.
LLVM_ABI void eraseDeadInstructions(Value *Root)
Remove inserted instructions that are dead, e.g.
virtual bool isAlwaysTrue() const =0
Returns true if the predicate is always true.
This class represents an analyzed expression in the program.
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
Type * getType() const
Return the LLVM type of this SCEV expression.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI const SCEV * getElementCount(Type *Ty, ElementCount EC, SCEVFlags Flags=SCEV::FlagNone)
LLVM_ABI const SCEV * getURemExpr(SCEVUse LHS, SCEVUse RHS)
Represents an unsigned remainder expression based on unsigned division.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getTripCountFromExitCount(const SCEV *ExitCount)
A version of getTripCountFromExitCount below which always picks an evaluation type which can not resu...
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI void forgetLoop(const Loop *L)
This method should be called by the client when it has changed a loop in a way that may effect Scalar...
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI SCEVUse getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
ConstantRange getUnsignedRange(const SCEV *S)
Determine the unsigned range for a particular SCEV.
LLVM_ABI void forgetValue(Value *V)
This method should be called by the client when it has changed a value in a way that may effect its v...
LLVM_ABI void forgetBlockAndLoopDispositions(Value *V=nullptr)
Called when the client has changed the disposition of values in a loop or block.
const SCEV * getMinusOne(Type *Ty)
Return a SCEV for the constant -1 of a specific type.
LLVM_ABI void forgetLcssaPhiWithNewPredecessor(Loop *L, PHINode *V)
Forget LCSSA phi node V of loop L to which a new predecessor was added, such that it may no longer be...
LLVM_ABI SCEVUse getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
APInt getUnsignedRangeMax(const SCEV *S)
Determine the max of the unsigned range for a particular SCEV.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
This class represents the LLVM 'select' instruction.
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
void insert_range(Range &&R)
Definition SetVector.h:182
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:268
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
Definition SetVector.h:258
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Definition StringRef.h:888
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
LLVM_ABI bool supportsEfficientVectorElementLoadStore() const
If target has efficient vector element load/store instructions, it can return true here so that inser...
LLVM_ABI bool prefersVectorizedAddressing() const
Return true if target doesn't mind addresses in vectors.
LLVM_ABI InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const
LLVM_ABI InstructionCost getOperandsScalarizationOverhead(ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
Estimate the overhead of scalarizing operands with the given types.
LLVM_ABI InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, OperandValueInfo OpdInfo={OK_AnyValue, OP_None}, const Instruction *I=nullptr) const
LLVM_ABI InstructionCost getShuffleCost(ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, TTI::TargetCostKind CostKind, ArrayRef< int > Mask={}, int Index=0, VectorType *SubTp=nullptr, ArrayRef< const Value * > Args={}, const Instruction *CtxI=nullptr, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
static LLVM_ABI OperandValueInfo getOperandInfo(const Value *V)
Collect properties of V used in cost analysis, e.g. OP_PowerOf2.
LLVM_ABI InstructionCost getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, bool UseMaskForCond=false, bool UseMaskForGaps=false) const
TargetCostKind
The kind of cost model.
@ TCK_RecipThroughput
Reciprocal throughput.
@ TCK_CodeSize
Instruction code size.
@ TCK_SizeAndLatency
The weighted sum of size and latency.
@ TCK_Latency
The latency of instruction.
LLVM_ABI InstructionCost getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const
LLVM_ABI InstructionCost getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr, TTI::TargetCostKind CostKind) const
llvm::VectorInstrContext VectorInstrContext
@ TCC_Free
Expected to fold away in lowering.
LLVM_ABI InstructionCost getInstructionCost(const User *U, ArrayRef< const Value * > Operands, TargetCostKind CostKind) const
Estimate the cost of a given IR user when lowered.
LLVM_ABI InstructionCost getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index) const
LLVM_ABI InstructionCost getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
Estimate the overhead of scalarizing an instruction.
@ SK_Splice
Concatenates elements from the first input vector with elements of the second input vector.
@ SK_Broadcast
Broadcast element 0 to all other elements.
@ SK_Reverse
Reverse the order of the vector.
CastContextHint
Represents a hint about the context in which a cast is used.
@ Reversed
The cast is used with a reversed load/store.
@ Masked
The cast is used with a masked load/store.
@ Normal
The cast is used with a normal load/store.
@ Interleave
The cast is used with an interleaved load/store.
@ GatherScatter
The cast is used with a gather/scatter.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
This class implements a switch-like dispatch statement for a value of 'T' using dyn_cast functionalit...
Definition TypeSwitch.h:89
TypeSwitch< T, ResultT > & Case(CallableT &&caseFn)
Add a case on the given type.
Definition TypeSwitch.h:98
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:272
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
static SmallVector< VFInfo, 8 > getMappings(const CallInst &CI)
Retrieve all the VFInfo instances associated to the CallInst CI.
Definition VectorUtils.h:76
Holds state needed to make cost decisions before computing costs per-VF, including the maximum VFs.
const TTI::TargetCostKind CostKind
The kind of cost that we are calculating.
bool isEpilogueVectorizationProfitable(ElementCount VF, unsigned IC) const
Returns true if epilogue vectorization is considered profitable for a main loop with vectorization fa...
std::optional< unsigned > getVScaleForTuning() const
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:4429
RecipeListTy::iterator iterator
Instruction iterators...
Definition VPlan.h:4456
iterator end()
Definition VPlan.h:4466
iterator begin()
Recipe iterator methods.
Definition VPlan.h:4464
iterator_range< iterator > phis()
Returns an iterator range over the PHI-like recipes in the block.
Definition VPlan.h:4517
InstructionCost cost(ElementCount VF, VPCostContext &Ctx) override
Return the cost of this VPBasicBlock.
Definition VPlan.cpp:737
iterator getFirstNonPhi()
Return the position of the first non-phi node recipe in the block.
Definition VPlan.cpp:228
const VPRecipeBase & front() const
Definition VPlan.h:4476
VPRecipeBase * getTerminator()
If the block has multiple successors, return the branch recipe terminating the block.
Definition VPlan.cpp:607
bool empty() const
Definition VPlan.h:4475
const VPBasicBlock * getExitingBasicBlock() const
Definition VPlan.cpp:198
void setName(const Twine &newName)
Definition VPlan.h:188
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:230
VPlan * getPlan()
Definition VPlan.h:199
const VPBasicBlock * getEntryBasicBlock() const
Definition VPlan.cpp:183
VPBlockBase * getSingleSuccessor() const
Definition VPlan.h:235
static auto blocksAs(T &&Range)
Return an iterator range over Range with each block cast to BlockTy.
Definition VPlanUtils.h:421
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:384
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:414
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 VPBuilderBase getToInsertAfter(VPRecipeBase *R)
VPPhi * createScalarPhi(ArrayRef< VPValue * > IncomingValues, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="", std::optional< VPIRFlags > Flags=std::nullopt, Type *ResultTy=nullptr)
Create a phi with IncomingValues, using the default flags for the result type, unless Flags is set.
T * insert(T *R)
Insert R at the current insertion point. Returns R unchanged.
VPInstruction * createAdd(VPValue *LHS, VPValue *RHS, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="", VPRecipeWithIRFlags::WrapFlagsTy WrapFlags={false, false})
VPInstruction * createSelect(VPValue *Cond, VPValue *TrueVal, VPValue *FalseVal, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="", std::optional< VPIRFlags > Flags=std::nullopt)
Create a select of TrueVal and FalseVal based on Cond, using the default flags for the result type,...
static VPSingleDefRecipe * createSingleScalarOp(unsigned Opcode, ArrayRef< VPValue * > Operands, VPValue *Mask, const VPIRFlags &Flags, const VPIRMetadata &Metadata, DebugLoc DL, Type *ResultTy, Instruction *UV)
VPInstruction * createNaryOp(unsigned Opcode, ArrayRef< VPValue * > Operands, Instruction *Inst=nullptr, const VPIRFlags &Flags={}, const VPIRMetadata &MD={}, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="", Type *ResultTy=nullptr)
Create an N-ary operation with Opcode, Operands and set Inst as its underlying Instruction.
unsigned getNumDefinedValues() const
Returns the number of values defined by the VPDef.
Definition VPlanValue.h:577
VPValue * getVPSingleValue()
Returns the only VPValue defined by the VPDef.
Definition VPlanValue.h:550
Recipe to expand a SCEV expression.
Definition VPlan.h:4042
A pure virtual base class for all recipes modeling header phis, including phis for first order recurr...
Definition VPlan.h:2459
virtual VPValue * getBackedgeValue()
Returns the incoming value from the loop backedge.
Definition VPlan.h:2502
void setBackedgeValue(VPValue *V)
Update the incoming value from the loop backedge.
Definition VPlan.h:2505
VPValue * getStartValue()
Returns the start value of the phi, if one is set.
Definition VPlan.h:2491
A recipe representing a sequence of load -> update -> store as part of a histogram operation.
Definition VPlan.h:2170
A special type of VPBasicBlock that wraps an existing IR basic block.
Definition VPlan.h:4582
BasicBlock * getIRBasicBlock() const
Definition VPlan.h:4606
LLVM_ABI_FOR_TEST FastMathFlags getFastMathFlagsOrNone() const
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1282
iterator_range< operand_iterator > operandsWithoutMask()
Returns an iterator range over the operands excluding the mask operand if present.
Definition VPlan.h:1550
VPInstruction * clone() override
Clone the current recipe.
Definition VPlan.h:1460
@ ResumeForEpilogue
Explicit user for values in the main VPlan, used by the epilogue vector loop.
Definition VPlan.h:1390
@ ReductionStartVector
Start vector for reductions with 3 operands: the original start value, the identity value for the red...
Definition VPlan.h:1383
@ ComputeReductionResult
Reduce the operands to the final reduction result using the operation specified via the operation's V...
Definition VPlan.h:1341
unsigned getOpcode() const
Definition VPlan.h:1473
void setName(StringRef NewName)
Set the symbolic name for the VPInstruction.
Definition VPlan.h:1583
VPValue * getMask() const
Returns the mask for the VPInstruction.
Definition VPlan.h:1546
VPInterleaveRecipe is a recipe for transforming an interleave group of load or stores into one wide l...
Definition VPlan.h:3152
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:403
DebugLoc getDebugLoc() const
Returns the debug location of the recipe.
Definition VPlan.h:553
void moveBefore(VPBasicBlock &BB, iplist< VPRecipeBase >::iterator I)
Unlink this recipe and insert into BB before I.
void insertBefore(VPRecipeBase *InsertPos)
Insert an unlinked recipe into a basic block immediately before the specified recipe.
iplist< VPRecipeBase >::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
VPRecipeBase * tryToCreateWidenNonPhiRecipe(VPSingleDefRecipe *R, VFRange &Range)
Create and return a widened recipe for a non-phi recipe R if one can be created within the given VF R...
VPHistogramRecipe * widenIfHistogram(VPInstruction *VPI)
If VPI represents a histogram operation (as determined by LoopVectorizationLegality) make that safe f...
bool prefersVectorizedAddressing() const
Returns true if the target prefers vectorized addressing.
VPRecipeBase * tryToWidenMemory(VPInstruction *VPI, VFRange &Range)
Check if the load or store instruction VPI should widened for Range.Start and potentially masked.
bool replaceWithFinalIfReductionStore(VPInstruction *VPI, VPBuilder &FinalRedStoresBuilder)
If VPI is a store of a reduction into an invariant address, delete it.
VPSingleDefRecipe * handleReplication(VPInstruction *VPI, VFRange &Range)
Build a replicating or single-scalar recipe for VPI.
bool isPredicatedInst(Instruction *I) const
Returns true if I needs to be predicated (i.e.
Type * getScalarType() const
Returns the scalar type of this VPRecipeValue.
Definition VPlanValue.h:349
A recipe for handling reduction phis.
Definition VPlan.h:2862
bool isOrdered() const
Returns true, if the phi is part of an ordered reduction.
Definition VPlan.h:2934
bool hasUsesOutsideReductionChain() const
Returns true, if the phi is part of a multi-use reduction.
Definition VPlan.h:2943
bool isInLoop() const
Returns true if the phi is part of an in-loop reduction.
Definition VPlan.h:2937
VPReductionPHIRecipe * cloneWithOperands(VPValue *Start, VPValue *BackedgeValue)
Definition VPlan.h:2898
RecurKind getRecurrenceKind() const
Returns the recurrence kind of the reduction.
Definition VPlan.h:2931
A recipe to represent inloop, ordered or partial reduction operations.
Definition VPlan.h:3245
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
Definition VPlan.h:4654
const VPBlockBase * getEntry() const
Definition VPlan.h:4698
void clearCanonicalIVNUW(VPInstruction *Increment)
Unsets NUW for the canonical IV increment Increment, for loop regions.
Definition VPlan.h:4821
VPRegionValue * getCanonicalIV()
Return the canonical induction variable of the region, null for replicating regions.
Definition VPlan.h:4774
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
Definition VPlan.h:3412
VPSingleDefRecipe is a base class for recipes that model a sequence of one or more output IR that def...
Definition VPlan.h:611
Instruction * getUnderlyingInstr()
Returns the underlying instruction.
Definition VPlan.h:673
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:396
operand_range operands()
Definition VPlanValue.h:472
void setOperand(unsigned I, VPValue *New)
Definition VPlanValue.h:445
VPValue * getOperand(unsigned N) const
Definition VPlanValue.h:437
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Definition VPlanValue.h:50
Type * getScalarType() const
Returns the scalar type of this VPValue, dispatching based on the concrete subclass.
Definition VPlan.cpp:142
Value * getLiveInIRValue() const
Return the underlying IR value for a VPIRValue.
Definition VPlan.cpp:136
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
Definition VPlan.cpp:123
Value * getUnderlyingValue() const
Return the underlying Value attached to this VPValue.
Definition VPlanValue.h:75
void replaceUsesWithIf(VPValue *New, llvm::function_ref< bool(VPUser *U)> ShouldReplace)
Go through the uses list for this VPValue and make each use point to New if the callback ShouldReplac...
Definition VPlan.cpp:1458
void replaceAllUsesWith(VPValue *New)
Definition VPlan.cpp:1452
VPWidenCastRecipe is a recipe to create vector cast instructions.
Definition VPlan.h:1873
A recipe for handling GEP instructions.
Definition VPlan.h:2229
VPWidenRecipe is a recipe for producing a widened instruction using the opcode and operands of the re...
Definition VPlan.h:1806
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4841
bool hasVF(ElementCount VF) const
Definition VPlan.h:5077
ElementCount getSingleVF() const
Returns the single VF of the plan, asserting that the plan has exactly one VF.
Definition VPlan.h:5090
VPBasicBlock * getEntry()
Definition VPlan.h:4937
VPValue * getTripCount() const
The trip count of the original loop.
Definition VPlan.h:5009
VPSymbolicValue & getVFxUF()
Returns VF * UF of the vector loop region.
Definition VPlan.h:5049
bool hasUF(unsigned UF) const
Definition VPlan.h:5102
ArrayRef< VPIRBasicBlock * > getExitBlocks() const
Return an ArrayRef containing VPIRBasicBlocks wrapping the exit blocks of the original scalar loop.
Definition VPlan.h:5003
VPIRValue * getOrAddLiveIn(Value *V)
Gets the live-in VPIRValue for V or adds a new live-in (if none exists yet) for V.
Definition VPlan.h:5127
VPIRValue * getZero(Type *Ty)
Return a VPIRValue wrapping the null value of type Ty.
Definition VPlan.h:5153
LLVM_ABI_FOR_TEST VPRegionBlock * getVectorLoopRegion()
Returns the VPRegionBlock of the vector loop.
Definition VPlan.cpp:1030
bool hasEarlyExit() const
Returns true if the VPlan is based on a loop with an early exit.
Definition VPlan.h:5260
InstructionCost cost(ElementCount VF, VPCostContext &Ctx)
Return the cost of this plan.
Definition VPlan.cpp:1012
LLVM_ABI_FOR_TEST bool isOuterLoop() const
Returns true if this VPlan is for an outer loop, i.e., its vector loop region contains a nested loop ...
Definition VPlan.cpp:1054
VPBasicBlock * getMiddleBlock()
Returns the 'middle' block of the plan, that is the block that selects whether to execute the scalar ...
Definition VPlan.h:4979
VPBasicBlock * getVectorPreheader() const
Returns the preheader of the vector loop region, if one exists, or null otherwise.
Definition VPlan.h:4942
bool requiresScalarEpilogue() const
Returns true if the plan requires a scalar epilogue after the vector loop.
Definition VPlan.h:4965
VPSymbolicValue & getUF()
Returns the UF of the vector loop region.
Definition VPlan.h:5046
bool hasScalarVFOnly() const
Definition VPlan.h:5095
VPBasicBlock * getScalarPreheader() const
Return the VPBasicBlock for the preheader of the scalar loop.
Definition VPlan.h:4993
void execute(VPTransformState *State)
Generate the IR code for this VPlan.
Definition VPlan.cpp:905
bool hasTailFolded() const
Returns true if the vector loop region is tail-folded.
Definition VPlan.h:4958
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
Definition VPlan.h:4999
LLVM_ABI_FOR_TEST VPlan * duplicate()
Clone the current VPlan, update all VPValues of the new VPlan and cloned recipes to refer to the clon...
Definition VPlan.cpp:1195
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isNonZero() const
Definition TypeSize.h:155
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:216
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isFixed() const
Returns true if the quantity is not scaled by vscale.
Definition TypeSize.h:171
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr bool isZero() const
Definition TypeSize.h:153
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:223
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
IteratorT end() const
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
@ Legal
The operation is expected to be selectable directly by the target, and no transformation is necessary...
void reportVectorizationFailure(const StringRef DebugMsg, const StringRef OREMsg, const StringRef ORETag, OptimizationRemarkEmitter *ORE, const Loop *TheLoop, Instruction *I=nullptr)
Reports a vectorization failure: print DebugMsg for debugging purposes along with the corresponding o...
void reportVectorizationInfo(const StringRef Msg, const StringRef ORETag, OptimizationRemarkEmitter *ORE, const Loop *TheLoop, Instruction *I=nullptr, DebugLoc DL={})
Reports an informative message: print Msg for debugging purposes as well as an optimization remark.
void reportVectorization(OptimizationRemarkEmitter *ORE, Loop *TheLoop, ElementCount VFWidth, unsigned IC)
Report successful vectorization of the loop.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
OneOps_match< OpTy, Instruction::Freeze > m_Freeze(const OpTy &Op)
Matches FreezeInst.
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
bind_cst_ty m_scev_APInt(const APInt *&C)
Match an SCEV constant and bind it to an APInt.
match_bind< const SCEVMulExpr > m_scev_Mul(const SCEVMulExpr *&V)
bool match(const SCEV *S, const Pattern &P)
SCEVBinaryExpr_match< SCEVMulExpr, Op0_t, Op1_t, SCEV::FlagNone, true > m_scev_c_Mul(const Op0_t &Op0, const Op1_t &Op1)
bool matchFindIVResult(VPInstruction *VPI, Op0_t ReducedIV, Op1_t Start)
Match FindIV result pattern: select(icmp ne ComputeReductionResult(ReducedIV), Sentinel),...
VPInstruction_match< VPInstruction::ExtractLastLane, Op0_t > m_ExtractLastLane(const Op0_t &Op0)
VPInstruction_match< VPInstruction::BranchOnCount > m_BranchOnCount()
auto m_VPValue()
Match an arbitrary VPValue and ignore it.
VPInstruction_match< VPInstruction::ExtractLastPart, Op0_t > m_ExtractLastPart(const Op0_t &Op0)
VPRecipeBase * findUserOf(VPValue *V, const MatchT &P)
If V is used by a recipe matching pattern P, return it.
bool match(Val *V, const Pattern &P)
match_bind< VPInstruction > m_VPInstruction(VPInstruction *&V)
Match a VPInstruction, capturing if we match.
VPInstruction_match< VPInstruction::ExtractLane, Op0_t, Op1_t > m_ExtractLane(const Op0_t &Op0, const Op1_t &Op1)
initializer< Ty > init(const Ty &Val)
Add a small namespace to avoid name clashes with the classes used in the streaming interface.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
InstructionCost getScalarizationOverhead(const TargetTransformInfo &TTI, bool ReVec, Type *ScalarTy, VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, const TTI::TargetCostKind CostKind, bool ForPoisonSrc, ArrayRef< Value * > VL, TTI::VectorInstrContext VIC)
This is similar to TargetTransformInfo::getScalarizationOverhead, but if ScalarTy is a FixedVectorTyp...
BranchProbability getExecutionProbability(BlockFrequency Freq)
Returns Freq as a BranchProbability, relative to the full mass.
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...
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,...
VPInstruction * findCanonicalIVIncrement(VPlan &Plan)
Find the canonical IV increment of Plan's vector loop region.
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.
bool doesGeneratePerAllLanes(const VPRecipeBase *R)
Returns true if R produces scalar values for all VF lanes.
VPRecipeBase * findRecipe(VPValue *Start, PredT Pred)
Search Start's users for a recipe satisfying Pred, looking through recipes with definitions.
Definition VPlanUtils.h:145
LLVM_ABI_FOR_TEST const SCEV * getSCEVExprForVPValue(const VPValue *V, PredicatedScalarEvolution &PSE, const Loop *L=nullptr)
Return the SCEV expression for V.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify each loop in a loop nest recursively.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
SmallVector< VPBasicBlock * > vp_rpo_plain_cfg_loop_body(VPBasicBlock *Header)
Returns the VPBasicBlocks forming the loop body of a plain (pre-region) VPlan in reverse post-order s...
Definition VPlanCFG.h:262
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:846
constexpr auto not_equal_to(T &&Arg)
Functor variant of std::not_equal_to that can be used as a UnaryPredicate in functional algorithms li...
Definition STLExtras.h:2196
LLVM_ABI Value * addRuntimeChecks(Instruction *Loc, Loop *TheLoop, const SmallVectorImpl< RuntimePointerCheck > &PointerChecks, SCEVExpander &Expander, bool HoistRuntimeChecks=false)
Add code that checks at runtime if the accessed arrays in PointerChecks overlap.
auto cast_if_present(const Y &Val)
cast_if_present<X> - Functionally identical to cast, except that a null value is accepted.
Definition Casting.h:683
LLVM_ABI bool RemoveRedundantDbgInstrs(BasicBlock *BB)
Try to remove redundant dbg.value instructions from given basic block.
LLVM_ABI std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Return either:
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
unsigned getLoadStoreAddressSpace(const Value *I)
A helper function that returns the address space of the pointer operand of load or store instruction.
LLVM_ABI Intrinsic::ID getVectorIntrinsicIDForCall(const CallInst *CI, const TargetLibraryInfo *TLI)
Returns intrinsic ID for call.
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
Definition STLExtras.h:856
InstructionCost Cost
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool verifyFunction(const Function &F, raw_ostream *OS=nullptr)
Check a function for errors, useful for use when debugging a pass.
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
VPBuilderBase<> VPBuilder
Definition VPlan.h:67
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
Value * getRuntimeVF(IRBuilderBase &B, Type *Ty, ElementCount VF)
Return the runtime value for VF.
LLVM_ABI bool formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put a loop nest into LCSSA form.
Definition LCSSA.cpp:469
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
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Definition MathExtras.h:285
Align getLoadStoreAlignment(const Value *I)
A helper function that returns the alignment of load or store instruction.
iterator_range< df_iterator< VPBlockShallowTraversalWrapper< VPBlockBase * > > > vp_depth_first_shallow(VPBlockBase *G)
Returns an iterator range to traverse the graph starting at G in depth-first order.
Definition VPlanCFG.h:250
LLVM_ABI bool VerifySCEV
LLVM_ABI bool isSafeToSpeculativelyExecute(const Instruction *I, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr, bool UseVariableInfo=true, bool IgnoreUBImplyingAttrs=true)
Return true if the instruction does not have any effects besides calculating the result and does not ...
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
iterator_range< df_iterator< VPBlockDeepTraversalWrapper< VPBlockBase * > > > vp_depth_first_deep(VPBlockBase *G)
Returns an iterator range to traverse the graph starting at G in depth-first order while traversing t...
Definition VPlanCFG.h:285
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:366
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
void collectEphemeralRecipesForVPlan(VPlan &Plan, DenseSet< VPRecipeBase * > &EphRecipes)
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
bool containsIrreducibleCFG(RPOTraversalT &RPOTraversal, const LoopInfoT &LI)
Return true if the control flow in RPOTraversal is irreducible.
Definition CFG.h:154
std::optional< uint64_t > getMaxRuntimeElementCount(ElementCount EC, const Function &F)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
bool hasIrregularType(Type *Ty, const DataLayout &DL)
A helper function that returns true if the given type is irregular.
UncountableExitStyle
Different methods of handling early exits.
Definition VPlan.h:83
@ ReadOnly
No side effects to worry about, so we can process any uncountable exits in the loop and branch either...
Definition VPlan.h:87
@ MaskedHandleExitInScalarLoop
All memory operations other than the load(s) required to determine whether an uncountable exit occurr...
Definition VPlan.h:92
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:149
SmallVector< VPRegisterUsage, 8 > calculateRegisterUsageForPlan(VPlan &Plan, ArrayRef< ElementCount > VFs, const TargetTransformInfo &TTI)
Estimate the register usage for Plan and vectorization factors in VFs by calculating the highest numb...
LLVM_ABI bool wouldInstructionBeTriviallyDead(const Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction would have no side effects if it was not used.
Definition Local.cpp:413
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...
Type * toVectorizedTy(Type *Ty, ElementCount EC)
A helper for converting to vectorized types.
T * find_singleton(R &&Range, Predicate P, bool AllowRepeats=false)
Return the single value in Range that satisfies P(<member of Range> *, AllowRepeats)->T * returning n...
Definition STLExtras.h:1853
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
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:389
bool canVectorizeTy(Type *Ty)
Returns true if Ty is a valid vector element type, void, or an unpacked literal struct where all elem...
TargetTransformInfo TTI
@ CM_EpilogueNotAllowedLowTripLoop
@ CM_EpilogueNotNeededFoldTail
@ CM_EpilogueNotAllowedFoldTail
@ CM_EpilogueNotAllowedOptSize
@ CM_EpilogueAllowed
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
RecurKind
These are the kinds of recurrences that we support.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
LLVM_ABI Value * getRecurrenceIdentity(RecurKind K, Type *Tp, FastMathFlags FMF)
Given information about an recurrence kind, return the identity for the @llvm.vector....
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the specified block at the specified instruction.
constexpr T AbsoluteDifference(U X, V Y)
Subtract two unsigned integers, X and Y, of type T and return the absolute value of the result.
Definition MathExtras.h:595
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
ArrayRef(const T &OneElt) -> ArrayRef< T >
auto sum_of(R &&Range, E Init=E{0})
Returns the sum of all values in Range with Init initial value.
Definition STLExtras.h:1733
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
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:1788
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterator.h:368
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
constexpr bool valueOr(BoolOrDefault X, bool Default)
ArrayRef< Type * > getContainedTypes(Type *const &Ty)
Returns the types contained in Ty.
bool pred_empty(const BasicBlock *BB)
Definition CFG.h:107
@ None
Don't use tail folding.
@ DataWithEVL
Use predicated EVL instructions for tail-folding.
@ DataAndControlFlow
Use predicate to control both data and control flow.
@ DataWithoutLaneMask
Same as Data, but avoids using the get.active.lane.mask intrinsic to calculate the mask and instead i...
@ Data
Use predicate only to mask operations on data in the loop.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI bool hasBranchWeightMD(const Instruction &I)
Checks if an instructions has Branch Weight Metadata.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition Hashing.h:307
@ Increment
Incrementally increasing token ID.
Definition AllocToken.h:26
@ Enabled
Convert any .debug_str_offsets tables to DWARF64 if needed.
Definition DWP.h:31
@ Disabled
Don't do any conversion of .debug_str_offsets tables.
Definition DWP.h:30
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:347
Type * toVectorTy(Type *Scalar, ElementCount EC)
A helper function for converting Scalar types to vector types.
std::unique_ptr< VPlan > VPlanPtr
Definition VPlan.h:78
LLVM_ABI Value * addDiffRuntimeChecks(Instruction *Loc, ArrayRef< PointerDiffInfo > Checks, SCEVExpander &Expander, ElementCount VF, unsigned IC)
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:866
LLVM_ABI_FOR_TEST bool verifyVPlanIsValid(const VPlan &Plan)
Verify invariants for general VPlans.
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition Hashing.h:287
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
ResumeForEpilogue markers in the main plan, used by the epilogue plan.
VPInstruction * CanIVResume
SmallVector< VPInstruction * > ResumeValues
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
static LLVM_ABI void collectEphemeralValues(const Loop *L, AssumptionCache *AC, SmallPtrSetImpl< const Value * > &EphValues)
Collect a loop's ephemeral values (those used only by an assume or similar intrinsics in the loop).
A class that represents two vectorization factors (initialized with 0 by default).
static FixedScalableVFPair getNone()
This holds details about a histogram operation – a load -> update -> store sequence where each lane i...
TargetLibraryInfo * TLI
LLVM_ABI LoopVectorizeResult runImpl(Function &F)
LLVM_ABI bool processLoop(Loop *L)
ProfileSummaryInfo * PSI
LoopAccessInfoManager * LAIs
std::function< const BranchProbabilityInfo &()> GetBPI
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
LLVM_ABI LoopVectorizePass(LoopVectorizeOptions Opts={})
ScalarEvolution * SE
AssumptionCache * AC
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
OptimizationRemarkEmitter * ORE
std::function< BlockFrequencyInfo &()> GetBFI
TargetTransformInfo * TTI
Storage for information about made changes.
A marker analysis to determine if extra passes should be run after loop vectorization.
static LLVM_ABI AnalysisKey Key
Parameters that control the generic loop unrolling transformation.
bool UnrollVectorizedLoop
Disable runtime unrolling by default for vectorized loops.
Holds the VFShape for a specific scalar to vector function mapping.
A range of powers-of-2 vectorization factors with fixed start and adjustable end.
ElementCount End
Struct to hold various analysis needed for cost computations.
LLVMContext & LLVMCtx
const VFSelectionContext & Config
LoopVectorizationCostModel & CM
VPCostContext(const TargetLibraryInfo &TLI, const VPlan &Plan, LoopVectorizationCostModel &CM, VFSelectionContext &Config, bool ReusePrintingSlotTracker=false)
bool skipCostComputation(Instruction *UI, bool IsVector) const
Return true if the cost for UI shouldn't be computed, e.g.
InstructionCost getLegacyCost(Instruction *UI, ElementCount VF) const
Return the cost for UI with VF using the legacy cost model as fallback until computing the cost of al...
bool isMaskRequired(Instruction *I) const
Forwards to LoopVectorizationCostModel::isMaskRequired.
void invalidateWideningDecision(Instruction *I, ElementCount VF)
Mark the widening decision for I at VF as invalidated since a VPlan transform replaced the original r...
PredicatedScalarEvolution & PSE
bool willBeScalarized(Instruction *I, ElementCount VF) const
Returns true if I is known to be scalarized at VF.
static bool executesAtMostOnce(const VPlan &Plan, ElementCount VF)
Returns true if the vector loop body of Plan is known to execute at most once at VF,...
TargetTransformInfo::TargetCostKind CostKind
const TargetLibraryInfo & TLI
const TargetTransformInfo & TTI
SmallPtrSet< Instruction *, 8 > SkipCostComputation
const VectorizeOptions & Opts
A pure-virtual common base class for recipes defining a single VPValue and using IR flags.
Definition VPlan.h:1100
A struct that represents some properties of the register usage of a loop.
InstructionCost spillCost(const TargetTransformInfo &TTI, TargetTransformInfo::TargetCostKind CostKind, unsigned OverrideMaxNumRegs=0) const
Calculate the estimated cost of any spills due to using more registers than the number available for ...
VPTransformState holds information passed down when "executing" a VPlan, needed for generating the ou...
A recipe for widening load operations, using the address to load from and an optional mask.
Definition VPlan.h:3829
A recipe for widening store operations, using the stored value, the address to store to and an option...
Definition VPlan.h:3934
static void simplifyLiveInsWithSCEV(VPlan &Plan, PredicatedScalarEvolution &PSE)
Check Plan's live-ins and replace them with constants, if they can be simplified via SCEV.
static void addMinimumVectorEpilogueIterationCheck(VPlan &Plan, VPValue *MainVectorTripCount, bool RequiresScalarEpilogue, ElementCount EpilogueVF, unsigned MainLoopStep, unsigned EpilogueLoopStep, ScalarEvolution &SE)
Add a check to Plan to see if the epilogue vector loop should be executed.
static bool makeCallWideningDecisions(VPlan &Plan, VFRange &Range, VPRecipeBuilder &RecipeBuilder, VPCostContext &CostCtx)
Convert call VPInstructions in Plan into widened call, vector intrinsic or replicate recipes based on...
static void expandSCEVsToVPInstructions(VPlan &Plan, ScalarEvolution &SE)
Expand VPExpandSCEVRecipes in Plan's entry block to VPInstructions.
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 createInterleaveGroups(VPlan &Plan, const SmallPtrSetImpl< const InterleaveGroup< Instruction > * > &InterleaveGroups, const bool &EpilogueAllowed)
static LLVM_ABI_FOR_TEST bool handleUncountableEarlyExits(VPlan &Plan, OptimizationRemarkEmitter *ORE, Loop *TheLoop, PredicatedScalarEvolution &PSE, DominatorTree &DT, AssumptionCache *AC, UncountableExitStyle Style)
Update Plan to account for uncountable early exits by introducing appropriate branching logic in the ...
static bool simplifyKnownEVL(VPlan &Plan, ElementCount VF, PredicatedScalarEvolution &PSE)
Try to simplify VPInstruction::ExplicitVectorLength recipes when the AVL is known to be <= VF,...
static void introduceMasksAndLinearize(VPlan &Plan)
Predicate and linearize the control-flow in the only loop region of Plan.
static void materializeFactors(VPlan &Plan, VPBasicBlock *VectorPH, ElementCount VF)
Materialize UF, VF and VFxUF to be computed explicitly using VPInstructions.
static void foldTailByMasking(VPlan &Plan)
Adapts the vector loop region for tail folding by introducing a header mask and conditionally executi...
static void materializeBackedgeTakenCount(VPlan &Plan, VPBasicBlock *VectorPH)
Materialize the backedge-taken count to be computed explicitly using VPInstructions.
static LLVM_ABI_FOR_TEST bool tryToConvertVPInstructionsToVPRecipes(VPlan &Plan, const TargetLibraryInfo &TLI, PredicatedScalarEvolution &PSE, Loop *OuterLoop)
Replaces the VPInstructions in Plan with corresponding widen recipes.
static bool handleMultiUseReductions(VPlan &Plan, OptimizationRemarkEmitter *ORE, Loop *TheLoop)
Try to legalize reductions with multiple in-loop uses.
static void convertToVariableLengthStep(VPlan &Plan)
Transform loops with variable-length stepping after region dissolution.
static void materializeHeaderMask(VPlan &Plan, bool UseActiveLaneMask, bool UseActiveLaneMaskForControlFlow)
Materialize the abstract header mask of the loop region into concrete recipes: an active-lane-mask if...
static void recordExecutionFrequencies(VPlan &Plan)
Add execution frequencies to each recipe in the loop body of Plan.
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 std::unique_ptr< VPlan > narrowInterleaveGroups(VPlan &Plan, const TargetTransformInfo &TTI)
Try to find a single VF among Plan's VFs for which all interleave groups (with known minimum VF eleme...
static bool handleFindLastReductions(VPlan &Plan)
Check if Plan contains any FindLast reductions.
static void createInLoopReductionRecipes(VPlan &Plan, ElementCount MinVF)
Create VPReductionRecipes for in-loop reductions.
static void materializeAliasMaskCheckBlock(VPlan &Plan, ArrayRef< PointerDiffInfo > DiffChecks, bool HasBranchWeights)
Materializes the alias mask within a check block before the loop.
static void modelGeneratedMainLoopBlocks(VPlan &EpiPlan, VPlan &MainPlan, VPIRBasicBlock *EnteredFrom)
Model the blocks the executed MainPlan generated for the main vector loop in EpiPlan during epilogue ...
static void unrollByUF(VPlan &Plan, unsigned UF)
Explicitly unroll Plan by UF.
static DenseMap< const SCEV *, Value * > expandSCEVs(VPlan &Plan, ScalarEvolution &SE)
Expand remaining VPExpandSCEVRecipes in Plan's entry block using SCEVExpander.
static void convertToConcreteRecipes(VPlan &Plan)
Lower abstract recipes to concrete ones, that can be codegen'd.
static LLVM_ABI_FOR_TEST void createLoopRegions(VPlan &Plan, DebugLoc DL)
Replace loops in Plan's flat CFG with VPRegionBlocks, turning Plan's flat CFG into a hierarchical CFG...
static void makeMemOpWideningDecisions(VPlan &Plan, VFRange &Range, VPRecipeBuilder &RecipeBuilder, VPCostContext &CostCtx)
Convert load/store VPInstructions in Plan into widened or replicate recipes.
static LLVM_ABI_FOR_TEST void addMiddleCheck(VPlan &Plan)
If a check is needed to guard executing the scalar epilogue loop, it will be added to the middle bloc...
static void narrowInductionTruncates(VPlan &Plan, VFRange &Range, const TargetTransformInfo &TTI, PredicatedScalarEvolution &PSE)
Replace truncates of a wide induction, or of that induction's increment, by a VPWidenIntOrFpInduction...
static void expandBranchOnTwoConds(VPlan &Plan)
Expand BranchOnTwoConds instructions into explicit CFG with BranchOnCond instructions.
static void materializeVectorTripCount(VPlan &Plan, VPBasicBlock *VectorPHVPBB, bool TailByMasking, bool RequiresScalarEpilogue, VPValue *Step, std::optional< uint64_t > MaxRuntimeStep=std::nullopt)
Materialize vector trip count computations to a set of VPInstructions.
static void hoistPredicatedLoads(VPlan &Plan, PredicatedScalarEvolution &PSE, const Loop *L)
Hoist predicated loads from the same address to the loop entry block, if they are guaranteed to execu...
static void attachAliasMaskToHeaderMask(VPlan &Plan)
Attaches the alias-mask to the existing header-mask.
static void removeRedundantExpandSCEVRecipes(VPlan &Plan)
Replace each VPExpandSCEVRecipe in Plan's entry block with an earlier VPExpandSCEVRecipe there expand...
static void optimizeFindIVReductions(VPlan &Plan, PredicatedScalarEvolution &PSE, Loop &L)
Optimize FindLast reductions selecting IVs (or expressions of IVs) by converting them to FindIV reduc...
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 void makeScalarizationDecisions(VPlan &Plan, VFRange &Range)
Make VPlan-based scalarization decision prior to delegating to the ones made by the legacy CM.
static void replaceWideCanonicalIVWithWideIV(VPlan &Plan, ScalarEvolution &SE, const TargetTransformInfo &TTI, TargetTransformInfo::TargetCostKind CostKind, ElementCount VF, unsigned UF)
Replace a VPWidenCanonicalIVRecipe if it is present in Plan, with a VPWidenIntOrFpInductionRecipe,...
static LLVM_ABI_FOR_TEST std::unique_ptr< VPlan > buildVPlan0(Loop *TheLoop, LoopInfo &LI, Type *InductionTy, PredicatedScalarEvolution &PSE, LoopVersioning *LVer=nullptr, function_ref< const BranchProbabilityInfo &()> GetBPI=nullptr)
Create a base VPlan0, serving as the common starting point for all later candidates.
static void optimizeInductionLiveOutUsers(VPlan &Plan, PredicatedScalarEvolution &PSE, const Loop *L)
If there's a single exit block, optimize its phi recipes that use exiting IV values by feeding them p...
static void addExplicitVectorLength(VPlan &Plan, const std::optional< unsigned > &MaxEVLSafeElements)
Add a VPCurrentIterationPHIRecipe and related recipes to Plan and replaces all uses of the canonical ...
static void adjustFirstOrderRecurrenceMiddleUsers(VPlan &Plan, VFRange &Range)
Adjust first-order recurrence users in the middle block: create penultimate element extracts for LCSS...
static void optimizeEVLMasks(VPlan &Plan)
Optimize recipes which use an EVL-based header mask to VP intrinsics, for example:
static bool handleMaxMinNumReductions(VPlan &Plan)
Check if Plan contains any FMaxNum or FMinNum reductions.
static void removeDeadRecipes(VPlan &Plan)
Remove dead recipes from Plan.
static void attachCheckBlock(VPlan &Plan, Value *Cond, BasicBlock *CheckBlock, bool AddBranchWeights)
static LLVM_ABI_FOR_TEST void handleCountableEarlyExits(VPlan &Plan)
Disconnect countable early exits from the loop.
static void sinkPredicatedStores(VPlan &Plan, PredicatedScalarEvolution &PSE, const Loop *L)
Sink predicated stores to the same address with complementary predicates (P and NOT P) to an uncondit...
static bool finalizeSCEVPredicates(VPlan &Plan, PredicatedScalarEvolution &PSE, bool OptForSize, unsigned SCEVCheckThreshold, OptimizationRemarkEmitter *ORE, Loop *TheLoop)
Finalize SCEV predicates by adding induction predicates from Plan to PSE and checking constraints.
static void replicateByVF(VPlan &Plan, ElementCount VF)
Replace replicating VPReplicateRecipe, VPScalarIVStepsRecipe and VPInstruction in Plan with VF single...
static bool removeBranchOnConst(VPlan &Plan, bool OnlyLatches=false)
Remove BranchOnCond recipes with true or false conditions together with removing dead edges to their ...
static void convertToStridedAccesses(VPlan &Plan, PredicatedScalarEvolution &PSE, Loop &L, VPCostContext &Ctx, VFRange &Range)
Transform widen memory recipes into strided access recipes when legal and profitable.
static void addIterationCountCheckBlock(VPlan &Plan, ElementCount VF, unsigned UF, bool RequiresScalarEpilogue, Loop *OrigLoop, const uint32_t *MinItersBypassWeights, DebugLoc DL, PredicatedScalarEvolution &PSE)
Add a new check block before the vector preheader to Plan to check if the main vector loop should be ...
static void clearReductionWrapFlags(VPlan &Plan)
Clear NSW/NUW flags from reduction instructions if necessary.
static void createPartialReductions(VPlan &Plan, VPCostContext &CostCtx, VFRange &Range)
Detect and create partial reduction recipes for scaled or unordered reductions in Plan.
static void materializeUnpacks(VPlan &Plan)
Add explicit Unpack recipes to extract scalars from vectors as needed.
static void addMinimumIterationCheck(VPlan &Plan, ElementCount VF, unsigned UF, ElementCount MinProfitableTripCount, bool RequiresScalarEpilogue, bool TailFolded, Loop *OrigLoop, const uint32_t *MinItersBypassWeights, DebugLoc DL, PredicatedScalarEvolution &PSE, VPBasicBlock *CheckBlock)
static void cse(VPlan &Plan)
Perform common-subexpression-elimination on Plan.
static void replaceSymbolicStrides(VPlan &Plan, PredicatedScalarEvolution &PSE, const SymbolicStrideMap &StridesMap, const VPDominatorTree &VPDT)
Replace symbolic strides from StridesMap in Plan with constants when possible.
static LLVM_ABI_FOR_TEST 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 truncateToMinimalBitwidths(VPlan &Plan, const MapVector< Instruction *, uint64_t > &MinBWs)
Insert truncates and extends for any truncated recipe.
static LLVM_ABI_FOR_TEST bool createHeaderPhiRecipes(VPlan &Plan, PredicatedScalarEvolution &PSE, Loop &OrigLoop, OptimizationRemarkEmitter *ORE, const VPDominatorTree &VPDT, const MapVector< PHINode *, InductionDescriptor > &Inductions, const MapVector< PHINode *, RecurrenceDescriptor > &Reductions, const SmallPtrSetImpl< const PHINode * > &FixedOrderRecurrences, const SmallPtrSetImpl< PHINode * > &InLoopReductions, bool AllowReordering)
Replace VPPhi recipes in Plan's header with corresponding VPHeaderPHIRecipe subclasses for inductions...
static void dropPoisonGeneratingRecipes(VPlan &Plan)
Drop poison flags from recipes that may generate a poison value that is used after vectorization,...
static void optimizeForVFAndUF(VPlan &Plan, ElementCount BestVF, unsigned BestUF, PredicatedScalarEvolution &PSE)
Optimize Plan based on BestVF and BestUF.
static void widenMemoryAccessesByUF(VPlan &Plan, ElementCount VF, unsigned UF, const TargetTransformInfo &TTI)
Widens memory operations by a factor of UF based on a target hook.
static void convertEVLExitCond(VPlan &Plan)
Replaces the exit condition from (branch-on-cond eq CanonicalIVInc, VectorTripCount) to (branch-on-co...
static bool splitCombinedExits(VPlan &Plan, PredicatedScalarEvolution &PSE, Loop *TheLoop)
If a single exit has multiple conditions combined together, split them and create new exiting blocks.
static void attachMemoryChecks(VPlan &Plan, ArrayRef< RuntimePointerCheck > Checks, ScalarEvolution &SE, DebugLoc DL, bool AddBranchWeights)
Generate Checks as recipes and attach the check block to Plan.
static void combineRecipes(VPlan &Plan)
Perform instcombine-like simplifications on recipes in Plan.
TODO: The following VectorizationFactor was pulled out of LoopVectorizationCostModel class.
InstructionCost Cost
Cost of the loop with that width.
ElementCount MinProfitableTripCount
The minimum trip count required to make vectorization profitable, e.g.
ElementCount Width
Vector width with best cost.
InstructionCost ScalarCost
Cost of the scalar loop.
static VectorizationFactor Disabled()
Width 1 means no vectorization, cost 0 means uncomputed cost.
static LLVM_ABI unsigned VectorizeMemoryCheckThreshold
The maximum allowed number of runtime memory checks.
static LLVM_ABI bool HoistRuntimeChecks