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)
315 : OrigLoop(OrigLoop), PSE(PSE), LI(LI), DT(DT), TTI(TTI), AC(AC),
316 VF(VecWidth), UF(UnrollFactor), Builder(PSE.getSE()->getModule()),
318
319 /// Fix the vectorized code, taking care of header phi's, and more.
321
322protected:
324
325 /// The original loop.
327
328 /// A wrapper around ScalarEvolution used to add runtime SCEV checks. Applies
329 /// dynamic knowledge to simplify SCEV expressions and converts them to a
330 /// more usable form.
332
333 /// Loop Info.
335
336 /// Dominator Tree.
338
339 /// Target Transform Info.
341
342 /// Assumption Cache.
344
345 /// The vectorization SIMD factor to use. Each vector will have this many
346 /// vector elements.
348
349 /// The vectorization unroll factor to use. Each scalar is vectorized to this
350 /// many different vector instructions.
351 unsigned UF;
352
353 /// The builder that we use
355
356 // --- Vectorization state ---
357
358 /// Structure to hold information about generated runtime checks, responsible
359 /// for cleaning the checks, if vectorization turns out unprofitable.
360 GeneratedRTChecks &RTChecks;
361};
362} // end namespace llvm
363
364/// Look for a meaningful debug location on the instruction or its operands.
366 if (!I)
367 return DebugLoc::getUnknown();
368
370 if (I->getDebugLoc() != Empty)
371 return I->getDebugLoc();
372
373 for (Use &Op : I->operands()) {
374 if (Instruction *OpInst = dyn_cast<Instruction>(Op))
375 if (OpInst->getDebugLoc() != Empty)
376 return OpInst->getDebugLoc();
377 }
378
379 return I->getDebugLoc();
380}
381
382namespace llvm {
383
384/// Return the runtime value for VF.
386 return B.CreateElementCount(Ty, VF);
387}
388
389} // end namespace llvm
390
391namespace llvm {
392
393// Loop vectorization cost-model hints how the epilogue/tail loop should be
394// lowered.
396
397 // The default: allowing epilogues.
399
400 // Vectorization with OptForSize: don't allow epilogues.
402
403 // A special case of vectorisation with OptForSize: loops with a very small
404 // trip count are considered for vectorization under OptForSize, thereby
405 // making sure the cost of their loop body is dominant, free of runtime
406 // guards and scalar iteration overheads.
408
409 // Loop hint indicating an epilogue is undesired, apply tail folding.
411
412 // Directive indicating we must either fold the epilogue/tail or not vectorize
414};
415
417
418/// LoopVectorizationCostModel - estimates the expected speedups due to
419/// vectorization.
420/// In many cases vectorization is not profitable. This can happen because of
421/// a number of reasons. In this class we mainly attempt to predict the
422/// expected speedup/slowdowns due to the supported instruction set. We use the
423/// TargetTransformInfo to query the different backends for the cost of
424/// different operations.
427
428public:
435 std::function<BlockFrequencyInfo &()> GetBFI,
436 const Function *F, InterleavedAccessInfo &IAI,
437 VFSelectionContext &Config)
438 : Opts(Config.getOpts()), Config(Config), EpilogueLoweringStatus(SEL),
439 TheLoop(L), PSE(PSE), LI(LI), Legal(Legal), TTI(TTI), TLI(TLI), AC(AC),
441
442 /// \return An upper bound for the vectorization factors (both fixed and
443 /// scalable). If the factors are 0, vectorization and interleaving should be
444 /// avoided up front.
445 FixedScalableVFPair computeMaxVF(ElementCount UserVF, unsigned UserIC);
446
447 /// Memory access instruction may be vectorized in more than one way.
448 /// Form of instruction after vectorization depends on cost.
449 /// This function takes cost-based decisions for Load/Store instructions
450 /// and collects them in a map. This decisions map is used for building
451 /// the lists of loop-uniform and loop-scalar instructions.
452 /// The calculated cost is saved with widening decision in order to
453 /// avoid redundant calculations.
455
456 /// Collect values we want to ignore in the cost model.
458
459 /// \returns True if it is more profitable to scalarize instruction \p I for
460 /// vectorization factor \p VF.
462 assert(VF.isVector() &&
463 "Profitable to scalarize relevant only for VF > 1.");
464 assert(
465 TheLoop->isInnermost() &&
466 "cost-model should not be used for outer loops (in VPlan-native path)");
467
468 auto Scalars = InstsToScalarize.find(VF);
469 assert(Scalars != InstsToScalarize.end() &&
470 "VF not yet analyzed for scalarization profitability");
471 return Scalars->second.contains(I);
472 }
473
474 /// Returns true if \p I is known to be uniform after vectorization.
476 assert(
477 TheLoop->isInnermost() &&
478 "cost-model should not be used for outer loops (in VPlan-native path)");
479
480 // If VF is scalar, then all instructions are trivially uniform.
481 if (VF.isScalar())
482 return true;
483
484 // Pseudo probes must be duplicated per vector lane so that the
485 // profiled loop trip count is not undercounted.
487 return false;
488
489 auto UniformsPerVF = Uniforms.find(VF);
490 assert(UniformsPerVF != Uniforms.end() &&
491 "VF not yet analyzed for uniformity");
492 return UniformsPerVF->second.count(I);
493 }
494
495 /// Returns true if \p I is known to be scalar after vectorization.
497 assert(
498 TheLoop->isInnermost() &&
499 "cost-model should not be used for outer loops (in VPlan-native path)");
500 if (VF.isScalar())
501 return true;
502
503 auto ScalarsPerVF = Scalars.find(VF);
504 assert(ScalarsPerVF != Scalars.end() &&
505 "Scalar values are not calculated for VF");
506 return ScalarsPerVF->second.count(I);
507 }
508
509 /// \returns True if instruction \p I can be truncated to a smaller bitwidth
510 /// for vectorization factor \p VF.
512 const auto &MinBWs = Config.getMinimalBitwidths();
513 // Truncs must truncate at most to their destination type.
514 if (isa_and_nonnull<TruncInst>(I) && MinBWs.contains(I) &&
515 I->getType()->getScalarSizeInBits() < MinBWs.lookup(I))
516 return false;
517 return VF.isVector() && MinBWs.contains(I) &&
520 }
521
522 /// Decision that was taken during cost calculation for memory instruction.
525 CM_Widen, // For consecutive accesses with stride +1.
526 CM_Widen_Reverse, // For consecutive accesses with stride -1.
530 /// A widening decision that has been invalidated after replacing the
531 /// corresponding recipe during VPlan transforms.
532 /// TODO: Remove once the legacy exit cost computation is retired.
534 };
535
536#ifndef NDEBUG
538 constexpr StringLiteral WideningStr[] = {
539 "Unknown", "Widen", "Widen_Reverse", "Interleave",
540 "GatherScatter", "Scalarize", "InvalidatedDecision"};
541 return WideningStr[W];
542 }
543#endif
544
545 /// Save vectorization decision \p W and \p Cost taken by the cost model for
546 /// instruction \p I and vector width \p VF.
549 assert(VF.isVector() && "Expected VF >=2");
550 LLVM_DEBUG(dbgs() << "LV: Setting widening decision to "
551 << getInstWideningStr(W) << " for VF " << VF
552 << " and instruction: " << *I << '\n');
553 WideningDecisions[{I, VF}] = {W, Cost};
554 }
555
556 /// Save vectorization decision \p W and \p Cost taken by the cost model for
557 /// interleaving group \p Grp and vector width \p VF.
561 assert(VF.isVector() && "Expected VF >=2");
562 /// Broadcast this decicion to all instructions inside the group.
563 /// When interleaving, the cost will only be assigned one instruction, the
564 /// insert position. For other cases, add the appropriate fraction of the
565 /// total cost to each instruction. This ensures accurate costs are used,
566 /// even if the insert position instruction is not used.
567 InstructionCost InsertPosCost = Cost;
568 InstructionCost OtherMemberCost = 0;
569 if (W != CM_Interleave)
570 OtherMemberCost = InsertPosCost = Cost / Grp->getNumMembers();
571 ;
572 for (auto *I : Grp->members()) {
573 LLVM_DEBUG(dbgs() << "LV: Setting widening decision to "
574 << getInstWideningStr(W) << " for VF " << VF
575 << " and instruction: " << *I << '\n');
576 if (Grp->getInsertPos() == I)
577 WideningDecisions[{I, VF}] = {W, InsertPosCost};
578 else
579 WideningDecisions[{I, VF}] = {W, OtherMemberCost};
580 }
581 }
582
583 /// Return the cost model decision for the given instruction \p I and vector
584 /// width \p VF. Return CM_Unknown if this instruction did not pass
585 /// through the cost modeling.
587 assert(VF.isVector() && "Expected VF to be a vector VF");
588 assert(
589 TheLoop->isInnermost() &&
590 "cost-model should not be used for outer loops (in VPlan-native path)");
591
592 std::pair<Instruction *, ElementCount> InstOnVF(I, VF);
593 auto Itr = WideningDecisions.find(InstOnVF);
594 if (Itr == WideningDecisions.end())
595 return CM_Unknown;
596 return Itr->second.first;
597 }
598
599 /// Return the vectorization cost for the given instruction \p I and vector
600 /// width \p VF.
602 assert(VF.isVector() && "Expected VF >=2");
603 std::pair<Instruction *, ElementCount> InstOnVF(I, VF);
604 assert(WideningDecisions.contains(InstOnVF) &&
605 "The cost is not calculated");
606 return WideningDecisions[InstOnVF].second;
607 }
608
609 /// Return True if instruction \p I is an optimizable truncate whose operand
610 /// is an induction variable. Such a truncate will be removed by adding a new
611 /// induction variable with the destination type.
613 // If the instruction is not a truncate, return false.
614 auto *Trunc = dyn_cast<TruncInst>(I);
615 if (!Trunc)
616 return false;
617
618 // Get the source and destination types of the truncate.
619 Type *SrcTy = toVectorTy(Trunc->getSrcTy(), VF);
620 Type *DestTy = toVectorTy(Trunc->getDestTy(), VF);
621
622 // If the truncate is free for the given types, return false. Replacing a
623 // free truncate with an induction variable would add an induction variable
624 // update instruction to each iteration of the loop. We exclude from this
625 // check the primary induction variable since it will need an update
626 // instruction regardless.
627 Value *Op = Trunc->getOperand(0);
628 if (Op != Legal->getPrimaryInduction() && TTI.isTruncateFree(SrcTy, DestTy))
629 return false;
630
631 // If the truncated value is not an induction variable, return false.
632 return Legal->isInductionPhi(Op);
633 }
634
635 /// Collects the instructions to scalarize for each predicated instruction in
636 /// the loop.
638
639 /// Collect values that will not be widened, including Uniforms, Scalars, and
640 /// Instructions to Scalarize for the given \p VF.
641 /// The sets depend on CM decision for Load/Store instructions
642 /// that may be vectorized as interleave, gather-scatter or scalarized.
643 /// Also make a decision on what to do about call instructions in the loop
644 /// at that VF -- scalarize, call a known vector routine, or call a
645 /// vector intrinsic.
647 // Do the analysis once.
648 if (VF.isScalar() || Uniforms.contains(VF))
649 return;
651 collectLoopUniforms(VF);
652 collectLoopScalars(VF);
654 }
655
656 /// Given costs for both strategies, return true if the scalar predication
657 /// lowering should be used for div/rem. This incorporates an override
658 /// option so it is not simply a cost comparison.
660 InstructionCost MaskedCost) const {
661 return !valueOr(Opts.force_widen_divrem_via_masked_intrinsic,
662 !(ScalarCost < MaskedCost));
663 }
664
665 /// Returns true if \p I is an instruction which requires predication and
666 /// for which our chosen predication strategy is scalarization (i.e. we
667 /// don't have an alternate strategy such as masking available).
668 /// \p VF is the vectorization factor that will be used to vectorize \p I.
670
671 /// Wrapper function for LoopVectorizationLegality::isMaskRequired,
672 /// that passes the Instruction \p I and if we fold tail.
673 bool isMaskRequired(Instruction *I) const;
674
675 /// Returns true if \p I is an instruction that needs to be predicated
676 /// at runtime. The result is independent of the predication mechanism.
677 /// Superset of instructions that return true for isScalarWithPredication.
678 bool isPredicatedInst(Instruction *I) const;
679
680 /// A helper function that returns how much we should divide the cost of a
681 /// predicated block by. Typically this is the reciprocal of the block
682 /// probability, i.e. if we return X we are assuming the predicated block will
683 /// execute once for every X iterations of the loop header so the block should
684 /// only contribute 1/X of its cost to the total cost calculation, but when
685 /// optimizing for code size it will just be 1 as code size costs don't depend
686 /// on execution probabilities.
687 ///
688 /// Note that if a block wasn't originally predicated but was predicated due
689 /// to tail folding, the divisor will still be 1 because it will execute for
690 /// every iteration of the loop header.
691 inline uint64_t
693 const BasicBlock *BB);
694
695 /// Returns true if an artificially high cost for emulated masked memrefs
696 /// should be used.
698
699 /// Return the costs for our two available strategies for lowering a
700 /// div/rem operation which requires speculating at least one lane.
701 /// First result is for scalarization (will be invalid for scalable
702 /// vectors); second is for the masked intrinsic strategy.
703 std::pair<InstructionCost, InstructionCost>
705
706 /// If \p I is a memory instruction with a consecutive pointer that can be
707 /// widened, returns the widening kind (CM_Widen or CM_Widen_Reverse) and
708 /// std::nullopt otherwise.
709 std::optional<InstWidening> memoryInstructionCanBeWidened(Instruction *I,
710 ElementCount VF);
711
712 /// Returns true if \p I is a memory instruction in an interleaved-group
713 /// of memory accesses that can be vectorized with wide vector loads/stores
714 /// and shuffles.
716
717 /// Returns true if the target machine supports masked loads or stores
718 /// for \p I's data type and alignment. The caller must ensure the access is
719 /// consecutive or part of an interleave group.
721
722 /// Returns true if the target machine supports gather or scatter for \p I's
723 /// data type and alignment.
725
726 /// Check if \p Instr belongs to any interleaved access group.
727 bool isAccessInterleaved(Instruction *Instr) const {
728 return InterleaveInfo.isInterleaved(Instr);
729 }
730
731 /// Get the interleaved access group that \p Instr belongs to.
734 return InterleaveInfo.getInterleaveGroup(Instr);
735 }
736
737 /// Returns true if we're required to use a scalar epilogue for at least
738 /// the final iteration of the original loop.
739 bool requiresScalarEpilogue(bool IsVectorizing) const {
740 if (!isEpilogueAllowed()) {
741 LLVM_DEBUG(dbgs() << "LV: Loop does not require scalar epilogue\n");
742 return false;
743 }
744 // If we might exit from anywhere but the latch and early exit vectorization
745 // is disabled, we must run the exiting iteration in scalar form.
746 if (TheLoop->getExitingBlock() != TheLoop->getLoopLatch() &&
747 !(Opts.enable_early_exit_vectorization &&
748 Legal->hasUncountableEarlyExit())) {
749 LLVM_DEBUG(dbgs() << "LV: Loop requires scalar epilogue: not exiting "
750 "from latch block\n");
751 return true;
752 }
753 if (IsVectorizing && InterleaveInfo.requiresScalarEpilogue()) {
754 LLVM_DEBUG(dbgs() << "LV: Loop requires scalar epilogue: "
755 "interleaved group requires scalar epilogue\n");
756 return true;
757 }
758 LLVM_DEBUG(dbgs() << "LV: Loop does not require scalar epilogue\n");
759 return false;
760 }
761
762 /// Returns true if an epilogue is allowed (e.g., not prevented by
763 /// optsize or a loop hint annotation).
764 bool isEpilogueAllowed() const {
765 return EpilogueLoweringStatus == CM_EpilogueAllowed;
766 }
767
768 /// Returns the TailFoldingStyle that is best for the current loop.
770 return ChosenTailFoldingStyle;
771 }
772
773 /// Selects and saves TailFoldingStyle.
774 /// \param IsScalableVF true if scalable vector factors enabled.
775 /// \param UserIC User specific interleave count.
776 void setTailFoldingStyle(bool IsScalableVF, unsigned UserIC) {
777 assert(ChosenTailFoldingStyle == TailFoldingStyle::None &&
778 "Tail folding must not be selected yet.");
779 if (!Legal->canFoldTailByMasking()) {
780 ChosenTailFoldingStyle = TailFoldingStyle::None;
781 return;
782 }
783
784 // Default to TTI preference, but allow command line override.
785 ChosenTailFoldingStyle = Opts.force_tail_folding_style.value_or(
786 TTI.getPreferredTailFoldingStyle());
787
788 if (ChosenTailFoldingStyle != TailFoldingStyle::DataWithEVL)
789 return;
790 // Override EVL styles if needed.
791 // FIXME: Investigate opportunity for fixed vector factor.
792 bool EVLIsLegal = UserIC <= 1 && IsScalableVF &&
793 TTI.hasActiveVectorLength() &&
794 !Opts.enable_vplan_native_path;
795 if (EVLIsLegal)
796 return;
797 // If for some reason EVL mode is unsupported, fallback to an epilogue
798 // if it's allowed, or DataWithoutLaneMask otherwise.
799 if (EpilogueLoweringStatus == CM_EpilogueAllowed ||
800 EpilogueLoweringStatus == CM_EpilogueNotNeededFoldTail)
801 ChosenTailFoldingStyle = TailFoldingStyle::None;
802 else
803 ChosenTailFoldingStyle = TailFoldingStyle::DataWithoutLaneMask;
804
806 dbgs() << "LV: Preference for VP intrinsics indicated. Will "
807 "not try to generate VP Intrinsics "
808 << (UserIC > 1
809 ? "since interleave count specified is greater than 1.\n"
810 : "due to non-interleaving reasons.\n"));
811 }
812
813 /// Returns true if all loop blocks should be masked to fold tail loop.
814 bool foldTailByMasking() const {
816 }
817
819 assert(foldTailByMasking() && "Expected tail folding to be enabled!");
821 "Did not expect to enable alias masking with EVL!");
822 assert(PartialAliasMaskingStatus == AliasMaskingStatus::NotDecided);
823
824 // Assume we fail to enable alias masking (in case we early exit).
825 PartialAliasMaskingStatus = AliasMaskingStatus::Disabled;
826
827 // Note: FixedOrderRecurrences are not supported yet as we cannot handle
828 // the required `splice.right` with the alias-mask.
829 if (!Opts.force_partial_aliasing_vectorization ||
830 !Legal->getFixedOrderRecurrences().empty())
831 return;
832
833 const RuntimePointerChecking *Checks = Legal->getRuntimePointerChecking();
834 if (!Checks)
835 return;
836
837 auto DiffChecks = Checks->getDiffChecks();
838 if (!DiffChecks || DiffChecks->empty())
839 return;
840
841 [[maybe_unused]] auto HasPointerArgs = [](CallBase *CB) {
842 return any_of(CB->args(), [](Value const *Arg) {
843 return Arg->getType()->isPointerTy();
844 });
845 };
846
847 for (BasicBlock *BB : TheLoop->blocks()) {
848 for (Instruction &I : *BB) {
850 [[maybe_unused]] auto *Call = dyn_cast<CallInst>(&I);
851 assert(
852 (!I.mayReadOrWriteMemory() || (Call && !HasPointerArgs(Call))) &&
853 "Skipped unexpected memory access");
854 continue;
855 }
856
857 Type *ScalarTy = getLoadStoreType(&I);
859
860 // Currently, we can't handle alias masking in reverse. Reversing the
861 // alias mask is not correct (or necessary). When combined with
862 // tail-folding the active lane mask should only be reversed where the
863 // alias-mask is true.
864 if (Legal->isConsecutivePtr(ScalarTy, Ptr) == -1)
865 return;
866 }
867 }
868
869 PartialAliasMaskingStatus = AliasMaskingStatus::Enabled;
870 }
871
872 /// Returns true if all loop blocks should have partial aliases masked.
873 bool maskPartialAliasing() const {
874 return PartialAliasMaskingStatus == AliasMaskingStatus::Enabled;
875 }
876
877 /// Returns true if the instructions in this block requires predication
878 /// for any reason, e.g. because tail folding now requires a predicate
879 /// or because the block in the original loop was predicated.
881 return foldTailByMasking() || Legal->blockNeedsPredication(BB);
882 }
883
884 /// Returns true if VP intrinsics with explicit vector length support should
885 /// be generated in the tail folded loop.
889
890 /// Returns true if the predicated reduction select should be used to set the
891 /// incoming value for the reduction phi.
893 bool HasUsesOutsideReductionChain) const {
894 // Force to use predicated reduction select since the EVL of the
895 // second-to-last iteration might not be VF*UF.
896 if (foldTailWithEVL())
897 return true;
898
899 // Force a predicated select with alias-masking to avoid propagating poison
900 // values to the header phi for lanes outside the alias-mask.
902 return true;
903
904 // Note: For FindLast recurrences and multi-use reductions we prefer a
905 // predicated select to simplify matching in handleFindLastReductions() and
906 // handleMultiUseReductions() respectively, rather than handle multiple
907 // cases.
909 HasUsesOutsideReductionChain)
910 return true;
911
912 return Opts.prefer_predicated_reduction_select ||
913 TTI.preferPredicatedReductionSelect();
914 }
915
916 /// Estimate cost of an intrinsic call instruction CI if it were vectorized
917 /// with factor VF. Return the cost of the instruction, including
918 /// scalarization overhead if it's needed.
920
921 /// Estimate cost of a call instruction CI if it were vectorized with factor
922 /// VF. Return the cost of the instruction, including scalarization overhead
923 /// if it's needed.
925
926 /// Invalidates decisions already taken by the cost model.
928 WideningDecisions.clear();
929 Uniforms.clear();
930 Scalars.clear();
931 }
932
933 /// Returns the expected execution cost. The unit of the cost does
934 /// not matter because we use the 'cost' units to compare different
935 /// vector widths. The cost that is returned is *not* normalized by
936 /// the factor width.
938
939 /// Returns the execution time cost of an instruction for a given vector
940 /// width. Vector width of one means scalar.
942
943 /// Returns true if \p Op should be considered invariant and if it is
944 /// trivially hoistable.
946
947 /// Returns true if \p I has been forced to be scalarized at \p VF.
949 auto FS = ForcedScalars.find(VF);
950 return FS != ForcedScalars.end() && FS->second.contains(I);
951 }
952
953private:
954 const VectorizeOptions &Opts;
955
956 unsigned NumPredStores = 0;
957
958 /// VF selection state independent of cost-modeling decisions.
959 VFSelectionContext &Config;
960
961 /// Wrapper around LoopVectorizationLegality::isUniform() that takes into
962 /// account if alias-masking is enabled. We consider the VF to be unknown when
963 /// alias masking.
964 bool isUniform(Value *V, ElementCount VF) const {
965 // With alias-masking our runtime VF is [2, VF] (and not necessarily a
966 // power-of-two). Something that is uniform for VF may not be for the full
967 // range.
968 assert(PartialAliasMaskingStatus != AliasMaskingStatus::NotDecided &&
969 "alias-mask status must be decided already");
970 return Legal->isUniform(V, PartialAliasMaskingStatus ==
972 ? std::optional(VF)
973 : std::nullopt);
974 }
975
976 /// Wrapper around LoopVectorizationLegality::isUniformMemOp() that takes into
977 /// account if alias-masking is enabled. We consider the VF to be unknown when
978 /// alias masking.
979 bool isUniformMemOp(Instruction &I, ElementCount VF) const {
980 assert(PartialAliasMaskingStatus != AliasMaskingStatus::NotDecided &&
981 "alias-mask status must be decided already");
982 return Legal->isUniformMemOp(I, PartialAliasMaskingStatus ==
984 ? std::optional(VF)
985 : std::nullopt);
986 }
987
988 /// Calculate vectorization cost of memory instruction \p I.
989 InstructionCost getMemoryInstructionCost(Instruction *I, ElementCount VF);
990
991 /// The cost computation for scalarized memory instruction.
992 InstructionCost getMemInstScalarizationCost(Instruction *I, ElementCount VF);
993
994 /// The cost computation for interleaving group of memory instructions.
995 InstructionCost getInterleaveGroupCost(Instruction *I, ElementCount VF) const;
996
997 /// The cost computation for Gather/Scatter instruction.
998 InstructionCost getGatherScatterCost(Instruction *I, ElementCount VF) const;
999
1000 /// The cost computation for widening instruction \p I with consecutive
1001 /// memory access.
1002 InstructionCost getConsecutiveMemOpCost(Instruction *I, ElementCount VF,
1003 InstWidening Kind);
1004
1005 /// The cost calculation for Load/Store instruction \p I with uniform pointer -
1006 /// Load: scalar load + broadcast.
1007 /// Store: scalar store + (loop invariant value stored? 0 : extract of last
1008 /// element)
1009 InstructionCost getUniformMemOpCost(Instruction *I, ElementCount VF) const;
1010
1011 /// Estimate the overhead of scalarizing an instruction. This is a
1012 /// convenience wrapper for the type-based getScalarizationOverhead API.
1013 InstructionCost getScalarizationOverhead(Instruction *I,
1014 ElementCount VF) const;
1015
1016 /// A type representing the costs for instructions if they were to be
1017 /// scalarized rather than vectorized. The entries are Instruction-Cost
1018 /// pairs.
1019 using ScalarCostsTy = MapVector<Instruction *, InstructionCost>;
1020
1021 /// A set containing all BasicBlocks that are known to present after
1022 /// vectorization as a predicated block.
1023 DenseMap<ElementCount, SmallPtrSet<BasicBlock *, 4>>
1024 PredicatedBBsAfterVectorization;
1025
1026 /// Records whether it is allowed to have the original scalar loop execute at
1027 /// least once. This may be needed as a fallback loop in case runtime
1028 /// aliasing/dependence checks fail, or to handle the tail/remainder
1029 /// iterations when the trip count is unknown or doesn't divide by the VF,
1030 /// or as a peel-loop to handle gaps in interleave-groups.
1031 /// Under optsize and when the trip count is very small we don't allow any
1032 /// iterations to execute in the scalar loop.
1033 EpilogueLowering EpilogueLoweringStatus = CM_EpilogueAllowed;
1034
1035 /// Control finally chosen tail folding style.
1036 TailFoldingStyle ChosenTailFoldingStyle = TailFoldingStyle::None;
1037
1038 /// If partial alias masking is enabled/disabled or not decided.
1039 AliasMaskingStatus PartialAliasMaskingStatus = AliasMaskingStatus::NotDecided;
1040
1041 /// A map holding scalar costs for different vectorization factors. The
1042 /// presence of a cost for an instruction in the mapping indicates that the
1043 /// instruction will be scalarized when vectorizing with the associated
1044 /// vectorization factor. The entries are VF-ScalarCostTy pairs.
1045 MapVector<ElementCount, ScalarCostsTy> InstsToScalarize;
1046
1047 /// Holds the instructions known to be uniform after vectorization.
1048 /// The data is collected per VF.
1049 DenseMap<ElementCount, SmallPtrSet<Instruction *, 4>> Uniforms;
1050
1051 /// Holds the instructions known to be scalar after vectorization.
1052 /// The data is collected per VF.
1053 DenseMap<ElementCount, SmallPtrSet<Instruction *, 4>> Scalars;
1054
1055 /// Holds the instructions (address computations) that are forced to be
1056 /// scalarized.
1057 DenseMap<ElementCount, SmallSetVector<Instruction *, 4>> ForcedScalars;
1058
1059 /// Returns the expected difference in cost from scalarizing the expression
1060 /// feeding a predicated instruction \p PredInst. The instructions to
1061 /// scalarize and their scalar costs are collected in \p ScalarCosts. A
1062 /// non-negative return value implies the expression will be scalarized.
1063 /// Currently, only single-use chains are considered for scalarization.
1064 InstructionCost computePredInstDiscount(Instruction *PredInst,
1065 ScalarCostsTy &ScalarCosts,
1066 ElementCount VF);
1067
1068 /// Collect the instructions that are uniform after vectorization. An
1069 /// instruction is uniform if we represent it with a single scalar value in
1070 /// the vectorized loop corresponding to each vector iteration. Examples of
1071 /// uniform instructions include pointer operands of consecutive or
1072 /// interleaved memory accesses. Note that although uniformity implies an
1073 /// instruction will be scalar, the reverse is not true. In general, a
1074 /// scalarized instruction will be represented by VF scalar values in the
1075 /// vectorized loop, each corresponding to an iteration of the original
1076 /// scalar loop.
1077 void collectLoopUniforms(ElementCount VF);
1078
1079 /// Collect the instructions that are scalar after vectorization. An
1080 /// instruction is scalar if it is known to be uniform or will be scalarized
1081 /// during vectorization. collectLoopScalars should only add non-uniform nodes
1082 /// to the list if they are used by a load/store instruction that is marked as
1083 /// CM_Scalarize. Non-uniform scalarized instructions will be represented by
1084 /// VF values in the vectorized loop, each corresponding to an iteration of
1085 /// the original scalar loop.
1086 void collectLoopScalars(ElementCount VF);
1087
1088 /// Keeps cost model vectorization decision and cost for instructions.
1089 /// Right now it is used for memory instructions only.
1090 using DecisionList = DenseMap<std::pair<Instruction *, ElementCount>,
1091 std::pair<InstWidening, InstructionCost>>;
1092
1093 DecisionList WideningDecisions;
1094
1095 /// Returns true if \p V is expected to be vectorized and it needs to be
1096 /// extracted.
1097 bool needsExtract(Value *V, ElementCount VF) const {
1099 if (VF.isScalar() || !I || !TheLoop->contains(I) ||
1100 TheLoop->isLoopInvariant(I) ||
1102 return false;
1103
1104 // Assume we can vectorize V (and hence we need extraction) if the
1105 // scalars are not computed yet. This can happen, because it is called
1106 // via getScalarizationOverhead from setCostBasedWideningDecision, before
1107 // the scalars are collected. That should be a safe assumption in most
1108 // cases, because we check if the operands have vectorizable types
1109 // beforehand in LoopVectorizationLegality.
1110 return !Scalars.contains(VF) || !isScalarAfterVectorization(I, VF);
1111 };
1112
1113 /// Returns a range containing only operands needing to be extracted.
1114 SmallVector<Value *, 4> filterExtractingOperands(Instruction::op_range Ops,
1115 ElementCount VF) const {
1116
1117 SmallPtrSet<const Value *, 4> UniqueOperands;
1118 SmallVector<Value *, 4> Res;
1119 for (Value *Op : Ops) {
1120 if (isa<Constant>(Op) || !UniqueOperands.insert(Op).second ||
1121 !needsExtract(Op, VF))
1122 continue;
1123 Res.push_back(Op);
1124 }
1125 return Res;
1126 }
1127
1128public:
1129 /// The loop that we evaluate.
1131
1132 /// Predicated scalar evolution analysis.
1134
1135 /// Loop Info analysis.
1137
1138 /// Vectorization legality.
1140
1141 /// Vector target information.
1143
1144 /// Target Library Info.
1146
1147 /// Assumption cache.
1149
1150 /// Interface to emit optimization remarks.
1152
1153 /// A function to lazily fetch BlockFrequencyInfo. This avoids computing it
1154 /// unless necessary, e.g. when the loop isn't legal to vectorize or when
1155 /// there is no predication.
1156 std::function<BlockFrequencyInfo &()> GetBFI;
1157 /// The BlockFrequencyInfo returned from GetBFI.
1159 /// Returns the BlockFrequencyInfo for the function if cached, otherwise
1160 /// fetches it via GetBFI. Avoids an indirect call to the std::function.
1162 if (!BFI)
1163 BFI = &GetBFI();
1164 return *BFI;
1165 }
1166
1168
1169 /// The interleave access information contains groups of interleaved accesses
1170 /// with the same stride and close to each other.
1172
1173 /// Values to ignore in the cost model.
1175
1176 /// Values to ignore in the cost model when VF > 1.
1178};
1179} // end namespace llvm
1180
1181namespace {
1182/// Helper struct to manage generating runtime checks for vectorization.
1183///
1184/// The runtime checks are created up-front in temporary blocks to allow better
1185/// estimating the cost and un-linked from the existing IR. After deciding to
1186/// vectorize, the checks are attached to VPlan as IR or recipes. If deciding
1187/// not to vectorize, the temporary blocks are completely removed.
1188class GeneratedRTChecks {
1189 const VectorizeOptions &Opts;
1190
1191 /// Basic block which contains the generated SCEV checks, if any.
1192 BasicBlock *SCEVCheckBlock = nullptr;
1193
1194 /// The value representing the result of the generated SCEV checks. If it is
1195 /// nullptr no SCEV checks have been generated.
1196 Value *SCEVCheckCond = nullptr;
1197
1198 /// Basic block which contains the generated memory runtime checks, if any.
1199 BasicBlock *MemCheckBlock = nullptr;
1200
1201 /// The value representing the result of the generated memory runtime checks.
1202 /// If it is nullptr no memory runtime checks have been generated.
1203 Value *MemRuntimeCheckCond = nullptr;
1204
1205 /// Whether checks were generated, retained after their IR is replaced or
1206 /// removed during VPlan execution.
1207 bool HasChecks = false;
1208
1209 DominatorTree *DT;
1210 LoopInfo *LI;
1212
1213 SCEVExpander SCEVExp;
1214 SCEVExpander MemCheckExp;
1215
1216 bool CostTooHigh = false;
1217
1218 Loop *OuterLoop = nullptr;
1219
1221
1222 /// The kind of cost that we are calculating
1223 TTI::TargetCostKind CostKind;
1224
1225 /// True if the loop is alias-masked (which allows us to omit diff checks).
1226 bool LoopUsesPartialAliasMasking = false;
1227
1228public:
1229 GeneratedRTChecks(const VectorizeOptions &Opts,
1232 TTI::TargetCostKind CostKind,
1233 bool LoopUsesPartialAliasMasking)
1234 : Opts(Opts), DT(DT), LI(LI), TTI(TTI),
1235 SCEVExp(*PSE.getSE(), "scev.check", /*PreserveLCSSA=*/false),
1236 MemCheckExp(*PSE.getSE(), "scev.check", /*PreserveLCSSA=*/false),
1237 PSE(PSE), CostKind(CostKind),
1238 LoopUsesPartialAliasMasking(LoopUsesPartialAliasMasking) {}
1239
1240 /// Generate runtime checks in SCEVCheckBlock and MemCheckBlock, so we can
1241 /// accurately estimate the cost of the runtime checks. The blocks are
1242 /// un-linked from the IR and attached to VPlan as IR or recipes if
1243 /// profitable. Otherwise, the check blocks are removed completely.
1244 void create(Loop *L, const LoopAccessInfo &LAI,
1245 const SCEVPredicate &UnionPred, ElementCount VF, unsigned IC,
1246 OptimizationRemarkEmitter &ORE) {
1247
1248 // Hard cutoff to limit compile-time increase in case a very large number of
1249 // runtime checks needs to be generated.
1250 // TODO: Skip cutoff if the loop is guaranteed to execute, e.g. due to
1251 // profile info.
1252 CostTooHigh = LAI.getNumRuntimePointerChecks() >
1254 if (CostTooHigh) {
1255 // Mark runtime checks as never succeeding when they exceed the threshold.
1256 MemRuntimeCheckCond = ConstantInt::getTrue(L->getHeader()->getContext());
1257 SCEVCheckCond = ConstantInt::getTrue(L->getHeader()->getContext());
1258 ORE.emit([&]() {
1259 return OptimizationRemarkAnalysisAliasing(
1260 DEBUG_TYPE, "TooManyMemoryRuntimeChecks", L->getStartLoc(),
1261 L->getHeader())
1262 << "loop not vectorized: too many memory checks needed";
1263 });
1264 LLVM_DEBUG(dbgs() << "LV: Too many memory checks needed.\n");
1265 return;
1266 }
1267
1268 BasicBlock *LoopHeader = L->getHeader();
1269 BasicBlock *Preheader = L->getLoopPreheader();
1270
1271 // Use SplitBlock to create blocks for SCEV & memory runtime checks to
1272 // ensure the blocks are properly added to LoopInfo & DominatorTree. Those
1273 // may be used by SCEVExpander. The blocks will be un-linked from their
1274 // predecessors and removed from LI & DT at the end of the function.
1275 if (!UnionPred.isAlwaysTrue()) {
1276 SCEVCheckBlock = SplitBlock(Preheader, Preheader->getTerminator(), DT, LI,
1277 nullptr, "vector.scevcheck");
1278
1279 SCEVCheckCond = SCEVExp.expandCodeForPredicate(
1280 &UnionPred, SCEVCheckBlock->getTerminator());
1281 if (isa<Constant>(SCEVCheckCond)) {
1282 // Clean up directly after expanding the predicate to a constant, to
1283 // avoid further expansions re-using anything left over from SCEVExp.
1284 SCEVExpanderCleaner SCEVCleaner(SCEVExp);
1285 SCEVCleaner.cleanup();
1286 }
1287 }
1288
1289 const auto &RtPtrChecking = *LAI.getRuntimePointerChecking();
1290 // TODO: We need to estimate the cost of alias-masking in
1291 // GeneratedRTChecks::getCost(). We can't check the MemCheckBlock as the
1292 // alias-mask is generated later in VPlan.
1293 if (RtPtrChecking.Need && !LoopUsesPartialAliasMasking) {
1294 auto *Pred = SCEVCheckBlock ? SCEVCheckBlock : Preheader;
1295 MemCheckBlock = SplitBlock(Pred, Pred->getTerminator(), DT, LI, nullptr,
1296 "vector.memcheck");
1297
1298 auto DiffChecks = RtPtrChecking.getDiffChecks();
1299 if (DiffChecks) {
1300 MemRuntimeCheckCond = addDiffRuntimeChecks(
1301 MemCheckBlock->getTerminator(), *DiffChecks, MemCheckExp, VF, IC);
1302 } else {
1303 MemRuntimeCheckCond = addRuntimeChecks(
1304 MemCheckBlock->getTerminator(), L, RtPtrChecking.getChecks(),
1306 }
1307 assert(MemRuntimeCheckCond &&
1308 "no RT checks generated although RtPtrChecking "
1309 "claimed checks are required");
1310 }
1311
1312 SCEVExp.eraseDeadInstructions(SCEVCheckCond);
1313 HasChecks = getSCEVChecks().first || getMemRuntimeChecks().first;
1314
1315 if (!MemCheckBlock && !SCEVCheckBlock)
1316 return;
1317
1318 // Unhook the temporary block with the checks, update various places
1319 // accordingly.
1320 if (SCEVCheckBlock)
1321 SCEVCheckBlock->replaceAllUsesWith(Preheader);
1322 if (MemCheckBlock)
1323 MemCheckBlock->replaceAllUsesWith(Preheader);
1324
1325 if (SCEVCheckBlock) {
1326 SCEVCheckBlock->getTerminator()->moveBefore(
1327 Preheader->getTerminator()->getIterator());
1328 auto *UI = new UnreachableInst(Preheader->getContext(), SCEVCheckBlock);
1329 UI->setDebugLoc(DebugLoc::getTemporary());
1330 Preheader->getTerminator()->eraseFromParent();
1331 }
1332 if (MemCheckBlock) {
1333 MemCheckBlock->getTerminator()->moveBefore(
1334 Preheader->getTerminator()->getIterator());
1335 auto *UI = new UnreachableInst(Preheader->getContext(), MemCheckBlock);
1336 UI->setDebugLoc(DebugLoc::getTemporary());
1337 Preheader->getTerminator()->eraseFromParent();
1338 }
1339
1340 DT->changeImmediateDominator(LoopHeader, Preheader);
1341 if (MemCheckBlock) {
1342 DT->eraseNode(MemCheckBlock);
1343 LI->removeBlock(MemCheckBlock);
1344 }
1345 if (SCEVCheckBlock) {
1346 DT->eraseNode(SCEVCheckBlock);
1347 LI->removeBlock(SCEVCheckBlock);
1348 }
1349
1350 // Outer loop is used as part of the later cost calculations.
1351 OuterLoop = L->getParentLoop();
1352 }
1353
1355 if (SCEVCheckBlock || MemCheckBlock)
1356 LLVM_DEBUG(dbgs() << "Calculating cost of runtime checks:\n");
1357
1358 if (CostTooHigh) {
1360 Cost.setInvalid();
1361 LLVM_DEBUG(dbgs() << " number of checks exceeded threshold\n");
1362 return Cost;
1363 }
1364
1365 InstructionCost RTCheckCost = 0;
1366 if (SCEVCheckBlock)
1367 for (Instruction &I : *SCEVCheckBlock) {
1368 if (SCEVCheckBlock->getTerminator() == &I)
1369 continue;
1370 InstructionCost C = TTI->getInstructionCost(&I, CostKind);
1371 LLVM_DEBUG(dbgs() << " " << C << " for " << I << "\n");
1372 RTCheckCost += C;
1373 }
1374 if (MemCheckBlock) {
1375 InstructionCost MemCheckCost = 0;
1376 for (Instruction &I : *MemCheckBlock) {
1377 if (MemCheckBlock->getTerminator() == &I)
1378 continue;
1379 InstructionCost C = TTI->getInstructionCost(&I, CostKind);
1380 LLVM_DEBUG(dbgs() << " " << C << " for " << I << "\n");
1381 MemCheckCost += C;
1382 }
1383
1384 // If the runtime memory checks are being created inside an outer loop
1385 // we should find out if these checks are outer loop invariant. If so,
1386 // the checks will likely be hoisted out and so the effective cost will
1387 // reduce according to the outer loop trip count.
1388 if (OuterLoop) {
1389 ScalarEvolution *SE = MemCheckExp.getSE();
1390 // TODO: If profitable, we could refine this further by analysing every
1391 // individual memory check, since there could be a mixture of loop
1392 // variant and invariant checks that mean the final condition is
1393 // variant.
1394 const SCEV *Cond = SE->getSCEV(MemRuntimeCheckCond);
1395 if (SE->isLoopInvariant(Cond, OuterLoop)) {
1396 // It seems reasonable to assume that we can reduce the effective
1397 // cost of the checks even when we know nothing about the trip
1398 // count. Assume that the outer loop executes at least twice.
1399 unsigned BestTripCount = 2;
1400
1401 // Get the best known TC estimate.
1402 if (auto EstimatedTC = getSmallBestKnownTC(
1403 Opts, PSE, OuterLoop, /* CanUseConstantMax = */ false))
1404 if (EstimatedTC->isFixed())
1405 BestTripCount = EstimatedTC->getFixedValue();
1406
1407 InstructionCost NewMemCheckCost = MemCheckCost / BestTripCount;
1408
1409 // Let's ensure the cost is always at least 1.
1410 NewMemCheckCost = std::max(NewMemCheckCost.getValue(),
1412
1413 if (BestTripCount > 1)
1415 << "We expect runtime memory checks to be hoisted "
1416 << "out of the outer loop. Cost reduced from "
1417 << MemCheckCost << " to " << NewMemCheckCost << '\n');
1418
1419 MemCheckCost = NewMemCheckCost;
1420 }
1421 }
1422
1423 RTCheckCost += MemCheckCost;
1424 }
1425
1426 if (SCEVCheckBlock || MemCheckBlock)
1427 LLVM_DEBUG(dbgs() << "Total cost of runtime checks: " << RTCheckCost
1428 << "\n");
1429
1430 return RTCheckCost;
1431 }
1432
1433 /// Remove the created SCEV & memory runtime check blocks & instructions, if
1434 /// unused.
1435 ~GeneratedRTChecks() {
1436 SCEVExpanderCleaner SCEVCleaner(SCEVExp);
1437 bool SCEVChecksUsed = !SCEVCheckBlock || !pred_empty(SCEVCheckBlock);
1438 if (SCEVChecksUsed)
1439 SCEVCleaner.markResultUsed();
1440
1441 if (MemCheckBlock && pred_empty(MemCheckBlock))
1442 eraseMemCheckBlock();
1443
1444 SCEVCleaner.cleanup();
1445
1446 if (!SCEVChecksUsed)
1447 SCEVCheckBlock->eraseFromParent();
1448 }
1449
1450 /// Retrieves the SCEVCheckCond and SCEVCheckBlock that were generated as IR
1451 /// outside VPlan.
1452 std::pair<Value *, BasicBlock *> getSCEVChecks() const {
1453 using namespace llvm::PatternMatch;
1454 if (!SCEVCheckCond || match(SCEVCheckCond, m_ZeroInt()))
1455 return {nullptr, nullptr};
1456
1457 return {SCEVCheckCond, SCEVCheckBlock};
1458 }
1459
1460 /// Retrieves the MemCheckCond and MemCheckBlock that were generated as IR
1461 /// outside VPlan.
1462 std::pair<Value *, BasicBlock *> getMemRuntimeChecks() const {
1463 using namespace llvm::PatternMatch;
1464 if (MemRuntimeCheckCond && match(MemRuntimeCheckCond, m_ZeroInt()))
1465 return {nullptr, nullptr};
1466 return {MemRuntimeCheckCond, MemCheckBlock};
1467 }
1468
1469 /// Return true if any runtime checks have been added
1470 bool hasChecks() const { return HasChecks; }
1471
1472 /// Erase the memory check block, its instructions and their SCEV expansions.
1473 void eraseMemCheckBlock() {
1474 SCEVExpanderCleaner MemCheckCleaner(MemCheckExp);
1475 auto &SE = *MemCheckExp.getSE();
1476 // Memory runtime check generation creates compares that use expanded
1477 // values. Remove them before running the SCEVExpanderCleaner.
1478 for (auto &I : make_early_inc_range(reverse(*MemCheckBlock))) {
1479 if (MemCheckExp.isInsertedInstruction(&I))
1480 continue;
1481 SE.forgetValue(&I);
1482 I.eraseFromParent();
1483 }
1484 MemCheckCleaner.cleanup();
1485 MemCheckBlock->eraseFromParent();
1486 MemCheckBlock = nullptr;
1487 MemRuntimeCheckCond = nullptr;
1488 }
1489};
1490} // namespace
1491
1493 return Style == TailFoldingStyle::Data ||
1495}
1496
1500
1501// Return true if \p OuterLp is an outer loop annotated with hints for explicit
1502// vectorization. The loop needs to be annotated with #pragma omp simd
1503// simdlen(#) or #pragma clang vectorize(enable) vectorize_width(#). If the
1504// vector length information is not provided, vectorization is not considered
1505// explicit. Interleave hints are not allowed either. These limitations will be
1506// relaxed in the future.
1507// Please, note that we are currently forced to abuse the pragma 'clang
1508// vectorize' semantics. This pragma provides *auto-vectorization hints*
1509// (i.e., LV must check that vectorization is legal) whereas pragma 'omp simd'
1510// provides *explicit vectorization hints* (LV can bypass legal checks and
1511// assume that vectorization is legal). However, both hints are implemented
1512// using the same metadata (llvm.loop.vectorize, processed by
1513// LoopVectorizeHints). This will be fixed in the future when the native IR
1514// representation for pragma 'omp simd' is introduced.
1515static bool isExplicitVecOuterLoop(const VectorizeOptions &Opts, Loop *OuterLp,
1517 assert(!OuterLp->isInnermost() && "This is not an outer loop");
1518 LoopVectorizeHints Hints(Opts, OuterLp, true /*DisableInterleaving*/, *ORE);
1519
1520 // Only outer loops with an explicit vectorization hint are supported.
1521 // Unannotated outer loops are ignored.
1523 return false;
1524
1525 Function *Fn = OuterLp->getHeader()->getParent();
1526 if (!Hints.allowVectorization(Fn, OuterLp,
1527 true /*VectorizeOnlyWhenForced*/)) {
1528 LLVM_DEBUG(dbgs() << "LV: Loop hints prevent outer loop vectorization.\n");
1529 return false;
1530 }
1531
1532 if (Hints.getInterleave() > 1) {
1533 // TODO: Interleave support is future work.
1534 LLVM_DEBUG(dbgs() << "LV: Not vectorizing: Interleave is not supported for "
1535 "outer loops.\n");
1536 Hints.emitRemarkWithHints();
1537 return false;
1538 }
1539
1540 return true;
1541}
1542
1543static void collectSupportedLoops(const VectorizeOptions &Opts, Loop &L,
1546 // Collect inner loops and outer loops without irreducible control flow. For
1547 // now, only collect outer loops that have explicit vectorization hints. If we
1548 // are stress testing the VPlan H-CFG construction, we collect the outermost
1549 // loop of every loop nest.
1550 if (L.isInnermost() || Opts.vplan_build_outerloop_stress_test ||
1551 (Opts.enable_vplan_native_path &&
1552 isExplicitVecOuterLoop(Opts, &L, ORE))) {
1553 LoopBlocksRPO RPOT(&L);
1554 RPOT.perform(LI);
1556 V.push_back(&L);
1557 // TODO: Collect inner loops inside marked outer loops in case
1558 // vectorization fails for the outer loop. Do not invoke
1559 // 'containsIrreducibleCFG' again for inner loops when the outer loop is
1560 // already known to be reducible. We can use an inherited attribute for
1561 // that.
1562 return;
1563 }
1564 }
1565 for (Loop *InnerL : L)
1566 collectSupportedLoops(Opts, *InnerL, LI, ORE, V);
1567}
1568
1569//===----------------------------------------------------------------------===//
1570// Implementation of LoopVectorizationLegality, InnerLoopVectorizer and
1571// LoopVectorizationCostModel and LoopVectorizationPlanner.
1572//===----------------------------------------------------------------------===//
1573
1574/// For the given VF and UF and maximum trip count computed for the loop, return
1575/// whether the induction variable might overflow in the vectorized loop. If not,
1576/// then we know a runtime overflow check always evaluates to false and can be
1577/// removed.
1579 const VectorizeOptions &Opts, const LoopVectorizationCostModel *Cost,
1580 ElementCount VF, std::optional<unsigned> UF = std::nullopt) {
1581 // Always be conservative if we don't know the exact unroll factor.
1582 uint64_t MaxUF = UF ? *UF
1583 : std::max(Cost->TTI.getMaxInterleaveFactor(VF, false),
1584 Cost->TTI.getMaxInterleaveFactor(VF, true));
1585
1586 IntegerType *IdxTy = Cost->Legal->getWidestInductionType();
1587 APInt MaxUIntTripCount = IdxTy->getMask();
1588
1589 // We know the runtime overflow check is known false iff the (max) trip-count
1590 // is known and (max) trip-count + (VF * UF) does not overflow in the type of
1591 // the vector loop induction variable.
1592 if (std::optional<ElementCount> TC = getSmallBestKnownTC(
1593 Opts, Cost->PSE, Cost->TheLoop,
1594 /*CanUseConstantMax=*/true, /*CanExcludeZeroTrips=*/false,
1595 /*ComputeUpperBoundOnly=*/true)) {
1596 // Compute the maximum runtime values of VF and the trip count.
1597 std::optional<uint64_t> MaxStep =
1598 getMaxRuntimeElementCount(VF * MaxUF, *Cost->TheFunction);
1599 std::optional<uint64_t> MaxTC =
1600 getMaxRuntimeElementCount(*TC, *Cost->TheFunction);
1601 if (!MaxStep || !MaxTC)
1602 return false;
1603
1604 // Bail out if the maximum trip count is not representable in the induction
1605 // variable's type.
1606 if (MaxUIntTripCount.ult(*MaxTC))
1607 return false;
1608
1609 return (MaxUIntTripCount - *MaxTC).ugt(*MaxStep);
1610 }
1611
1612 return false;
1613}
1614
1615// Return whether we allow using masked interleave-groups (for dealing with
1616// strided loads/stores that reside in predicated blocks, or for dealing
1617// with gaps).
1618static bool useMaskedInterleavedAccesses(const VectorizeOptions &Opts,
1619 const TargetTransformInfo &TTI) {
1620 // If an override option has been passed in for interleaved accesses, use it.
1621 return valueOr(Opts.enable_masked_interleaved_mem_accesses,
1622 TTI.enableMaskedInterleavedAccessVectorization());
1623}
1624
1625/// Replace \p VPBB with a VPIRBasicBlock wrapping \p IRBB. All recipes from \p
1626/// VPBB are moved to the end of the newly created VPIRBasicBlock. All
1627/// predecessors and successors of VPBB, if any, are rewired to the new
1628/// VPIRBasicBlock. If \p VPBB may be unreachable, \p Plan must be passed.
1630 BasicBlock *IRBB,
1631 VPlan *Plan = nullptr) {
1632 if (!Plan)
1633 Plan = VPBB->getPlan();
1634 VPIRBasicBlock *IRVPBB = Plan->createEmptyVPIRBasicBlock(IRBB);
1635 auto IP = IRVPBB->begin();
1636 for (auto &R : make_early_inc_range(VPBB->phis()))
1637 R.moveBefore(*IRVPBB, IP);
1638
1639 for (auto &R :
1641 R.moveBefore(*IRVPBB, IRVPBB->end());
1642
1643 VPBlockUtils::reassociateBlocks(VPBB, IRVPBB);
1644 // VPBB is now dead and will be cleaned up when the plan gets destroyed.
1645 return IRVPBB;
1646}
1647
1648/// Knowing that loop \p L executes a single vector iteration, add instructions
1649/// that will get simplified and thus should not have any cost to \p
1650/// InstsToIgnore.
1653 SmallPtrSetImpl<Instruction *> &InstsToIgnore) {
1654 auto *Cmp = L->getLatchCmpInst();
1655 if (Cmp)
1656 InstsToIgnore.insert(Cmp);
1657 for (PHINode *IV : IL.keys()) {
1658 // The induction is free: a widened induction generates a vector phi with
1659 // its start value and an increment that is dead without a backedge.
1660 InstsToIgnore.insert(IV);
1661
1662 // Get next iteration value of the induction variable.
1663 Instruction *IVInst =
1664 cast<Instruction>(IV->getIncomingValueForBlock(L->getLoopLatch()));
1665 if (all_of(IVInst->users(),
1666 [&](const User *U) { return U == IV || U == Cmp; }))
1667 InstsToIgnore.insert(IVInst);
1668 }
1669}
1670
1671namespace {
1672
1673struct CSEDenseMapInfo {
1674 static bool canHandle(const Instruction *I) {
1677 }
1678
1679 static unsigned getHashValue(const Instruction *I) {
1680 assert(canHandle(I) && "Unknown instruction!");
1681 return hash_combine(I->getOpcode(),
1682 hash_combine_range(I->operand_values()));
1683 }
1684
1685 static bool isEqual(const Instruction *LHS, const Instruction *RHS) {
1686 return LHS->isIdenticalTo(RHS);
1687 }
1688};
1689
1690} // end anonymous namespace
1691
1692/// FIXME: This legacy common-subexpression-elimination routine is scheduled for
1693/// removal, in favor of the VPlan-based one.
1694static void legacyCSE(BasicBlock *BB) {
1695 // Perform simple cse.
1697 for (Instruction &In : llvm::make_early_inc_range(*BB)) {
1698 if (!CSEDenseMapInfo::canHandle(&In))
1699 continue;
1700
1701 // Check if we can replace this instruction with any of the
1702 // visited instructions.
1703 if (Instruction *V = CSEMap.lookup(&In)) {
1704 In.replaceAllUsesWith(V);
1705 In.eraseFromParent();
1706 continue;
1707 }
1708
1709 CSEMap[&In] = &In;
1710 }
1711}
1712
1713/// This function attempts to return a value that represents the ElementCount
1714/// at runtime. For fixed-width VFs we know this precisely at compile
1715/// time, but for scalable VFs we calculate it based on an estimate of the
1716/// vscale value.
1718 std::optional<unsigned> VScale) {
1719 unsigned EstimatedVF = VF.getKnownMinValue();
1720 if (VF.isScalable())
1721 if (VScale)
1722 EstimatedVF *= *VScale;
1723 assert(EstimatedVF >= 1 && "Estimated VF shouldn't be less than 1");
1724 return EstimatedVF;
1725}
1726
1727/// Returns the vector library variant function of \p CI usable at \p VF,
1728/// respecting \p MaskRequired, or nullptr if none is found: a mapping with
1729/// matching VF, masked if required, whose vector function is declared in the
1730/// module.
1732 bool MaskRequired,
1733 const TargetLibraryInfo *TLI) {
1734 if (!TLI || CI.isNoBuiltin())
1735 return nullptr;
1736 for (const VFInfo &Info : VFDatabase::getMappings(CI))
1737 if (Info.Shape.VF == VF && (!MaskRequired || Info.isMasked()))
1738 if (Function *F = CI.getModule()->getFunction(Info.VectorName))
1739 return F;
1740 return nullptr;
1741}
1742
1743/// Returns true iff \p CI has a library vector variant usable at \p VF.
1745 bool MaskRequired,
1746 const TargetLibraryInfo *TLI) {
1747 return getVectorLibraryVariantFor(CI, VF, MaskRequired, TLI) != nullptr;
1748}
1749
1752 ElementCount VF) const {
1753 Type *RetTy = CI->getType();
1755 for (auto &ArgOp : CI->args())
1756 Tys.push_back(ArgOp->getType());
1757
1758 InstructionCost ScalarCallCost = TTI.getCallInstrCost(
1759 CI->getCalledFunction(), RetTy, Tys, Config.CostKind);
1760
1761 // Cost of the scalar call (scalar VF) or its scalarization (vector VF). The
1762 // scalarization cost is only meaningful for fixed VFs.
1765 : ScalarCallCost * VF.getKnownMinValue() +
1766 getScalarizationOverhead(CI, VF);
1767
1768 // The call may be vectorized at this VF, via a vector intrinsic or a vector
1769 // library variant.
1771 Cost = std::min(Cost, getVectorIntrinsicCost(CI, VF));
1772
1773 if (Function *Variant =
1775 Cost = std::min(Cost,
1776 TTI.getCallInstrCost(
1777 /*F=*/nullptr, Variant->getReturnType(),
1778 Variant->getFunctionType()->params(), Config.CostKind));
1779
1780 return Cost;
1781}
1782
1784 if (VF.isScalar() || !canVectorizeTy(Ty))
1785 return Ty;
1786 return toVectorizedTy(Ty, VF);
1787}
1788
1791 ElementCount VF) const {
1793 assert(ID && "Expected intrinsic call!");
1794 Type *RetTy = maybeVectorizeType(CI->getType(), VF);
1795 FastMathFlags FMF;
1796 if (auto *FPMO = dyn_cast<FPMathOperator>(CI))
1797 FMF = FPMO->getFastMathFlags();
1798
1801 SmallVector<Type *> ParamTys;
1802 std::transform(FTy->param_begin(), FTy->param_end(),
1803 std::back_inserter(ParamTys),
1804 [&](Type *Ty) { return maybeVectorizeType(Ty, VF); });
1805
1806 IntrinsicCostAttributes CostAttrs(ID, RetTy, Arguments, ParamTys, FMF,
1809 return TTI.getIntrinsicInstrCost(CostAttrs, Config.CostKind);
1810}
1811
1813 // Don't apply optimizations below when no (vector) loop remains, as they all
1814 // require one at the moment.
1815 VPBasicBlock *HeaderVPBB =
1816 vputils::getFirstLoopHeader(*State.Plan, State.VPDT);
1817 if (!HeaderVPBB)
1818 return;
1819
1820 BasicBlock *HeaderBB = State.CFG.VPBB2IRBB[HeaderVPBB];
1821
1822 // Remove redundant induction instructions.
1823 legacyCSE(HeaderBB);
1824}
1825
1826void LoopVectorizationCostModel::collectLoopScalars(ElementCount VF) {
1827 // We should not collect Scalars more than once per VF. Right now, this
1828 // function is called from collectUniformsAndScalars(), which already does
1829 // this check. Collecting Scalars for VF=1 does not make any sense.
1830 assert(VF.isVector() && !Scalars.contains(VF) &&
1831 "This function should not be visited twice for the same VF");
1832
1833 // This avoids any chances of creating a REPLICATE recipe during planning
1834 // since that would result in generation of scalarized code during execution,
1835 // which is not supported for scalable vectors.
1836 if (VF.isScalable()) {
1837 Scalars[VF].insert_range(Uniforms[VF]);
1838 return;
1839 }
1840
1842
1843 // These sets are used to seed the analysis with pointers used by memory
1844 // accesses that will remain scalar.
1846 SmallPtrSet<Instruction *, 8> PossibleNonScalarPtrs;
1847 auto *Latch = TheLoop->getLoopLatch();
1848
1849 // A helper that returns true if the use of Ptr by MemAccess will be scalar.
1850 // The pointer operands of loads and stores will be scalar as long as the
1851 // memory access is not a gather/scatter or histogram operation. The value
1852 // operand of a store will remain scalar if the store is scalarized.
1853 auto IsScalarUse = [&](Instruction *MemAccess, Value *Ptr) {
1854 InstWidening WideningDecision = getWideningDecision(MemAccess, VF);
1855 assert(WideningDecision != CM_Unknown &&
1856 "Widening decision should be ready at this moment");
1857 auto *Store = dyn_cast<StoreInst>(MemAccess);
1858 if (Store && Ptr == Store->getValueOperand())
1859 return WideningDecision == CM_Scalarize;
1860 assert(Ptr == getLoadStorePointerOperand(MemAccess) &&
1861 "Ptr is neither a value or pointer operand");
1862 return WideningDecision != CM_GatherScatter &&
1864 };
1865
1866 // A helper that returns true if the given value is a getelementptr
1867 // instruction contained in the loop.
1868 auto IsLoopVaryingGEP = [&](Value *V) {
1869 return isa<GetElementPtrInst>(V) && !TheLoop->isLoopInvariant(V);
1870 };
1871
1872 // A helper that evaluates a memory access's use of a pointer. If the use will
1873 // be a scalar use and the pointer is only used by memory accesses, we place
1874 // the pointer in ScalarPtrs. Otherwise, the pointer is placed in
1875 // PossibleNonScalarPtrs.
1876 auto EvaluatePtrUse = [&](Instruction *MemAccess, Value *Ptr) {
1877 // We only care about bitcast and getelementptr instructions contained in
1878 // the loop.
1879 if (!IsLoopVaryingGEP(Ptr))
1880 return;
1881
1882 // If the pointer has already been identified as scalar (e.g., if it was
1883 // also identified as uniform), there's nothing to do.
1884 auto *I = cast<Instruction>(Ptr);
1885 if (Worklist.count(I))
1886 return;
1887
1888 // If the use of the pointer will be a scalar use, and all users of the
1889 // pointer are memory accesses, place the pointer in ScalarPtrs. Otherwise,
1890 // place the pointer in PossibleNonScalarPtrs.
1891 if (IsScalarUse(MemAccess, Ptr) &&
1893 ScalarPtrs.insert(I);
1894 else
1895 PossibleNonScalarPtrs.insert(I);
1896 };
1897
1898 // We seed the scalars analysis with three classes of instructions: (1)
1899 // instructions marked uniform-after-vectorization and (2) bitcast,
1900 // getelementptr and (pointer) phi instructions used by memory accesses
1901 // requiring a scalar use.
1902 //
1903 // (1) Add to the worklist all instructions that have been identified as
1904 // uniform-after-vectorization.
1905 Worklist.insert_range(Uniforms[VF]);
1906
1907 // (2) Add to the worklist all bitcast and getelementptr instructions used by
1908 // memory accesses requiring a scalar use. The pointer operands of loads and
1909 // stores will be scalar unless the operation is a gather or scatter.
1910 // The value operand of a store will remain scalar if the store is scalarized.
1911 for (auto *BB : TheLoop->blocks())
1912 for (auto &I : *BB) {
1913 if (auto *Load = dyn_cast<LoadInst>(&I)) {
1914 EvaluatePtrUse(Load, Load->getPointerOperand());
1915 } else if (auto *Store = dyn_cast<StoreInst>(&I)) {
1916 EvaluatePtrUse(Store, Store->getPointerOperand());
1917 EvaluatePtrUse(Store, Store->getValueOperand());
1918 }
1919 }
1920 for (auto *I : ScalarPtrs)
1921 if (!PossibleNonScalarPtrs.count(I)) {
1922 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *I << "\n");
1923 Worklist.insert(I);
1924 }
1925
1926 // Insert the forced scalars.
1927 // FIXME: Currently VPWidenPHIRecipe() often creates a dead vector
1928 // induction variable when the PHI user is scalarized.
1929 auto ForcedScalar = ForcedScalars.find(VF);
1930 if (ForcedScalar != ForcedScalars.end())
1931 for (auto *I : ForcedScalar->second) {
1932 LLVM_DEBUG(dbgs() << "LV: Found (forced) scalar instruction: " << *I << "\n");
1933 Worklist.insert(I);
1934 }
1935
1936 // Expand the worklist by looking through any bitcasts and getelementptr
1937 // instructions we've already identified as scalar. This is similar to the
1938 // expansion step in collectLoopUniforms(); however, here we're only
1939 // expanding to include additional bitcasts and getelementptr instructions.
1940 unsigned Idx = 0;
1941 while (Idx != Worklist.size()) {
1942 Instruction *Dst = Worklist[Idx++];
1943 if (!IsLoopVaryingGEP(Dst->getOperand(0)))
1944 continue;
1945 auto *Src = cast<Instruction>(Dst->getOperand(0));
1946 if (llvm::all_of(Src->users(), [&](User *U) -> bool {
1947 auto *J = cast<Instruction>(U);
1948 return !TheLoop->contains(J) || Worklist.count(J) ||
1949 ((isa<LoadInst>(J) || isa<StoreInst>(J)) &&
1950 IsScalarUse(J, Src));
1951 })) {
1952 Worklist.insert(Src);
1953 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *Src << "\n");
1954 }
1955 }
1956
1957 // An induction variable will remain scalar if all users of the induction
1958 // variable and induction variable update remain scalar.
1959 for (const auto &Induction : Legal->getInductionVars()) {
1960 auto *Ind = Induction.first;
1961 auto *IndUpdate = cast<Instruction>(Ind->getIncomingValueForBlock(Latch));
1962
1963 // If tail-folding is applied, the primary induction variable will be used
1964 // to feed a vector compare.
1965 if (Ind == Legal->getPrimaryInduction() && foldTailByMasking())
1966 continue;
1967
1968 // Returns true if \p Indvar is a pointer induction that is used directly by
1969 // load/store instruction \p I.
1970 auto IsDirectLoadStoreFromPtrIndvar = [&](Instruction *Indvar,
1971 Instruction *I) {
1972 return Induction.second.getKind() ==
1975 Indvar == getLoadStorePointerOperand(I) && IsScalarUse(I, Indvar);
1976 };
1977
1978 // Determine if all users of the induction variable are scalar after
1979 // vectorization.
1980 bool ScalarInd = all_of(Ind->users(), [&](User *U) -> bool {
1981 auto *I = cast<Instruction>(U);
1982 return I == IndUpdate || !TheLoop->contains(I) || Worklist.count(I) ||
1983 IsDirectLoadStoreFromPtrIndvar(Ind, I);
1984 });
1985 if (!ScalarInd)
1986 continue;
1987
1988 // If the induction variable update is a fixed-order recurrence, neither the
1989 // induction variable or its update should be marked scalar after
1990 // vectorization.
1991 auto *IndUpdatePhi = dyn_cast<PHINode>(IndUpdate);
1992 if (IndUpdatePhi && Legal->isFixedOrderRecurrence(IndUpdatePhi))
1993 continue;
1994
1995 // Determine if all users of the induction variable update instruction are
1996 // scalar after vectorization.
1997 bool ScalarIndUpdate = all_of(IndUpdate->users(), [&](User *U) -> bool {
1998 auto *I = cast<Instruction>(U);
1999 return I == Ind || !TheLoop->contains(I) || Worklist.count(I) ||
2000 IsDirectLoadStoreFromPtrIndvar(IndUpdate, I);
2001 });
2002 if (!ScalarIndUpdate)
2003 continue;
2004
2005 // The induction variable and its update instruction will remain scalar.
2006 Worklist.insert(Ind);
2007 Worklist.insert(IndUpdate);
2008 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *Ind << "\n");
2009 LLVM_DEBUG(dbgs() << "LV: Found scalar instruction: " << *IndUpdate
2010 << "\n");
2011 }
2012
2013 Scalars[VF].insert_range(Worklist);
2014}
2015
2023
2025 ElementCount VF) const {
2027 return Config.isLegalGatherOrScatter(isa<LoadInst>(I), getLoadStoreType(I),
2029}
2030
2032 ElementCount VF) {
2033 if (!isPredicatedInst(I))
2034 return false;
2035
2036 // Do we have a non-scalar lowering for this predicated
2037 // instruction? No - it is scalar with predication.
2038 switch(I->getOpcode()) {
2039 default:
2040 return true;
2041 case Instruction::Call: {
2042 if (VF.isScalar())
2043 return true;
2044 auto *CI = cast<CallInst>(I);
2045 // A vector intrinsic or library variant lowering avoids scalarization.
2046 return !getVectorIntrinsicIDForCall(CI, TLI) &&
2048 }
2049 case Instruction::Load:
2050 case Instruction::Store: {
2051 bool IsConsecutive = Legal->isConsecutivePtr(getLoadStoreType(I),
2053 return !(IsConsecutive && isLegalMaskedLoadOrStore(I, VF)) &&
2055 }
2056 case Instruction::UDiv:
2057 case Instruction::SDiv:
2058 case Instruction::SRem:
2059 case Instruction::URem: {
2060 // We have the option to use the llvm.masked.udiv intrinsics to avoid
2061 // predication. The cost based decision here will always select the masked
2062 // intrinsics for scalable vectors as scalarization isn't legal.
2063 const auto [ScalarCost, MaskedCost] = getDivRemSpeculationCost(I, VF);
2064 return isDivRemScalarWithPredication(ScalarCost, MaskedCost);
2065 }
2066 }
2067}
2068
2070 return Legal->isMaskRequired(I, foldTailByMasking());
2071}
2072
2073// TODO: Fold into LoopVectorizationLegality::isMaskRequired.
2075 // TODO: We can use the loop-preheader as context point here and get
2076 // context sensitive reasoning for isSafeToSpeculativelyExecute.
2080 return false;
2081
2082 // If the instruction was executed conditionally in the original scalar loop,
2083 // predication is needed with a mask whose lanes are all possibly inactive.
2084 if (Legal->blockNeedsPredication(I->getParent()))
2085 return true;
2086
2087 // If we're not folding the tail by masking and not vectorizing a loop with
2088 // uncountable exits and side effects, predication is unnecessary.
2089 if (!foldTailByMasking() && !Legal->hasUncountableExitWithSideEffects())
2090 return false;
2091
2092 // All that remain are instructions with side-effects originally executed in
2093 // the loop unconditionally, but now execute under a tail-fold mask (only)
2094 // having at least one active lane (the first). If the side-effects of the
2095 // instruction are invariant, executing it w/o (the tail-folding) mask is safe
2096 // - it will cause the same side-effects as when masked.
2097 switch(I->getOpcode()) {
2098 default:
2100 "instruction should have been considered by earlier checks");
2101 case Instruction::Call:
2102 // Side-effects of a Call are assumed to be non-invariant, needing a
2103 // (fold-tail) mask.
2105 "should have returned earlier for calls not needing a mask");
2106 return true;
2107 case Instruction::Load:
2108 // If the address is loop invariant no predication is needed.
2109 return !Legal->isInvariant(getLoadStorePointerOperand(I));
2110 case Instruction::Store: {
2111 // For stores, we need to prove both speculation safety (which follows from
2112 // the same argument as loads), but also must prove the value being stored
2113 // is correct. The easiest form of the later is to require that all values
2114 // stored are the same.
2115 return !(Legal->isInvariant(getLoadStorePointerOperand(I)) &&
2116 TheLoop->isLoopInvariant(cast<StoreInst>(I)->getValueOperand()));
2117 }
2118 case Instruction::UDiv:
2119 case Instruction::URem:
2120 // If the divisor is loop-invariant no predication is needed.
2121 return !Legal->isInvariant(I->getOperand(1));
2122 case Instruction::SDiv:
2123 case Instruction::SRem:
2124 // Conservative for now, since masked-off lanes may be poison and could
2125 // trigger signed overflow.
2126 return true;
2127 }
2128}
2129
2131 TargetTransformInfo::TargetCostKind CostKind, const BasicBlock *BB) {
2132 if (CostKind == TTI::TCK_CodeSize)
2133 return 1;
2134 // If the block wasn't originally predicated then return early to avoid
2135 // computing BlockFrequencyInfo unnecessarily.
2136 if (!Legal->blockNeedsPredication(BB))
2137 return 1;
2138
2139 uint64_t HeaderFreq =
2140 getBFI().getBlockFreq(TheLoop->getHeader()).getFrequency();
2141 uint64_t BBFreq = getBFI().getBlockFreq(BB).getFrequency();
2142 assert(HeaderFreq >= BBFreq &&
2143 "Header has smaller block freq than dominated BB?");
2144 return std::round((double)HeaderFreq / BBFreq);
2145}
2146
2148 switch (Opcode) {
2149 case Instruction::UDiv:
2150 return Intrinsic::masked_udiv;
2151 case Instruction::SDiv:
2152 return Intrinsic::masked_sdiv;
2153 case Instruction::URem:
2154 return Intrinsic::masked_urem;
2155 case Instruction::SRem:
2156 return Intrinsic::masked_srem;
2157 default:
2158 llvm_unreachable("Unexpected opcode");
2159 }
2160}
2161
2162std::pair<InstructionCost, InstructionCost>
2164 ElementCount VF) {
2165 assert(I->getOpcode() == Instruction::UDiv ||
2166 I->getOpcode() == Instruction::SDiv ||
2167 I->getOpcode() == Instruction::SRem ||
2168 I->getOpcode() == Instruction::URem);
2170
2171 // Scalarization isn't legal for scalable vector types
2172 InstructionCost ScalarizationCost = InstructionCost::getInvalid();
2173 if (!VF.isScalable()) {
2174 // Get the scalarization cost and scale this amount by the probability of
2175 // executing the predicated block. If the instruction is not predicated,
2176 // we fall through to the next case.
2177 ScalarizationCost = 0;
2178
2179 // These instructions have a non-void type, so account for the phi nodes
2180 // that we will create. This cost is likely to be zero. The phi node
2181 // cost, if any, should be scaled by the block probability because it
2182 // models a copy at the end of each predicated block.
2183 ScalarizationCost += VF.getFixedValue() *
2184 TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
2185
2186 // The cost of the non-predicated instruction.
2187 ScalarizationCost +=
2188 VF.getFixedValue() * TTI.getArithmeticInstrCost(
2189 I->getOpcode(), I->getType(), Config.CostKind);
2190
2191 // The cost of insertelement and extractelement instructions needed for
2192 // scalarization.
2193 ScalarizationCost += getScalarizationOverhead(I, VF);
2194
2195 // Scale the cost by the probability of executing the predicated blocks.
2196 // This assumes the predicated block for each vector lane is equally
2197 // likely.
2198 ScalarizationCost =
2199 ScalarizationCost /
2200 getPredBlockCostDivisor(Config.CostKind, I->getParent());
2201 }
2202
2203 auto *VecTy = toVectorTy(I->getType(), VF);
2204 auto *MaskTy = toVectorTy(Type::getInt1Ty(I->getContext()), VF);
2205 IntrinsicCostAttributes ICA(getMaskedDivRemIntrinsic(I->getOpcode()), VecTy,
2206 {VecTy, VecTy, MaskTy});
2207 InstructionCost MaskedCost = TTI.getIntrinsicInstrCost(ICA, Config.CostKind);
2208 return {ScalarizationCost, MaskedCost};
2209}
2210
2212 Instruction *I, ElementCount VF) const {
2213 assert(isAccessInterleaved(I) && "Expecting interleaved access.");
2215 "Decision should not be set yet.");
2216 auto *Group = getInterleavedAccessGroup(I);
2217 assert(Group && "Must have a group.");
2218 unsigned InterleaveFactor = Group->getFactor();
2219
2220 // If the instruction's allocated size doesn't equal its type size, it
2221 // requires padding and will be scalarized.
2222 auto &DL = I->getDataLayout();
2223 auto *ScalarTy = getLoadStoreType(I);
2224 if (hasIrregularType(ScalarTy, DL))
2225 return false;
2226
2227 // For scalable vectors, the interleave factors must be <= 8 since we require
2228 // the (de)interleaveN intrinsics instead of shufflevectors.
2229 if (VF.isScalable() && InterleaveFactor > 8)
2230 return false;
2231
2232 // If the group involves a non-integral pointer, we may not be able to
2233 // losslessly cast all values to a common type.
2234 bool ScalarNI = DL.isNonIntegralPointerType(ScalarTy);
2235 for (Instruction *Member : Group->members()) {
2236 auto *MemberTy = getLoadStoreType(Member);
2237 bool MemberNI = DL.isNonIntegralPointerType(MemberTy);
2238 // Don't coerce non-integral pointers to integers or vice versa.
2239 if (MemberNI != ScalarNI)
2240 // TODO: Consider adding special nullptr value case here
2241 return false;
2242 if (MemberNI && ScalarNI &&
2243 ScalarTy->getPointerAddressSpace() !=
2244 MemberTy->getPointerAddressSpace())
2245 return false;
2246 }
2247
2248 // Check if masking is required.
2249 // A Group may need masking for one of two reasons: it resides in a block that
2250 // needs predication, or it was decided to use masking to deal with gaps
2251 // (either a gap at the end of a load-access that may result in a speculative
2252 // load, or any gaps in a store-access).
2253 bool PredicatedAccessRequiresMasking =
2255 bool LoadAccessWithGapsRequiresEpilogMasking =
2256 isa<LoadInst>(I) && Group->requiresScalarEpilogue() &&
2258 bool StoreAccessWithGapsRequiresMasking =
2259 isa<StoreInst>(I) && !Group->isFull();
2260 if (!PredicatedAccessRequiresMasking &&
2261 !LoadAccessWithGapsRequiresEpilogMasking &&
2262 !StoreAccessWithGapsRequiresMasking)
2263 return true;
2264
2265 // If masked interleaving is required, we expect that the user/target had
2266 // enabled it, because otherwise it either wouldn't have been created or
2267 // it should have been invalidated by the CostModel.
2269 "Masked interleave-groups for predicated accesses are not enabled.");
2270
2271 if (Group->isReverse())
2272 return false;
2273
2274 // TODO: Support interleaved access that requires a gap mask for scalable VFs.
2275 bool NeedsMaskForGaps = LoadAccessWithGapsRequiresEpilogMasking ||
2276 StoreAccessWithGapsRequiresMasking;
2277 if (VF.isScalable() && NeedsMaskForGaps)
2278 return false;
2279
2280 return isLegalMaskedLoadOrStore(I, VF);
2281}
2282
2283std::optional<LoopVectorizationCostModel::InstWidening>
2285 ElementCount VF) {
2286 // Get and ensure we have a valid memory instruction.
2287 assert((isa<LoadInst, StoreInst>(I)) && "Invalid memory instruction");
2288
2289 auto *Ptr = getLoadStorePointerOperand(I);
2290 auto *ScalarTy = getLoadStoreType(I);
2291
2292 // In order to be widened, the pointer should be consecutive, first of all.
2293 int Stride = Legal->isConsecutivePtr(ScalarTy, Ptr);
2294 if (!Stride)
2295 return std::nullopt;
2296
2297 // If the instruction is a store located in a predicated block, it will be
2298 // scalarized.
2299 if (isScalarWithPredication(I, VF))
2300 return std::nullopt;
2301
2302 // If the instruction's allocated size doesn't equal it's type size, it
2303 // requires padding and will be scalarized.
2304 auto &DL = I->getDataLayout();
2305 if (hasIrregularType(ScalarTy, DL))
2306 return std::nullopt;
2307
2308 return Stride == 1 ? CM_Widen : CM_Widen_Reverse;
2309}
2310
2311void LoopVectorizationCostModel::collectLoopUniforms(ElementCount VF) {
2312 // We should not collect Uniforms more than once per VF. Right now,
2313 // this function is called from collectUniformsAndScalars(), which
2314 // already does this check. Collecting Uniforms for VF=1 does not make any
2315 // sense.
2316
2317 assert(VF.isVector() && !Uniforms.contains(VF) &&
2318 "This function should not be visited twice for the same VF");
2319
2320 // Visit the list of Uniforms. If we find no uniform value, we won't
2321 // analyze again. Uniforms.count(VF) will return 1.
2322 Uniforms[VF].clear();
2323
2324 // Now we know that the loop is vectorizable!
2325 // Collect instructions inside the loop that will remain uniform after
2326 // vectorization.
2327
2328 // Global values, params and instructions outside of current loop are out of
2329 // scope.
2330 auto IsOutOfScope = [&](Value *V) -> bool {
2332 return (!I || !TheLoop->contains(I));
2333 };
2334
2335 // Worklist containing uniform instructions demanding lane 0.
2336 SetVector<Instruction *> Worklist;
2337
2338 // Add uniform instructions demanding lane 0 to the worklist. Instructions
2339 // that require predication must not be considered uniform after
2340 // vectorization, because that would create an erroneous replicating region
2341 // where only a single instance out of VF should be formed.
2342 auto AddToWorklistIfAllowed = [&](Instruction *I) -> void {
2343 if (IsOutOfScope(I)) {
2344 LLVM_DEBUG(dbgs() << "LV: Found not uniform due to scope: "
2345 << *I << "\n");
2346 return;
2347 }
2348 if (isPredicatedInst(I)) {
2349 LLVM_DEBUG(
2350 dbgs() << "LV: Found not uniform due to requiring predication: " << *I
2351 << "\n");
2352 return;
2353 }
2354 LLVM_DEBUG(dbgs() << "LV: Found uniform instruction: " << *I << "\n");
2355 Worklist.insert(I);
2356 };
2357
2358 // Start with the conditional branches exiting the loop. If the branch
2359 // condition is an instruction contained in the loop that is only used by the
2360 // branch, it is uniform. Note conditions from uncountable early exits are not
2361 // uniform.
2363 TheLoop->getExitingBlocks(Exiting);
2364 for (BasicBlock *E : Exiting) {
2365 if (Legal->hasUncountableEarlyExit() && TheLoop->getLoopLatch() != E)
2366 continue;
2367 auto *Cmp = dyn_cast<Instruction>(E->getTerminator()->getOperand(0));
2368 if (!Cmp || !TheLoop->contains(Cmp) || !Cmp->hasOneUse())
2369 continue;
2370
2371 // If we have an exit condition that is actually two conditions (one
2372 // countable and the other uncountable) combined via an or, only add the
2373 // countable comparison as a uniform value.
2374 if (Legal->hasUncountableExitWithSideEffects() &&
2375 TheLoop->getLoopLatch() == E) {
2376 if (Instruction *Countable =
2377 Legal->findCountableComparisonInCombinedCondition(Cmp)) {
2378 if (Countable->hasOneUse())
2379 AddToWorklistIfAllowed(Countable);
2380 continue;
2381 }
2382 }
2383
2384 // Normal exit comparisons are uniform.
2385 AddToWorklistIfAllowed(Cmp);
2386 }
2387
2388 auto PrevVF = VF.divideCoefficientBy(2);
2389 // Return true if all lanes perform the same memory operation, and we can
2390 // thus choose to execute only one.
2391 auto IsUniformMemOpUse = [&](Instruction *I) {
2392 // If the value was already known to not be uniform for the previous
2393 // (smaller VF), it cannot be uniform for the larger VF.
2394 if (PrevVF.isVector()) {
2395 auto Iter = Uniforms.find(PrevVF);
2396 if (Iter != Uniforms.end() && !Iter->second.contains(I))
2397 return false;
2398 }
2399 if (!isUniformMemOp(*I, VF))
2400 return false;
2401 if (isa<LoadInst>(I))
2402 // Loading the same address always produces the same result - at least
2403 // assuming aliasing and ordering which have already been checked.
2404 return true;
2405 // Storing the same value on every iteration.
2406 return TheLoop->isLoopInvariant(cast<StoreInst>(I)->getValueOperand());
2407 };
2408
2409 auto IsUniformDecision = [&](Instruction *I, ElementCount VF) {
2410 InstWidening WideningDecision = getWideningDecision(I, VF);
2411 assert(WideningDecision != CM_Unknown &&
2412 "Widening decision should be ready at this moment");
2413
2414 if (IsUniformMemOpUse(I))
2415 return true;
2416
2417 return (WideningDecision == CM_Widen ||
2418 WideningDecision == CM_Widen_Reverse ||
2419 WideningDecision == CM_Interleave);
2420 };
2421
2422 // Returns true if Ptr is the pointer operand of a memory access instruction
2423 // I, I is known to not require scalarization, and the pointer is not also
2424 // stored.
2425 auto IsVectorizedMemAccessUse = [&](Instruction *I, Value *Ptr) -> bool {
2426 if (isa<StoreInst>(I) && I->getOperand(0) == Ptr)
2427 return false;
2428 return getLoadStorePointerOperand(I) == Ptr &&
2429 (IsUniformDecision(I, VF) || Legal->isInvariant(Ptr));
2430 };
2431
2432 // Holds a list of values which are known to have at least one uniform use.
2433 // Note that there may be other uses which aren't uniform. A "uniform use"
2434 // here is something which only demands lane 0 of the unrolled iterations;
2435 // it does not imply that all lanes produce the same value (e.g. this is not
2436 // the usual meaning of uniform)
2437 SetVector<Value *> HasUniformUse;
2438
2439 // Scan the loop for instructions which are either a) known to have only
2440 // lane 0 demanded or b) are uses which demand only lane 0 of their operand.
2441 for (auto *BB : TheLoop->blocks())
2442 for (auto &I : *BB) {
2443 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) {
2444 switch (II->getIntrinsicID()) {
2445 case Intrinsic::sideeffect:
2446 case Intrinsic::experimental_noalias_scope_decl:
2447 case Intrinsic::assume:
2448 case Intrinsic::lifetime_start:
2449 case Intrinsic::lifetime_end:
2450 if (TheLoop->hasLoopInvariantOperands(&I))
2451 AddToWorklistIfAllowed(&I);
2452 break;
2453 default:
2454 break;
2455 }
2456 }
2457
2458 if (auto *EVI = dyn_cast<ExtractValueInst>(&I)) {
2459 if (IsOutOfScope(EVI->getAggregateOperand())) {
2460 AddToWorklistIfAllowed(EVI);
2461 continue;
2462 }
2463 // Only ExtractValue instructions where the aggregate value comes from a
2464 // call are allowed to be non-uniform.
2465 assert(isa<CallInst>(EVI->getAggregateOperand()) &&
2466 "Expected aggregate value to be call return value");
2467 }
2468
2469 // If there's no pointer operand, there's nothing to do.
2470 auto *Ptr = getLoadStorePointerOperand(&I);
2471 if (!Ptr)
2472 continue;
2473
2474 // If the pointer can be proven to be uniform, always add it to the
2475 // worklist.
2476 if (isa<Instruction>(Ptr) && isUniform(Ptr, VF))
2477 AddToWorklistIfAllowed(cast<Instruction>(Ptr));
2478
2479 if (IsUniformMemOpUse(&I))
2480 AddToWorklistIfAllowed(&I);
2481
2482 if (IsVectorizedMemAccessUse(&I, Ptr))
2483 HasUniformUse.insert(Ptr);
2484 }
2485
2486 // Add to the worklist any operands which have *only* uniform (e.g. lane 0
2487 // demanding) users. Since loops are assumed to be in LCSSA form, this
2488 // disallows uses outside the loop as well.
2489 for (auto *V : HasUniformUse) {
2490 if (IsOutOfScope(V))
2491 continue;
2492 auto *I = cast<Instruction>(V);
2493 bool UsersAreMemAccesses = all_of(I->users(), [&](User *U) -> bool {
2494 auto *UI = cast<Instruction>(U);
2495 return TheLoop->contains(UI) && IsVectorizedMemAccessUse(UI, V);
2496 });
2497 if (UsersAreMemAccesses)
2498 AddToWorklistIfAllowed(I);
2499 }
2500
2501 // Expand Worklist in topological order: whenever a new instruction
2502 // is added , its users should be already inside Worklist. It ensures
2503 // a uniform instruction will only be used by uniform instructions.
2504 unsigned Idx = 0;
2505 while (Idx != Worklist.size()) {
2506 Instruction *I = Worklist[Idx++];
2507
2508 for (auto *OV : I->operand_values()) {
2509 // isOutOfScope operands cannot be uniform instructions.
2510 if (IsOutOfScope(OV))
2511 continue;
2512 // First order recurrence Phi's should typically be considered
2513 // non-uniform.
2514 auto *OP = dyn_cast<PHINode>(OV);
2515 if (OP && Legal->isFixedOrderRecurrence(OP))
2516 continue;
2517 // If all the users of the operand are uniform, then add the
2518 // operand into the uniform worklist.
2519 auto *OI = cast<Instruction>(OV);
2520 if (llvm::all_of(OI->users(), [&](User *U) -> bool {
2521 auto *J = cast<Instruction>(U);
2522 return Worklist.count(J) || IsVectorizedMemAccessUse(J, OI);
2523 }))
2524 AddToWorklistIfAllowed(OI);
2525 }
2526 }
2527
2528 // For an instruction to be added into Worklist above, all its users inside
2529 // the loop should also be in Worklist. However, this condition cannot be
2530 // true for phi nodes that form a cyclic dependence. We must process phi
2531 // nodes separately. An induction variable will remain uniform if all users
2532 // of the induction variable and induction variable update remain uniform.
2533 // The code below handles both pointer and non-pointer induction variables.
2534 BasicBlock *Latch = TheLoop->getLoopLatch();
2535 for (PHINode *Ind : Legal->getInductionVars().keys()) {
2536 auto *IndUpdate = cast<Instruction>(Ind->getIncomingValueForBlock(Latch));
2537
2538 // Determine if all users of the induction variable are uniform after
2539 // vectorization.
2540 bool UniformInd = all_of(Ind->users(), [&](User *U) -> bool {
2541 auto *I = cast<Instruction>(U);
2542 return I == IndUpdate || !TheLoop->contains(I) || Worklist.count(I) ||
2543 IsVectorizedMemAccessUse(I, Ind);
2544 });
2545 if (!UniformInd)
2546 continue;
2547
2548 // Determine if all users of the induction variable update instruction are
2549 // uniform after vectorization.
2550 bool UniformIndUpdate = all_of(IndUpdate->users(), [&](User *U) -> bool {
2551 auto *I = cast<Instruction>(U);
2552 return I == Ind || Worklist.count(I) ||
2553 IsVectorizedMemAccessUse(I, IndUpdate);
2554 });
2555 if (!UniformIndUpdate)
2556 continue;
2557
2558 // The induction variable and its update instruction will remain uniform.
2559 AddToWorklistIfAllowed(Ind);
2560 AddToWorklistIfAllowed(IndUpdate);
2561 }
2562
2563 Uniforms[VF].insert_range(Worklist);
2564}
2565
2568 // Make sure once we return PartialAliasMaskingStatus is not "NotDecided".
2569 scope_exit EnsureAliasMaskingStatusIsDecidedOnReturn([this] {
2570 if (PartialAliasMaskingStatus == AliasMaskingStatus::NotDecided)
2571 PartialAliasMaskingStatus = AliasMaskingStatus::Disabled;
2572 });
2573
2574 // For outer loops, use simple type-based heuristic VF. No cost model or
2575 // memory dependence analysis is available.
2576 if (!TheLoop->isInnermost()) {
2577 return Config.computeVPlanOuterloopVF(UserVF);
2578 }
2579
2580 if (Legal->getRuntimePointerChecking()->Need && TTI.hasBranchDivergence()) {
2581 // TODO: It may be useful to do since it's still likely to be dynamically
2582 // uniform if the target can skip.
2584 "Not inserting runtime ptr check for divergent target",
2585 "runtime pointer checks needed. Not enabled for divergent target",
2586 "CantVersionLoopWithDivergentTarget", ORE, TheLoop);
2588 }
2589
2590 ScalarEvolution *SE = PSE.getSE();
2592 unsigned MaxTC = PSE.getSmallConstantMaxTripCount();
2593 if (!MaxTC && EpilogueLoweringStatus == CM_EpilogueAllowed)
2595 LLVM_DEBUG(dbgs() << "LV: Found trip count: " << TC << '\n');
2596 if (TC != ElementCount::getFixed(MaxTC))
2597 LLVM_DEBUG(dbgs() << "LV: Found maximum trip count: " << MaxTC << '\n');
2598 if (TC.isScalar()) {
2600 "Single iteration (non) loop",
2601 "loop trip count is one, irrelevant for vectorization",
2602 "SingleIterationLoop", ORE, TheLoop);
2604 }
2605
2606 // If BTC matches the widest induction type and is -1 then the trip count
2607 // computation will wrap to 0 and the vector trip count will be 0. Do not try
2608 // to vectorize.
2609 const SCEV *BTC = SE->getBackedgeTakenCount(TheLoop);
2610 if (!isa<SCEVCouldNotCompute>(BTC) &&
2611 BTC->getType()->getScalarSizeInBits() >=
2612 Legal->getWidestInductionType()->getScalarSizeInBits() &&
2614 SE->getMinusOne(BTC->getType()))) {
2616 "Trip count computation wrapped",
2617 "backedge-taken count is -1, loop trip count wrapped to 0",
2618 "TripCountWrapped", ORE, TheLoop);
2620 }
2621
2622 assert(WideningDecisions.empty() && Uniforms.empty() && Scalars.empty() &&
2623 "No cost-modeling decisions should have been taken at this point");
2624
2625 switch (EpilogueLoweringStatus) {
2626 case CM_EpilogueAllowed:
2627 return Config.computeFeasibleMaxVF(MaxTC, UserVF, UserIC, false,
2630 [[fallthrough]];
2632 LLVM_DEBUG(dbgs() << "LV: tail-folding hint/switch found.\n"
2633 << "LV: Not allowing epilogue, creating tail-folded "
2634 << "vector loop.\n");
2635 break;
2637 // fallthrough as a special case of OptForSize
2639 if (EpilogueLoweringStatus == CM_EpilogueNotAllowedOptSize)
2640 LLVM_DEBUG(dbgs() << "LV: Not allowing epilogue due to -Os/-Oz.\n");
2641 else
2642 LLVM_DEBUG(dbgs() << "LV: Not allowing epilogue due to low trip "
2643 << "count.\n");
2644
2645 // Bail if runtime checks are required, which are not good when optimising
2646 // for size.
2647 if (Config.runtimeChecksRequired())
2649
2650 break;
2651 }
2652
2653 // Now try the tail folding
2654
2655 // Invalidate interleave groups that require an epilogue if we can't mask
2656 // the interleave-group.
2657 if (!useMaskedInterleavedAccesses(Opts, TTI)) {
2658 // Note: There is no need to invalidate any cost modeling decisions here, as
2659 // none were taken so far (see assertion above).
2660 InterleaveInfo.invalidateGroupsRequiringScalarEpilogue();
2661 }
2662
2663 FixedScalableVFPair MaxFactors = Config.computeFeasibleMaxVF(
2664 MaxTC, UserVF, UserIC, true, requiresScalarEpilogue(true));
2665
2666 // Avoid tail folding if the trip count is known to be a multiple of any VF
2667 // we choose.
2668 std::optional<uint64_t> MaxPowerOf2RuntimeVF =
2669 MaxFactors.FixedVF.getFixedValue();
2670 if (MaxFactors.ScalableVF) {
2671 if (std::optional<uint64_t> MaxRuntimeScalableVF =
2673 MaxPowerOf2RuntimeVF =
2674 std::max(*MaxPowerOf2RuntimeVF, *MaxRuntimeScalableVF);
2675 else
2676 MaxPowerOf2RuntimeVF = std::nullopt; // Stick with tail-folding for now.
2677 }
2678
2679 auto NoScalarEpilogueNeeded = [this, &UserIC](uint64_t MaxRuntimeVF) {
2680 // Return false if the loop is neither a single-latch-exit loop nor an
2681 // early-exit loop as tail-folding is not supported in that case.
2682 if (TheLoop->getExitingBlock() != TheLoop->getLoopLatch() &&
2683 !Legal->hasUncountableEarlyExit())
2684 return false;
2685 uint64_t MaxVFtimesIC = MaxRuntimeVF * std::max<uint64_t>(UserIC, 1);
2686 ScalarEvolution *SE = PSE.getSE();
2687 // Calling getSymbolicMaxBackedgeTakenCount enables support for loops
2688 // with uncountable exits. For countable loops, the symbolic maximum must
2689 // remain identical to the known back-edge taken count.
2690 const SCEV *BackedgeTakenCount = PSE.getSymbolicMaxBackedgeTakenCount();
2691 assert((Legal->hasUncountableEarlyExit() ||
2692 BackedgeTakenCount == PSE.getBackedgeTakenCount()) &&
2693 "Invalid loop count");
2694 const SCEV *ExitCount = SE->getAddExpr(
2695 BackedgeTakenCount, SE->getOne(BackedgeTakenCount->getType()));
2696 const SCEV *Rem = SE->getURemExpr(
2697 SE->applyLoopGuards(ExitCount, TheLoop),
2698 SE->getConstant(BackedgeTakenCount->getType(), MaxVFtimesIC));
2699 return Rem->isZero();
2700 };
2701
2702 if (MaxPowerOf2RuntimeVF > 0u) {
2703 assert((UserVF.isNonZero() || isPowerOf2_64(*MaxPowerOf2RuntimeVF)) &&
2704 "MaxFixedVF must be a power of 2");
2705 if (NoScalarEpilogueNeeded(*MaxPowerOf2RuntimeVF)) {
2706 // Accept MaxFixedVF if we do not have a tail.
2707 LLVM_DEBUG(dbgs() << "LV: No tail will remain for any chosen VF.\n");
2708 return MaxFactors;
2709 }
2710 }
2711
2712 auto ExpectedTC = getSmallBestKnownTC(Opts, PSE, TheLoop);
2713 if (ExpectedTC && ExpectedTC->isFixed() &&
2714 ExpectedTC->getFixedValue() <=
2715 TTI.getMinTripCountTailFoldingThreshold()) {
2716 // If we have a low-trip-count, and the fixed-width VF is known to divide
2717 // the trip count the fixed-width factor in preference to allow the
2718 // generation of a non-predicated loop.
2719 if (EpilogueLoweringStatus == CM_EpilogueNotAllowedLowTripLoop &&
2720 NoScalarEpilogueNeeded(MaxFactors.FixedVF.getFixedValue())) {
2721 LLVM_DEBUG(dbgs() << "LV: Picking a fixed-width so that no tail will "
2722 "remain for any chosen VF.\n");
2723 MaxFactors.ScalableVF = ElementCount::getScalable(0);
2724 return MaxFactors;
2725 }
2726
2727 // Allow cases where the ExactTC == (VF * IC) + 1.
2728 //
2729 // This produces 1 vector iteration, and 1 scalar iteration with no
2730 // remainder. Later passes will eliminate the loop and leave straight-line
2731 // code as the both iteration counts are statically known.
2732 //
2733 // If a function is marked as minsize/optsize or OptForSize is set, do not
2734 // allow this form of transformation as this will increase CodeSize.
2735 //
2736 // For loops with small bodies, the cost model is not currently reliable
2737 // enough to accurately determine if vectorization is beneficial.
2738 unsigned EffectiveIC = UserIC > 0 ? UserIC : 1;
2739 unsigned MaxVFForTC = llvm::bit_floor(TC.getFixedValue());
2740 if (TC.getFixedValue() - MaxVFForTC == 1 && MaxVFForTC / EffectiveIC > 1 &&
2741 MaxVFForTC <= (MaxFactors.FixedVF.getFixedValue() * EffectiveIC) &&
2742 !Config.OptForSize) {
2743 unsigned NumOfInstructions = llvm::sum_of(
2744 llvm::map_range(TheLoop->blocks(),
2745 [](BasicBlock *BB) { return BB->size(); }),
2746 unsigned(0));
2747 if (NumOfInstructions > Opts.low_trip_count_loop_body_size_limit) {
2748 unsigned VF = MaxVFForTC / EffectiveIC;
2749 LLVM_DEBUG(dbgs() << "LV: Picking MaxVF=" << VF
2750 << " with 1 scalar iteration remaining.\n");
2751 MaxFactors.FixedVF = ElementCount::getFixed(VF);
2752 MaxFactors.ScalableVF = ElementCount::getScalable(0);
2753 return MaxFactors;
2754 }
2755 }
2756
2758 "The trip count is below the minial threshold value.",
2759 "loop trip count is too low, avoiding vectorization", "LowTripCount",
2760 ORE, TheLoop);
2762 }
2763
2764 // If we don't know the precise trip count, or if the trip count that we
2765 // found modulo the vectorization factor is not zero, try to fold the tail
2766 // by masking.
2767 // FIXME: look for a smaller MaxVF that does divide TC rather than masking.
2768 bool ContainsScalableVF = MaxFactors.ScalableVF.isNonZero();
2769 setTailFoldingStyle(ContainsScalableVF, UserIC);
2770 if (foldTailByMasking()) {
2771 if (foldTailWithEVL()) {
2772 LLVM_DEBUG(
2773 dbgs()
2774 << "LV: tail is folded with EVL, forcing unroll factor to be 1. Will "
2775 "try to generate VP Intrinsics with scalable vector "
2776 "factors only.\n");
2777 // Tail folded loop using VP intrinsics restricts the VF to be scalable
2778 // for now.
2779 // TODO: extend it for fixed vectors, if required.
2780 assert(ContainsScalableVF && "Expected scalable vector factor.");
2781
2782 MaxFactors.FixedVF = ElementCount::getFixed(1);
2783 } else {
2785 }
2786 return MaxFactors;
2787 }
2788
2789 // If there was a tail-folding hint/switch, but we can't fold the tail by
2790 // masking, fallback to a vectorization with an epilogue.
2791 if (EpilogueLoweringStatus == CM_EpilogueNotNeededFoldTail) {
2792 LLVM_DEBUG(dbgs() << "LV: Cannot fold tail by masking: vectorize with an "
2793 "epilogue instead.\n");
2794 EpilogueLoweringStatus = CM_EpilogueAllowed;
2795 return MaxFactors;
2796 }
2797
2798 if (EpilogueLoweringStatus == CM_EpilogueNotAllowedFoldTail) {
2799 LLVM_DEBUG(dbgs() << "LV: Can't fold tail by masking: don't vectorize\n");
2801 }
2802
2803 if (TC.isZero()) {
2805 "unable to calculate the loop count due to complex control flow",
2806 "UnknownLoopCountComplexCFG", ORE, TheLoop);
2808 }
2809
2811 "Cannot optimize for size and vectorize at the same time.",
2812 "cannot optimize for size and vectorize at the same time. "
2813 "Enable vectorization of this loop with '#pragma clang loop "
2814 "vectorize(enable)' when compiling with -Os/-Oz",
2815 "NoTailLoopWithOptForSize", ORE, TheLoop);
2817}
2818
2821 using RecipeVFPair = std::pair<VPRecipeBase *, ElementCount>;
2822 SmallVector<RecipeVFPair> InvalidCosts;
2823 for (const auto &Plan : VPlans) {
2824 for (ElementCount VF : Plan->vectorFactors()) {
2825 // The VPlan-based cost model is designed for computing vector cost.
2826 // Querying VPlan-based cost model with a scarlar VF will cause some
2827 // errors because we expect the VF is vector for most of the widen
2828 // recipes.
2829 if (VF.isScalar())
2830 continue;
2831
2832 VPCostContext CostCtx(*TLI, *Plan, *CM, Config,
2833 /*ReusePrintingSlotTracker=*/true);
2834 precomputeCosts(*Plan, VF, CostCtx);
2835 auto Iter = vp_depth_first_deep(Plan->getVectorLoopRegion()->getEntry());
2837 for (auto &R : *VPBB) {
2838 if (!R.cost(VF, CostCtx).isValid())
2839 InvalidCosts.emplace_back(&R, VF);
2840 }
2841 }
2842 }
2843 }
2844 if (InvalidCosts.empty())
2845 return;
2846
2847 // Emit a report of VFs with invalid costs in the loop.
2848
2849 // Group the remarks per recipe, keeping the recipe order from InvalidCosts.
2851 unsigned I = 0;
2852 for (auto &Pair : InvalidCosts)
2853 if (Numbering.try_emplace(Pair.first, I).second)
2854 ++I;
2855
2856 // Sort the list, first on recipe(number) then on VF.
2857 sort(InvalidCosts, [&Numbering](RecipeVFPair &A, RecipeVFPair &B) {
2858 unsigned NA = Numbering[A.first];
2859 unsigned NB = Numbering[B.first];
2860 if (NA != NB)
2861 return NA < NB;
2862 return ElementCount::isKnownLT(A.second, B.second);
2863 });
2864
2865 // For a list of ordered recipe-VF pairs:
2866 // [(load, VF1), (load, VF2), (store, VF1)]
2867 // group the recipes together to emit separate remarks for:
2868 // load (VF1, VF2)
2869 // store (VF1)
2870 auto Tail = ArrayRef<RecipeVFPair>(InvalidCosts);
2871 auto Subset = ArrayRef<RecipeVFPair>();
2872 do {
2873 if (Subset.empty())
2874 Subset = Tail.take_front(1);
2875
2876 VPRecipeBase *R = Subset.front().first;
2877
2878 unsigned Opcode =
2880 .Case([](const VPHeaderPHIRecipe *R) { return Instruction::PHI; })
2881 .Case(
2882 [](const VPWidenStoreRecipe *R) { return Instruction::Store; })
2883 .Case([](const VPWidenLoadRecipe *R) { return Instruction::Load; })
2884 .Case<VPWidenCallRecipe, VPWidenIntrinsicRecipe>(
2885 [](const auto *R) { return Instruction::Call; })
2888 [](const auto *R) { return R->getOpcode(); })
2889 .Case([](const VPInterleaveRecipe *R) {
2890 return R->getStoredValues().empty() ? Instruction::Load
2891 : Instruction::Store;
2892 })
2893 .Case([](const VPReductionRecipe *R) {
2894 return RecurrenceDescriptor::getOpcode(R->getRecurrenceKind());
2895 });
2896
2897 // If the next recipe is different, or if there are no other pairs,
2898 // emit a remark for the collated subset. e.g.
2899 // [(load, VF1), (load, VF2))]
2900 // to emit:
2901 // remark: invalid costs for 'load' at VF=(VF1, VF2)
2902 if (Subset == Tail || Tail[Subset.size()].first != R) {
2903 std::string OutString;
2904 raw_string_ostream OS(OutString);
2905 assert(!Subset.empty() && "Unexpected empty range");
2906 OS << "Recipe with invalid costs prevented vectorization at VF=(";
2907 for (const auto &Pair : Subset)
2908 OS << (Pair.second == Subset.front().second ? "" : ", ") << Pair.second;
2909 OS << "):";
2910 if (Opcode == Instruction::Call) {
2911 StringRef Name = "";
2912 if (auto *Int = dyn_cast<VPWidenIntrinsicRecipe>(R)) {
2913 Name = Int->getIntrinsicName();
2914 } else {
2915 auto *WidenCall = dyn_cast<VPWidenCallRecipe>(R);
2916 Function *CalledFn =
2917 WidenCall
2918 ? WidenCall->getCalledScalarFunction()
2919 : cast<Function>(R->getLastOperand()->getLiveInIRValue());
2920 Name = CalledFn->getName();
2921 }
2922 OS << " call to " << Name;
2923 } else
2924 OS << " " << Instruction::getOpcodeName(Opcode);
2925 reportVectorizationInfo(OutString, "InvalidCost", ORE, OrigLoop, nullptr,
2926 R->getDebugLoc());
2927 Tail = Tail.drop_front(Subset.size());
2928 Subset = {};
2929 } else
2930 // Grow the subset by one element
2931 Subset = Tail.take_front(Subset.size() + 1);
2932 } while (!Tail.empty());
2933}
2934
2935/// Check if any recipe of \p Plan will generate a vector value, which will be
2936/// assigned a vector register.
2938 const TargetTransformInfo &TTI) {
2939 assert(VF.isVector() && "Checking a scalar VF?");
2940 DenseSet<VPRecipeBase *> EphemeralRecipes;
2941 collectEphemeralRecipesForVPlan(Plan, EphemeralRecipes);
2942 // Set of already visited types.
2943 DenseSet<Type *> Visited;
2946 for (VPRecipeBase &R : *VPBB) {
2947 if (EphemeralRecipes.contains(&R))
2948 continue;
2949 // Continue early if the recipe is considered to not produce a vector
2950 // result. Note that this includes VPInstruction where some opcodes may
2951 // produce a vector, to preserve existing behavior as VPInstructions model
2952 // aspects not directly mapped to existing IR instructions.
2953 switch (R.getVPRecipeID()) {
2954 case VPRecipeBase::VPDerivedIVSC:
2955 case VPRecipeBase::VPScalarIVStepsSC:
2956 case VPRecipeBase::VPReplicateSC:
2957 case VPRecipeBase::VPInstructionSC:
2958 case VPRecipeBase::VPCurrentIterationPHISC:
2959 case VPRecipeBase::VPVectorPointerSC:
2960 case VPRecipeBase::VPVectorEndPointerSC:
2961 case VPRecipeBase::VPExpandSCEVSC:
2962 case VPRecipeBase::VPPredInstPHISC:
2963 case VPRecipeBase::VPBranchOnMaskSC:
2964 continue;
2965 case VPRecipeBase::VPReductionSC:
2966 case VPRecipeBase::VPActiveLaneMaskPHISC:
2967 case VPRecipeBase::VPWidenCallSC:
2968 case VPRecipeBase::VPWidenCanonicalIVSC:
2969 case VPRecipeBase::VPWidenCastSC:
2970 case VPRecipeBase::VPWidenGEPSC:
2971 case VPRecipeBase::VPWidenIntrinsicSC:
2972 case VPRecipeBase::VPWidenMemIntrinsicSC:
2973 case VPRecipeBase::VPWidenSC:
2974 case VPRecipeBase::VPBlendSC:
2975 case VPRecipeBase::VPFirstOrderRecurrencePHISC:
2976 case VPRecipeBase::VPHistogramSC:
2977 case VPRecipeBase::VPWidenPHISC:
2978 case VPRecipeBase::VPWidenIntOrFpInductionSC:
2979 case VPRecipeBase::VPWidenPointerInductionSC:
2980 case VPRecipeBase::VPReductionPHISC:
2981 case VPRecipeBase::VPInterleaveEVLSC:
2982 case VPRecipeBase::VPInterleaveSC:
2983 case VPRecipeBase::VPWidenLoadEVLSC:
2984 case VPRecipeBase::VPWidenLoadSC:
2985 case VPRecipeBase::VPWidenStoreEVLSC:
2986 case VPRecipeBase::VPWidenStoreSC:
2987 break;
2988 default:
2989 llvm_unreachable("unhandled recipe");
2990 }
2991
2992 auto WillGenerateTargetVectors = [&TTI, VF](Type *VectorTy) {
2993 unsigned NumLegalParts = TTI.getNumberOfParts(VectorTy);
2994 if (!NumLegalParts)
2995 return false;
2996 if (VF.isScalable()) {
2997 // <vscale x 1 x iN> is assumed to be profitable over iN because
2998 // scalable registers are a distinct register class from scalar
2999 // ones. If we ever find a target which wants to lower scalable
3000 // vectors back to scalars, we'll need to update this code to
3001 // explicitly ask TTI about the register class uses for each part.
3002 return NumLegalParts <= VF.getKnownMinValue();
3003 }
3004 // Two or more elements that share a register - are vectorized.
3005 return NumLegalParts < VF.getFixedValue();
3006 };
3007
3008 // If no def nor is a store, e.g., branches, continue - no value to check.
3009 if (R.getNumDefinedValues() == 0 &&
3011 continue;
3012 // For multi-def recipes, currently only interleaved loads, suffice to
3013 // check first def only.
3014 // For stores check their stored value; for interleaved stores suffice
3015 // the check first stored value only. In all cases this is the second
3016 // operand.
3017 VPValue *ToCheck =
3018 R.getNumDefinedValues() >= 1 ? R.getVPValue(0) : R.getOperand(1);
3019 Type *ScalarTy = ToCheck->getScalarType();
3020 if (!Visited.insert({ScalarTy}).second)
3021 continue;
3022 Type *WideTy = toVectorizedTy(ScalarTy, VF);
3023 if (any_of(getContainedTypes(WideTy), WillGenerateTargetVectors))
3024 return true;
3025 }
3026 }
3027
3028 return false;
3029}
3030
3031static bool hasReplicatorRegion(VPlan &Plan) {
3033 Plan.getVectorLoopRegion()->getEntry())),
3034 [](auto *VPRB) { return VPRB->isReplicator(); });
3035}
3036
3037/// Returns true if the VPlan contains a VPReductionPHIRecipe with
3038/// FindLast recurrence kind.
3039static bool hasFindLastReductionPhi(VPlan &Plan) {
3042 [](VPReductionPHIRecipe &RedPhi) {
3043 return RecurrenceDescriptor::isFindLastRecurrenceKind(
3044 RedPhi.getRecurrenceKind());
3045 });
3046}
3047
3048/// Determine how to lower the epilogue for the vector epilogue loop.
3049/// Check if there are any conflicts that prevent tail-folding the epilogue.
3050/// \return CM_EpilogueNotNeededFoldTail if epilogue tail-folding is possible,
3051/// otherwise CM_EpilogueAllowed.
3053 const VectorizeOptions &Opts, const LoopVectorizationCostModel &MainCM,
3054 const Loop *L, OptimizationRemarkEmitter *ORE,
3057 // Epilogue TF is only enabled when explicitly requested via command line.
3058 if (Opts.epilogue_tail_folding_policy != TailFoldingPolicyTy::PreferFoldTail)
3059 return CM_EpilogueAllowed;
3060
3061 if (!Opts.enable_epilogue_vectorization) {
3063 "Options conflict, epilogue vectorization is disallowed while "
3064 "epilogue tail-folding allowed!",
3065 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3066 return CM_EpilogueAllowed;
3067 }
3068
3069 if (!Hints.getWidth() || !hasForcedEpilogueVF()) {
3070 reportVectorizationInfo("For now, epilogue tail-folding can't be "
3071 "applied without forced main/epilogue loop VF",
3072 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3073 return CM_EpilogueAllowed;
3074 }
3075
3077 reportVectorizationInfo("For now, epilogue tail-folding can't be applied "
3078 "when VF of the main loop <= VF of the epilogue",
3079 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3080 return CM_EpilogueAllowed;
3081 }
3082
3083 if (!L->isInnermost()) {
3085 "Epilogue tail-folding is not supported for outer loop",
3086 "InvalidTailFoldedEpilogue", ORE, L);
3087 return CM_EpilogueAllowed;
3088 }
3089
3090 // If scalar epilogue is explicitly required, we can't apply TF.
3091 if (MainCM.requiresScalarEpilogue(/*IsVectorizing*/ true)) {
3093 "Epilogue tail-folding can't be applied because scalar epilogue is "
3094 "required. Fall back to a normal epilogue",
3095 "InvalidTailFoldedEpilogue", ORE, L);
3096 return CM_EpilogueAllowed;
3097 }
3098
3099 // If having epilogue is NOT allowed, then no epilogue to apply TF for.
3100 if (!MainCM.isEpilogueAllowed()) {
3101 reportVectorizationInfo("Not applying tail-folding to the epilogue, since "
3102 "no epilogue is allowed.",
3103 "InvalidTailFoldedEpilogue", ORE, L);
3104 return CM_EpilogueAllowed;
3105 }
3106
3107 if (L->getExitingBlock() != L->getLoopLatch() ||
3110 "Epilogue tail-folding is not supported yet for early-exit loops",
3111 "InvalidTailFoldedEpilogue", ORE, L);
3112 return CM_EpilogueAllowed;
3113 }
3114
3115 // The epilogue reuses the main loop's interleave groups, so it can't be
3116 // tail-folded if the target can't mask interleaved accesses.
3117 // TODO: Add support once the epilogue has its own IAI, separate from the main
3118 // loop's.
3119 if (MainCM.InterleaveInfo.hasGroups() &&
3122 "Epilogue tail-folding is not supported with interleaved accesses "
3123 "when masking them isn't supported",
3124 "InvalidTailFoldedEpilogue", ORE, L);
3125 return CM_EpilogueAllowed;
3126 }
3127
3128 if (Opts.force_partial_aliasing_vectorization) {
3130 "Epilogue tail-folding is not supported with alias masking",
3131 "InvalidTailFoldedEpilogue", ORE, L);
3132 return CM_EpilogueAllowed;
3133 }
3134
3135 if (!LVL.getReductionVars().empty()) {
3137 "Epilogue tail-folding is not supported with reductions",
3138 "InvalidTailFoldedEpilogue", ORE, L);
3139 return CM_EpilogueAllowed;
3140 }
3141
3142 if (!LVL.getFixedOrderRecurrences().empty()) {
3144 "Epilogue tail-folding is not supported with fixed-order recurrence",
3145 "InvalidTailFoldedEpilogue", ORE, L);
3146 return CM_EpilogueAllowed;
3147 }
3148
3149 // TODO: This is conservative: it rejects any target that prefers EVL, even
3150 // for fixed-width epilogue VFs where EVL won't be chosen. Move this check to
3151 // where the epilogue's TF style is known once epilogue TF is supported.
3152 TailFoldingStyle TFStyle = Opts.force_tail_folding_style.value_or(
3153 TTI->getPreferredTailFoldingStyle());
3154 // TODO: Remove once EVL recipes support cloning.
3155 if (TFStyle == TailFoldingStyle::DataWithEVL) {
3156 reportVectorizationInfo("Epilogue tail-folding is not supported yet with "
3157 "EVL-based tail-folding",
3158 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
3159 return CM_EpilogueAllowed;
3160 }
3161
3162 // We can apply tail-folding on the vectorized epilogue loop.
3164}
3165
3167 const ElementCount VF, const unsigned IC) const {
3168 // FIXME: We need a much better cost-model to take different parameters such
3169 // as register pressure, code size increase and cost of extra branches into
3170 // account. For now we apply a very crude heuristic and only consider loops
3171 // with vectorization factors larger than a certain value.
3172
3173 // Allow the target to opt out.
3174 if (!TTI.preferEpilogueVectorization(VF * IC))
3175 return false;
3176
3177 unsigned MinVFThreshold = Opts.epilogue_vectorization_minimum_VF.value_or(
3178 TTI.getEpilogueVectorizationMinVF());
3179 return estimateElementCount(VF * IC, getVScaleForTuning()) >= MinVFThreshold;
3180}
3181
3183 VPlan &MainPlan, ElementCount MainLoopVF, unsigned IC,
3184 bool ScalarEpilogueAllowed) {
3185 if (!Opts.enable_epilogue_vectorization) {
3186 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization is disabled.\n");
3187 return nullptr;
3188 }
3189
3190 if (!ScalarEpilogueAllowed) {
3191 LLVM_DEBUG(dbgs() << "LEV: Unable to vectorize epilogue because no "
3192 "epilogue is allowed.\n");
3193 return nullptr;
3194 }
3195
3196 if (vputils::findIncomingAliasMask(MainPlan)) {
3197 LLVM_DEBUG(
3198 dbgs()
3199 << "LEV: Epilogue vectorization not supported with alias masking.\n");
3200 return nullptr;
3201 }
3202
3203 // Not really a cost consideration, but check for unsupported cases here to
3204 // simplify the logic.
3205 if (!isCandidateForEpilogueVectorization(MainPlan)) {
3206 LLVM_DEBUG(dbgs() << "LEV: Unable to vectorize epilogue because the loop "
3207 "is not a supported candidate.\n");
3208 return nullptr;
3209 }
3210
3211 if (hasForcedEpilogueVF()) {
3213 Config.getVScaleForTuning()) >=
3214 IC * estimateElementCount(MainLoopVF, Config.getVScaleForTuning())) {
3215 // Note that the main loop leaves IC * MainLoopVF iterations iff a scalar
3216 // epilogue is required, but then the epilogue loop also requires a scalar
3217 // epilogue.
3218 LLVM_DEBUG(dbgs() << "LEV: Forced epilogue VF results in dead epilogue "
3219 "vector loop, skipping vectorizing epilogue.\n");
3220 return nullptr;
3221 }
3222
3223 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization factor is forced.\n");
3225 std::unique_ptr<VPlan> Clone(
3227 Clone->setVF(EpilogueVectorizationForceVF);
3228 return Clone;
3229 }
3230
3231 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization forced factor is not "
3232 "viable.\n");
3233 return nullptr;
3234 }
3235
3236 if (OrigLoop->getHeader()->getParent()->hasOptSize()) {
3237 LLVM_DEBUG(
3238 dbgs() << "LEV: Epilogue vectorization skipped due to opt for size.\n");
3239 return nullptr;
3240 }
3241
3242 if (!Config.isEpilogueVectorizationProfitable(MainLoopVF, IC)) {
3243 LLVM_DEBUG(dbgs() << "LEV: Epilogue vectorization is not profitable for "
3244 "this loop\n");
3245 return nullptr;
3246 }
3247
3248 // Check if a plan's vector loop processes fewer iterations than VF (e.g. when
3249 // interleave groups have been narrowed) narrowInterleaveGroups) and return
3250 // the adjusted, effective VF.
3251 using namespace VPlanPatternMatch;
3252 auto GetEffectiveVF = [](VPlan &Plan, ElementCount VF) -> ElementCount {
3253 auto *Exiting = Plan.getVectorLoopRegion()->getExitingBasicBlock();
3254 if (match(&Exiting->back(),
3255 m_BranchOnCount(m_Add(m_CanonicalIV(), m_Specific(&Plan.getUF())),
3256 m_VPValue())))
3257 return ElementCount::get(1, VF.isScalable());
3258 return VF;
3259 };
3260
3261 // Check if the main loop processes fewer than MainLoopVF elements per
3262 // iteration (e.g. due to narrowing interleave groups). Adjust MainLoopVF
3263 // as needed.
3264 MainLoopVF = GetEffectiveVF(MainPlan, MainLoopVF);
3265
3266 // If MainLoopVF = vscale x 2, and vscale is expected to be 4, then we know
3267 // the main loop handles 8 lanes per iteration. We could still benefit from
3268 // vectorizing the epilogue loop with VF=4.
3269 ElementCount EstimatedRuntimeVF = ElementCount::getFixed(
3270 estimateElementCount(MainLoopVF, Config.getVScaleForTuning()));
3271
3272 Type *TCType = Legal->getWidestInductionType();
3273 const SCEV *RemainingIterations = nullptr;
3274 unsigned MaxTripCount = 0;
3275 const SCEV *TC = vputils::getSCEVExprForVPValue(MainPlan.getTripCount(), PSE);
3276 assert(!isa<SCEVCouldNotCompute>(TC) && "Trip count SCEV must be computable");
3277 const SCEV *KnownMinTC;
3278 bool ScalableTC = match(TC, m_scev_c_Mul(m_SCEV(KnownMinTC), m_SCEVVScale()));
3279 bool ScalableRemIter = false;
3280 ScalarEvolution &SE = *PSE.getSE();
3281 // Use versions of TC and VF in which both are either scalable or fixed.
3282 if (ScalableTC == MainLoopVF.isScalable()) {
3283 ScalableRemIter = ScalableTC;
3284 RemainingIterations =
3285 SE.getURemExpr(TC, SE.getElementCount(TCType, MainLoopVF * IC));
3286 } else if (ScalableTC) {
3287 const SCEV *EstimatedTC = SE.getMulExpr(
3288 KnownMinTC,
3289 SE.getConstant(TCType, Config.getVScaleForTuning().value_or(1)));
3290 RemainingIterations = SE.getURemExpr(
3291 EstimatedTC, SE.getElementCount(TCType, MainLoopVF * IC));
3292 } else
3293 RemainingIterations =
3294 SE.getURemExpr(TC, SE.getElementCount(TCType, EstimatedRuntimeVF * IC));
3295
3296 // No iterations left to process in the epilogue.
3297 if (RemainingIterations->isZero())
3298 return nullptr;
3299
3300 if (MainLoopVF.isFixed()) {
3301 MaxTripCount = MainLoopVF.getFixedValue() * IC - 1;
3302 if (SE.isKnownPredicate(CmpInst::ICMP_ULT, RemainingIterations,
3303 SE.getConstant(TCType, MaxTripCount))) {
3304 MaxTripCount = SE.getUnsignedRangeMax(RemainingIterations).getZExtValue();
3305 }
3306 LLVM_DEBUG(dbgs() << "LEV: Maximum Trip Count for Epilogue: "
3307 << MaxTripCount << "\n");
3308 }
3309
3310 auto SkipVF = [&](const SCEV *VF, const SCEV *RemIter) -> bool {
3311 return SE.isKnownPredicate(CmpInst::ICMP_UGT, VF, RemIter);
3312 };
3314 VPlan *BestPlan = nullptr;
3315 for (auto &NextVF : ProfitableVFs) {
3316 // Skip candidate VFs without a corresponding VPlan.
3317 if (!hasPlanWithVF(NextVF.Width))
3318 continue;
3319
3320 VPlan &CurrentPlan = getPlanFor(NextVF.Width);
3321 ElementCount EffectiveVF = GetEffectiveVF(CurrentPlan, NextVF.Width);
3322 // Skip fixed vector VFs > than the estimated runtime VF, or any VF > than
3323 // the VF of the main loop.
3324 if ((!EffectiveVF.isScalable() && MainLoopVF.isScalable() &&
3325 ElementCount::isKnownGT(EffectiveVF, EstimatedRuntimeVF)) ||
3326 ElementCount::isKnownGT(EffectiveVF, MainLoopVF))
3327 continue;
3328
3329 // If EffectiveVF is greater than the number of remaining iterations, the
3330 // epilogue loop would be dead. Skip such factors. If the epilogue plan
3331 // also has narrowed interleave groups, use the effective VF since
3332 // the epilogue step will be reduced to its IC.
3333 // TODO: We should also consider comparing against a scalable
3334 // RemainingIterations when SCEV be able to evaluate non-canonical
3335 // vscale-based expressions.
3336 if (!ScalableRemIter) {
3337 // Handle the case where EffectiveVF and RemainingIterations are in
3338 // different numerical spaces.
3339 if (EffectiveVF.isScalable())
3340 EffectiveVF = ElementCount::getFixed(
3341 estimateElementCount(EffectiveVF, Config.getVScaleForTuning()));
3342 if (SkipVF(SE.getElementCount(TCType, EffectiveVF), RemainingIterations))
3343 continue;
3344 }
3345
3346 if (Result.Width.isScalar() ||
3347 isMoreProfitable(NextVF, Result, MaxTripCount,
3348 !MainPlan.hasTailFolded(),
3349 /*IsEpilogue*/ true)) {
3350 Result = NextVF;
3351 BestPlan = &CurrentPlan;
3352 }
3353 }
3354
3355 if (!BestPlan)
3356 return nullptr;
3357
3358 LLVM_DEBUG(dbgs() << "LEV: Vectorizing epilogue loop with VF = "
3359 << Result.Width << "\n");
3360 std::unique_ptr<VPlan> Clone(BestPlan->duplicate());
3361 Clone->setVF(Result.Width);
3362 return Clone;
3363}
3364
3365unsigned
3367 InstructionCost LoopCost) {
3368 // -- The interleave heuristics --
3369 // We interleave the loop in order to expose ILP and reduce the loop overhead.
3370 // There are many micro-architectural considerations that we can't predict
3371 // at this level. For example, frontend pressure (on decode or fetch) due to
3372 // code size, or the number and capabilities of the execution ports.
3373 //
3374 // We use the following heuristics to select the interleave count:
3375 // 1. If the code has reductions, then we interleave to break the cross
3376 // iteration dependency.
3377 // 2. If the loop is really small, then we interleave to reduce the loop
3378 // overhead.
3379 // 3. We don't interleave if we think that we will spill registers to memory
3380 // due to the increased register pressure.
3381
3382 // Do not interleave tail-folded loops, as the overhead of multiple
3383 // instructions to calculate the predicate is likely not beneficial.
3384 // If an epilogue is not allowed for any other reason, do not interleave.
3385 if (!CM->isEpilogueAllowed())
3386 return 1;
3387
3390 LLVM_DEBUG(dbgs() << "LV: Loop requires variable-length step. "
3391 "Unroll factor forced to be 1.\n");
3392 return 1;
3393 }
3394
3395 // We used the distance for the interleave count.
3396 if (!Legal->isSafeForAnyVectorWidth())
3397 return 1;
3398
3399 // We don't attempt to perform interleaving for loops with uncountable early
3400 // exits because the VPInstruction::AnyOf code cannot currently handle
3401 // multiple parts.
3402 if (Plan.hasEarlyExit())
3403 return 1;
3404
3405 const bool HasReductions =
3408
3409 // FIXME: implement interleaving for FindLast transform correctly.
3410 if (hasFindLastReductionPhi(Plan))
3411 return 1;
3412
3413 VPRegisterUsage R = calculateRegisterUsageForPlan(Plan, {VF}, TTI)[0];
3414
3415 // If we did not calculate the cost for VF (because the user selected the VF)
3416 // then we calculate the cost of VF here.
3417 if (LoopCost == 0) {
3418 if (VF.isScalar())
3419 LoopCost = CM->expectedCost(VF);
3420 else
3421 LoopCost = cost(Plan, VF, &R, *CM);
3422 assert(LoopCost.isValid() && "Expected to have chosen a VF with valid cost");
3423
3424 // Loop body is free and there is no need for interleaving.
3425 if (LoopCost == 0)
3426 return 1;
3427 }
3428
3429 // We divide by these constants so assume that we have at least one
3430 // instruction that uses at least one register.
3431 for (auto &Pair : R.MaxLocalUsers) {
3432 Pair.second = std::max(Pair.second, 1U);
3433 }
3434
3435 // We calculate the interleave count using the following formula.
3436 // Subtract the number of loop invariants from the number of available
3437 // registers. These registers are used by all of the interleaved instances.
3438 // Next, divide the remaining registers by the number of registers that is
3439 // required by the loop, in order to estimate how many parallel instances
3440 // fit without causing spills. All of this is rounded down if necessary to be
3441 // a power of two. We want power of two interleave count to simplify any
3442 // addressing operations or alignment considerations.
3443 // We also want power of two interleave counts to ensure that the induction
3444 // variable of the vector loop wraps to zero, when tail is folded by masking;
3445 // this currently happens when OptForSize, in which case IC is set to 1 above.
3446 unsigned IC = UINT_MAX;
3447
3448 for (const auto &Pair : R.MaxLocalUsers) {
3449 unsigned TargetNumRegisters = TTI.getNumberOfRegisters(Pair.first);
3450 LLVM_DEBUG(dbgs() << "LV: The target has " << TargetNumRegisters
3451 << " registers of "
3452 << TTI.getRegisterClassName(Pair.first)
3453 << " register class\n");
3454 TargetNumRegisters = (VF.isScalar() ? Opts.force_target_num_scalar_regs
3455 : Opts.force_target_num_vector_regs)
3456 .value_or(TargetNumRegisters);
3457 unsigned MaxLocalUsers = Pair.second;
3458 unsigned LoopInvariantRegs = 0;
3459 if (R.LoopInvariantRegs.contains(Pair.first))
3460 LoopInvariantRegs = R.LoopInvariantRegs[Pair.first];
3461
3462 unsigned TmpIC = llvm::bit_floor((TargetNumRegisters - LoopInvariantRegs) /
3463 MaxLocalUsers);
3464 // Don't count the induction variable as interleaved.
3465 if (Opts.enable_ind_var_reg_heur) {
3466 TmpIC = llvm::bit_floor((TargetNumRegisters - LoopInvariantRegs - 1) /
3467 std::max(1U, (MaxLocalUsers - 1)));
3468 }
3469
3470 IC = std::min(IC, TmpIC);
3471 }
3472
3473 // Clamp the interleave ranges to reasonable counts.
3474 bool HasUnorderedReductions =
3475 HasReductions &&
3478 [](VPReductionPHIRecipe &RedR) { return RedR.isOrdered(); });
3479 unsigned MaxInterleaveCount =
3480 TTI.getMaxInterleaveFactor(VF, HasUnorderedReductions);
3481 LLVM_DEBUG(dbgs() << "LV: MaxInterleaveFactor for the target is "
3482 << MaxInterleaveCount << "\n");
3483
3484 // Check if the user has overridden the max.
3485 MaxInterleaveCount = (VF.isScalar() ? Opts.force_target_max_scalar_interleave
3486 : Opts.force_target_max_vector_interleave)
3487 .value_or(MaxInterleaveCount);
3488
3489 // Try to get the exact trip count, or an estimate based on profiling data or
3490 // ConstantMax from PSE, failing that.
3491 auto BestKnownTC =
3492 getSmallBestKnownTC(Opts, PSE, OrigLoop,
3493 /*CanUseConstantMax=*/true,
3494 /*CanExcludeZeroTrips=*/CM->isEpilogueAllowed());
3495
3496 // For fixed length VFs treat a scalable trip count as unknown.
3497 if (BestKnownTC && (BestKnownTC->isFixed() || VF.isScalable())) {
3498 // Re-evaluate trip counts and VFs to be in the same numerical space.
3499 unsigned AvailableTC =
3500 estimateElementCount(*BestKnownTC, Config.getVScaleForTuning());
3501 unsigned EstimatedVF =
3502 estimateElementCount(VF, Config.getVScaleForTuning());
3503
3504 // At least one iteration must be scalar when this constraint holds. So the
3505 // maximum available iterations for interleaving is one less.
3506 if (Plan.requiresScalarEpilogue())
3507 --AvailableTC;
3508
3509 unsigned InterleaveCountLB = bit_floor(std::max(
3510 1u, std::min(AvailableTC / (EstimatedVF * 2), MaxInterleaveCount)));
3511
3512 if (getSmallConstantTripCount(PSE.getSE(), OrigLoop).isNonZero()) {
3513 // If the best known trip count is exact, we select between two
3514 // prospective ICs, where
3515 //
3516 // 1) the aggressive IC is capped by the trip count divided by VF
3517 // 2) the conservative IC is capped by the trip count divided by (VF * 2)
3518 //
3519 // The final IC is selected in a way that the epilogue loop trip count is
3520 // minimized while maximizing the IC itself, so that we either run the
3521 // vector loop at least once if it generates a small epilogue loop, or
3522 // else we run the vector loop at least twice.
3523
3524 unsigned InterleaveCountUB = bit_floor(std::max(
3525 1u, std::min(AvailableTC / EstimatedVF, MaxInterleaveCount)));
3526 MaxInterleaveCount = InterleaveCountLB;
3527
3528 if (InterleaveCountUB != InterleaveCountLB) {
3529 unsigned TailTripCountUB =
3530 (AvailableTC % (EstimatedVF * InterleaveCountUB));
3531 unsigned TailTripCountLB =
3532 (AvailableTC % (EstimatedVF * InterleaveCountLB));
3533 // If both produce same scalar tail, maximize the IC to do the same work
3534 // in fewer vector loop iterations
3535 if (TailTripCountUB == TailTripCountLB)
3536 MaxInterleaveCount = InterleaveCountUB;
3537 }
3538 } else {
3539 // If trip count is an estimated compile time constant, limit the
3540 // IC to be capped by the trip count divided by VF * 2, such that the
3541 // vector loop runs at least twice to make interleaving seem profitable
3542 // when there is an epilogue loop present. Since exact Trip count is not
3543 // known we choose to be conservative in our IC estimate.
3544 MaxInterleaveCount = InterleaveCountLB;
3545 }
3546 }
3547
3548 assert(MaxInterleaveCount > 0 &&
3549 "Maximum interleave count must be greater than 0");
3550
3551 // Clamp the calculated IC to be between the 1 and the max interleave count
3552 // that the target and trip count allows.
3553 if (IC > MaxInterleaveCount)
3554 IC = MaxInterleaveCount;
3555 else
3556 // Make sure IC is greater than 0.
3557 IC = std::max(1u, IC);
3558
3559 assert(IC > 0 && "Interleave count must be greater than 0.");
3560
3561 // FIXME: VF is required to be a vector only because there are several recipes
3562 // whose computeCost function asserts that the VF is a vector.
3563 if (Opts.enable_interleave_to_reduce_stalls && VF.isVector()) {
3564 LLVM_DEBUG(dbgs() << "LV: Interleaving to reduce stall cycles due to "
3565 "instruction latency.\n");
3566 // Interleaving a replicator region means we get extra copies of the blocks
3567 // in the region. Vector values used in those blocks are expected to later
3568 // be sunk to just before them, negating any reduction in stalls. Therefore
3569 // there's no gain to be had from interleaving.
3570 if (hasReplicatorRegion(Plan)) {
3571 LLVM_DEBUG(dbgs() << "LV: Not interleaving due to replicator region.\n");
3572 return 1;
3573 }
3574 VPCostContext LatencyCtx(*TLI, Plan, *CM, Config,
3575 /*ReusePrintingSlotTracker=*/true);
3576 LatencyCtx.CostKind = TTI::TCK_Latency;
3577 VPCostContext ThroughputCtx(*TLI, Plan, *CM, Config,
3578 /*ReusePrintingSlotTracker=*/true);
3579 ThroughputCtx.CostKind = TTI::TCK_RecipThroughput;
3580 // Find the largest interleave count that will help with reducing stalls.
3581 unsigned StallsIC = 1;
3584 for (VPRecipeBase &R : *VPBB) {
3585 // Assuming that each value will be needed as soon as it's generated the
3586 // number of stall cycles is one less than the latency.
3587 InstructionCost StallCycles = R.cost(VF, LatencyCtx) - 1;
3588 if (Opts.force_target_load_latency > 0 && R.mayReadFromMemory())
3589 StallCycles = Opts.force_target_load_latency - 1;
3590 // Each interleaving above 1 will reduce the stalls by RecipThroughput,
3591 // so pick the interleaving that will reduce stalls to zero.
3592 InstructionCost RecipThroughput = R.cost(VF, ThroughputCtx);
3593 if (StallCycles.isValid() && RecipThroughput.isValid() &&
3594 StallCycles > 0 && RecipThroughput > 0) {
3595 unsigned ThisIC = bit_floor<uint64_t>(
3596 1 + (StallCycles / RecipThroughput).getValue());
3597 StallsIC = std::max(StallsIC, ThisIC);
3598 }
3599 }
3600 }
3601 if (StallsIC <= 1) {
3602 LLVM_DEBUG(
3603 dbgs() << "LV: Not interleaving as it wouldn't reduce stalls.\n");
3604 return 1;
3605 }
3606 IC = std::min(IC, StallsIC);
3607 return IC;
3608 }
3609
3610 // Interleave if we vectorized this loop and there is a reduction that could
3611 // benefit from interleaving.
3612 if (VF.isVector() && HasReductions) {
3613 LLVM_DEBUG(dbgs() << "LV: Interleaving because of reductions.\n");
3614 return IC;
3615 }
3616
3617 // For any scalar loop that either requires runtime checks or tail-folding we
3618 // are better off leaving this to the unroller. Note that if we've already
3619 // vectorized the loop we will have done the runtime check and so interleaving
3620 // won't require further checks.
3621 bool ScalarInterleavingRequiresPredication =
3622 (VF.isScalar() && any_of(OrigLoop->blocks(), [this](BasicBlock *BB) {
3623 return Legal->blockNeedsPredication(BB);
3624 }));
3625 bool ScalarInterleavingRequiresRuntimePointerCheck =
3626 (VF.isScalar() && Legal->getRuntimePointerChecking()->Need);
3627
3628 // We want to interleave small loops in order to reduce the loop overhead and
3629 // potentially expose ILP opportunities.
3630 LLVM_DEBUG(dbgs() << "LV: Loop cost is " << LoopCost << '\n'
3631 << "LV: IC is " << IC << '\n'
3632 << "LV: VF is " << VF << '\n');
3633 const bool AggressivelyInterleave =
3634 TTI.enableAggressiveInterleaving(HasReductions);
3635 if (!ScalarInterleavingRequiresRuntimePointerCheck &&
3636 !ScalarInterleavingRequiresPredication &&
3637 LoopCost < Opts.small_loop_cost) {
3638 // We assume that the cost overhead is 1 and we use the cost model
3639 // to estimate the cost of the loop and interleave until the cost of the
3640 // loop overhead is about 5% of the cost of the loop.
3641 unsigned SmallIC =
3642 std::min(IC, (unsigned)llvm::bit_floor<uint64_t>(Opts.small_loop_cost /
3643 LoopCost.getValue()));
3644
3645 // Interleave until store/load ports (estimated by max interleave count) are
3646 // saturated.
3647 unsigned NumStores = 0;
3648 unsigned NumLoads = 0;
3651 for (VPRecipeBase &R : *VPBB) {
3653 NumLoads++;
3654 continue;
3655 }
3657 NumStores++;
3658 continue;
3659 }
3660
3661 if (auto *InterleaveR = dyn_cast<VPInterleaveRecipe>(&R)) {
3662 if (unsigned StoreOps = InterleaveR->getNumStoreOperands())
3663 NumStores += StoreOps;
3664 else
3665 NumLoads += InterleaveR->getNumDefinedValues();
3666 continue;
3667 }
3668 if (auto *RepR = dyn_cast<VPReplicateRecipe>(&R)) {
3669 NumLoads += isa<LoadInst>(RepR->getUnderlyingInstr());
3670 NumStores += isa<StoreInst>(RepR->getUnderlyingInstr());
3671 continue;
3672 }
3673 if (isa<VPHistogramRecipe>(&R)) {
3674 NumLoads++;
3675 NumStores++;
3676 continue;
3677 }
3678 }
3679 }
3680 unsigned StoresIC = IC / (NumStores ? NumStores : 1);
3681 unsigned LoadsIC = IC / (NumLoads ? NumLoads : 1);
3682
3683 // There is little point in interleaving for reductions containing selects
3684 // and compares when VF=1 since it may just create more overhead than it's
3685 // worth for loops with small trip counts. This is because we still have to
3686 // do the final reduction after the loop.
3687 bool HasSelectCmpReductions =
3688 HasReductions &&
3691 [](VPReductionPHIRecipe &RedR) {
3692 return RecurrenceDescriptor::isAnyOfRecurrenceKind(
3693 RedR.getRecurrenceKind()) ||
3694 RecurrenceDescriptor::isFindIVRecurrenceKind(
3695 RedR.getRecurrenceKind());
3696 });
3697 if (HasSelectCmpReductions) {
3698 LLVM_DEBUG(dbgs() << "LV: Not interleaving select-cmp reductions.\n");
3699 return 1;
3700 }
3701
3702 // If we have a scalar reduction (vector reductions are already dealt with
3703 // by this point), we can increase the critical path length if the loop
3704 // we're interleaving is inside another loop. For tree-wise reductions
3705 // set the limit to 2, and for ordered reductions it's best to disable
3706 // interleaving entirely.
3707 if (HasReductions && OrigLoop->getLoopDepth() > 1) {
3708 bool HasOrderedReductions =
3711 [](VPReductionPHIRecipe &RedR) { return RedR.isOrdered(); });
3712 if (HasOrderedReductions) {
3713 LLVM_DEBUG(
3714 dbgs() << "LV: Not interleaving scalar ordered reductions.\n");
3715 return 1;
3716 }
3717
3718 unsigned F = Opts.max_nested_scalar_reduction_interleave;
3719 SmallIC = std::min(SmallIC, F);
3720 StoresIC = std::min(StoresIC, F);
3721 LoadsIC = std::min(LoadsIC, F);
3722 }
3723
3724 if (Opts.enable_loadstore_runtime_interleave &&
3725 std::max(StoresIC, LoadsIC) > SmallIC) {
3726 LLVM_DEBUG(
3727 dbgs() << "LV: Interleaving to saturate store or load ports.\n");
3728 return std::max(StoresIC, LoadsIC);
3729 }
3730
3731 // If there are scalar reductions and TTI has enabled aggressive
3732 // interleaving for reductions, we will interleave to expose ILP.
3733 if (VF.isScalar() && AggressivelyInterleave) {
3734 LLVM_DEBUG(dbgs() << "LV: Interleaving to expose ILP.\n");
3735 // Interleave no less than SmallIC but not as aggressive as the normal IC
3736 // to satisfy the rare situation when resources are too limited.
3737 return std::max(IC / 2, SmallIC);
3738 }
3739
3740 LLVM_DEBUG(dbgs() << "LV: Interleaving to reduce branch cost.\n");
3741 return SmallIC;
3742 }
3743
3744 // Interleave if this is a large loop (small loops are already dealt with by
3745 // this point) that could benefit from interleaving.
3746 if (AggressivelyInterleave) {
3747 LLVM_DEBUG(dbgs() << "LV: Interleaving to expose ILP.\n");
3748 return IC;
3749 }
3750
3751 LLVM_DEBUG(dbgs() << "LV: Not Interleaving.\n");
3752 return 1;
3753}
3754
3756 Instruction *I, ElementCount VF) const {
3757 // TODO: Cost model for emulated masked load/store is completely
3758 // broken. This hack guides the cost model to use an artificially
3759 // high enough value to practically disable vectorization with such
3760 // operations, except where previously deployed legality hack allowed
3761 // using very low cost values. This is to avoid regressions coming simply
3762 // from moving "masked load/store" check from legality to cost model.
3763 // Masked Load/Gather emulation was previously never allowed.
3764 // Limited number of Masked Store/Scatter emulation was allowed.
3766 "Expecting a scalar emulated instruction");
3767 return isa<LoadInst>(I) ||
3768 (isa<StoreInst>(I) && NumPredStores > Opts.vectorize_num_stores_pred);
3769}
3770
3772 assert(VF.isVector() && "Expected VF >= 2");
3773
3774 // If we've already collected the instructions to scalarize or the predicated
3775 // BBs after vectorization, there's nothing to do. Collection may already have
3776 // occurred if we have a user-selected VF and are now computing the expected
3777 // cost for interleaving.
3778 if (InstsToScalarize.contains(VF) ||
3779 PredicatedBBsAfterVectorization.contains(VF))
3780 return;
3781
3782 // Initialize a mapping for VF in InstsToScalalarize. If we find that it's
3783 // not profitable to scalarize any instructions, the presence of VF in the
3784 // map will indicate that we've analyzed it already.
3785 ScalarCostsTy &ScalarCostsVF = InstsToScalarize[VF];
3786
3787 // Find all the instructions that are scalar with predication in the loop and
3788 // determine if it would be better to not if-convert the blocks they are in.
3789 // If so, we also record the instructions to scalarize.
3790 for (BasicBlock *BB : TheLoop->blocks()) {
3792 continue;
3793 for (Instruction &I : *BB)
3794 if (isScalarWithPredication(&I, VF)) {
3795 ScalarCostsTy ScalarCosts;
3796 // Do not apply discount logic for:
3797 // 1. Scalars after vectorization, as there will only be a single copy
3798 // of the instruction.
3799 // 2. Scalable VF, as that would lead to invalid scalarization costs.
3800 // 3. Emulated masked memrefs, if a hacked cost is needed.
3801 if (!isScalarAfterVectorization(&I, VF) && !VF.isScalable() &&
3803 computePredInstDiscount(&I, ScalarCosts, VF) >= 0) {
3804 for (const auto &[I, IC] : ScalarCosts)
3805 ScalarCostsVF.insert({I, IC});
3806 }
3807 // Remember that BB will remain after vectorization.
3808 PredicatedBBsAfterVectorization[VF].insert(BB);
3809 for (auto *Pred : predecessors(BB)) {
3810 if (Pred->getSingleSuccessor() == BB)
3811 PredicatedBBsAfterVectorization[VF].insert(Pred);
3812 }
3813 }
3814 }
3815}
3816
3817InstructionCost LoopVectorizationCostModel::computePredInstDiscount(
3818 Instruction *PredInst, ScalarCostsTy &ScalarCosts, ElementCount VF) {
3819 assert(!isUniformAfterVectorization(PredInst, VF) &&
3820 "Instruction marked uniform-after-vectorization will be predicated");
3821
3822 // Initialize the discount to zero, meaning that the scalar version and the
3823 // vector version cost the same.
3824 InstructionCost Discount = 0;
3825
3826 // Holds instructions to analyze. The instructions we visit are mapped in
3827 // ScalarCosts. Those instructions are the ones that would be scalarized if
3828 // we find that the scalar version costs less.
3830
3831 // Returns true if the given instruction can be scalarized.
3832 auto CanBeScalarized = [&](Instruction *I) -> bool {
3833 // We only attempt to scalarize instructions forming a single-use chain
3834 // from the original predicated block that would otherwise be vectorized.
3835 // Although not strictly necessary, we give up on instructions we know will
3836 // already be scalar to avoid traversing chains that are unlikely to be
3837 // beneficial.
3838 if (!I->hasOneUse() || PredInst->getParent() != I->getParent() ||
3840 return false;
3841
3842 // If the instruction is scalar with predication, it will be analyzed
3843 // separately. We ignore it within the context of PredInst.
3844 if (isScalarWithPredication(I, VF))
3845 return false;
3846
3847 // If any of the instruction's operands are uniform after vectorization,
3848 // the instruction cannot be scalarized. This prevents, for example, a
3849 // masked load from being scalarized.
3850 //
3851 // We assume we will only emit a value for lane zero of an instruction
3852 // marked uniform after vectorization, rather than VF identical values.
3853 // Thus, if we scalarize an instruction that uses a uniform, we would
3854 // create uses of values corresponding to the lanes we aren't emitting code
3855 // for. This behavior can be changed by allowing getScalarValue to clone
3856 // the lane zero values for uniforms rather than asserting.
3857 for (Use &U : I->operands())
3858 if (auto *J = dyn_cast<Instruction>(U.get()))
3859 if (isUniformAfterVectorization(J, VF))
3860 return false;
3861
3862 // Otherwise, we can scalarize the instruction.
3863 return true;
3864 };
3865
3866 // Compute the expected cost discount from scalarizing the entire expression
3867 // feeding the predicated instruction. We currently only consider expressions
3868 // that are single-use instruction chains.
3869 Worklist.push_back(PredInst);
3870 while (!Worklist.empty()) {
3871 Instruction *I = Worklist.pop_back_val();
3872
3873 // If we've already analyzed the instruction, there's nothing to do.
3874 if (ScalarCosts.contains(I))
3875 continue;
3876
3877 // Cannot scalarize fixed-order recurrence phis at the moment.
3879 continue;
3880
3881 // Compute the cost of the vector instruction. Note that this cost already
3882 // includes the scalarization overhead of the predicated instruction.
3883 InstructionCost VectorCost = getInstructionCost(I, VF);
3884
3885 // Compute the cost of the scalarized instruction. This cost is the cost of
3886 // the instruction as if it wasn't if-converted and instead remained in the
3887 // predicated block. We will scale this cost by block probability after
3888 // computing the scalarization overhead.
3889 InstructionCost ScalarCost =
3891
3892 // Compute the scalarization overhead of needed insertelement instructions
3893 // and phi nodes.
3894 if (isScalarWithPredication(I, VF) && !I->getType()->isVoidTy()) {
3895 Type *WideTy = toVectorizedTy(I->getType(), VF);
3896 for (Type *VectorTy : getContainedTypes(WideTy)) {
3897 ScalarCost += TTI.getScalarizationOverhead(
3899 /*Insert=*/true,
3900 /*Extract=*/false, Config.CostKind);
3901 }
3902 ScalarCost += VF.getFixedValue() *
3903 TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
3904 }
3905
3906 // Compute the scalarization overhead of needed extractelement
3907 // instructions. For each of the instruction's operands, if the operand can
3908 // be scalarized, add it to the worklist; otherwise, account for the
3909 // overhead.
3910 for (Use &U : I->operands())
3911 if (auto *J = dyn_cast<Instruction>(U.get())) {
3912 assert(canVectorizeTy(J->getType()) &&
3913 "Instruction has non-scalar type");
3914 if (CanBeScalarized(J))
3915 Worklist.push_back(J);
3916 else if (needsExtract(J, VF)) {
3917 Type *WideTy = toVectorizedTy(J->getType(), VF);
3918 for (Type *VectorTy : getContainedTypes(WideTy)) {
3919 ScalarCost += TTI.getScalarizationOverhead(
3920 cast<VectorType>(VectorTy),
3921 APInt::getAllOnes(VF.getFixedValue()), /*Insert*/ false,
3922 /*Extract*/ true, Config.CostKind);
3923 }
3924 }
3925 }
3926
3927 // Scale the total scalar cost by block probability.
3928 ScalarCost /= getPredBlockCostDivisor(Config.CostKind, I->getParent());
3929
3930 // Compute the discount. A non-negative discount means the vector version
3931 // of the instruction costs more, and scalarizing would be beneficial.
3932 Discount += VectorCost - ScalarCost;
3933 ScalarCosts[I] = ScalarCost;
3934 }
3935
3936 return Discount;
3937}
3938
3941 assert(VF.isScalar() && "must only be called for scalar VFs");
3942
3943 // For each block.
3944 for (BasicBlock *BB : TheLoop->blocks()) {
3945 InstructionCost BlockCost;
3946
3947 // For each instruction in the old loop.
3948 for (Instruction &I : *BB) {
3949 // Skip ignored values.
3950 if (ValuesToIgnore.count(&I) ||
3951 (VF.isVector() && VecValuesToIgnore.count(&I)))
3952 continue;
3953
3955
3956 // Check if we should override the cost.
3957 if (C.isValid() && Opts.force_target_instruction_cost)
3958 C = InstructionCost(*Opts.force_target_instruction_cost);
3959
3960 BlockCost += C;
3961 LLVM_DEBUG(dbgs() << "LV: Found an estimated cost of " << C << " for VF "
3962 << VF << " For instruction: " << I << '\n');
3963 }
3964
3965 // In the scalar loop, we may not always execute the predicated block, if it
3966 // is an if-else block. Thus, scale the block's cost by the probability of
3967 // executing it. getPredBlockCostDivisor will return 1 for blocks that are
3968 // only predicated by the header mask when folding the tail.
3969 Cost += BlockCost / getPredBlockCostDivisor(Config.CostKind, BB);
3970 }
3971
3972 return Cost;
3973}
3974
3975/// Gets the address access SCEV for Ptr, if it should be used for cost modeling
3976/// according to isAddressSCEVForCost.
3977///
3978/// This SCEV can be sent to the Target in order to estimate the address
3979/// calculation cost.
3981 Value *Ptr,
3983 const Loop *TheLoop) {
3984 const SCEV *Addr = PSE.getSCEV(Ptr);
3985 return vputils::isAddressSCEVForCost(Addr, *PSE.getSE(), TheLoop) ? Addr
3986 : nullptr;
3987}
3988
3990LoopVectorizationCostModel::getMemInstScalarizationCost(Instruction *I,
3991 ElementCount VF) {
3992 assert(VF.isVector() &&
3993 "Scalarization cost of instruction implies vectorization.");
3994 if (VF.isScalable())
3996
3997 Type *ValTy = getLoadStoreType(I);
3998 auto *SE = PSE.getSE();
3999
4000 unsigned AS = getLoadStoreAddressSpace(I);
4002 Type *PtrTy = toVectorTy(Ptr->getType(), VF);
4003 // NOTE: PtrTy is a vector to signal `TTI::getAddressComputationCost`
4004 // that it is being called from this specific place.
4005
4006 // Figure out whether the access is strided and get the stride value
4007 // if it's known in compile time
4008 const SCEV *PtrSCEV = getAddressAccessSCEV(Ptr, PSE, TheLoop);
4009
4010 // Get the cost of the scalar memory instruction and address computation.
4012 VF.getFixedValue() *
4013 TTI.getAddressComputationCost(PtrTy, SE, PtrSCEV, Config.CostKind);
4014
4015 // Don't pass *I here, since it is scalar but will actually be part of a
4016 // vectorized loop where the user of it is a vectorized instruction.
4018 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4019 Cost += VF.getFixedValue() *
4020 TTI.getMemoryOpCost(I->getOpcode(), ValTy->getScalarType(), Alignment,
4021 AS, Config.CostKind, OpInfo);
4022
4023 // Get the overhead of the extractelement and insertelement instructions
4024 // we might create due to scalarization.
4025 Cost += getScalarizationOverhead(I, VF);
4026
4027 // If we have a predicated load/store, it will need extra i1 extracts and
4028 // conditional branches, but may not be executed for each vector lane. Scale
4029 // the cost by the probability of executing the predicated block.
4030 if (isPredicatedInst(I)) {
4031 Cost /= getPredBlockCostDivisor(Config.CostKind, I->getParent());
4032
4033 // Add the cost of an i1 extract and a branch
4034 auto *VecI1Ty =
4036 Cost += TTI.getScalarizationOverhead(
4037 VecI1Ty, APInt::getAllOnes(VF.getFixedValue()),
4038 /*Insert=*/false, /*Extract=*/true, Config.CostKind);
4039 Cost += TTI.getCFInstrCost(Instruction::CondBr, Config.CostKind);
4040
4042 // Artificially setting to a high enough value to practically disable
4043 // vectorization with such operations.
4044 Cost = 3000000;
4045 }
4046
4047 return Cost;
4048}
4049
4050InstructionCost LoopVectorizationCostModel::getConsecutiveMemOpCost(
4051 Instruction *I, ElementCount VF, InstWidening Kind) {
4052 assert((Kind == CM_Widen || Kind == CM_Widen_Reverse) &&
4053 "Expected a consecutive widening decision");
4054 Type *ValTy = getLoadStoreType(I);
4055 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4056 unsigned AS = getLoadStoreAddressSpace(I);
4057
4060 if (isMaskRequired(I)) {
4061 unsigned IID = I->getOpcode() == Instruction::Load
4062 ? Intrinsic::masked_load
4063 : Intrinsic::masked_store;
4064 Cost += TTI.getMemIntrinsicInstrCost(
4065 MemIntrinsicCostAttributes(IID, VectorTy, Alignment, AS),
4066 Config.CostKind);
4067 } else {
4068 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4069 Cost += TTI.getMemoryOpCost(I->getOpcode(), VectorTy, Alignment, AS,
4070 Config.CostKind, OpInfo, I);
4071 }
4072
4073 if (Kind == CM_Widen_Reverse)
4074 Cost += TTI.getShuffleCost(TargetTransformInfo::SK_Reverse, VectorTy,
4075 VectorTy, Config.CostKind, {}, 0);
4076 return Cost;
4077}
4078
4080LoopVectorizationCostModel::getUniformMemOpCost(Instruction *I,
4081 ElementCount VF) const {
4082 assert(isUniformMemOp(*I, VF));
4083
4084 Type *ValTy = getLoadStoreType(I);
4086 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4088 unsigned AS = getLoadStoreAddressSpace(I);
4089 if (isa<LoadInst>(I)) {
4090 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4091 Config.CostKind) +
4092 TTI.getMemoryOpCost(Instruction::Load, ValTy, Alignment, AS,
4093 Config.CostKind) +
4094 TTI.getShuffleCost(TargetTransformInfo::SK_Broadcast, VectorTy,
4095 VectorTy, Config.CostKind);
4096 }
4097 StoreInst *SI = cast<StoreInst>(I);
4098
4099 bool IsLoopInvariantStoreValue = Legal->isInvariant(SI->getValueOperand());
4100 // TODO: We have existing tests that request the cost of extracting element
4101 // VF.getKnownMinValue() - 1 from a scalable vector. This does not represent
4102 // the actual generated code, which involves extracting the last element of
4103 // a scalable vector where the lane to extract is unknown at compile time.
4105 TTI.getAddressComputationCost(PtrTy, nullptr, nullptr, Config.CostKind) +
4106 TTI.getMemoryOpCost(Instruction::Store, ValTy, Alignment, AS,
4107 Config.CostKind);
4108 if (!IsLoopInvariantStoreValue)
4109 Cost += TTI.getIndexedVectorInstrCostFromEnd(Instruction::ExtractElement,
4110 VectorTy, Config.CostKind, 0);
4111 return Cost;
4112}
4113
4115LoopVectorizationCostModel::getGatherScatterCost(Instruction *I,
4116 ElementCount VF) const {
4117 Type *ValTy = getLoadStoreType(I);
4118 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4121 Type *PtrTy = Ptr->getType();
4122
4123 if (!isUniform(Ptr, VF))
4124 PtrTy = toVectorTy(PtrTy, VF);
4125
4126 unsigned IID = I->getOpcode() == Instruction::Load
4127 ? Intrinsic::masked_gather
4128 : Intrinsic::masked_scatter;
4129 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4130 Config.CostKind) +
4131 TTI.getMemIntrinsicInstrCost(
4132 MemIntrinsicCostAttributes(IID, VectorTy, Ptr, isMaskRequired(I),
4133 Alignment, I),
4134 Config.CostKind);
4135}
4136
4138LoopVectorizationCostModel::getInterleaveGroupCost(Instruction *I,
4139 ElementCount VF) const {
4140 const auto *Group = getInterleavedAccessGroup(I);
4141 assert(Group && "Fail to get an interleaved access group.");
4142
4143 Instruction *InsertPos = Group->getInsertPos();
4144 Type *ValTy = getLoadStoreType(InsertPos);
4145 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4146 unsigned AS = getLoadStoreAddressSpace(InsertPos);
4147
4148 unsigned InterleaveFactor = Group->getFactor();
4149 auto *WideVecTy = VectorType::get(ValTy, VF * InterleaveFactor);
4150
4151 // Holds the indices of existing members in the interleaved group.
4152 SmallVector<unsigned, 4> Indices;
4153 for (unsigned IF = 0; IF < InterleaveFactor; IF++)
4154 if (Group->getMember(IF))
4155 Indices.push_back(IF);
4156
4157 // Calculate the cost of the whole interleaved group.
4158 bool UseMaskForGaps =
4159 (Group->requiresScalarEpilogue() && !isEpilogueAllowed()) ||
4160 (isa<StoreInst>(I) && !Group->isFull());
4161 InstructionCost Cost = TTI.getInterleavedMemoryOpCost(
4162 InsertPos->getOpcode(), WideVecTy, Group->getFactor(), Indices,
4163 Group->getAlign(), AS, Config.CostKind, isMaskRequired(I),
4164 UseMaskForGaps);
4165
4166 if (Group->isReverse()) {
4167 // TODO: Add support for reversed masked interleaved access.
4169 "Reverse masked interleaved access not supported.");
4170 Cost += Group->getNumMembers() *
4171 TTI.getShuffleCost(TargetTransformInfo::SK_Reverse, VectorTy,
4172 VectorTy, Config.CostKind, {}, 0);
4173 }
4174 return Cost;
4175}
4176
4178LoopVectorizationCostModel::getMemoryInstructionCost(Instruction *I,
4179 ElementCount VF) {
4180 // Calculate scalar cost only. Vectorization cost should be ready at this
4181 // moment.
4182 if (VF.isScalar()) {
4183 Type *ValTy = getLoadStoreType(I);
4186 unsigned AS = getLoadStoreAddressSpace(I);
4187
4188 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4189 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4190 Config.CostKind) +
4191 TTI.getMemoryOpCost(I->getOpcode(), ValTy, Alignment, AS,
4192 Config.CostKind, OpInfo, I);
4193 }
4194 return getWideningCost(I, VF);
4195}
4196
4198LoopVectorizationCostModel::getScalarizationOverhead(Instruction *I,
4199 ElementCount VF) const {
4200
4201 // There is no mechanism yet to create a scalable scalarization loop,
4202 // so this is currently Invalid.
4203 if (VF.isScalable())
4205
4206 if (VF.isScalar())
4207 return 0;
4208
4210 Type *RetTy = toVectorizedTy(I->getType(), VF);
4211 if (!RetTy->isVoidTy() &&
4212 (!isa<LoadInst>(I) || !TTI.supportsEfficientVectorElementLoadStore())) {
4213
4215 if (isa<LoadInst>(I))
4216 VIC = TTI::VectorInstrContext::Load;
4217 else if (isa<StoreInst>(I))
4218 VIC = TTI::VectorInstrContext::Store;
4219
4220 for (Type *VectorTy : getContainedTypes(RetTy)) {
4221 Cost += TTI.getScalarizationOverhead(
4223 /*Insert=*/true, /*Extract=*/false, Config.CostKind,
4224 /*ForPoisonSrc=*/true, {}, VIC);
4225 }
4226 }
4227
4228 // Some targets keep addresses scalar.
4229 if (isa<LoadInst>(I) && !TTI.prefersVectorizedAddressing())
4230 return Cost;
4231
4232 // Some targets support efficient element stores.
4233 if (isa<StoreInst>(I) && TTI.supportsEfficientVectorElementLoadStore())
4234 return Cost;
4235
4236 // Collect operands to consider.
4237 CallInst *CI = dyn_cast<CallInst>(I);
4238 Instruction::op_range Ops = CI ? CI->args() : I->operands();
4239
4240 // Skip operands that do not require extraction/scalarization and do not incur
4241 // any overhead.
4243 for (auto *V : filterExtractingOperands(Ops, VF))
4244 Tys.push_back(maybeVectorizeType(V->getType(), VF));
4245
4247 ? TTI::VectorInstrContext::Store
4249 return Cost +
4250 TTI.getOperandsScalarizationOverhead(Tys, Config.CostKind, OperandVIC);
4251}
4252
4254 if (VF.isScalar())
4255 return;
4256
4257 // TODO: We should generate better code and update the cost model for
4258 // predicated uniform stores. Today they are treated as any other
4259 // predicated store (see added test cases in
4260 // invariant-store-vectorization.ll).
4261 NumPredStores = 0;
4262 for (BasicBlock *BB : TheLoop->blocks())
4263 for (Instruction &I : *BB)
4265 ++NumPredStores;
4266
4267 for (BasicBlock *BB : TheLoop->blocks()) {
4268 // For each instruction in the old loop.
4269 for (Instruction &I : *BB) {
4271
4272 // Ignore if no pointer found or a widening decision has already been
4273 // made.
4274 if (!Ptr || (getWideningDecision(&I, VF) != CM_Unknown))
4275 continue;
4276
4277 LLVM_DEBUG(dbgs() << "LV: Memory widening: calculating best strategy for "
4278 << I << '\n');
4279 if (isUniformMemOp(I, VF)) {
4280 auto IsLegalToScalarize = [&]() {
4281 if (!VF.isScalable())
4282 // Scalarization of fixed length vectors "just works".
4283 return true;
4284
4285 // We have dedicated lowering for unpredicated uniform loads and
4286 // stores. Note that even with tail folding we know that at least
4287 // one lane is active (i.e. generalized predication is not possible
4288 // here), and the logic below depends on this fact.
4289 if (!foldTailByMasking())
4290 return true;
4291
4292 // For scalable vectors, a uniform memop load is always
4293 // uniform-by-parts and we know how to scalarize that.
4294 if (isa<LoadInst>(I))
4295 return true;
4296
4297 // A uniform store isn't neccessarily uniform-by-part
4298 // and we can't assume scalarization.
4299 auto &SI = cast<StoreInst>(I);
4300 return TheLoop->isLoopInvariant(SI.getValueOperand());
4301 };
4302
4303 const InstructionCost GatherScatterCost =
4304 isLegalGatherOrScatter(&I, VF) ? getGatherScatterCost(&I, VF)
4306
4307 // Load: Scalar load + broadcast
4308 // Store: Scalar store + isLoopInvariantStoreValue ? 0 : extract
4309 // FIXME: This cost is a significant under-estimate for tail folded
4310 // memory ops.
4311 const InstructionCost ScalarizationCost =
4312 IsLegalToScalarize() ? getUniformMemOpCost(&I, VF)
4314
4315 // Choose better solution for the current VF, Note that Invalid
4316 // costs compare as maximumal large. If both are invalid, we get
4317 // scalable invalid which signals a failure and a vectorization abort.
4318 LLVM_DEBUG(dbgs() << "LV: Memory widening: uniform memory op has "
4319 "GatherScatterCost = "
4320 << GatherScatterCost << ", ScalarizationCost = "
4321 << ScalarizationCost << '\n');
4322 if (GatherScatterCost < ScalarizationCost)
4323 setWideningDecision(&I, VF, CM_GatherScatter, GatherScatterCost);
4324 else
4325 setWideningDecision(&I, VF, CM_Scalarize, ScalarizationCost);
4326 continue;
4327 }
4328
4329 // We assume that widening is the best solution when possible.
4330 if (std::optional<InstWidening> Decision =
4332 InstructionCost WidenCost = getConsecutiveMemOpCost(&I, VF, *Decision);
4333 LLVM_DEBUG(
4334 dbgs() << "LV: Memory widening: can be widened normally with cost "
4335 << WidenCost << '\n');
4336 setWideningDecision(&I, VF, *Decision, WidenCost);
4337 continue;
4338 }
4339
4340 // Choose between Interleaving, Gather/Scatter or Scalarization.
4342 unsigned NumAccesses = 1;
4343 if (isAccessInterleaved(&I)) {
4344 const auto *Group = getInterleavedAccessGroup(&I);
4345 assert(Group && "Fail to get an interleaved access group.");
4346
4347 NumAccesses = Group->getNumMembers();
4349 InterleaveCost = getInterleaveGroupCost(&I, VF);
4350 }
4351
4352 InstructionCost GatherScatterCost =
4354 ? getGatherScatterCost(&I, VF) * NumAccesses
4356
4357 InstructionCost ScalarizationCost =
4358 getMemInstScalarizationCost(&I, VF) * NumAccesses;
4359
4360 // Choose better solution for the current VF,
4361 // write down this decision and use it during vectorization.
4363 InstWidening Decision;
4364 if (InterleaveCost <= GatherScatterCost &&
4365 InterleaveCost < ScalarizationCost) {
4366 Decision = CM_Interleave;
4367 Cost = InterleaveCost;
4368 } else if (GatherScatterCost < ScalarizationCost) {
4369 Decision = CM_GatherScatter;
4370 Cost = GatherScatterCost;
4371 } else {
4372 Decision = CM_Scalarize;
4373 Cost = ScalarizationCost;
4374 }
4375 LLVM_DEBUG(
4376 dbgs() << "LV: Memory widening: InterleaveCost = " << InterleaveCost
4377 << ", GatherScatterCost = " << GatherScatterCost
4378 << ", ScalarizationCost = " << ScalarizationCost << '\n');
4379
4380 // If the instructions belongs to an interleave group, the whole group
4381 // receives the same decision. The whole group receives the cost, but
4382 // the cost will actually be assigned to one instruction.
4383 if (const auto *Group = getInterleavedAccessGroup(&I)) {
4384 if (Decision == CM_Scalarize) {
4385 for (Instruction *I : Group->members())
4386 setWideningDecision(I, VF, Decision,
4387 getMemInstScalarizationCost(I, VF));
4388 } else {
4389 setWideningDecision(Group, VF, Decision, Cost);
4390 }
4391 } else
4392 setWideningDecision(&I, VF, Decision, Cost);
4393 }
4394 }
4395
4396 // Make sure that any load of address and any other address computation
4397 // remains scalar unless there is gather/scatter support. This avoids
4398 // inevitable extracts into address registers, and also has the benefit of
4399 // activating LSR more, since that pass can't optimize vectorized
4400 // addresses.
4401 if (TTI.prefersVectorizedAddressing())
4402 return;
4403
4404 // Start with all scalar pointer uses.
4406 for (BasicBlock *BB : TheLoop->blocks())
4407 for (Instruction &I : *BB) {
4408 Instruction *PtrDef =
4410 if (PtrDef && TheLoop->contains(PtrDef) &&
4412 AddrDefs.insert(PtrDef);
4413 }
4414
4415 // Add all instructions used to generate the addresses.
4417 append_range(Worklist, AddrDefs);
4418 while (!Worklist.empty()) {
4419 Instruction *I = Worklist.pop_back_val();
4420 for (auto &Op : I->operands())
4421 if (auto *InstOp = dyn_cast<Instruction>(Op))
4422 if (TheLoop->contains(InstOp) && !isa<PHINode>(InstOp) &&
4423 AddrDefs.insert(InstOp))
4424 Worklist.push_back(InstOp);
4425 }
4426
4427 auto UpdateMemOpUserCost = [this, VF](LoadInst *LI) {
4428 // If there are direct memory op users of the newly scalarized load,
4429 // their cost may have changed because there's no scalarization
4430 // overhead for the operand. Update it.
4431 for (User *U : LI->users()) {
4433 continue;
4435 continue;
4436 auto UI = cast<Instruction>(U);
4437 LLVM_DEBUG(
4438 dbgs() << "LV: Memory widening: updating decision for load user "
4439 << *UI << '\n');
4441 UI, VF, CM_Scalarize,
4442 getMemInstScalarizationCost(cast<Instruction>(U), VF));
4443 }
4444 };
4445 for (auto *I : AddrDefs) {
4446 if (isa<LoadInst>(I)) {
4447 // Setting the desired widening decision should ideally be handled in
4448 // by cost functions, but since this involves the task of finding out
4449 // if the loaded register is involved in an address computation, it is
4450 // instead changed here when we know this is the case.
4451 InstWidening Decision = getWideningDecision(I, VF);
4452 if (!isPredicatedInst(I) &&
4453 (Decision == CM_Widen || Decision == CM_Widen_Reverse ||
4454 (!isUniformMemOp(*I, VF) && Decision == CM_Scalarize))) {
4455 // Scalarize a widened load of address or update the cost of a scalar
4456 // load of an address.
4457 LLVM_DEBUG(dbgs() << "LV: Memory widening: updating decision for load "
4458 << *I << '\n');
4460 I, VF, CM_Scalarize,
4461 (VF.getKnownMinValue() *
4462 getMemoryInstructionCost(I, ElementCount::getFixed(1))));
4463 UpdateMemOpUserCost(cast<LoadInst>(I));
4464 } else if (const auto *Group = getInterleavedAccessGroup(I)) {
4465 // Scalarize all members of this interleaved group when any member
4466 // is used as an address. The address-used load skips scalarization
4467 // overhead, other members include it.
4468 for (Instruction *Member : Group->members()) {
4469 InstructionCost Cost = AddrDefs.contains(Member)
4470 ? (VF.getKnownMinValue() *
4471 getMemoryInstructionCost(
4472 Member, ElementCount::getFixed(1)))
4473 : getMemInstScalarizationCost(Member, VF);
4474 LLVM_DEBUG(
4475 dbgs()
4476 << "LV: Memory widening: updating decision for interleave member "
4477 << *Member << '\n');
4479 UpdateMemOpUserCost(cast<LoadInst>(Member));
4480 }
4481 }
4482 } else {
4483 // Cannot scalarize fixed-order recurrence phis at the moment.
4484 if (isa<PHINode>(I) && Legal->isFixedOrderRecurrence(cast<PHINode>(I)))
4485 continue;
4486
4487 // Make sure I gets scalarized and a cost estimate without
4488 // scalarization overhead.
4489 ForcedScalars[VF].insert(I);
4490 }
4491 }
4492}
4493
4495 if (!Legal->isInvariant(Op))
4496 return false;
4497 // Consider Op invariant, if it or its operands aren't predicated
4498 // instruction in the loop. In that case, it is not trivially hoistable.
4499 auto *OpI = dyn_cast<Instruction>(Op);
4500 return !OpI || !TheLoop->contains(OpI) ||
4501 (!isPredicatedInst(OpI) &&
4502 (!isa<PHINode>(OpI) || OpI->getParent() != TheLoop->getHeader()) &&
4503 all_of(OpI->operands(),
4504 [this](Value *Op) { return shouldConsiderInvariant(Op); }));
4505}
4506
4509 ElementCount VF) {
4510 // If we know that this instruction will remain uniform, check the cost of
4511 // the scalar version.
4513 VF = ElementCount::getFixed(1);
4514
4515 if (VF.isVector() && isProfitableToScalarize(I, VF))
4516 return InstsToScalarize[VF][I];
4517
4518 // Forced scalars do not have any scalarization overhead.
4519 auto ForcedScalar = ForcedScalars.find(VF);
4520 if (VF.isVector() && ForcedScalar != ForcedScalars.end()) {
4521 auto InstSet = ForcedScalar->second;
4522 if (InstSet.count(I))
4524 VF.getKnownMinValue();
4525 }
4526
4527 const auto &MinBWs = Config.getMinimalBitwidths();
4528 uint64_t InstrMinBWs = MinBWs.lookup(I);
4529 Type *RetTy = I->getType();
4531 RetTy = IntegerType::get(RetTy->getContext(), InstrMinBWs);
4532 auto *SE = PSE.getSE();
4533
4534 Type *VectorTy;
4535 if (isScalarAfterVectorization(I, VF)) {
4536 [[maybe_unused]] auto HasSingleCopyAfterVectorization =
4537 [this](Instruction *I, ElementCount VF) -> bool {
4538 if (VF.isScalar())
4539 return true;
4540
4541 auto Scalarized = InstsToScalarize.find(VF);
4542 assert(Scalarized != InstsToScalarize.end() &&
4543 "VF not yet analyzed for scalarization profitability");
4544 return !Scalarized->second.count(I) &&
4545 llvm::all_of(I->users(), [&](User *U) {
4546 auto *UI = cast<Instruction>(U);
4547 return !Scalarized->second.count(UI);
4548 });
4549 };
4550
4551 // With the exception of GEPs and PHIs, after scalarization there should
4552 // only be one copy of the instruction generated in the loop. This is
4553 // because the VF is either 1, or any instructions that need scalarizing
4554 // have already been dealt with by the time we get here. As a result,
4555 // it means we don't have to multiply the instruction cost by VF.
4556 assert(I->getOpcode() == Instruction::GetElementPtr ||
4557 I->getOpcode() == Instruction::PHI ||
4558 (I->getOpcode() == Instruction::BitCast &&
4559 I->getType()->isPointerTy()) ||
4560 HasSingleCopyAfterVectorization(I, VF));
4561 VectorTy = RetTy;
4562 } else
4563 VectorTy = toVectorizedTy(RetTy, VF);
4564
4565 if (VF.isVector() && VectorTy->isVectorTy() &&
4566 !TTI.getNumberOfParts(VectorTy))
4568
4569 // TODO: We need to estimate the cost of intrinsic calls.
4570 switch (I->getOpcode()) {
4571 case Instruction::GetElementPtr:
4572 // We mark this instruction as zero-cost because the cost of GEPs in
4573 // vectorized code depends on whether the corresponding memory instruction
4574 // is scalarized or not. Therefore, we handle GEPs with the memory
4575 // instruction cost.
4576 return 0;
4577 case Instruction::UncondBr:
4578 case Instruction::CondBr: {
4579 // In cases of scalarized and predicated instructions, there will be VF
4580 // predicated blocks in the vectorized loop. Each branch around these
4581 // blocks requires also an extract of its vector compare i1 element.
4582 // Note that the conditional branch from the loop latch will be replaced by
4583 // a single branch controlling the loop, so there is no extra overhead from
4584 // scalarization.
4585 bool ScalarPredicatedBB = false;
4587 if (VF.isVector() && BI &&
4588 (PredicatedBBsAfterVectorization[VF].count(BI->getSuccessor(0)) ||
4589 PredicatedBBsAfterVectorization[VF].count(BI->getSuccessor(1))) &&
4590 BI->getParent() != TheLoop->getLoopLatch())
4591 ScalarPredicatedBB = true;
4592
4593 if (ScalarPredicatedBB) {
4594 // Not possible to scalarize scalable vector with predicated instructions.
4595 if (VF.isScalable())
4597 // Return cost for branches around scalarized and predicated blocks.
4598 auto *VecI1Ty =
4600 return (TTI.getScalarizationOverhead(
4601 VecI1Ty, APInt::getAllOnes(VF.getFixedValue()),
4602 /*Insert*/ false, /*Extract*/ true, Config.CostKind) +
4603 (TTI.getCFInstrCost(Instruction::CondBr, Config.CostKind) *
4604 VF.getFixedValue()));
4605 }
4606
4607 if (I->getParent() == TheLoop->getLoopLatch() || VF.isScalar())
4608 // The back-edge branch will remain, as will all scalar branches.
4609 return TTI.getCFInstrCost(Instruction::UncondBr, Config.CostKind);
4610
4611 // This branch will be eliminated by if-conversion.
4612 return 0;
4613 // Note: We currently assume zero cost for an unconditional branch inside
4614 // a predicated block since it will become a fall-through, although we
4615 // may decide in the future to call TTI for all branches.
4616 }
4617 case Instruction::Switch: {
4618 if (VF.isScalar())
4619 return TTI.getCFInstrCost(Instruction::Switch, Config.CostKind);
4620 auto *Switch = cast<SwitchInst>(I);
4621 return Switch->getNumCases() *
4622 TTI.getCmpSelInstrCost(
4623 Instruction::ICmp,
4624 toVectorTy(Switch->getCondition()->getType(), VF),
4625 toVectorTy(Type::getInt1Ty(I->getContext()), VF),
4626 CmpInst::ICMP_EQ, Config.CostKind);
4627 }
4628 case Instruction::PHI: {
4629 auto *Phi = cast<PHINode>(I);
4630
4631 // First-order recurrences are replaced by vector shuffles inside the loop.
4632 if (VF.isVector() && Legal->isFixedOrderRecurrence(Phi)) {
4633 return TTI.getShuffleCost(
4635 cast<VectorType>(VectorTy), Config.CostKind, {}, -1);
4636 }
4637
4638 // Phi nodes in non-header blocks (not inductions, reductions, etc.) are
4639 // converted into select instructions. We require N - 1 selects per phi
4640 // node, where N is the number of incoming values.
4641 if (VF.isVector() && Phi->getParent() != TheLoop->getHeader()) {
4642 Type *ResultTy = Phi->getType();
4643
4644 // All instructions in an Any-of reduction chain are narrowed to bool.
4645 // Check if that is the case for this phi node.
4646 auto *HeaderUser = find_singleton<PHINode>(
4647 Phi->users(), [this](User *U, bool) -> PHINode * {
4648 auto *Phi = dyn_cast<PHINode>(U);
4649 if (Phi && Phi->getParent() == TheLoop->getHeader())
4650 return Phi;
4651 return nullptr;
4652 });
4653 if (HeaderUser) {
4654 auto &ReductionVars = Legal->getReductionVars();
4655 auto Iter = ReductionVars.find(HeaderUser);
4656 if (Iter != ReductionVars.end() &&
4658 Iter->second.getRecurrenceKind()))
4659 ResultTy = Type::getInt1Ty(Phi->getContext());
4660 }
4661 return (Phi->getNumIncomingValues() - 1) *
4662 TTI.getCmpSelInstrCost(
4663 Instruction::Select, toVectorTy(ResultTy, VF),
4664 toVectorTy(Type::getInt1Ty(Phi->getContext()), VF),
4665 CmpInst::BAD_ICMP_PREDICATE, Config.CostKind);
4666 }
4667
4668 // When tail folding with EVL, if the phi is part of an out of loop
4669 // reduction then it will be transformed into a wide vp_merge.
4670 if (VF.isVector() && foldTailWithEVL() &&
4671 Legal->getReductionVars().contains(Phi) &&
4672 !Config.isInLoopReduction(Phi)) {
4674 Intrinsic::vp_merge, toVectorTy(Phi->getType(), VF),
4675 {toVectorTy(Type::getInt1Ty(Phi->getContext()), VF)});
4676 return TTI.getIntrinsicInstrCost(ICA, Config.CostKind);
4677 }
4678
4679 return TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
4680 }
4681 case Instruction::UDiv:
4682 case Instruction::SDiv:
4683 case Instruction::URem:
4684 case Instruction::SRem:
4685 if (VF.isVector() && isPredicatedInst(I)) {
4686 const auto [ScalarCost, MaskedCost] = getDivRemSpeculationCost(I, VF);
4687 return isDivRemScalarWithPredication(ScalarCost, MaskedCost) ? ScalarCost
4688 : MaskedCost;
4689 }
4690 // We've proven all lanes safe to speculate, fall through.
4691 [[fallthrough]];
4692 case Instruction::Add:
4693 case Instruction::Sub: {
4694 const HistogramInfo *HGram = Legal->getHistogramInfo(I);
4695 if (HGram && VF.isVector()) {
4696 // Assume that a non-constant update value (or a constant != 1) requires
4697 // a multiply, and add that into the cost.
4699 ConstantInt *RHS = dyn_cast<ConstantInt>(I->getOperand(1));
4700 if (!RHS || RHS->getZExtValue() != 1)
4701 MulCost = TTI.getArithmeticInstrCost(Instruction::Mul, VectorTy,
4702 Config.CostKind);
4703
4704 // Find the cost of the histogram operation itself.
4705 Type *PtrTy = VectorType::get(HGram->Load->getPointerOperandType(), VF);
4706 Type *ScalarTy = I->getType();
4707 Type *MaskTy = VectorType::get(Type::getInt1Ty(I->getContext()), VF);
4708 IntrinsicCostAttributes ICA(Intrinsic::experimental_vector_histogram_add,
4709 Type::getVoidTy(I->getContext()),
4710 {PtrTy, ScalarTy, MaskTy});
4711
4712 // Add the costs together with the add/sub operation.
4713 return TTI.getIntrinsicInstrCost(ICA, Config.CostKind) + MulCost +
4714 TTI.getArithmeticInstrCost(I->getOpcode(), VectorTy,
4715 Config.CostKind);
4716 }
4717 [[fallthrough]];
4718 }
4719 case Instruction::FAdd:
4720 case Instruction::FSub:
4721 case Instruction::Mul:
4722 case Instruction::FMul:
4723 case Instruction::FDiv:
4724 case Instruction::FRem:
4725 case Instruction::Shl:
4726 case Instruction::LShr:
4727 case Instruction::AShr:
4728 case Instruction::And:
4729 case Instruction::Or:
4730 case Instruction::Xor: {
4731 // If we're speculating on the stride being 1, the multiplication may
4732 // fold away. We can generalize this for all operations using the notion
4733 // of neutral elements. (TODO)
4734 if (I->getOpcode() == Instruction::Mul &&
4735 ((TheLoop->isLoopInvariant(I->getOperand(0)) &&
4736 PSE.getSCEV(I->getOperand(0))->isOne()) ||
4737 (TheLoop->isLoopInvariant(I->getOperand(1)) &&
4738 PSE.getSCEV(I->getOperand(1))->isOne())))
4739 return 0;
4740
4741 // Certain instructions can be cheaper to vectorize if they have a constant
4742 // second vector operand. One example of this are shifts on x86.
4743 Value *Op2 = I->getOperand(1);
4744 if (!isa<Constant>(Op2) && TheLoop->isLoopInvariant(Op2) &&
4745 PSE.getSE()->isSCEVable(Op2->getType()) &&
4746 isa<SCEVConstant>(PSE.getSCEV(Op2))) {
4747 Op2 = cast<SCEVConstant>(PSE.getSCEV(Op2))->getValue();
4748 }
4749 auto Op2Info = TTI.getOperandInfo(Op2);
4750 if (Op2Info.Kind == TargetTransformInfo::OK_AnyValue &&
4753
4754 SmallVector<const Value *, 4> Operands(I->operand_values());
4755 return TTI.getArithmeticInstrCost(
4756 I->getOpcode(), VectorTy, Config.CostKind,
4757 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4758 Op2Info, Operands, I, TLI);
4759 }
4760 case Instruction::FNeg: {
4761 return TTI.getArithmeticInstrCost(
4762 I->getOpcode(), VectorTy, Config.CostKind,
4763 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4764 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4765 I->getOperand(0), I);
4766 }
4767 case Instruction::Select: {
4769 const SCEV *CondSCEV = SE->getSCEV(SI->getCondition());
4770 bool ScalarCond = (SE->isLoopInvariant(CondSCEV, TheLoop));
4771
4772 const Value *Op0, *Op1;
4773 using namespace llvm::PatternMatch;
4774 if (!ScalarCond && (match(I, m_LogicalAnd(m_Value(Op0), m_Value(Op1))) ||
4775 match(I, m_LogicalOr(m_Value(Op0), m_Value(Op1))))) {
4776 // select x, y, false --> x & y
4777 // select x, true, y --> x | y
4778 const auto [Op1VK, Op1VP] = TTI::getOperandInfo(Op0);
4779 const auto [Op2VK, Op2VP] = TTI::getOperandInfo(Op1);
4780 assert(Op0->getType()->getScalarSizeInBits() == 1 &&
4781 Op1->getType()->getScalarSizeInBits() == 1);
4782
4783 return TTI.getArithmeticInstrCost(
4784 match(I, m_LogicalOr()) ? Instruction::Or : Instruction::And,
4785 VectorTy, Config.CostKind, {Op1VK, Op1VP}, {Op2VK, Op2VP}, {Op0, Op1},
4786 I);
4787 }
4788
4789 Type *CondTy = SI->getCondition()->getType();
4790 if (!ScalarCond)
4791 CondTy = VectorType::get(CondTy, VF);
4792
4794 if (auto *Cmp = dyn_cast<CmpInst>(SI->getCondition()))
4795 Pred = Cmp->getPredicate();
4796 return TTI.getCmpSelInstrCost(
4797 I->getOpcode(), VectorTy, CondTy, Pred, Config.CostKind,
4798 {TTI::OK_AnyValue, TTI::OP_None}, {TTI::OK_AnyValue, TTI::OP_None}, I);
4799 }
4800 case Instruction::ICmp:
4801 case Instruction::FCmp: {
4802 Type *ValTy = I->getOperand(0)->getType();
4803
4805 [[maybe_unused]] Instruction *Op0AsInstruction =
4806 dyn_cast<Instruction>(I->getOperand(0));
4807 assert((!canTruncateToMinimalBitwidth(Op0AsInstruction, VF) ||
4808 InstrMinBWs == MinBWs.lookup(Op0AsInstruction)) &&
4809 "if both the operand and the compare are marked for "
4810 "truncation, they must have the same bitwidth");
4811 ValTy = IntegerType::get(ValTy->getContext(), InstrMinBWs);
4812 }
4813
4814 VectorTy = toVectorTy(ValTy, VF);
4815 return TTI.getCmpSelInstrCost(
4816 I->getOpcode(), VectorTy, CmpInst::makeCmpResultType(VectorTy),
4817 cast<CmpInst>(I)->getPredicate(), Config.CostKind,
4818 {TTI::OK_AnyValue, TTI::OP_None}, {TTI::OK_AnyValue, TTI::OP_None}, I);
4819 }
4820 case Instruction::Store:
4821 case Instruction::Load: {
4822 ElementCount Width = VF;
4823 if (Width.isVector()) {
4824 InstWidening Decision = getWideningDecision(I, Width);
4825 assert(Decision != CM_Unknown &&
4826 "CM decision should be taken at this point");
4829 if (Decision == CM_Scalarize)
4830 Width = ElementCount::getFixed(1);
4831 }
4832 VectorTy = toVectorTy(getLoadStoreType(I), Width);
4833 return getMemoryInstructionCost(I, VF);
4834 }
4835 case Instruction::BitCast:
4836 if (I->getType()->isPointerTy())
4837 return 0;
4838 [[fallthrough]];
4839 case Instruction::ZExt:
4840 case Instruction::SExt:
4841 case Instruction::FPToUI:
4842 case Instruction::FPToSI:
4843 case Instruction::FPExt:
4844 case Instruction::PtrToInt:
4845 case Instruction::IntToPtr:
4846 case Instruction::SIToFP:
4847 case Instruction::UIToFP:
4848 case Instruction::Trunc:
4849 case Instruction::FPTrunc: {
4850 // Computes the CastContextHint from a Load/Store instruction.
4851 auto ComputeCCH = [&](Instruction *I) -> TTI::CastContextHint {
4853 "Expected a load or a store!");
4854
4855 if (VF.isScalar() || !TheLoop->contains(I))
4857
4858 switch (getWideningDecision(I, VF)) {
4870 llvm_unreachable("Instr did not go through cost modelling?");
4873 }
4874
4875 llvm_unreachable("Unhandled case!");
4876 };
4877
4878 unsigned Opcode = I->getOpcode();
4880 // For Trunc, the context is the only user, which must be a StoreInst.
4881 if (Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) {
4882 if (I->hasOneUse())
4883 if (StoreInst *Store = dyn_cast<StoreInst>(*I->user_begin()))
4884 CCH = ComputeCCH(Store);
4885 }
4886 // For Z/Sext, the context is the operand, which must be a LoadInst.
4887 else if (Opcode == Instruction::ZExt || Opcode == Instruction::SExt ||
4888 Opcode == Instruction::FPExt) {
4889 if (LoadInst *Load = dyn_cast<LoadInst>(I->getOperand(0)))
4890 CCH = ComputeCCH(Load);
4891 }
4892
4893 // We optimize the truncation of induction variables having constant
4894 // integer steps. The cost of these truncations is the same as the scalar
4895 // operation.
4896 if (isOptimizableIVTruncate(I, VF)) {
4897 auto *Trunc = cast<TruncInst>(I);
4898 return TTI.getCastInstrCost(Instruction::Trunc, Trunc->getDestTy(),
4899 Trunc->getSrcTy(), CCH, Config.CostKind,
4900 Trunc);
4901 }
4902
4903 Type *SrcScalarTy = I->getOperand(0)->getType();
4904 Instruction *Op0AsInstruction = dyn_cast<Instruction>(I->getOperand(0));
4905 if (canTruncateToMinimalBitwidth(Op0AsInstruction, VF))
4906 SrcScalarTy = IntegerType::get(SrcScalarTy->getContext(),
4907 MinBWs.lookup(Op0AsInstruction));
4908 Type *SrcVecTy =
4909 VectorTy->isVectorTy() ? toVectorTy(SrcScalarTy, VF) : SrcScalarTy;
4910
4912 // If the result type is <= the source type, there will be no extend
4913 // after truncating the users to the minimal required bitwidth.
4914 if (VectorTy->getScalarSizeInBits() <= SrcVecTy->getScalarSizeInBits() &&
4915 (I->getOpcode() == Instruction::ZExt ||
4916 I->getOpcode() == Instruction::SExt))
4917 return 0;
4918 }
4919
4920 return TTI.getCastInstrCost(Opcode, VectorTy, SrcVecTy, CCH,
4921 Config.CostKind, I);
4922 }
4923 case Instruction::Call:
4924 return getVectorCallCost(cast<CallInst>(I), VF);
4925 case Instruction::ExtractValue:
4926 return TTI.getInstructionCost(I, Config.CostKind);
4927 case Instruction::Alloca:
4928 // We cannot easily widen alloca to a scalable alloca, as
4929 // the result would need to be a vector of pointers.
4930 if (VF.isScalable())
4932 return TTI.getArithmeticInstrCost(Instruction::Mul, RetTy, Config.CostKind);
4933 case Instruction::Freeze:
4934 return TTI::TCC_Free;
4935 default:
4936 // This opcode is unknown. Assume that it is the same as 'mul'.
4937 return TTI.getArithmeticInstrCost(Instruction::Mul, VectorTy,
4938 Config.CostKind);
4939 } // end of switch.
4940}
4941
4943 // Ignore ephemeral values.
4945
4946 SmallVector<Value *, 4> DeadInterleavePointerOps;
4948
4949 // If a scalar epilogue is required, users outside the loop won't use
4950 // live-outs from the vector loop but from the scalar epilogue. Ignore them if
4951 // that is the case.
4952 bool RequiresScalarEpilogue = requiresScalarEpilogue(true);
4953 auto IsLiveOutDead = [this, RequiresScalarEpilogue](User *U) {
4954 return RequiresScalarEpilogue &&
4955 !TheLoop->contains(cast<Instruction>(U)->getParent());
4956 };
4957
4959 DFS.perform(LI);
4960 for (BasicBlock *BB : reverse(make_range(DFS.beginRPO(), DFS.endRPO())))
4961 for (Instruction &I : reverse(*BB)) {
4962 if (VecValuesToIgnore.contains(&I) || ValuesToIgnore.contains(&I))
4963 continue;
4964
4965 // Add instructions that would be trivially dead and are only used by
4966 // values already ignored to DeadOps to seed worklist.
4968 all_of(I.users(), [this, IsLiveOutDead](User *U) {
4969 return VecValuesToIgnore.contains(U) ||
4970 ValuesToIgnore.contains(U) || IsLiveOutDead(U);
4971 }))
4972 DeadOps.push_back(&I);
4973
4974 // For interleave groups, we only create a pointer for the start of the
4975 // interleave group. Queue up addresses of group members except the insert
4976 // position for further processing.
4977 if (isAccessInterleaved(&I)) {
4978 auto *Group = getInterleavedAccessGroup(&I);
4979 if (Group->getInsertPos() == &I)
4980 continue;
4981 Value *PointerOp = getLoadStorePointerOperand(&I);
4982 DeadInterleavePointerOps.push_back(PointerOp);
4983 }
4984
4985 // Queue branches for analysis. They are dead, if their successors only
4986 // contain dead instructions.
4987 if (isa<CondBrInst>(&I))
4988 DeadOps.push_back(&I);
4989 }
4990
4991 // Mark ops feeding interleave group members as free, if they are only used
4992 // by other dead computations.
4993 for (unsigned I = 0; I != DeadInterleavePointerOps.size(); ++I) {
4994 auto *Op = dyn_cast<Instruction>(DeadInterleavePointerOps[I]);
4995 if (!Op || !TheLoop->contains(Op) || any_of(Op->users(), [this](User *U) {
4996 Instruction *UI = cast<Instruction>(U);
4997 return !VecValuesToIgnore.contains(U) &&
4998 (!isAccessInterleaved(UI) ||
4999 getInterleavedAccessGroup(UI)->getInsertPos() == UI);
5000 }))
5001 continue;
5002 VecValuesToIgnore.insert(Op);
5003 append_range(DeadInterleavePointerOps, Op->operands());
5004 }
5005
5006 // Mark ops that would be trivially dead and are only used by ignored
5007 // instructions as free.
5008 BasicBlock *Header = TheLoop->getHeader();
5009
5010 // Returns true if the block contains only dead instructions. Such blocks will
5011 // be removed by VPlan-to-VPlan transforms and won't be considered by the
5012 // VPlan-based cost model, so skip them in the legacy cost-model as well.
5013 auto IsEmptyBlock = [this](BasicBlock *BB) {
5014 return all_of(*BB, [this](Instruction &I) {
5015 return ValuesToIgnore.contains(&I) || VecValuesToIgnore.contains(&I) ||
5017 });
5018 };
5019 SmallPtrSet<Instruction *, 16> ProcessedDeadOps;
5020 for (unsigned I = 0; I != DeadOps.size(); ++I) {
5021 auto *Op = dyn_cast<Instruction>(DeadOps[I]);
5022
5023 // Check if the branch should be considered dead.
5024 if (auto *Br = dyn_cast_or_null<CondBrInst>(Op)) {
5025 BasicBlock *ThenBB = Br->getSuccessor(0);
5026 BasicBlock *ElseBB = Br->getSuccessor(1);
5027 // Don't considers branches leaving the loop for simplification.
5028 if (!TheLoop->contains(ThenBB) || !TheLoop->contains(ElseBB))
5029 continue;
5030 bool ThenEmpty = IsEmptyBlock(ThenBB);
5031 bool ElseEmpty = IsEmptyBlock(ElseBB);
5032 if ((ThenEmpty && ElseEmpty) ||
5033 (ThenEmpty && ThenBB->getSingleSuccessor() == ElseBB &&
5034 ElseBB->phis().empty()) ||
5035 (ElseEmpty && ElseBB->getSingleSuccessor() == ThenBB &&
5036 ThenBB->phis().empty())) {
5037 VecValuesToIgnore.insert(Br);
5038 DeadOps.push_back(Br->getCondition());
5039 }
5040 continue;
5041 }
5042
5043 // Skip any op that shouldn't be considered dead.
5044 if (!Op || !TheLoop->contains(Op) ||
5045 (isa<PHINode>(Op) && Op->getParent() == Header) ||
5047 any_of(Op->users(), [this, IsLiveOutDead](User *U) {
5048 return !VecValuesToIgnore.contains(U) &&
5049 !ValuesToIgnore.contains(U) && !IsLiveOutDead(U);
5050 }))
5051 continue;
5052
5053 // If all of Op's users are in ValuesToIgnore, add it to ValuesToIgnore
5054 // which applies for both scalar and vector versions. Otherwise it is only
5055 // dead in vector versions, so only add it to VecValuesToIgnore.
5056 bool BecameScalarDead = false;
5057 if (all_of(Op->users(),
5058 [this](User *U) { return ValuesToIgnore.contains(U); }))
5059 BecameScalarDead = ValuesToIgnore.insert(Op).second;
5060
5061 VecValuesToIgnore.insert(Op);
5062 // Shared operands may be queued more than once. Propagate deadness once,
5063 // and again if an instruction previously dead only in the vector loop
5064 // becomes dead in the scalar loop too.
5065 if (ProcessedDeadOps.insert(Op).second || BecameScalarDead)
5066 append_range(DeadOps, Op->operands());
5067 }
5068
5069 // Ignore type-promoting instructions we identified during reduction
5070 // detection.
5071 for (const RecurrenceDescriptor &RedDes :
5072 Legal->getReductionVars().values()) {
5073 VecValuesToIgnore.insert_range(RedDes.getCastInsts());
5074 }
5075 // Ignore type-casting instructions we identified during induction
5076 // detection.
5077 for (const InductionDescriptor &IndDes : Legal->getInductionVars().values())
5078 VecValuesToIgnore.insert_range(IndDes.getCastInsts());
5079}
5080
5081void LoopVectorizationPlanner::plan(ElementCount UserVF, unsigned UserIC) {
5082 CM->collectValuesToIgnore();
5083 Config.collectElementTypesForWidening(&CM->ValuesToIgnore);
5084
5085 FixedScalableVFPair MaxFactors = CM->computeMaxVF(UserVF, UserIC);
5086 if (!MaxFactors) // Cases that should not to be vectorized nor interleaved.
5087 return;
5088
5089 Config.collectInLoopReductions();
5090 // Cases that may be vectorized may be optimized by unit stride predicates.
5091 // TODO: Currently unit stride predicates are added unconditionally, even if
5092 // they are not used for the selected VF (e.g. when only interleaving).
5093 if (MaxFactors.FixedVF.isVector() || MaxFactors.ScalableVF.isVector())
5094 Legal->collectUnitStridePredicates();
5095
5096 auto VPlan1 = tryToBuildVPlan1(*CM);
5097 if (!VPlan1)
5098 return;
5099
5100 LLVM_DEBUG(dbgs() << "LV: VPlan created successfully. Loop can be "
5101 "vectorized.\n");
5102
5103 if (!OrigLoop->isInnermost()) {
5104 // For outer loops, computeMaxVF returns a single non-scalar VF; build a
5105 // plan for that VF only.
5106 ElementCount VF =
5107 MaxFactors.FixedVF ? MaxFactors.FixedVF : MaxFactors.ScalableVF;
5108 buildVPlans(*VPlan1, VF, VF, *CM);
5110 return;
5111 }
5112
5113 // Compute the minimal bitwidths required for integer operations in the loop
5114 // for later use by the cost model.
5115 Config.computeMinimalBitwidths();
5116
5117 // Invalidate interleave groups if all blocks of loop will be predicated.
5118 if (CM->blockNeedsPredicationForAnyReason(OrigLoop->getHeader()) &&
5119 !useMaskedInterleavedAccesses(Opts, TTI)) {
5120 LLVM_DEBUG(
5121 dbgs()
5122 << "LV: Invalidate all interleaved groups due to fold-tail by masking "
5123 "which requires masked-interleaved support.\n");
5124 if (CM->InterleaveInfo.invalidateGroups())
5125 // Invalidating interleave groups also requires invalidating all decisions
5126 // based on them, which includes widening decisions and uniform and scalar
5127 // values.
5128 CM->invalidateCostModelingDecisions();
5129 }
5130
5131 if (CM->foldTailByMasking())
5132 Legal->prepareToFoldTailByMasking();
5133
5134 ElementCount MaxUserVF =
5135 UserVF.isScalable() ? MaxFactors.ScalableVF : MaxFactors.FixedVF;
5136 if (UserVF) {
5137 if (!ElementCount::isKnownLE(UserVF, MaxUserVF)) {
5139 "UserVF ignored because it may be larger than the maximal safe VF",
5140 "InvalidUserVF", ORE, OrigLoop);
5141 } else {
5142 assert(UserVF.isPowerOf2() && "VF needs to be a power of two");
5143 // Collect the instructions (and their associated costs) that will be more
5144 // profitable to scalarize.
5145 CM->collectNonVectorizedAndSetWideningDecisions(UserVF);
5146 buildVPlans(*VPlan1, UserVF, UserVF, *CM);
5148 if (EpilogueUserVF.isVector() &&
5149 ElementCount::isKnownLT(EpilogueUserVF, UserVF)) {
5150 CM->collectNonVectorizedAndSetWideningDecisions(EpilogueUserVF);
5151 buildVPlans(*VPlan1, EpilogueUserVF, EpilogueUserVF, *CM);
5152 }
5153 if (!VPlans.empty() && VPlans.front()->getSingleVF() == UserVF) {
5154 // For scalar VF, skip VPlan cost check as VPlan cost is designed for
5155 // vector VFs only.
5156 if (UserVF.isScalar() ||
5157 cost(*VPlans.front(), UserVF, /*RU=*/nullptr, *CM).isValid()) {
5158 LLVM_DEBUG(dbgs() << "LV: Using user VF " << UserVF << ".\n");
5160 return;
5161 }
5162 }
5163 VPlans.clear();
5164 reportVectorizationInfo("UserVF ignored because of invalid costs.",
5165 "InvalidCost", ORE, OrigLoop);
5166 }
5167 }
5168
5169 // Collect the Vectorization Factor Candidates.
5170 SmallVector<ElementCount> VFCandidates;
5171 for (auto VF = ElementCount::getFixed(1);
5172 ElementCount::isKnownLE(VF, MaxFactors.FixedVF); VF *= 2)
5173 VFCandidates.push_back(VF);
5174 for (auto VF = ElementCount::getScalable(1);
5175 ElementCount::isKnownLE(VF, MaxFactors.ScalableVF); VF *= 2)
5176 VFCandidates.push_back(VF);
5177
5178 for (const auto &VF : VFCandidates) {
5179 // Collect Uniform and Scalar instructions after vectorization with VF.
5180 CM->collectNonVectorizedAndSetWideningDecisions(VF);
5181 }
5182
5183 buildVPlans(*VPlan1, ElementCount::getFixed(1), MaxFactors.FixedVF, *CM);
5184 buildVPlans(*VPlan1, ElementCount::getScalable(1), MaxFactors.ScalableVF,
5185 *CM);
5186
5188}
5189
5193 bool ReusePrintingSlotTracker)
5194 : Opts(Config.getOpts()), TTI(Config.getTTI()), TLI(TLI),
5195 LLVMCtx(Plan.getContext()), CM(CM), Config(Config),
5196 CostKind(Config.CostKind), PSE(Config.getPSE()), L(Config.getLoop()) {
5197#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5198 if (ReusePrintingSlotTracker)
5199 PlanForSlotTracker = &Plan;
5200#endif
5201}
5202
5204 ElementCount VF) const {
5205 InstructionCost Cost = CM.getInstructionCost(UI, VF);
5206 if (Cost.isValid() && Opts.force_target_instruction_cost)
5207 return InstructionCost(*Opts.force_target_instruction_cost);
5208 return Cost;
5209}
5210
5211bool VPCostContext::skipCostComputation(Instruction *UI, bool IsVector) const {
5212 return CM.ValuesToIgnore.contains(UI) ||
5213 (IsVector && CM.VecValuesToIgnore.contains(UI)) ||
5214 SkipCostComputation.contains(UI);
5215}
5216
5222
5224 return CM.isScalarWithPredication(I, VF) ||
5225 CM.isUniformAfterVectorization(I, VF) || CM.isForcedScalar(I, VF) ||
5226 (VF.isVector() && CM.isProfitableToScalarize(I, VF));
5227}
5228
5230 return CM.isMaskRequired(I);
5231}
5232
5236 return TC && TC->getValue().ule(VF.getKnownMinValue());
5237}
5238
5240LoopVectorizationPlanner::precomputeCosts(VPlan &Plan, ElementCount VF,
5241 VPCostContext &CostCtx) const {
5243
5244 // If the vector loop gets executed exactly once with the given VF, ignore the
5245 // costs of comparison and induction instructions, as they'll get simplified
5246 // away.
5247 // TODO: Remove this code after stepping away from the legacy cost model and
5248 // adding code to simplify VPlans before calculating their costs.
5249 auto TC = getSmallConstantTripCount(PSE.getSE(), OrigLoop);
5250 if (TC == VF && !Plan.hasTailFolded())
5251 addFullyUnrolledInstructionsToIgnore(OrigLoop, Legal->getInductionVars(),
5252 CostCtx.SkipCostComputation);
5253
5254 // Pre-compute the costs for branches except for the backedge, as the number
5255 // of replicate regions in a VPlan may not directly match the number of
5256 // branches, which would lead to different decisions.
5257 // TODO: Compute cost of branches for each replicate region in the VPlan,
5258 // which is more accurate than the legacy cost model.
5259 for (BasicBlock *BB : OrigLoop->blocks()) {
5260 if (CostCtx.skipCostComputation(BB->getTerminator(), VF.isVector()))
5261 continue;
5262 CostCtx.SkipCostComputation.insert(BB->getTerminator());
5263 if (BB == OrigLoop->getLoopLatch())
5264 continue;
5265 auto BranchCost = CostCtx.getLegacyCost(BB->getTerminator(), VF);
5266 Cost += BranchCost;
5267 }
5268
5269 // Don't apply special costs when instruction cost is forced to make sure the
5270 // forced cost is used for each recipe.
5271 if (Opts.force_target_instruction_cost)
5272 return Cost;
5273
5274 // Pre-compute costs for instructions that are forced-scalar or profitable to
5275 // scalarize. For most such instructions, their scalarization costs are
5276 // accounted for here using the legacy cost model. However, some opcodes
5277 // are excluded from these precomputed scalarization costs and are instead
5278 // modeled later by the VPlan cost model (see UseVPlanCostModel below).
5279 for (Instruction *ForcedScalar : CostCtx.CM.ForcedScalars[VF]) {
5280 if (CostCtx.skipCostComputation(ForcedScalar, VF.isVector()))
5281 continue;
5282 CostCtx.SkipCostComputation.insert(ForcedScalar);
5283 InstructionCost ForcedCost = CostCtx.getLegacyCost(ForcedScalar, VF);
5284 LLVM_DEBUG({
5285 dbgs() << "Cost of " << ForcedCost << " for VF " << VF
5286 << ": forced scalar " << *ForcedScalar << "\n";
5287 });
5288 Cost += ForcedCost;
5289 }
5290
5291 // Don't apply legacy scalarization costs if nothing remains scalar &
5292 // predicated.
5293 if (!hasReplicatorRegion(Plan))
5294 return Cost;
5295
5296 auto UseVPlanCostModel = [](Instruction *I) -> bool {
5297 switch (I->getOpcode()) {
5298 case Instruction::SDiv:
5299 case Instruction::UDiv:
5300 case Instruction::SRem:
5301 case Instruction::URem:
5302 return true;
5303 default:
5304 return false;
5305 }
5306 };
5307 // Only charge legacy scalarization costs for instructions VPlan replicates.
5308 SmallPtrSet<Instruction *, 8> Replicated;
5309 for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
5311 for (VPReplicateRecipe &RepR : make_isa_range<VPReplicateRecipe>(*VPBB))
5312 Replicated.insert(RepR.getUnderlyingInstr());
5313 for (const auto &[Scalarized, ScalarCost] : CostCtx.CM.InstsToScalarize[VF]) {
5314 if (!Replicated.contains(Scalarized) || UseVPlanCostModel(Scalarized) ||
5315 CostCtx.skipCostComputation(Scalarized, VF.isVector()))
5316 continue;
5317 CostCtx.SkipCostComputation.insert(Scalarized);
5318 LLVM_DEBUG({
5319 dbgs() << "Cost of " << ScalarCost << " for VF " << VF
5320 << ": profitable to scalarize " << *Scalarized << "\n";
5321 });
5322 Cost += ScalarCost;
5323 }
5324
5325 return Cost;
5326}
5327
5328#ifndef NDEBUG
5329/// Returns the frequency with which \p VPBB executes, as recorded on its
5330/// recipes. All recipes of a block share the same frequency.
5331static std::optional<VPExecutionFrequency>
5333 if (VPBB->empty())
5334 return std::nullopt;
5335 return cast<VPInstruction>(&VPBB->front())->getExecutionFrequency();
5336}
5337#endif
5338
5340LoopVectorizationPlanner::cost(VPlan &Plan, ElementCount VF,
5341 VPRegisterUsage *RU,
5342 LoopVectorizationCostModel &PlanCM) const {
5343 VPCostContext CostCtx(*TLI, Plan, PlanCM, Config,
5344 /*ReusePrintingSlotTracker=*/true);
5345 InstructionCost Cost = precomputeCosts(Plan, VF, CostCtx);
5346 LLVM_DEBUG(dbgs() << "Precomputed costs for VF " << VF << ": " << Cost
5347 << '\n');
5348
5349 // Now compute and add the VPlan-based cost.
5350 Cost += Plan.cost(VF, CostCtx);
5351
5352 // Add the cost of spills due to excess register usage
5353 if (RU && Config.shouldConsiderRegPressureForVF(VF)) {
5354 InstructionCost SpillCost = RU->spillCost(
5355 TTI, Config.CostKind, Opts.force_target_num_vector_regs.value_or(0));
5356 LLVM_DEBUG(dbgs() << "Spill costs for VF " << VF << ": " << SpillCost
5357 << '\n');
5358 Cost += SpillCost;
5359 }
5360
5361#ifndef NDEBUG
5362 unsigned EstimatedWidth =
5363 estimateElementCount(VF, Config.getVScaleForTuning());
5364 LLVM_DEBUG(dbgs() << "Cost for VF " << VF << ": " << Cost
5365 << " (Estimated cost per lane: ");
5366 if (Cost.isValid()) {
5367 APFloat CostPerLane(APFloat::IEEEdouble());
5368 APFloat EstimatedWidthAsAPFloat(APFloat::IEEEdouble());
5369 (void)CostPerLane.convertFromAPInt(APInt(64, (uint64_t)Cost.getValue()),
5370 false, APFloat::rmTowardZero);
5371 (void)EstimatedWidthAsAPFloat.convertFromAPInt(
5372 APInt(64, (uint64_t)EstimatedWidth), false, APFloat::rmTowardZero);
5373 (void)CostPerLane.divide(EstimatedWidthAsAPFloat, APFloat::rmTowardZero);
5374
5375 SmallString<16> Str;
5376 CostPerLane.toString(Str, 3);
5377 LLVM_DEBUG(dbgs() << Str);
5378 } else /* No point dividing an invalid cost - it will still be invalid */
5379 LLVM_DEBUG(dbgs() << "Invalid");
5380 LLVM_DEBUG(dbgs() << ")\n");
5381#endif
5382 return Cost;
5383}
5384
5385std::pair<VectorizationFactor, VPlan *>
5387 if (VPlans.empty())
5388 return {VectorizationFactor::Disabled(), nullptr};
5389 // If there is a single VPlan with a single VF, return it directly.
5390 VPlan &FirstPlan = *VPlans[0];
5391
5392 ElementCount UserVF = Config.getHints().getWidth();
5393 if (VPlans.size() == 1) {
5394 // For outer loops, the plan has a single vector VF determined by the
5395 // heuristic.
5396 assert((FirstPlan.hasScalarVFOnly() || hasPlanWithVF(UserVF) ||
5397 FirstPlan.isOuterLoop()) &&
5398 "must have a single scalar VF, UserVF or an outer loop");
5399 return {VectorizationFactor(FirstPlan.getSingleVF(), 0, 0), &FirstPlan};
5400 }
5401
5402 if (hasPlanWithVF(UserVF) && hasForcedEpilogueVF() && VPlans.size() == 2) {
5403 assert(VPlans[0]->getSingleVF() == UserVF &&
5404 "expected second plan to be for the forced UserVF");
5405 assert(VPlans[1]->getSingleVF() == EpilogueVectorizationForceVF &&
5406 "expected first plan to be for the forced epilogue VF");
5407 return {VectorizationFactor(UserVF, 0, 0), VPlans[0].get()};
5408 }
5409
5410 LLVM_DEBUG(dbgs() << "LV: Computing best VF using cost kind: "
5411 << (Config.CostKind == TTI::TCK_RecipThroughput
5412 ? "Reciprocal Throughput\n"
5413 : Config.CostKind == TTI::TCK_Latency
5414 ? "Instruction Latency\n"
5415 : Config.CostKind == TTI::TCK_CodeSize ? "Code Size\n"
5416 : Config.CostKind == TTI::TCK_SizeAndLatency
5417 ? "Code Size and Latency\n"
5418 : "Unknown\n"));
5419
5421 assert(FirstPlan.hasVF(ScalarVF) &&
5422 "More than a single plan/VF w/o any plan having scalar VF");
5423
5424 // TODO: Compute scalar cost using VPlan-based cost model.
5425 InstructionCost ScalarCost = CM->expectedCost(ScalarVF);
5426 LLVM_DEBUG(dbgs() << "LV: Scalar loop costs: " << ScalarCost << ".\n");
5427 VectorizationFactor ScalarFactor(ScalarVF, ScalarCost, ScalarCost);
5428 VectorizationFactor BestFactor = ScalarFactor;
5429
5430 bool ForceVectorization =
5431 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
5432 if (ForceVectorization) {
5433 // Ignore scalar width, because the user explicitly wants vectorization.
5434 // Initialize cost to max so that VF = 2 is, at least, chosen during cost
5435 // evaluation.
5436 BestFactor.Cost = InstructionCost::getMax();
5437 }
5438
5439 VPlan *PlanForBestVF = &FirstPlan;
5440 ElementCount ExactTC = getSmallConstantTripCount(PSE.getSE(), OrigLoop);
5441
5442 for (auto &P : VPlans) {
5443 ArrayRef<ElementCount> VFs(P->vectorFactors().begin(),
5444 P->vectorFactors().end());
5445
5446 // For loops where the Trip Count is below the TailFoldingThreshold, only
5447 // consider the largest VF to result in at most one vector iteration, and at
5448 // most one scalar iteration.
5449 // FIXME: Encode this decision directly in LVPlanner.
5450 if (!ForceVectorization && P->hasScalarTail() && ExactTC.isFixed() &&
5451 ExactTC.getFixedValue() > 0 &&
5452 ExactTC.getFixedValue() <= TTI.getMinTripCountTailFoldingThreshold()) {
5453 VFs = VFs.take_back(1);
5454 }
5455
5457 bool ConsiderRegPressure = any_of(VFs, [this](ElementCount VF) {
5458 return Config.shouldConsiderRegPressureForVF(VF);
5459 });
5460 if (ConsiderRegPressure)
5461 RUs = calculateRegisterUsageForPlan(*P, VFs, TTI);
5462
5463 for (unsigned I = 0; I < VFs.size(); I++) {
5464 ElementCount VF = VFs[I];
5465 if (VF.isScalar())
5466 continue;
5467 if (!ForceVectorization && !willGenerateVectors(*P, VF, TTI)) {
5468 LLVM_DEBUG(
5469 dbgs()
5470 << "LV: Not considering vector loop of width " << VF
5471 << " because it will not generate any vector instructions.\n");
5472 continue;
5473 }
5474 if (Config.OptForSize && !ForceVectorization && hasReplicatorRegion(*P)) {
5475 LLVM_DEBUG(
5476 dbgs()
5477 << "LV: Not considering vector loop of width " << VF
5478 << " because it would cause replicated blocks to be generated,"
5479 << " which isn't allowed when optimizing for size.\n");
5480 continue;
5481 }
5482
5484 cost(*P, VF, ConsiderRegPressure ? &RUs[I] : nullptr, *CM);
5485 VectorizationFactor CurrentFactor(VF, Cost, ScalarCost);
5486
5487 if (isMoreProfitable(CurrentFactor, BestFactor, P->hasScalarTail())) {
5488 BestFactor = CurrentFactor;
5489 PlanForBestVF = P.get();
5490 }
5491
5492 // If profitable add it to ProfitableVF list.
5493 if (isMoreProfitable(CurrentFactor, ScalarFactor, P->hasScalarTail()))
5494 ProfitableVFs.push_back(CurrentFactor);
5495 }
5496 }
5497
5498 VPlan &BestPlan = *PlanForBestVF;
5499
5500 assert((BestFactor.Width.isScalar() || BestFactor.ScalarCost > 0) &&
5501 "when vectorizing, the scalar cost must be computed.");
5502
5503 LLVM_DEBUG(dbgs() << "LV: Selecting VF: " << BestFactor.Width << ".\n");
5504 return {BestFactor, &BestPlan};
5505}
5506
5508 Loop *L, LoopInfo *LI, DominatorTree *DT, const TargetLibraryInfo *TLI,
5510 std::unique_ptr<LoopVectorizationCostModel> CM, VFSelectionContext &Config,
5512 std::function<const BranchProbabilityInfo &()> GetBPI)
5513 : Opts(Config.getOpts()), OrigLoop(L), LI(LI), DT(DT), TLI(TLI), TTI(TTI),
5514 Legal(Legal), CM(std::move(CM)), Config(Config), PSE(PSE), ORE(ORE),
5515 GetBPI(GetBPI) {}
5516
5518
5520
5522 ElementCount BestVF, unsigned BestUF, VPlan &BestVPlan,
5524 EpilogueVectorizationKind EpilogueVecKind,
5525 MutableArrayRef<VPBasicBlock *> TrackedBlocks) {
5526 assert(BestVPlan.hasVF(BestVF) &&
5527 "Trying to execute plan with unsupported VF");
5528 assert(BestVPlan.hasUF(BestUF) &&
5529 "Trying to execute plan with unsupported UF");
5530 if (BestVPlan.hasEarlyExit())
5531 ++LoopsEarlyExitVectorized;
5532
5534 *PSE.getSE(), TTI, Config.CostKind, BestVF, BestUF);
5535 if (!BestVPlan.hasTailFolded() &&
5536 TTI.hasMultiVectorLoadStore(BestUF,
5539 BestUF, TTI);
5540 // TODO: Move to VPlan transform stage once the transition to the VPlan-based
5541 // cost model is complete for better cost estimates.
5542 RUN_VPLAN_PASS(VPlanTransforms::unrollByUF, BestVPlan, BestUF);
5546 bool HasBranchWeights =
5547 hasBranchWeightMD(*OrigLoop->getLoopLatch()->getTerminator());
5548 if (HasBranchWeights) {
5549 std::optional<unsigned> VScale = Config.getVScaleForTuning();
5551 BestVPlan, BestVF, VScale);
5552 }
5553
5554 if (vputils::findIncomingAliasMask(BestVPlan)) {
5555 assert(BestVPlan.hasTailFolded() && "Expected tail folding to be enabled");
5557 *Legal->getRuntimePointerChecking()->getDiffChecks(),
5558 HasBranchWeights);
5559 ++LoopsPartialAliasVectorized;
5560 }
5561
5562 // Retrieving VectorPH now when it's easier while VPlan still has Regions.
5563 VPBasicBlock *VectorPH = cast<VPBasicBlock>(BestVPlan.getVectorPreheader());
5564
5566 BestVF, BestUF, PSE);
5567 RUN_VPLAN_PASS(VPlanTransforms::optimizeForVFAndUF, BestVPlan, BestVF, BestUF,
5568 PSE);
5570 // Check if scalar epilogue is required, before simplifying constant branches.
5571 const bool RequiresScalarEpilogue = BestVPlan.requiresScalarEpilogue();
5572 if (EpilogueVecKind == EpilogueVectorizationKind::None)
5574 /*OnlyLatches=*/false);
5575 if (BestVPlan.getEntry()->getSingleSuccessor() ==
5576 BestVPlan.getScalarPreheader()) {
5577 // TODO: The vector loop would be dead, should not even try to vectorize.
5578 ORE->emit([&]() {
5579 return OptimizationRemarkAnalysis(DEBUG_TYPE, "VectorizationDead",
5580 OrigLoop->getStartLoc(),
5581 OrigLoop->getHeader())
5582 << "Created vector loop never executes due to insufficient trip "
5583 "count.";
5584 });
5586 }
5587
5589
5591 // Convert the exit condition to AVLNext == 0 for EVL tail folded loops.
5593 // Regions are dissolved after optimizing for VF and UF, which completely
5594 // removes unneeded loop regions first.
5595 const bool HasTailFolded = BestVPlan.hasTailFolded();
5597 // Expand BranchOnTwoConds after dissolution, when latch has direct access to
5598 // its successors.
5600 // Convert loops with variable-length stepping after regions are dissolved.
5602 // Remove dead back-edges for single-iteration loops with BranchOnCond(true).
5603 // Only process loop latches to avoid removing edges from the middle block,
5604 // which may be needed for epilogue vectorization.
5606 /*OnlyLatches=*/true);
5607 std::optional<uint64_t> MaxRuntimeStep = getMaxRuntimeElementCount(
5608 BestVF * BestUF, *OrigLoop->getHeader()->getParent());
5609
5610 assert((LI->getUniqueLatchExitBlock(*OrigLoop) || RequiresScalarEpilogue) &&
5611 "loops not exiting via the latch without required epilogue?");
5613 VectorPH, HasTailFolded, RequiresScalarEpilogue,
5614 &BestVPlan.getVFxUF(), MaxRuntimeStep);
5616 BestVF);
5617 // Limit expansions to VPInstruction to when not vectorizing the epilogue.
5618 // Currently this code path still relies on code re-using SCEVs expanded
5619 // directly to IR instructions.
5620 if (EpilogueVecKind == EpilogueVectorizationKind::None)
5622 *PSE.getSE());
5623 RUN_VPLAN_PASS(VPlanTransforms::cse, BestVPlan, VPDominatorTree(BestVPlan));
5625 // Removing branches and incoming values may expose additional simplification
5626 // opportunities.
5628 /*OnlyLatches=*/EpilogueVecKind !=
5631 RUN_VPLAN_PASS(VPlanTransforms::simplifyKnownEVL, BestVPlan, BestVF, PSE);
5632
5633 // 0. Generate SCEV-dependent code in the entry, including TripCount, before
5634 // making any changes to the CFG.
5635 DenseMap<const SCEV *, Value *> ExpandedSCEVs =
5636 RUN_VPLAN_PASS(VPlanTransforms::expandSCEVs, BestVPlan, *PSE.getSE());
5637
5638 // Perform the actual loop transformation.
5639 VPTransformState State(&TTI, BestVF, LI, DT, ILV.AC, ILV.Builder, &BestVPlan,
5640 OrigLoop->getParentLoop());
5641
5642#ifdef EXPENSIVE_CHECKS
5643 assert(DT->verify(DominatorTree::VerificationLevel::Fast));
5644#endif
5645
5646 // 1. Create the scalar preheader; all other blocks are created during VPlan
5647 // execution.
5648 State.CFG.PrevBB = OrigLoop->getLoopPreheader();
5649 assert(State.CFG.PrevBB && "Invalid loop structure");
5650 BasicBlock *ScalarPHBB = SplitBlock(
5651 State.CFG.PrevBB, State.CFG.PrevBB->getTerminator(), DT, LI, nullptr,
5652 EpilogueVecKind == EpilogueVectorizationKind::Epilogue
5653 ? "vec.epilog.scalar.ph"
5654 : "scalar.ph");
5655 if (VPBasicBlock *ScalarPH = BestVPlan.getScalarPreheader())
5656 replaceVPBBWithIRVPBB(ScalarPH, ScalarPHBB, &BestVPlan);
5658
5659 assert(verifyVPlanIsValid(BestVPlan) && "final VPlan is invalid");
5660
5661 // After vectorization, the exit blocks of the original loop will have
5662 // additional predecessors. Invalidate SCEVs for the exit phis in case SE
5663 // looked through single-entry phis.
5664 ScalarEvolution &SE = *PSE.getSE();
5665 for (VPIRBasicBlock *Exit : BestVPlan.getExitBlocks()) {
5666 if (!Exit->hasPredecessors())
5667 continue;
5668 for (VPRecipeBase &PhiR : Exit->phis())
5670 &cast<VPIRPhi>(PhiR).getIRPhi());
5671 }
5672
5673 // Query whether the target wants loops it vectorizes to remain eligible for
5674 // runtime unrolling. Do this here, on the original loop and before its SCEV
5675 // is forgotten below.
5677 TTI.getUnrollingPreferences(OrigLoop, SE, UP, ORE);
5678 bool UnrollVectorizedLoop = UP.UnrollVectorizedLoop;
5679
5680 // Forget the original loop and block dispositions.
5681 SE.forgetLoop(OrigLoop);
5683
5684 //===------------------------------------------------===//
5685 //
5686 // Notice: any optimization or new instruction that go
5687 // into the code below should also be implemented in
5688 // the cost-model.
5689 //
5690 //===------------------------------------------------===//
5691
5692 // Retrieve loop information before executing the plan, which may remove the
5693 // original loop, if it becomes unreachable.
5694 MDNode *LID = OrigLoop->getLoopID();
5695 unsigned OrigLoopInvocationWeight = 0;
5696 std::optional<unsigned> OrigAverageTripCount =
5697 getLoopEstimatedTripCount(OrigLoop, &OrigLoopInvocationWeight);
5698
5699 BestVPlan.execute(&State);
5700
5701 // 2.6. Maintain Loop Hints
5702 // Keep all loop hints from the original loop on the vector loop (we'll
5703 // replace the vectorizer-specific hints below).
5704 VPBasicBlock *HeaderVPBB = vputils::getFirstLoopHeader(BestVPlan, State.VPDT);
5705 // Add metadata to disable runtime unrolling a scalar loop when there
5706 // are no runtime checks about strides and memory. A scalar loop that is
5707 // rarely used is not worth unrolling.
5708 bool DisableRuntimeUnroll = !ILV.RTChecks.hasChecks() && !BestVF.isScalar();
5710 HeaderVPBB ? LI->getLoopFor(State.CFG.VPBB2IRBB.lookup(HeaderVPBB))
5711 : nullptr,
5712 HeaderVPBB, BestVPlan,
5713 EpilogueVecKind == EpilogueVectorizationKind::Epilogue, LID,
5714 OrigAverageTripCount, OrigLoopInvocationWeight,
5715 estimateElementCount(BestVF * BestUF, Config.getVScaleForTuning()),
5716 DisableRuntimeUnroll, UnrollVectorizedLoop);
5717
5718 // 3. Fix the vectorized code: take care of header phi's, live-outs,
5719 // predication, updating analyses.
5720 ILV.fixVectorizedLoop(State);
5721
5722 // Wrap the generated blocks in VPIRBasicBlocks, so they can be used in the
5723 // epilogue plan.
5724 if (EpilogueVecKind == EpilogueVectorizationKind::MainLoop)
5726 vp_depth_first_shallow(BestVPlan.getEntry()))))
5727 if (!isa<VPIRBasicBlock>(VPBB)) {
5729 VPBB, State.CFG.VPBB2IRBB.at(VPBB), &BestVPlan);
5730 replace(TrackedBlocks, VPBB, IRVPBB);
5731 }
5732
5733 return ExpandedSCEVs;
5734}
5735
5737 return CM.isPredicatedInst(I);
5738}
5739
5741 return CM.TTI.prefersVectorizedAddressing();
5742}
5743
5745 VFRange &Range) {
5746 assert((VPI->getOpcode() == Instruction::Load ||
5747 VPI->getOpcode() == Instruction::Store) &&
5748 "Must be called with either a load or store");
5750
5751 auto WillWiden = [&](ElementCount VF) -> bool {
5753 CM.getWideningDecision(I, VF);
5755 "CM decision should be taken at this point.");
5757 return true;
5758 if (CM.isScalarAfterVectorization(I, VF) ||
5759 CM.isProfitableToScalarize(I, VF))
5760 return false;
5762 };
5763
5765 return nullptr;
5766
5767 // If a mask is not required, drop it - use unmasked version for safe loads.
5768 // TODO: Determine if mask is needed in VPlan.
5769 VPValue *Mask = CM.isMaskRequired(I) ? VPI->getMask() : nullptr;
5770
5771 // Determine if the pointer operand of the access is either consecutive or
5772 // reverse consecutive.
5774 CM.getWideningDecision(I, Range.Start);
5776 bool Consecutive =
5778
5779 VPValue *Ptr = VPI->getOpcode() == Instruction::Load ? VPI->getOperand(0)
5780 : VPI->getOperand(1);
5781 Builder.setInsertPoint(VPI);
5782 if (Consecutive) {
5783 Ptr = Builder.createConsecutiveVectorPointer(Ptr, getLoadStoreType(I),
5784 Reverse, VPI->getDebugLoc());
5785 }
5786
5787 if (Reverse && Mask)
5788 Mask = Builder.createNaryOp(VPInstruction::Reverse, Mask, I->getDebugLoc());
5789
5790 if (VPI->getOpcode() == Instruction::Load) {
5791 auto *Load = cast<LoadInst>(I);
5792 auto *LoadR = Builder.createWidenLoad(*Load, Ptr, Mask, Consecutive, *VPI,
5793 Load->getDebugLoc());
5794 if (Reverse)
5795 return Builder.createNaryOp(VPInstruction::Reverse, LoadR,
5796 LoadR->getDebugLoc());
5797 return LoadR;
5798 }
5799
5801 VPValue *StoredVal = VPI->getOperand(0);
5802 if (Reverse)
5803 StoredVal = Builder.createNaryOp(VPInstruction::Reverse, StoredVal,
5804 Store->getDebugLoc());
5805 return Builder.createWidenStore(*Store, Ptr, StoredVal, Mask, Consecutive,
5806 *VPI, Store->getDebugLoc());
5807}
5808
5809bool VPRecipeBuilder::shouldWiden(Instruction *I, VFRange &Range) const {
5811 "Instruction should have been handled earlier");
5812 // Instruction should be widened, unless it is scalar after vectorization,
5813 // scalarization is profitable or it is predicated.
5814 auto WillScalarize = [this, I](ElementCount VF) -> bool {
5815 return CM.isScalarAfterVectorization(I, VF) ||
5816 CM.isProfitableToScalarize(I, VF) ||
5817 CM.isScalarWithPredication(I, VF);
5818 };
5820 Range);
5821}
5822
5823VPRecipeWithIRFlags *VPRecipeBuilder::tryToWiden(VPInstruction *VPI) {
5824 auto *I = VPI->getUnderlyingInstr();
5825 switch (VPI->getOpcode()) {
5826 default:
5827 return nullptr;
5828 case Instruction::SDiv:
5829 case Instruction::UDiv:
5830 case Instruction::SRem:
5831 case Instruction::URem:
5832 // If not provably safe, use a masked intrinsic.
5833 if (CM.isPredicatedInst(I))
5834 return new VPWidenIntrinsicRecipe(
5836 I->getType(), {}, {}, VPI->getDebugLoc());
5837 [[fallthrough]];
5838 case Instruction::Add:
5839 case Instruction::And:
5840 case Instruction::AShr:
5841 case Instruction::FAdd:
5842 case Instruction::FCmp:
5843 case Instruction::FDiv:
5844 case Instruction::FMul:
5845 case Instruction::FNeg:
5846 case Instruction::FRem:
5847 case Instruction::FSub:
5848 case Instruction::ICmp:
5849 case Instruction::LShr:
5850 case Instruction::Mul:
5851 case Instruction::Or:
5852 case Instruction::Select:
5853 case Instruction::Shl:
5854 case Instruction::Sub:
5855 case Instruction::Xor:
5856 case Instruction::Freeze:
5857 case Instruction::ExtractValue:
5858 return new VPWidenRecipe(*I, VPI->operandsWithoutMask(), *VPI, *VPI,
5859 VPI->getDebugLoc());
5860 };
5861}
5862
5864 if (VPI->getOpcode() != Instruction::Store)
5865 return nullptr;
5866
5867 const HistogramInfo *HistInfo =
5868 Legal->getHistogramInfo(cast<StoreInst>(VPI->getUnderlyingInstr()));
5869 if (!HistInfo)
5870 return nullptr;
5871
5873 // Bucket address.
5874 HGramOps.push_back(VPI->getOperand(1));
5875 // Increment value.
5876 HGramOps.push_back(Plan.getOrAddLiveIn(HistInfo->Update->getOperand(1)));
5877
5878 // In case of predicated execution (due to tail-folding, or conditional
5879 // execution, or both), pass the relevant mask.
5880 if (CM.isMaskRequired(HistInfo->Store))
5881 HGramOps.push_back(VPI->getMask());
5882
5883 return new VPHistogramRecipe(HistInfo->UpdateKind, HGramOps,
5884 cast<VPIRMetadata>(*VPI), VPI->getDebugLoc());
5885}
5886
5888 VPInstruction *VPI, VPBuilder &FinalRedStoresBuilder) {
5889 StoreInst *SI;
5890 if ((SI = dyn_cast<StoreInst>(VPI->getUnderlyingInstr())) &&
5891 Legal->isInvariantAddressOfReduction(SI->getPointerOperand())) {
5892 // Only create recipe for the final invariant store of the reduction.
5893 if (Legal->isInvariantStoreOfReduction(SI)) {
5894 VPValue *Val = VPI->getOperand(0);
5895 VPValue *Addr = VPI->getOperand(1);
5896 // We need to store the exiting value of the reduction, so use the blend
5897 // if tail folded.
5899 Val = Blend;
5900 [[maybe_unused]] auto *Rdx =
5902 assert((isa<VPIRValue>(Val) || !Rdx || Rdx->getBackedgeValue() == Val) &&
5903 "Store of reduction thats not the backedge value?");
5904 auto *Recipe = new VPReplicateRecipe(
5905 SI, {Val, Addr}, true /* IsUniform */, nullptr /*Mask*/, *VPI, *VPI,
5906 VPI->getDebugLoc());
5907 FinalRedStoresBuilder.insert(Recipe);
5908 }
5909 VPI->eraseFromParent();
5910 return true;
5911 }
5912
5913 return false;
5914}
5915
5917 VFRange &Range) {
5918 auto *I = VPI->getUnderlyingInstr();
5920 [&](ElementCount VF) { return CM.isUniformAfterVectorization(I, VF); },
5921 Range);
5922
5923 bool IsPredicated = CM.isPredicatedInst(I);
5924
5925 // Even if the instruction is not marked as uniform, there are certain
5926 // intrinsic calls that can be effectively treated as such, so we check for
5927 // them here. Conservatively, we only do this for scalable vectors, since
5928 // for fixed-width VFs we can always fall back on full scalarization.
5929 if (!IsUniform && Range.Start.isScalable() && isa<IntrinsicInst>(I)) {
5930 switch (cast<IntrinsicInst>(I)->getIntrinsicID()) {
5931 case Intrinsic::assume:
5932 case Intrinsic::lifetime_start:
5933 case Intrinsic::lifetime_end:
5934 // For scalable vectors if one of the operands is variant then we still
5935 // want to mark as uniform, which will generate one instruction for just
5936 // the first lane of the vector. We can't scalarize the call in the same
5937 // way as for fixed-width vectors because we don't know how many lanes
5938 // there are.
5939 //
5940 // The reasons for doing it this way for scalable vectors are:
5941 // 1. For the assume intrinsic generating the instruction for the first
5942 // lane is still be better than not generating any at all. For
5943 // example, the input may be a splat across all lanes.
5944 // 2. For the lifetime start/end intrinsics the pointer operand only
5945 // does anything useful when the input comes from a stack object,
5946 // which suggests it should always be uniform. For non-stack objects
5947 // the effect is to poison the object, which still allows us to
5948 // remove the call.
5949 IsUniform = true;
5950 break;
5951 default:
5952 break;
5953 }
5954 }
5955 VPValue *BlockInMask = nullptr;
5956 if (!IsPredicated) {
5957 // Finalize the recipe for Instr, first if it is not predicated.
5958 LLVM_DEBUG(dbgs() << "LV: Scalarizing:" << *I << "\n");
5959 } else {
5960 LLVM_DEBUG(dbgs() << "LV: Scalarizing and predicating:" << *I << "\n");
5961 // Instructions marked for predication are replicated and a mask operand is
5962 // added initially. Masked replicate recipes will later be placed under an
5963 // if-then construct to prevent side-effects. Generate recipes to compute
5964 // the block mask for this region.
5965 BlockInMask = VPI->getMask();
5966 }
5967
5968 // Note that there is some custom logic to mark some intrinsics as uniform
5969 // manually above for scalable vectors, which this assert needs to account for
5970 // as well.
5971 assert((Range.Start.isScalar() || !IsUniform || !IsPredicated ||
5972 (Range.Start.isScalable() && isa<IntrinsicInst>(I))) &&
5973 "Should not predicate a uniform recipe");
5974 if (IsUniform) {
5976 VPI->getOpcode(), VPI->operandsWithoutMask(), BlockInMask, *VPI, *VPI,
5977 VPI->getDebugLoc(), VPI->getScalarType(), I);
5978 }
5979 auto *Recipe = new VPReplicateRecipe(I, VPI->operandsWithoutMask(),
5980 /*IsSingleScalar=*/false, BlockInMask,
5981 *VPI, *VPI, VPI->getDebugLoc());
5982 return Recipe;
5983}
5984
5987 VFRange &Range) {
5988 assert(!R->isPhi() && "phis must be handled earlier");
5989 auto *VPI = cast<VPInstruction>(R);
5990 assert(VPI->getOpcode() != Instruction::Call &&
5991 "Call should have been handled by makeCallWideningDecisions");
5992
5993 // All widen recipes below deal only with VF > 1.
5995 [&](ElementCount VF) { return VF.isScalar(); }, Range))
5996 return nullptr;
5997
5998 Instruction *Instr = R->getUnderlyingInstr();
5999 assert(!is_contained({Instruction::Load, Instruction::Store},
6000 VPI->getOpcode()) &&
6001 "Should have been handled prior to this!");
6002
6003 // An extractvalue takes the shape of its operand: we cannot extract a lane
6004 // from a widened struct, nor build a struct from replicated lanes.
6005 if (VPI->getOpcode() == Instruction::ExtractValue &&
6007 if (VPRecipeBase *OpR = VPI->getOperand(0)->getDefiningRecipe())
6009 return tryToWiden(VPI);
6010 if (VPI->getOpcode() == Instruction::ExtractValue)
6011 return new VPReplicateRecipe(Instr, VPI->operandsWithoutMask(),
6013 /*Mask=*/nullptr, *VPI, *VPI,
6014 VPI->getDebugLoc());
6015
6016 if (!shouldWiden(Instr, Range))
6017 return nullptr;
6018
6019 if (VPI->getOpcode() == Instruction::GetElementPtr) {
6020 auto *GEP = cast<GetElementPtrInst>(Instr);
6021 return new VPWidenGEPRecipe(GEP->getSourceElementType(),
6022 VPI->operandsWithoutMask(), *VPI,
6023 VPI->getDebugLoc(), GEP);
6024 }
6025
6026 if (Instruction::isCast(VPI->getOpcode())) {
6027 auto *CI = cast<CastInst>(Instr);
6028 return new VPWidenCastRecipe(CI->getOpcode(), VPI->getOperand(0),
6029 VPI->getScalarType(), CI, *VPI, *VPI,
6030 VPI->getDebugLoc());
6031 }
6032
6033 return tryToWiden(VPI);
6034}
6035
6036// To allow RUN_VPLAN_PASS to print the VPlan after VF/UF independent
6037// optimizations.
6039
6040#ifndef NDEBUG
6041/// Cross-check the execution frequencies recorded in \p Plan against
6042/// BlockFrequencyInfo for the blocks of \p OrigLoop.
6043/// FIXME: Temporary verification aid, to be removed.
6044static bool verifyExecutionFrequenciesMatchBFI(VPlan &Plan, Loop *OrigLoop,
6045 LoopInfo *LI,
6047 // Limited to loops with the latch as only exiting block
6048 if (OrigLoop->getExitingBlock() != OrigLoop->getLoopLatch())
6049 return true;
6050
6051 // Visit the loop body in the same order as recordExecutionFrequencies. Both
6052 // are reverse post-orders of the same CFG, so indices correspond.
6055 assert(Blocks.size() == OrigLoop->getNumBlocks() &&
6056 "loop body and original loop must have the same blocks");
6057
6058 LoopBlocksRPO OrigRPO(OrigLoop);
6059 OrigRPO.perform(LI);
6060
6061 // Only request the expensive BFI once the cheap bail-outs are past.
6062 BlockFrequencyInfo &BFI = CM.getBFI();
6063 uint64_t HeaderFreq = BFI.getBlockFreq(OrigLoop->getHeader()).getFrequency();
6064 if (HeaderFreq == 0)
6065 return true;
6066
6067 // BFI's fixed-point mass propagation loses up to 1 ULP per edge, so bound the
6068 // error by the number of edges in the region.
6069 uint64_t Edges = 0;
6070 for (const VPBasicBlock *VPBB : Blocks)
6071 Edges += VPBB->getNumSuccessors();
6072 uint64_t Tolerance = Edges + BranchProbability::getDenominator() / HeaderFreq;
6073
6074 for (const auto &[VPBB, BB] :
6075 zip_equal(drop_begin(Blocks), drop_begin(OrigRPO))) {
6076 // Nothing to check for blocks without a recorded frequency.
6077 std::optional<VPExecutionFrequency> Freq =
6079 if (!Freq)
6080 continue;
6082
6083 // Clamp to the header's frequency, which BFI's rounding may exceed.
6086 std::min(BBFreq, HeaderFreq), HeaderFreq);
6087 if (AbsoluteDifference(Computed.getNumerator(), Expected.getNumerator()) <=
6088 Tolerance)
6089 continue;
6090
6091 errs() << "Block frequency mismatch for " << VPBB->getName() << ": VPlan "
6092 << Computed << ", BlockFrequencyInfo " << Expected << "\n";
6093 return false;
6094 }
6095 return true;
6096}
6097#endif
6098
6100LoopVectorizationPlanner::tryToBuildVPlan1(LoopVectorizationCostModel &PlanCM) {
6101 bool IsInnerLoop = OrigLoop->isInnermost();
6102
6103 // Set up loop versioning for inner loops with memory runtime checks.
6104 // Outer loops don't have LoopAccessInfo since canVectorizeMemory() is not
6105 // called for them.
6106 std::optional<LoopVersioning> LVer;
6107 if (IsInnerLoop) {
6108 const LoopAccessInfo *LAI = Legal->getLAI();
6109 LVer.emplace(*LAI, LAI->getRuntimePointerChecking()->getChecks(), OrigLoop,
6110 LI, DT, PSE.getSE());
6111 if (!LAI->getRuntimePointerChecking()->getChecks().empty() &&
6113 // Only use noalias metadata when using memory checks guaranteeing no
6114 // overlap across all iterations.
6115 LVer->prepareNoAliasMetadata();
6116 }
6117 }
6118
6119 // Create initial base VPlan0, to serve as common starting point for all
6120 // candidates built later for specific VF ranges.
6121 auto VPlan0 = VPlanTransforms::buildVPlan0(
6122 OrigLoop, *LI, Legal->getWidestInductionType(), PSE,
6123 LVer ? &*LVer : nullptr, GetBPI);
6124
6125 VPDominatorTree VPDT(*VPlan0);
6126 if (const LoopAccessInfo *LAI = Legal->getLAI())
6128 LAI->getSymbolicStrides(), VPDT);
6131 if (IsInnerLoop) {
6133 assert(verifyExecutionFrequenciesMatchBFI(*VPlan0, OrigLoop, LI, PlanCM) &&
6134 "execution frequencies do not match the loop's block frequencies");
6135 }
6136
6137 // Create recipes for header phis. For outer loops, reductions, recurrences
6138 // and in-loop reductions are empty since legality doesn't detect them.
6139 if (!RUN_VPLAN_PASS(
6140 VPlanTransforms::createHeaderPhiRecipes, *VPlan0, PSE, *OrigLoop, ORE,
6141 VPDT, Legal->getInductionVars(), Legal->getReductionVars(),
6142 Legal->getFixedOrderRecurrences(), Config.getInLoopReductions(),
6143 Config.getHints().allowReordering())) {
6144 return nullptr;
6145 }
6146
6147 if (const LoopAccessInfo *LAI = Legal->getLAI())
6149 LAI->getSymbolicStrides(), VPDT);
6150
6151 // Without -vplan-outer-loop-legality-checks, trust the explicit vectorization
6152 // pragma that vectorizing the outer loop is safe.
6153 if (!IsInnerLoop && Opts.vplan_outer_loop_legality_checks &&
6154 !proveOuterLoopMemorySafety(*VPlan0, PSE, *Legal->getAA(), VPDT,
6155 OrigLoop)) {
6157 "Cannot prove outer loop memory accesses safe",
6158 "cannot prove memory accesses in outer loop are safe to vectorize",
6159 "CantProveOuterLoopMemSafety", ORE, OrigLoop);
6160 return nullptr;
6161 }
6162
6163 // Add surviving induction predicates to PSE and check constraints.
6164 bool ForceVectorization =
6165 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
6166 bool OptForSize =
6167 !ForceVectorization &&
6168 (PlanCM.EpilogueLoweringStatus == CM_EpilogueNotAllowedOptSize ||
6169 PlanCM.EpilogueLoweringStatus == CM_EpilogueNotAllowedLowTripLoop);
6170 unsigned SCEVCheckThreshold = ForceVectorization
6171 ? Opts.pragma_vectorize_scev_check_threshold
6172 : Opts.vectorize_scev_check_threshold;
6174 OptForSize, SCEVCheckThreshold, ORE, OrigLoop))
6175 return nullptr;
6176
6178
6179 // If we're vectorizing a loop with an uncountable exit, make sure that the
6180 // recipes are safe to handle.
6181 // TODO: Remove this once we can properly check the VPlan itself for the
6182 // presence of an uncountable exit.
6183 if (Legal->hasUncountableEarlyExit()) {
6185 OrigLoop))
6186 return nullptr;
6187
6188 // TODO: Check target preference for style.
6191 ORE, OrigLoop, PSE, *DT, Legal->getAssumptionCache(),
6192 EEStyle)) {
6193 return nullptr;
6194 }
6195 } else {
6197 }
6198
6200 getDebugLocFromInstOrOperands(Legal->getPrimaryInduction()));
6201 if (PlanCM.foldTailByMasking())
6203
6205
6206 return VPlan0;
6207}
6208
6209void LoopVectorizationPlanner::buildVPlans(VPlan &VPlan1, ElementCount MinVF,
6210 ElementCount MaxVF,
6212 if (ElementCount::isKnownGT(MinVF, MaxVF))
6213 return;
6214
6215 auto MaxVFTimes2 = MaxVF * 2;
6216 for (ElementCount VF = MinVF; ElementCount::isKnownLT(VF, MaxVFTimes2);) {
6217 VFRange SubRange = {VF, MaxVFTimes2};
6218 auto Plan = tryToBuildVPlan(std::unique_ptr<VPlan>(VPlan1.duplicate()),
6219 SubRange, PlanCM);
6220 VF = SubRange.End;
6221
6222 if (!Plan)
6223 continue;
6224
6225 // Now optimize the initial VPlan.
6229 Config.getMinimalBitwidths());
6231 // TODO: try to put addExplicitVectorLength close to addActiveLaneMask
6232 if (PlanCM.foldTailWithEVL()) {
6234 Config.getMaxSafeElements());
6236 }
6237
6238 if (auto P =
6240 VPlans.push_back(std::move(P));
6241
6244 useActiveLaneMask(Style),
6246
6248 assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
6249 VPlans.push_back(std::move(Plan));
6250 }
6251}
6252
6254LoopVectorizationPlanner::tryToBuildVPlan(VPlanPtr Plan, VFRange &Range,
6256
6257 // For outer loops, the plan only needs basic recipe conversion and induction
6258 // live-out optimization; the full inner-loop recipe building below does not
6259 // apply (no widening decisions, interleave groups, reductions, etc.).
6260 if (Plan->isOuterLoop()) {
6261 for (ElementCount VF : Range)
6262 Plan->addVF(VF);
6264 *Plan, *TLI, PSE, OrigLoop))
6265 return nullptr;
6267 OrigLoop);
6268 return Plan;
6269 }
6270
6271 using namespace llvm::VPlanPatternMatch;
6272 SmallPtrSet<const InterleaveGroup<Instruction> *, 1> InterleaveGroups;
6273
6274 // ---------------------------------------------------------------------------
6275 // Build initial VPlan: Scan the body of the loop in a topological order to
6276 // visit each basic block after having visited its predecessor basic blocks.
6277 // ---------------------------------------------------------------------------
6278
6279 bool RequiresScalarEpilogueCheck =
6281 [&PlanCM](ElementCount VF) {
6282 return !PlanCM.requiresScalarEpilogue(VF.isVector());
6283 },
6284 Range);
6285 // Update the branch in the middle block if a scalar epilogue is required.
6286 VPBasicBlock *MiddleVPBB = Plan->getMiddleBlock();
6287 if (!RequiresScalarEpilogueCheck && MiddleVPBB->getNumSuccessors() == 2) {
6288 auto *BranchOnCond = cast<VPInstruction>(MiddleVPBB->getTerminator());
6289 assert(MiddleVPBB->getSuccessors()[1] == Plan->getScalarPreheader() &&
6290 "second successor must be scalar preheader");
6291 BranchOnCond->setOperand(0, Plan->getFalse());
6292 }
6293
6294 // Don't use getDecisionAndClampRange here, because we don't know the UF
6295 // so this function is better to be conservative, rather than to split
6296 // it up into different VPlans.
6297 // TODO: Consider using getDecisionAndClampRange here to split up VPlans.
6298 bool IVUpdateMayOverflow = false;
6299 for (ElementCount VF : Range)
6300 IVUpdateMayOverflow |= !isIndvarOverflowCheckKnownFalse(Opts, &PlanCM, VF);
6301
6303 // Use NUW for the induction increment if we proved that it won't overflow in
6304 // the vector loop or when not folding the tail. In the later case, we know
6305 // that the canonical induction increment will not overflow as the vector trip
6306 // count is >= increment and a multiple of the increment.
6307 VPRegionBlock *LoopRegion = Plan->getVectorLoopRegion();
6308 bool HasNUW = !IVUpdateMayOverflow || Style == TailFoldingStyle::None;
6309 if (!HasNUW) {
6310 auto *IVInc =
6311 LoopRegion->getExitingBasicBlock()->getTerminator()->getOperand(0);
6312 assert(match(IVInc,
6313 m_VPInstruction<Instruction::Add>(
6314 m_Specific(LoopRegion->getCanonicalIV()), m_VPValue())) &&
6315 "Did not find the canonical IV increment");
6316 LoopRegion->clearCanonicalIVNUW(cast<VPInstruction>(IVInc));
6317 }
6318
6319 // ---------------------------------------------------------------------------
6320 // Pre-construction: record ingredients whose recipes we'll need to further
6321 // process after constructing the initial VPlan.
6322 // ---------------------------------------------------------------------------
6323
6324 // For each interleave group which is relevant for this (possibly trimmed)
6325 // Range, add it to the set of groups to be later applied to the VPlan and add
6326 // placeholders for its members' Recipes which we'll be replacing with a
6327 // single VPInterleaveRecipe.
6328 for (InterleaveGroup<Instruction> *IG :
6330 auto ApplyIG = [IG, &PlanCM](ElementCount VF) -> bool {
6331 bool Result = (VF.isVector() && // Query is illegal for VF == 1
6332 PlanCM.getWideningDecision(IG->getInsertPos(), VF) ==
6334 // For scalable vectors, the interleave factors must be <= 8 since we
6335 // require the (de)interleaveN intrinsics instead of shufflevectors.
6336 assert((!Result || !VF.isScalable() || IG->getFactor() <= 8) &&
6337 "Unsupported interleave factor for scalable vectors");
6338 return Result;
6339 };
6340 if (!getDecisionAndClampRange(ApplyIG, Range))
6341 continue;
6342 InterleaveGroups.insert(IG);
6343 }
6344
6345 // ---------------------------------------------------------------------------
6346 // Construct wide recipes and apply predication for original scalar
6347 // VPInstructions in the loop.
6348 // ---------------------------------------------------------------------------
6349 VPRecipeBuilder RecipeBuilder(*Plan, Legal, PlanCM, Builder);
6350
6352 Range.Start);
6353
6354 VPCostContext CostCtx(*TLI, *Plan, PlanCM, Config);
6355
6357 RecipeBuilder, CostCtx);
6358
6360
6361 // Widened calls may only use the first lane of some operands.
6363 RecipeBuilder, CostCtx))
6365
6367 PSE);
6368
6369 // Convert remaining VPInstructions to widen or replicate recipes.
6370 // TODO: This legacy code should eventually be migrated to VPlan.
6371 VPBasicBlock *HeaderVPBB = LoopRegion->getEntryBasicBlock();
6372 for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
6373 vp_depth_first_shallow(HeaderVPBB))) {
6374 // All types but VPInstructions are already widened and don't need extra
6375 // processing. We process VPInstructions below.
6376 assert(
6377 all_of(
6378 make_range(VPBB->getFirstNonPhi(), VPBB->end()),
6379 IsaPred<VPWidenCanonicalIVRecipe, VPBlendRecipe, VPReductionRecipe,
6380 VPReplicateRecipe, VPWidenLoadRecipe, VPWidenStoreRecipe,
6381 VPWidenCallRecipe, VPWidenIntrinsicRecipe,
6382 VPVectorPointerRecipe, VPVectorEndPointerRecipe,
6383 VPHistogramRecipe, VPInstruction>) &&
6384 "Unexpected recipe");
6385 for (VPInstruction &VPI :
6387 // We represent single-scalar casts directly as VPInstructions.
6388 if (Instruction::isCast(VPI.getOpcode()) &&
6390 continue;
6391
6392 // Only VPInstructions with an underlying value need to be processed.
6393 if (!VPI.getUnderlyingValue())
6394 continue;
6395
6396 Builder.setInsertPoint(&VPI);
6397
6398 VPRecipeBase *Recipe =
6399 RecipeBuilder.tryToCreateWidenNonPhiRecipe(&VPI, Range);
6400 if (!Recipe)
6401 Recipe = RecipeBuilder.handleReplication(&VPI, Range);
6402 Builder.insert(Recipe);
6403
6404 if (Recipe->getNumDefinedValues() == 1) {
6405 VPI.replaceAllUsesWith(Recipe->getVPSingleValue());
6406 } else {
6407 assert(Recipe->getNumDefinedValues() == 0 &&
6408 "Unexpected multidef recipe");
6409 }
6410 VPI.eraseFromParent();
6411 }
6412 }
6413
6414 assert(isa<VPRegionBlock>(LoopRegion) &&
6415 !LoopRegion->getEntryBasicBlock()->empty() &&
6416 "entry block must be set to a VPRegionBlock having a non-empty entry "
6417 "VPBasicBlock");
6418
6420 Range);
6421
6422 // ---------------------------------------------------------------------------
6423 // Transform initial VPlan: Apply previously taken decisions, in order, to
6424 // bring the VPlan to its final state.
6425 // ---------------------------------------------------------------------------
6426
6427 addReductionResultComputation(Plan, Range.Start, PlanCM);
6428
6429 // Optimize FindIV reductions to use sentinel-based approach when possible.
6431 *OrigLoop);
6433 OrigLoop);
6434
6435 // Apply mandatory transformation to handle reductions with multiple in-loop
6436 // uses if possible, bail out otherwise.
6438 OrigLoop))
6439 return nullptr;
6440 // Apply mandatory transformation to handle FP maxnum/minnum reduction with
6441 // NaNs if possible, bail out otherwise.
6443 return nullptr;
6444
6445 // Create whole-vector selects for find-last recurrences.
6447 return nullptr;
6448
6450
6451 // Create partial reduction recipes for scaled reductions and transform
6452 // recipes to abstract recipes if it is legal and beneficial and clamp the
6453 // range for better cost estimation.
6455 Range);
6457 Range);
6458
6459 // Interleave memory: for each Interleave Group we marked earlier as relevant
6460 // for this VPlan, replace the Recipes widening its memory instructions with a
6461 // single VPInterleaveRecipe at its insertion point.
6463 InterleaveGroups, PlanCM.isEpilogueAllowed());
6464
6465 // Convert memory recipes to strided access recipes if the strided access is
6466 // legal and profitable.
6468 *OrigLoop, CostCtx, Range);
6469
6470 // Ensure scalar VF plans only contain VF=1, as required by hasScalarVFOnly.
6471 if (Range.Start.isScalar())
6472 Range.End = Range.Start * 2;
6473
6474 for (ElementCount VF : Range)
6475 Plan->addVF(VF);
6476 Plan->setName("Initial VPlan");
6477
6479
6480 if (PlanCM.maskPartialAliasing())
6482
6483 assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
6484 return Plan;
6485}
6486
6487void LoopVectorizationPlanner::addReductionResultComputation(
6488 VPlanPtr &Plan, ElementCount MinVF, LoopVectorizationCostModel &PlanCM) {
6489 using namespace VPlanPatternMatch;
6490 VPRegionBlock *VectorLoopRegion = Plan->getVectorLoopRegion();
6491 VPBasicBlock *MiddleVPBB = Plan->getMiddleBlock();
6492 VPBasicBlock *LatchVPBB = VectorLoopRegion->getExitingBasicBlock();
6493 Builder.setInsertPoint(&*std::prev(std::prev(LatchVPBB->end())));
6494 VPBasicBlock::iterator IP = MiddleVPBB->getFirstNonPhi();
6495 VPValue *HeaderMask = Plan->getVectorLoopRegion()->getHeaderMask();
6496 for (VPRecipeBase &R : make_early_inc_range(
6497 Plan->getVectorLoopRegion()->getEntryBasicBlock()->phis())) {
6498 VPReductionPHIRecipe *PhiR = dyn_cast<VPReductionPHIRecipe>(&R);
6499 if (!PhiR)
6500 continue;
6501
6502 // Clean up reductions that have become invariant.
6503 if (PhiR->getBackedgeValue() == PhiR) {
6504 PhiR->replaceAllUsesWith(PhiR->getStartValue());
6505 PhiR->eraseFromParent();
6506 continue;
6507 }
6508
6509 RecurKind RecurrenceKind = PhiR->getRecurrenceKind();
6510 const RecurrenceDescriptor &RdxDesc = Legal->getRecurrenceDescriptor(
6512 Type *PhiTy = PhiR->getScalarType();
6513
6514 // Convert a VPBlendRecipe backedge to a select.
6515 if (auto *Blend = dyn_cast<VPBlendRecipe>(PhiR->getBackedgeValue())) {
6516 if (Blend->getNumIncomingValues() == 2 &&
6517 Blend->getMask(0) == HeaderMask) {
6518 auto *Sel = VPBuilder(Blend).createSelect(
6519 Blend->getMask(0), Blend->getIncomingValue(0),
6520 Blend->getIncomingValue(1), {}, "", *Blend);
6521 Blend->replaceAllUsesWith(Sel);
6522 Blend->eraseFromParent();
6523 }
6524 }
6525
6526 auto *OrigExitingVPV = PhiR->getBackedgeValue();
6527 auto *NewExitingVPV = OrigExitingVPV;
6528
6529 // Remove the predicated select if the target doesn't want it.
6530 VPValue *V;
6531 if (!PlanCM.usePredicatedReductionSelect(
6532 RecurrenceKind, PhiR->hasUsesOutsideReductionChain()) &&
6533 match(PhiR->getBackedgeValue(),
6534 m_Select(m_Specific(HeaderMask), m_VPValue(V), m_Specific(PhiR))))
6535 PhiR->setBackedgeValue(V);
6536
6537 // We want code in the middle block to appear to execute on the location of
6538 // the scalar loop's latch terminator because: (a) it is all compiler
6539 // generated, (b) these instructions are always executed after evaluating
6540 // the latch conditional branch, and (c) other passes may add new
6541 // predecessors which terminate on this line. This is the easiest way to
6542 // ensure we don't accidentally cause an extra step back into the loop while
6543 // debugging.
6544 DebugLoc ExitDL = OrigLoop->getLoopLatch()->getTerminator()->getDebugLoc();
6545
6546 // TODO: At the moment ComputeReductionResult also drives creation of the
6547 // bc.merge.rdx phi nodes, hence it needs to be created unconditionally here
6548 // even for in-loop reductions, until the reduction resume value handling is
6549 // also modeled in VPlan.
6550 VPInstruction *FinalReductionResult;
6551 VPBuilder::InsertPointGuard Guard(Builder);
6552 Builder.setInsertPoint(MiddleVPBB, IP);
6553 // For AnyOf reductions, find the select among PhiR's users and convert
6554 // the reduction phi to operate on bools before creating the final
6555 // reduction result.
6556 if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RecurrenceKind)) {
6557 auto *AnyOfSelect = findSingleUser<VPSingleDefRecipe>(
6558 PhiR,
6559 m_Select(m_Unless(m_Specific(HeaderMask)), m_VPValue(), m_VPValue()));
6560 VPValue *Start = PhiR->getStartValue();
6561 bool TrueValIsPhi = AnyOfSelect->getOperand(1) == PhiR;
6562 // NewVal is the non-phi operand of the select.
6563 VPValue *NewVal = TrueValIsPhi ? AnyOfSelect->getOperand(2)
6564 : AnyOfSelect->getOperand(1);
6565
6566 // Adjust AnyOf reductions; replace the reduction phi for the selected
6567 // value with a boolean reduction phi node to check if the condition is
6568 // true in any iteration. The final value is selected by the final
6569 // ComputeReductionResult.
6570 VPValue *Cmp = AnyOfSelect->getOperand(0);
6571 // If the compare is checking the reduction PHI node, adjust it to check
6572 // the start value.
6573 if (VPRecipeBase *CmpR = Cmp->getDefiningRecipe())
6574 CmpR->replaceUsesOfWith(PhiR, PhiR->getStartValue());
6575 Builder.setInsertPoint(AnyOfSelect);
6576
6577 // If the true value of the select is the reduction phi, the new value
6578 // is selected if the negated condition is true in any iteration.
6579 if (TrueValIsPhi)
6580 Cmp = Builder.createNot(Cmp);
6581
6582 // Build a fresh i1 chain (phi, or, and i1 versions of any blend/select
6583 // the exiting value flows through).
6584 auto *NewPhiR =
6585 PhiR->cloneWithOperands(Plan->getFalse(), Plan->getFalse());
6586 NewPhiR->insertBefore(PhiR);
6587 VPValue *NewExiting = Builder.createOr(NewPhiR, Cmp);
6588
6589 // The exiting value may flow through a chain of VPBlendRecipes and
6590 // select recipes (VPInstruction, VPWidenRecipe or VPReplicateRecipe with
6591 // Select opcode) before reaching OrigExitingVPV. Clone each chain link
6592 // in topological order so each clone refers to the already-rewritten i1
6593 // operands via Substitutions.
6594 DenseMap<VPValue *, VPValue *> Substitutions = {{AnyOfSelect, NewExiting},
6595 {PhiR, NewPhiR}};
6596 std::function<void(VPSingleDefRecipe *)> CloneChain =
6597 [&](VPSingleDefRecipe *Old) {
6598 if (Substitutions.contains(Old))
6599 return;
6601 for (VPValue *Op : Old->operands()) {
6602 if (isa<VPBlendRecipe>(Op) ||
6604 CloneChain(cast<VPSingleDefRecipe>(Op));
6605 NewOps.push_back(Substitutions.lookup_or(Op, Op));
6606 }
6607 VPSingleDefRecipe *New;
6608 if (auto *B = dyn_cast<VPBlendRecipe>(Old))
6609 New = B->cloneWithOperands(NewOps);
6610 else if (auto *W = dyn_cast<VPWidenRecipe>(Old))
6611 New = W->cloneWithOperands(NewOps);
6612 else if (auto *Rep = dyn_cast<VPReplicateRecipe>(Old))
6613 New = Rep->cloneWithOperands(NewOps);
6614 else
6615 New = cast<VPInstruction>(Old)->cloneWithOperands(NewOps);
6616 New->insertBefore(Old);
6617 Substitutions[Old] = New;
6618 };
6619
6620 if (OrigExitingVPV != AnyOfSelect) {
6621 CloneChain(cast<VPSingleDefRecipe>(OrigExitingVPV));
6622 NewExiting = Substitutions.lookup(OrigExitingVPV);
6623 }
6624 NewPhiR->setOperand(1, NewExiting);
6625 PhiR->replaceAllUsesWith(Plan->getPoison(PhiR->getScalarType()));
6626
6627 Builder.setInsertPoint(MiddleVPBB, IP);
6628 FinalReductionResult =
6629 Builder.createAnyOfReduction(NewExiting, NewVal, Start, ExitDL);
6630 } else {
6631 // If the vector reduction can be performed in a smaller type, we
6632 // truncate then extend the loop exit value to enable InstCombine to
6633 // evaluate the entire expression in the smaller type.
6634 VPValue *ReductionOp = NewExitingVPV;
6635 Instruction::CastOps ExtendOpc = Instruction::CastOpsEnd;
6636 if (MinVF.isVector() && PhiTy != RdxDesc.getRecurrenceType()) {
6637 assert(!PhiR->isInLoop() && "Unexpected truncated inloop reduction!");
6639 "Unexpected truncated min-max recurrence!");
6640 Type *RdxTy = RdxDesc.getRecurrenceType();
6641 ExtendOpc = RdxDesc.isSigned() ? Instruction::SExt : Instruction::ZExt;
6642 {
6643 VPBuilder::InsertPointGuard Guard(Builder);
6644 Builder.setInsertPoint(
6645 NewExitingVPV->getDefiningRecipe()->getParent(),
6646 std::next(NewExitingVPV->getDefiningRecipe()->getIterator()));
6647 ReductionOp =
6648 Builder.createWidenCast(Instruction::Trunc, NewExitingVPV, RdxTy);
6649 VPWidenCastRecipe *Extnd =
6650 Builder.createWidenCast(ExtendOpc, ReductionOp, PhiTy);
6651 if (PhiR->getOperand(1) == NewExitingVPV)
6652 PhiR->setOperand(1, Extnd);
6653 }
6654 }
6655
6656 VPIRFlags Flags(RecurrenceKind, PhiR->isOrdered(), PhiR->isInLoop(),
6657 PhiR->getFastMathFlagsOrNone());
6658 FinalReductionResult = Builder.createNaryOp(
6659 VPInstruction::ComputeReductionResult, {ReductionOp}, Flags, ExitDL);
6660 if (ExtendOpc != Instruction::CastOpsEnd)
6661 FinalReductionResult = Builder.createScalarCast(
6662 ExtendOpc, FinalReductionResult, PhiTy, {});
6663 }
6664
6665 // Update all users outside the vector region. Also replace redundant
6666 // extracts.
6667 for (auto *U : to_vector(OrigExitingVPV->users())) {
6668 auto *Parent = cast<VPRecipeBase>(U)->getParent();
6669 if (FinalReductionResult == U || Parent->getParent())
6670 continue;
6671 // Skip ComputeReductionResult and FindIV reductions when they are not the
6672 // final result.
6673 if (match(U, m_VPInstruction<VPInstruction::ComputeReductionResult>()) ||
6675 match(U, m_VPInstruction<Instruction::ICmp>())))
6676 continue;
6677 U->replaceUsesOfWith(OrigExitingVPV, FinalReductionResult);
6678
6679 // Look through ExtractLastPart.
6681 U = cast<VPInstruction>(U)->getSingleUser();
6682
6685 cast<VPInstruction>(U)->replaceAllUsesWith(FinalReductionResult);
6686 }
6687
6688 RecurKind RK = PhiR->getRecurrenceKind();
6693 VPBuilder PHBuilder(Plan->getVectorPreheader());
6694 VPValue *Iden = Plan->getOrAddLiveIn(
6695 getRecurrenceIdentity(RK, PhiTy, PhiR->getFastMathFlagsOrNone()));
6696 auto *ScaleFactorVPV = Plan->getConstantInt(32, 1);
6697 VPValue *StartV = PHBuilder.createNaryOp(
6699 {PhiR->getStartValue(), Iden, ScaleFactorVPV}, *PhiR);
6700 PhiR->setOperand(0, StartV);
6701 }
6702 }
6703
6705}
6706
6708 VPlan &Plan, GeneratedRTChecks &RTChecks, ElementCount VF, unsigned UF,
6709 bool HasBranchWeights) const {
6710 const auto &[SCEVCheckCond, SCEVCheckBlock] = RTChecks.getSCEVChecks();
6711 if (SCEVCheckBlock && SCEVCheckBlock->hasNPredecessors(0)) {
6712 assert((!Config.OptForSize ||
6713 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled) &&
6714 "Cannot SCEV check stride or overflow when optimizing for size");
6716 SCEVCheckBlock, HasBranchWeights);
6717 }
6718 const auto &[MemCheckCond, MemCheckBlock] = RTChecks.getMemRuntimeChecks();
6719 if (MemCheckBlock && MemCheckBlock->hasNPredecessors(0)) {
6720 // VPlan-native path does not do any analysis for runtime checks
6721 // currently.
6722 assert((!Opts.enable_vplan_native_path || !Plan.isOuterLoop()) &&
6723 "Runtime checks are not supported for outer loops yet");
6724
6725 if (Config.OptForSize) {
6726 assert(
6727 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled &&
6728 "Cannot emit memory checks when optimizing for size, unless forced "
6729 "to vectorize.");
6730 ORE->emit([&]() {
6731 return OptimizationRemarkAnalysis(DEBUG_TYPE, "VectorizationCodeSize",
6732 OrigLoop->getStartLoc(),
6733 OrigLoop->getHeader())
6734 << "Code-size may be reduced by not forcing "
6735 "vectorization, or by source-code modifications "
6736 "eliminating the need for runtime checks "
6737 "(e.g., adding 'restrict').";
6738 });
6739 }
6740 const auto &RtPtrChecking = *Legal->getRuntimePointerChecking();
6741 // Erase the temporary IR before recipe expansion can reuse its values.
6742 RTChecks.eraseMemCheckBlock();
6744 OrigLoop, *PSE.getSE(), VF, UF, HasBranchWeights);
6745 }
6746}
6747
6749 VPlan &Plan, ElementCount VF, unsigned UF,
6750 ElementCount MinProfitableTripCount) const {
6751 const uint32_t *BranchWeights =
6752 hasBranchWeightMD(*OrigLoop->getLoopLatch()->getTerminator())
6754 : nullptr;
6756 MinProfitableTripCount, Plan.requiresScalarEpilogue(),
6757 Plan.hasTailFolded(), OrigLoop, BranchWeights,
6758 OrigLoop->getLoopPredecessor()->getTerminator()->getDebugLoc(),
6759 PSE, Plan.getEntry());
6760}
6761
6762// Determine how to lower the epilogue, which depends on 1) optimising
6763// for minimum code-size, 2) tail-folding compiler options, 3) loop
6764// hints forcing tail-folding, and 4) a TTI hook that analyses whether the loop
6765// is suitable for tail-folding.
6766// This function determines epilogue lowering for the main vector loop while
6767// epilogue lowering for the tail-folded epilogue path will be handled
6768// separately in getEpilogueTailLowering.
6769static EpilogueLowering
6770getEpilogueLowering(const VectorizeOptions &Opts, Function *F, Loop *L,
6771 LoopVectorizeHints &Hints, bool OptForSize,
6774 InterleavedAccessInfo *IAI) {
6775 // 1) OptSize takes precedence over all other options, i.e. if this is set,
6776 // don't look at hints or options, and don't request an epilogue.
6777 if (F->hasOptSize() ||
6778 (OptForSize && Hints.getForce() != LoopVectorizeHints::FK_Enabled))
6780
6781 // 2) If set, obey the directives
6782 if (Opts.tail_folding_policy) {
6783 switch (*Opts.tail_folding_policy) {
6785 return CM_EpilogueAllowed;
6790 };
6791 }
6792
6793 // 3) If set, obey the hints
6794 switch (Hints.getPredicate()) {
6798 return CM_EpilogueAllowed;
6799 };
6800
6801 // 4) if the TTI hook indicates this is profitable, request tail-folding.
6802 TailFoldingInfo TFI(TLI, &LVL, IAI);
6803 if (TTI->preferTailFoldingOverEpilogue(&TFI))
6805
6806 return CM_EpilogueAllowed;
6807}
6808
6809// Emit a remark if there are stores to floats that required a floating point
6810// extension. If the vectorized loop was generated with floating point there
6811// will be a performance penalty from the conversion overhead and the change in
6812// the vector width.
6815 for (BasicBlock *BB : L->getBlocks()) {
6816 for (Instruction &Inst : *BB) {
6817 if (auto *S = dyn_cast<StoreInst>(&Inst)) {
6818 if (S->getValueOperand()->getType()->isFloatTy())
6819 Worklist.push_back(S);
6820 }
6821 }
6822 }
6823
6824 // Traverse the floating point stores upwards searching, for floating point
6825 // conversions.
6828 while (!Worklist.empty()) {
6829 auto *I = Worklist.pop_back_val();
6830 if (!L->contains(I))
6831 continue;
6832 if (!Visited.insert(I).second)
6833 continue;
6834
6835 // Emit a remark if the floating point store required a floating
6836 // point conversion.
6837 // TODO: More work could be done to identify the root cause such as a
6838 // constant or a function return type and point the user to it.
6839 if (isa<FPExtInst>(I) && EmittedRemark.insert(I).second)
6840 ORE->emit([&]() {
6841 return OptimizationRemarkAnalysis(LV_NAME, "VectorMixedPrecision",
6842 I->getDebugLoc(), L->getHeader())
6843 << "floating point conversion changes vector width. "
6844 << "Mixed floating point precision requires an up/down "
6845 << "cast that will negatively impact performance.";
6846 });
6847
6848 for (Use &Op : I->operands())
6849 if (auto *OpI = dyn_cast<Instruction>(Op))
6850 Worklist.push_back(OpI);
6851 }
6852}
6853
6854/// For loops with uncountable early exits, find the cost of doing work when
6855/// exiting the loop early, such as calculating the final exit values of
6856/// variables used outside the loop.
6857/// TODO: This is currently overly pessimistic because the loop may not take
6858/// the early exit, but better to keep this conservative for now. In future,
6859/// it might be possible to relax this by using branch probabilities.
6861 VPlan &Plan, ElementCount VF) {
6862 InstructionCost Cost = 0;
6863 for (auto *ExitVPBB : Plan.getExitBlocks()) {
6864 for (auto *PredVPBB : ExitVPBB->getPredecessors()) {
6865 // If the predecessor is not the middle.block, then it must be the
6866 // vector.early.exit block, which may contain work to calculate the exit
6867 // values of variables used outside the loop.
6868 if (PredVPBB != Plan.getMiddleBlock()) {
6869 LLVM_DEBUG(dbgs() << "Calculating cost of work in exit block "
6870 << PredVPBB->getName() << ":\n");
6871 Cost += PredVPBB->cost(VF, CostCtx);
6872 }
6873 }
6874 }
6875 return Cost;
6876}
6877
6878/// This function determines whether or not it's still profitable to vectorize
6879/// the loop given the extra work we have to do outside of the loop:
6880/// 1. Perform the runtime checks before entering the loop to ensure it's safe
6881/// to vectorize.
6882/// 2. In the case of loops with uncountable early exits, we may have to do
6883/// extra work when exiting the loop early, such as calculating the final
6884/// exit values of variables used outside the loop.
6885/// 3. The middle block.
6886static bool isOutsideLoopWorkProfitable(GeneratedRTChecks &Checks,
6887 VectorizationFactor &VF, Loop *L,
6889 VPCostContext &CostCtx, VPlan &Plan,
6890 EpilogueLowering SEL,
6891 std::optional<unsigned> VScale) {
6892 InstructionCost RtC = Checks.getCost();
6893 if (!RtC.isValid())
6894 return false;
6895
6896 // When interleaving only scalar and vector cost will be equal, which in turn
6897 // would lead to a divide by 0. Fall back to hard threshold.
6898 if (VF.Width.isScalar()) {
6899 // TODO: Should we rename VectorizeMemoryCheckThreshold?
6901 LLVM_DEBUG(
6902 dbgs()
6903 << "LV: Interleaving only is not profitable due to runtime checks\n");
6904 return false;
6905 }
6906 return true;
6907 }
6908
6909 // The scalar cost should only be 0 when vectorizing with a user specified
6910 // VF/IC. In those cases, runtime checks should always be generated.
6911 uint64_t ScalarC = VF.ScalarCost.getValue();
6912 if (ScalarC == 0)
6913 return true;
6914
6915 InstructionCost TotalCost = RtC;
6916 // Add on the cost of any work required in the vector early exit block, if
6917 // one exists.
6918 TotalCost += calculateEarlyExitCost(CostCtx, Plan, VF.Width);
6919 TotalCost += Plan.getMiddleBlock()->cost(VF.Width, CostCtx);
6920
6921 // First, compute the minimum iteration count required so that the vector
6922 // loop outperforms the scalar loop.
6923 // The total cost of the scalar loop is
6924 // ScalarC * TC
6925 // where
6926 // * TC is the actual trip count of the loop.
6927 // * ScalarC is the cost of a single scalar iteration.
6928 //
6929 // The total cost of the vector loop is
6930 // TotalCost + VecC * (TC / VF) + EpiC
6931 // where
6932 // * TotalCost is the sum of the costs cost of
6933 // - the generated runtime checks, i.e. RtC
6934 // - performing any additional work in the vector.early.exit block for
6935 // loops with uncountable early exits.
6936 // - the middle block, if ExpectedTC <= VF.Width.
6937 // * VecC is the cost of a single vector iteration.
6938 // * TC is the actual trip count of the loop
6939 // * VF is the vectorization factor
6940 // * EpiCost is the cost of the generated epilogue, including the cost
6941 // of the remaining scalar operations.
6942 //
6943 // Vectorization is profitable once the total vector cost is less than the
6944 // total scalar cost:
6945 // TotalCost + VecC * (TC / VF) + EpiC < ScalarC * TC
6946 //
6947 // Now we can compute the minimum required trip count TC as
6948 // VF * (TotalCost + EpiC) / (ScalarC * VF - VecC) < TC
6949 //
6950 // For now we assume the epilogue cost EpiC = 0 for simplicity. Note that
6951 // the computations are performed on doubles, not integers and the result
6952 // is rounded up, hence we get an upper estimate of the TC.
6953 unsigned IntVF = estimateElementCount(VF.Width, VScale);
6954 uint64_t Div = ScalarC * IntVF - VF.Cost.getValue();
6955 uint64_t MinTC1 =
6956 Div == 0 ? 0 : divideCeil(TotalCost.getValue() * IntVF, Div);
6957
6958 // Second, compute a minimum iteration count so that the cost of the
6959 // runtime checks is only a fraction of the total scalar loop cost. This
6960 // adds a loop-dependent bound on the overhead incurred if the runtime
6961 // checks fail. In case the runtime checks fail, the cost is RtC + ScalarC
6962 // * TC. To bound the runtime check to be a fraction 1/X of the scalar
6963 // cost, compute
6964 // RtC < ScalarC * TC * (1 / X) ==> RtC * X / ScalarC < TC
6965 uint64_t MinTC2 = divideCeil(RtC.getValue() * 10, ScalarC);
6966
6967 // Now pick the larger minimum. If it is not a multiple of VF and an epilogue
6968 // is allowed, choose the next closest multiple of VF. This should partly
6969 // compensate for ignoring the epilogue cost.
6970 uint64_t MinTC = std::max(MinTC1, MinTC2);
6971 if (SEL == CM_EpilogueAllowed)
6972 MinTC = alignTo(MinTC, IntVF);
6974
6975 LLVM_DEBUG(
6976 dbgs() << "LV: Minimum required TC for runtime checks to be profitable:"
6977 << VF.MinProfitableTripCount << "\n");
6978
6979 // Skip vectorization if the expected trip count is less than the minimum
6980 // required trip count.
6981 if (auto ExpectedTC = getSmallBestKnownTC(CostCtx.Opts, PSE, L)) {
6982 if (ElementCount::isKnownLT(*ExpectedTC, VF.MinProfitableTripCount)) {
6983 LLVM_DEBUG(dbgs() << "LV: Vectorization is not beneficial: expected "
6984 "trip count < minimum profitable VF ("
6985 << *ExpectedTC << " < " << VF.MinProfitableTripCount
6986 << ")\n");
6987
6988 return false;
6989 }
6990 }
6991 return true;
6992}
6993
6995 : InterleaveOnlyWhenForced(Opts.InterleaveOnlyWhenForced),
6996 VectorizeOnlyWhenForced(Opts.VectorizeOnlyWhenForced) {}
6997
6998/// ResumeForEpilogue markers in the main plan, used by the epilogue plan.
7003
7004/// Prepare \p MainPlan for vectorizing the main vector loop during epilogue
7005/// vectorization.
7007 using namespace VPlanPatternMatch;
7008 // When vectorizing the epilogue, FindFirstIV & FindLastIV reductions can
7009 // introduce multiple uses of undef/poison. If the reduction start value may
7010 // be undef or poison it needs to be frozen and the frozen start has to be
7011 // used when computing the reduction result. We also need to use the frozen
7012 // value in the resume phi generated by the main vector loop, as this is also
7013 // used to compute the reduction result after the epilogue vector loop. The
7014 // epilogue plan re-uses the frozen values.
7015 VPBuilder Builder(MainPlan.getEntry());
7016 for (VPInstruction &VPI :
7018 VPValue *OrigStart;
7019 if (!matchFindIVResult(&VPI, m_VPValue(), m_VPValue(OrigStart)))
7020 continue;
7022 continue;
7023 VPInstruction *Freeze = Builder.createFreeze(OrigStart, {}, "fr");
7024 VPI.setOperand(2, Freeze);
7025 OrigStart->replaceUsesWithIf(Freeze, IsaPred<VPPhi>);
7026 }
7027
7028 VPValue *VectorTC = nullptr;
7029 auto *Term =
7031 [[maybe_unused]] bool MatchedTC =
7032 match(Term, m_BranchOnCount(m_VPValue(), m_VPValue(VectorTC)));
7033 assert(MatchedTC && "must match vector trip count");
7034
7035 VPBasicBlock *MiddleVPBB = MainPlan.getMiddleBlock();
7036 VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
7037 VPInstruction *VectorTCMarker = MiddleBuilder.createNaryOp(
7039 {VectorTC, MainPlan.getZero(VectorTC->getScalarType())});
7040
7041 // Replace the resume phis of the VPIRPhis in the scalar header of the main
7042 // plan by ResumeForEpilogue instructions for their incoming values and return
7043 // them so they can be used as resume values when vectorizing the epilogue.
7044 // The epilogue plan creates the resume phis after the main plan executed.
7045 VPRecipeBase *MiddleTerm = MiddleVPBB->getTerminator();
7046 MiddleBuilder.setInsertPoint(
7047 MiddleVPBB, MiddleTerm ? MiddleTerm->getIterator() : MiddleVPBB->end());
7048 auto ResumeValues = to_vector(
7049 map_range(MainPlan.getScalarHeader()->phis(), [&](VPRecipeBase &R) {
7050 auto *ResumePhi = cast<VPPhi>(R.getOperand(0));
7051 assert(ResumePhi->getNumIncoming() == 2 &&
7052 ResumePhi->getIncomingBlock(0) == MiddleVPBB &&
7053 "expected resume phi merging middle block and bypass value");
7054 return MiddleBuilder.createNaryOp(VPInstruction::ResumeForEpilogue,
7055 ResumePhi->operands());
7056 }));
7057 for (VPRecipeBase &R :
7059 auto *ResumePhi = cast<VPPhi>(&R);
7060 ResumePhi->replaceAllUsesWith(ResumePhi->getOperand(1));
7061 ResumePhi->eraseFromParent();
7062 }
7063 return {VectorTCMarker, std::move(ResumeValues)};
7064}
7065
7066/// Prepare \p Plan for vectorizing the epilogue loop. That is, re-use expanded
7067/// SCEVs from \p ExpandedSCEVs and set resume values for header recipes.
7069 VPlan &MainPlan, VPlan &Plan, const SCEV2ValueTy &ExpandedSCEVs,
7070 ElementCount MainLoopVF, unsigned MainLoopUF, ElementCount EpilogueVF,
7072 const MainPlanResumeMarkers &Markers, VPBasicBlock *MainCheck) {
7073 // Build a map from the scalar-header PHI to the ResumeForEpilogue markers
7074 // from the main plan.
7075 // TODO: Replace the IR PHI key.
7076 DenseMap<PHINode *, VPInstruction *> IRPhiToResumeForEpi;
7077 for (auto [HeaderPhi, ResumeForEpi] :
7078 zip_equal(MainPlan.getScalarHeader()->phis(), Markers.ResumeValues))
7079 IRPhiToResumeForEpi[&cast<VPIRPhi>(HeaderPhi).getIRPhi()] = ResumeForEpi;
7080 VPIRBasicBlock *EpilogueCheck = RUN_VPLAN_PASS(
7081 VPlanTransforms::modelGeneratedMainLoopBlocks, Plan, MainPlan, MainCheck);
7082 VPRegionBlock *VectorLoop = Plan.getVectorLoopRegion();
7083 VPBasicBlock *Header = VectorLoop->getEntryBasicBlock();
7084 Header->setName("vec.epilog.vector.body");
7085
7086 // When skipping the epilogue vector loop, the scalar loop resumes at the
7087 // values computed by the main vector loop.
7088 for (auto [R, ResumeForEpi] :
7089 zip_equal(Plan.getScalarHeader()->phis(), Markers.ResumeValues))
7090 cast<VPPhi>(R.getOperand(0))
7091 ->setIncomingValueForBlock(
7092 EpilogueCheck,
7093 Plan.getOrAddLiveIn(ResumeForEpi->getUnderlyingValue()));
7094
7095 VPBasicBlock *VectorPH = Plan.getVectorPreheader();
7096 assert(VectorPH->getNumPredecessors() == 2 &&
7097 VectorPH->getPredecessors()[0] == EpilogueCheck &&
7098 "vector preheader must be entered from the epilogue check first");
7099 // Returns the value to resume at for \p ResumeForEpi: a phi in the vector
7100 // preheader merging the value computed by the main vector loop with the
7101 // value used when the main vector loop has been bypassed, or the former if
7102 // both are equal.
7103 auto GetResumeValue = [&](VPInstruction *ResumeForEpi,
7104 const Twine &Name) -> VPValue * {
7105 VPValue *MainV = Plan.getOrAddLiveIn(ResumeForEpi->getUnderlyingValue());
7106 VPValue *BypassV =
7107 Plan.getOrAddLiveIn(ResumeForEpi->getOperand(1)->getUnderlyingValue());
7108 if (MainV == BypassV)
7109 return MainV;
7110 return VPBuilder(VectorPH, VectorPH->getFirstNonPhi())
7111 .createScalarPhi({MainV, BypassV}, {}, Name);
7112 };
7113
7114 VPValue *IV = VectorLoop->getCanonicalIV();
7115 // When vectorizing the epilogue loop, the canonical induction needs to start
7116 // at the resume value from the main vector loop. Find the resume value
7117 // created during execution of the main VPlan. Add this resume value as an
7118 // offset to the canonical IV of the epilogue loop.
7119 VPValue *VPV = GetResumeValue(Markers.VectorTC, "vec.epilog.resume.val");
7120 assert(all_of(IV->users(),
7121 [](const VPUser *U) {
7122 if (isa<VPScalarIVStepsRecipe, VPDerivedIVRecipe>(U))
7123 return true;
7124 auto *VPI = dyn_cast<VPInstruction>(U);
7125 if (!VPI)
7126 return false;
7127 // Only users linear in the canonical IV (e.g. scaling it by
7128 // a stride) stay correct when offsetting it below; others,
7129 // like header masks, may need an epilogue-relative IV.
7130 return Instruction::isCast(VPI->getOpcode()) ||
7131 is_contained({Instruction::Add, Instruction::Mul,
7132 Instruction::Shl},
7133 VPI->getOpcode());
7134 }) &&
7135 "the canonical IV should only be used by its increment, casts, "
7136 "stride scaling, ScalarIVSteps or DerivedIV when resetting the start "
7137 "value");
7138 VPBuilder Builder(Header, Header->getFirstNonPhi());
7139 VPInstruction *Add = Builder.createAdd(IV, VPV);
7140 // Replace all users of the canonical IV and its increment with the offset
7141 // version, except for the Add itself and the canonical IV increment.
7143 assert(Increment && "Must have a canonical IV increment at this point");
7144 IV->replaceUsesWithIf(
7145 Add, [Add, Increment](VPUser *U) { return U != Add && U != Increment; });
7146 VPInstruction *OffsetIVInc =
7148 Increment->replaceAllUsesWith(OffsetIVInc);
7149 OffsetIVInc->setOperand(0, Increment);
7150
7151 // Resume values must be created in the vector preheader.
7152 VPBuilder PHBuilder(VectorPH, VectorPH->getFirstNonPhi());
7153
7154 // Ensure that the start values for all header phi recipes are updated before
7155 // vectorizing the epilogue loop.
7156 for (VPRecipeBase &R : Header->phis()) {
7157 VPValue *ResumeVPV = nullptr;
7158 // TODO: Move setting of resume values to prepareToExecute.
7159 if (auto *ReductionPhi = dyn_cast<VPReductionPHIRecipe>(&R)) {
7160 // Find the reduction result by searching users of the phi or its backedge
7161 // value.
7162 auto IsReductionResult = [](VPRecipeBase *R) {
7163 auto *VPI = dyn_cast<VPInstruction>(R);
7164 return VPI && VPI->getOpcode() == VPInstruction::ComputeReductionResult;
7165 };
7166 auto *RdxResult = cast<VPInstruction>(
7167 vputils::findRecipe(ReductionPhi->getBackedgeValue(), IsReductionResult));
7168 assert(RdxResult && "expected to find reduction result");
7169
7170 VPInstruction *ResumeForEpi = IRPhiToResumeForEpi.at(
7171 cast<PHINode>(ReductionPhi->getUnderlyingInstr()));
7172
7173 // Check for FindIV pattern by looking for icmp user of RdxResult.
7174 // The pattern is: select(icmp ne RdxResult, Sentinel), RdxResult, Start
7175 using namespace VPlanPatternMatch;
7176 VPValue *SentinelVPV = nullptr;
7177 bool IsFindIV = any_of(RdxResult->users(), [&](VPUser *U) {
7178 return match(U, VPlanPatternMatch::m_SpecificICmp(
7179 ICmpInst::ICMP_NE, m_Specific(RdxResult),
7180 m_VPValue(SentinelVPV)));
7181 });
7182
7183 RecurKind RK = ReductionPhi->getRecurrenceKind();
7184 ResumeVPV = GetResumeValue(ResumeForEpi, "bc.merge.rdx");
7185 if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RK) || IsFindIV) {
7186 VPValue *BypassOp = ResumeForEpi->getOperand(1);
7187 assert((isa<VPIRValue>(BypassOp) ||
7189 BypassOp,
7190 m_VPInstruction<Instruction::Freeze>(m_VPValue()))) &&
7191 "expected live-in or Freeze");
7192 VPValue *StartV = Plan.getOrAddLiveIn(BypassOp->getUnderlyingValue());
7194 // VPReductionPHIRecipes for AnyOf reductions expect a boolean as
7195 // start value; compare the final value from the main vector loop
7196 // to the start value.
7197 ResumeVPV = PHBuilder.createICmp(CmpInst::ICMP_NE, ResumeVPV, StartV);
7198 } else {
7199 assert(isa<VPIRValue>(SentinelVPV) &&
7200 "sentinel must be a live-in to be used in the preheader");
7201 // Use the start value frozen for the main plan, if any, when
7202 // computing the reduction result.
7203 if (match(BypassOp, m_Freeze(m_VPValue())))
7204 for (VPUser *U : RdxResult->users()) {
7205 auto *VPI = dyn_cast<VPInstruction>(U);
7206 if (VPI && matchFindIVResult(VPI, m_VPValue(), m_VPValue()))
7207 VPI->setOperand(2, StartV);
7208 }
7209
7210 // Adjust resume: select(icmp eq ResumeVPV, StartV), Sentinel,
7211 // ResumeVPV
7212 VPValue *Cmp =
7213 PHBuilder.createICmp(CmpInst::ICMP_EQ, ResumeVPV, StartV);
7214 ResumeVPV = PHBuilder.createSelect(Cmp, SentinelVPV, ResumeVPV);
7215 }
7216 // TODO: materializeBroadcasts does not cover values in the vector
7217 // preheader.
7218 ReductionPhi->setStartValue(
7219 PHBuilder.createNaryOp(VPInstruction::Broadcast, ResumeVPV));
7220 continue;
7221 }
7222 if (auto *VPI = dyn_cast<VPInstruction>(ReductionPhi->getStartValue())) {
7224 "unexpected start value");
7225 // Partial sub-reductions always start at 0 and account for the
7226 // reduction start value in a final subtraction. Update it to use the
7227 // resume value from the main vector loop.
7228 if (ReductionPhi->getVFScaleFactor() > 1 &&
7230 auto *Sub = cast<VPInstruction>(RdxResult->getSingleUser());
7231 assert((Sub->getOpcode() == Instruction::Sub ||
7232 Sub->getOpcode() == Instruction::FSub) &&
7233 "Unexpected opcode");
7234 assert(isa<VPIRValue>(Sub->getOperand(0)) &&
7235 "Expected operand to match the original start value of the "
7236 "reduction");
7237 // For integer sub-reductions, verify start value is zero.
7238 // For FP sub-reductions, verify start value is negative zero.
7239 [[maybe_unused]] auto StartValueIsIdentity = [&] {
7240 Value *IdentityValue =
7241 getRecurrenceIdentity(RK, ResumeVPV->getScalarType(),
7242 ReductionPhi->getFastMathFlagsOrNone());
7243 auto *StartValue = dyn_cast<VPIRValue>(VPI->getOperand(0));
7244 return StartValue && StartValue->getValue() == IdentityValue;
7245 };
7246 assert(StartValueIsIdentity() &&
7247 "Expected start value for partial sub-reduction to be zero "
7248 "(or negative zero)");
7249
7250 Sub->setOperand(0, ResumeVPV);
7251 } else {
7252 // The start vector may be shared by multiple reductions, so create
7253 // a new one using the resume.
7254 auto *NewStart = cast<VPInstruction>(VPI->clone());
7255 NewStart->setOperand(0, ResumeVPV);
7256 NewStart->insertBefore(VPI);
7257 ReductionPhi->setStartValue(NewStart);
7258 }
7259 continue;
7260 }
7261 } else {
7262 // Retrieve the induction resume value via ResumeForEpilogue.
7263 PHINode *IndPhi = cast<VPWidenInductionRecipe>(&R)->getPHINode();
7264 ResumeVPV =
7265 GetResumeValue(IRPhiToResumeForEpi.at(IndPhi), "bc.resume.val");
7266 }
7267 assert(ResumeVPV && "Must have a resume value");
7268 cast<VPHeaderPHIRecipe>(&R)->setStartValue(ResumeVPV);
7269 }
7270
7271 // Re-use the SCEVs expanded for the main loop instead of expanding them
7272 // again, which also lets simplifyLiveInsWithSCEV fold their users.
7273 // TODO: Remove once the epilogue plan uses the main plan's VPValues directly.
7275 make_isa_range<VPExpandSCEVRecipe>(*Plan.getEntry()))) {
7276 assert(ExpandedSCEVs.contains(ExpandR.getSCEV()) &&
7277 "Epilogue plan needs a SCEV not expanded for the main loop");
7278 VPValue *ExpandedVal =
7279 Plan.getOrAddLiveIn(ExpandedSCEVs.lookup(ExpandR.getSCEV()));
7280 ExpandR.replaceAllUsesWith(ExpandedVal);
7281 if (Plan.getTripCount() == &ExpandR)
7282 Plan.resetTripCount(ExpandedVal);
7283 ExpandR.eraseFromParent();
7284 }
7285
7286 auto VScale = Config.getVScaleForTuning();
7287 unsigned MainLoopStep = estimateElementCount(MainLoopVF * MainLoopUF, VScale);
7288 unsigned EpilogueLoopStep = estimateElementCount(EpilogueVF, VScale);
7290 Plan.getOrAddLiveIn(Markers.VectorTC->getUnderlyingValue()),
7291 Plan.requiresScalarEpilogue(), EpilogueVF, MainLoopStep,
7292 EpilogueLoopStep, SE);
7293}
7294
7296 const VectorizeOptions &Opts = getVectorizeOptions(*L);
7297 assert((Opts.enable_vplan_native_path || L->isInnermost()) &&
7298 "VPlan-native path is not enabled. Only process inner loops.");
7299
7300 LLVM_DEBUG(dbgs() << "\nLV: Checking a loop in '"
7301 << L->getHeader()->getParent()->getName() << "' from "
7302 << L->getLocStr() << "\n");
7303
7304 LoopVectorizeHints Hints(
7305 Opts, L, InterleaveOnlyWhenForced || !Opts.interleave_loops, *ORE, TTI);
7306
7307 LLVM_DEBUG(
7308 dbgs() << "LV: Loop hints:"
7309 << " force="
7311 ? "disabled"
7313 ? "enabled"
7314 : "?"))
7315 << " width=" << Hints.getWidth()
7316 << " interleave=" << Hints.getInterleave() << "\n");
7317
7318 // Function containing loop
7319 Function *F = L->getHeader()->getParent();
7320
7321 // Looking at the diagnostic output is the only way to determine if a loop
7322 // was vectorized (other than looking at the IR or machine code), so it
7323 // is important to generate an optimization remark for each loop. Most of
7324 // these messages are generated as OptimizationRemarkAnalysis. Remarks
7325 // generated as OptimizationRemark and OptimizationRemarkMissed are
7326 // less verbose reporting vectorized loops and unvectorized loops that may
7327 // benefit from vectorization, respectively.
7328
7329 if (!Hints.allowVectorization(
7330 F, L, VectorizeOnlyWhenForced || !Opts.vectorize_loops)) {
7331 LLVM_DEBUG(dbgs() << "LV: Loop hints prevent vectorization.\n");
7332 return false;
7333 }
7334
7335 PredicatedScalarEvolution PSE(*SE, *L);
7336
7337 // Query this against the original loop and save it here because the profile
7338 // of the original loop header may change as the transformation happens.
7339 bool OptForSize = llvm::shouldOptimizeForSize(
7340 L->getHeader(), PSI,
7341 PSI && PSI->hasProfileSummary() ? &GetBFI() : nullptr,
7343
7344 // Check if it is legal to vectorize the loop.
7345 LoopVectorizationRequirements Requirements;
7346 LoopVectorizationLegality LVL(Opts, L, PSE, DT, TTI, TLI, F, *LAIs, LI, ORE,
7347 &Requirements, &Hints, DB, AC,
7348 /*AllowRuntimeSCEVChecks=*/!OptForSize, AA);
7349 if (!LVL.canVectorize(Opts.enable_vplan_native_path)) {
7350 LLVM_DEBUG(dbgs() << "LV: Not vectorizing: Cannot prove legality.\n");
7351 Hints.emitRemarkWithHints();
7352 return false;
7353 }
7354
7355 bool IsInnerLoop = L->isInnermost();
7356
7357 // Outer loops require a computable trip count.
7358 if (!IsInnerLoop && isa<SCEVCouldNotCompute>(PSE.getBackedgeTakenCount())) {
7359 LLVM_DEBUG(dbgs() << "LV: cannot compute the outer-loop trip count\n");
7360 return false;
7361 }
7362
7363 if (LVL.hasUncountableEarlyExit()) {
7364 if (!Opts.enable_early_exit_vectorization) {
7365 reportVectorizationFailure("Auto-vectorization of loops with uncountable "
7366 "early exit is not enabled",
7367 "UncountableEarlyExitLoopsDisabled", ORE, L);
7368 return false;
7369 }
7371 !Opts.enable_early_exit_vectorization_with_side_effects) {
7372 reportVectorizationFailure("Auto-vectorization of loops with uncountable "
7373 "early exit and side effects is not enabled",
7374 "UncountableEarlyExitSideEffectLoopsDisabled",
7375 ORE, L);
7376 return false;
7377 }
7378 }
7379
7380 InterleavedAccessInfo IAI(PSE, L, DT, LI, LVL.getLAI(), OptForSize);
7381 // If an override option has been passed in for interleaved accesses, use it.
7382 bool UseInterleaved =
7383 IsInnerLoop && valueOr(Opts.enable_interleaved_mem_accesses,
7384 TTI->enableInterleavedAccessVectorization());
7385
7386 // Analyze interleaved memory accesses.
7387 if (UseInterleaved) {
7389 // If the loop exits from a block other than the latch, the scalar
7390 // iteration reserved for the exit may leave the loop before reaching the
7391 // grouped accesses.
7392 if (L->getExitingBlock() != L->getLoopLatch() &&
7395 }
7396
7397 if (LVL.hasUncountableEarlyExit()) {
7398 BasicBlock *LoopLatch = L->getLoopLatch();
7399 if (IAI.requiresScalarEpilogue() ||
7400 any_of(LVL.getCountableExitingBlocks(), not_equal_to(LoopLatch))) {
7401 reportVectorizationFailure("Auto-vectorization of early exit loops "
7402 "requiring a scalar epilogue is unsupported",
7403 "UncountableEarlyExitUnsupported", ORE, L);
7404 return false;
7405 }
7406 }
7407
7408 // Check the function attributes and profiles to find out if this function
7409 // should be optimized for size.
7410 EpilogueLowering SEL =
7411 getEpilogueLowering(Opts, F, L, Hints, OptForSize, TTI, TLI, LVL, &IAI);
7412
7413 // Check the loop for a trip count threshold: vectorize loops with a tiny trip
7414 // count by optimizing for size, to minimize overheads.
7415 auto ExpectedTC = getSmallBestKnownTC(Opts, PSE, L);
7416 if (ExpectedTC && ExpectedTC->isFixed() &&
7417 ExpectedTC->getFixedValue() < Opts.vectorizer_min_trip_count) {
7418 LLVM_DEBUG(dbgs() << "LV: Found a loop with a very small trip count. "
7419 << "This loop is worth vectorizing only if no scalar "
7420 << "iteration overheads are incurred.");
7422 LLVM_DEBUG(dbgs() << " But vectorizing was explicitly forced.\n");
7423 else {
7424 LLVM_DEBUG(dbgs() << "\n");
7425 // Tail-folded loops are efficient even when the loop
7426 // iteration count is low. However, setting the epilogue policy to
7427 // `CM_EpilogueNotAllowedLowTripLoop` prevents vectorizing loops
7428 // with runtime checks. It's more effective to let
7429 // `isOutsideLoopWorkProfitable` determine if vectorization is
7430 // beneficial for the loop. If the trip count is below the target's
7431 // minimum for tail-folding, the tail cannot be folded, so treat it like
7432 // any other low trip count loop.
7433 if (SEL != CM_EpilogueNotNeededFoldTail ||
7434 ExpectedTC->getFixedValue() <=
7435 TTI->getMinTripCountTailFoldingThreshold())
7437 }
7438 }
7439
7440 // Check the function attributes to see if implicit floats or vectors are
7441 // allowed.
7442 if (F->hasFnAttribute(Attribute::NoImplicitFloat)) {
7444 "Can't vectorize when the NoImplicitFloat attribute is used",
7445 "loop not vectorized due to NoImplicitFloat attribute",
7446 "NoImplicitFloat", ORE, L);
7447 Hints.emitRemarkWithHints();
7448 return false;
7449 }
7450
7451 // Check if the target supports potentially unsafe FP vectorization.
7452 // FIXME: Add a check for the type of safety issue (denormal, signaling)
7453 // for the target we're vectorizing for, to make sure none of the
7454 // additional fp-math flags can help.
7455 if (Hints.isPotentiallyUnsafe() &&
7456 TTI->isFPVectorizationPotentiallyUnsafe()) {
7458 "Potentially unsafe FP op prevents vectorization",
7459 "loop not vectorized due to unsafe FP support.", "UnsafeFP", ORE, L);
7460 Hints.emitRemarkWithHints();
7461 return false;
7462 }
7463
7464 // If the flag is set, use that instead and override the TTI behaviour.
7465 bool AllowOrderedReductions =
7466 valueOr(Opts.force_ordered_reductions, TTI->enableOrderedReductions());
7467 if (!LVL.canVectorizeFPMath(AllowOrderedReductions)) {
7468 ORE->emit([&]() {
7469 auto *ExactFPMathInst = Requirements.getExactFPInst();
7470 return OptimizationRemarkAnalysisFPCommute(DEBUG_TYPE, "CantReorderFPOps",
7471 ExactFPMathInst->getDebugLoc(),
7472 ExactFPMathInst->getParent())
7473 << "loop not vectorized: cannot prove it is safe to reorder "
7474 "floating-point operations";
7475 });
7476 LLVM_DEBUG(dbgs() << "LV: loop not vectorized: cannot prove it is safe to "
7477 "reorder floating-point operations\n");
7478 Hints.emitRemarkWithHints();
7479 return false;
7480 }
7481
7482 // Use the cost model.
7483 VFSelectionContext Config(Opts, *TTI, &LVL, L, *F, PSE, DB, ORE, &Hints,
7484 OptForSize);
7485 // Use the planner for vectorization.
7487 L, LI, DT, TLI, *TTI, &LVL,
7488 std::make_unique<LoopVectorizationCostModel>(
7489 SEL, L, PSE, LI, &LVL, *TTI, TLI, AC, ORE, GetBFI, F, IAI, Config),
7490 Config, PSE, ORE, GetBPI);
7491
7492 EpilogueLowering EpilogueTailLoweringStatus = getEpilogueTailLowering(
7493 Opts, LVP.getCostModel(), L, ORE, LVL, Hints, TTI);
7494 if (EpilogueTailLoweringStatus ==
7496 // TODO: Apply tail-folding on the vectorized epilogue loop.
7497 LLVM_DEBUG(dbgs() << "LV: epilogue tail-folding is not supported yet\n");
7499 "The epilogue-tail-folding policy prefer-fold-tail is not supported "
7500 "yet, fall back to a normal epilogue",
7501 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
7502 }
7503
7504 // Get user vectorization factor and interleave count.
7505 ElementCount UserVF = Hints.getWidth();
7506 unsigned UserIC = Hints.getInterleave();
7507 // Outer loops don't have LoopAccessInfo, so skip the safety check and reset
7508 // UserIC (interleaving is not supported for outer loops).
7509 if (!IsInnerLoop)
7510 UserIC = 0;
7511 else if (UserIC > 1 && !LVL.isSafeForAnyVectorWidth())
7512 UserIC = 1;
7513
7514 // Plan how to best vectorize.
7515 LVP.plan(UserVF, UserIC);
7516 auto [VF, BestPlanPtr] = LVP.computeBestVF();
7517 unsigned IC = 1;
7518
7519 // For VPlan build stress testing of outer loops, bail after plan
7520 // construction.
7521 if (!IsInnerLoop && Opts.vplan_build_outerloop_stress_test)
7522 return false;
7523
7524 if (IsInnerLoop && ORE->allowExtraAnalysis(LV_NAME))
7526
7527 assert((IsInnerLoop || !LVP.getCostModel().maskPartialAliasing()) &&
7528 "Did not expect to alias-mask outer loop");
7529
7530 GeneratedRTChecks Checks(Opts, PSE, DT, LI, TTI, Config.CostKind,
7532 if (IsInnerLoop && LVP.hasPlanWithVF(VF.Width)) {
7533 // Select the interleave count.
7534 IC = LVP.selectInterleaveCount(*BestPlanPtr, VF.Width, VF.Cost);
7535
7536 unsigned SelectedIC = UserIC > 0 ? UserIC : IC;
7537 // Optimistically generate runtime checks if they are needed. Drop them if
7538 // they turn out to not be profitable.
7539 if (VF.Width.isVector() || SelectedIC > 1) {
7540 Checks.create(L, *LVL.getLAI(), PSE.getPredicate(), VF.Width, SelectedIC,
7541 *ORE);
7542
7543 // Bail out early if either the SCEV or memory runtime checks are known to
7544 // fail. In that case, the vector loop would never execute.
7545 using namespace llvm::PatternMatch;
7546 if ((Checks.getSCEVChecks().first &&
7547 match(Checks.getSCEVChecks().first, m_One())) ||
7548 (Checks.getMemRuntimeChecks().first &&
7549 match(Checks.getMemRuntimeChecks().first, m_One()))) {
7551 "runtime checks are known to fail, so we will never enter the "
7552 "vector loop",
7553 "RuntimeChecksNeverEnterVectorLoop", ORE, L);
7554 return false;
7555 }
7556 }
7557
7558 // Check if it is profitable to vectorize with runtime checks.
7559 bool ForceVectorization =
7561 VPCostContext CostCtx(*TLI, *BestPlanPtr, LVP.getCostModel(), Config,
7562 /*ReusePrintingSlotTracker=*/true);
7563 if (!ForceVectorization &&
7564 !isOutsideLoopWorkProfitable(Checks, VF, L, PSE, CostCtx, *BestPlanPtr,
7565 SEL, Config.getVScaleForTuning())) {
7566 ORE->emit([&]() {
7568 DEBUG_TYPE, "CantReorderMemOps", L->getStartLoc(),
7569 L->getHeader())
7570 << "loop not vectorized: cannot prove it is safe to reorder "
7571 "memory operations";
7572 });
7573 LLVM_DEBUG(dbgs() << "LV: Too many memory checks needed.\n");
7574 Hints.emitRemarkWithHints();
7575 return false;
7576 }
7577 }
7578
7579 // Identify the diagnostic messages that should be produced.
7580 std::pair<StringRef, std::string> VecDiagMsg, IntDiagMsg;
7581 bool VectorizeLoop = true, InterleaveLoop = true;
7582 if (VF.Width.isScalar()) {
7583 if (LVP.hasVectorPlan()) {
7584 LLVM_DEBUG(
7585 dbgs() << "LV: Vectorization is possible but not beneficial.\n");
7586 VecDiagMsg = {
7587 "VectorizationNotBeneficial",
7588 "the cost-model indicates that vectorization is not beneficial"};
7589 } else {
7590 LLVM_DEBUG(dbgs() << "LV: Vectorization is not possible. Failed to "
7591 "create any vector VPlans.\n");
7592 VecDiagMsg = {"VectorizationNotPossible",
7593 "vectorization is not possible"};
7594 }
7595 VectorizeLoop = false;
7596 }
7597
7598 if (UserIC == 1 && Hints.getInterleave() > 1) {
7600 "UserIC should only be ignored due to unsafe dependencies");
7601 LLVM_DEBUG(dbgs() << "LV: Ignoring user-specified interleave count.\n");
7602 IntDiagMsg = {"InterleavingUnsafe",
7603 "Ignoring user-specified interleave count due to possibly "
7604 "unsafe dependencies in the loop."};
7605 InterleaveLoop = false;
7606 } else if (!LVP.hasPlanWithVF(VF.Width) && UserIC > 1) {
7607 // Tell the user interleaving was avoided up-front, despite being explicitly
7608 // requested.
7609 LLVM_DEBUG(dbgs() << "LV: Ignoring UserIC, because vectorization and "
7610 "interleaving should be avoided up front\n");
7611 IntDiagMsg = {"InterleavingAvoided",
7612 "Ignoring UserIC, because interleaving was avoided up front"};
7613 InterleaveLoop = false;
7614 } else if (IC == 1 && UserIC <= 1) {
7615 // Tell the user interleaving is not beneficial.
7616 if (LVP.hasAPlan()) {
7617 LLVM_DEBUG(dbgs() << "LV: Interleaving is not beneficial.\n");
7618 IntDiagMsg = {
7619 "InterleavingNotBeneficial",
7620 "the cost-model indicates that interleaving is not beneficial"};
7621 if (UserIC == 1) {
7622 IntDiagMsg.first = "InterleavingNotBeneficialAndDisabled";
7623 IntDiagMsg.second +=
7624 " and is explicitly disabled or interleave count is set to 1";
7625 }
7626 } else {
7627 LLVM_DEBUG(dbgs() << "LV: Interleaving is not possible. Failed to create"
7628 << " any vplans\n");
7629 IntDiagMsg = {"InterleavingNotPossible", "interleaving is not possible"};
7630 }
7631 InterleaveLoop = false;
7632 } else if (IC > 1 && UserIC == 1) {
7633 // Tell the user interleaving is beneficial, but it explicitly disabled.
7634 LLVM_DEBUG(dbgs() << "LV: Interleaving is beneficial but is explicitly "
7635 "disabled.\n");
7636 IntDiagMsg = {"InterleavingBeneficialButDisabled",
7637 "the cost-model indicates that interleaving is beneficial "
7638 "but is explicitly disabled or interleave count is set to 1"};
7639 InterleaveLoop = false;
7640 }
7641
7642 // If there is a histogram in the loop, do not just interleave without
7643 // vectorizing. The order of operations will be incorrect without the
7644 // histogram intrinsics, which are only used for recipes with VF > 1.
7645 if (!VectorizeLoop && InterleaveLoop && LVL.hasHistograms()) {
7646 LLVM_DEBUG(dbgs() << "LV: Not interleaving without vectorization due "
7647 << "to histogram operations.\n");
7648 IntDiagMsg = {
7649 "HistogramPreventsScalarInterleaving",
7650 "Unable to interleave without vectorization due to constraints on "
7651 "the order of histogram operations"};
7652 InterleaveLoop = false;
7653 }
7654
7655 // Override IC if user provided an interleave count.
7656 IC = UserIC > 0 ? UserIC : IC;
7657
7658 if (LVP.getCostModel().maskPartialAliasing()) {
7659 LLVM_DEBUG(
7660 dbgs()
7661 << "LV: Not interleaving due to partial aliasing vectorization.\n");
7662 IntDiagMsg = {
7663 "PartialAliasingVectorization",
7664 "Unable to interleave due to partial aliasing vectorization."};
7665 InterleaveLoop = false;
7666 IC = 1;
7667 }
7668
7669 // FIXME: Enable interleaving for EE-with-side-effects.
7670 if (InterleaveLoop && LVL.hasUncountableExitWithSideEffects()) {
7671 LLVM_DEBUG(dbgs() << "LV: Not interleaving due to EE with side effects.\n");
7672 IntDiagMsg = {"EEWithSideEffectsPreventsInterleaving",
7673 "Unable to interleave due to early exit with side effects."};
7674 InterleaveLoop = false;
7675 IC = 1;
7676 }
7677
7678 // Emit diagnostic messages, if any.
7679 if (!VectorizeLoop && !InterleaveLoop) {
7680 // Do not vectorize or interleaving the loop.
7681 ORE->emit([&]() {
7682 return OptimizationRemarkMissed(LV_NAME, VecDiagMsg.first,
7683 L->getStartLoc(), L->getHeader())
7684 << VecDiagMsg.second;
7685 });
7686 ORE->emit([&]() {
7687 return OptimizationRemarkMissed(LV_NAME, IntDiagMsg.first,
7688 L->getStartLoc(), L->getHeader())
7689 << IntDiagMsg.second;
7690 });
7691 return false;
7692 }
7693
7694 if (!VectorizeLoop && InterleaveLoop) {
7695 LLVM_DEBUG(dbgs() << "LV: Interleave Count is " << IC << '\n');
7696 ORE->emit([&]() {
7697 return OptimizationRemarkAnalysis(LV_NAME, VecDiagMsg.first,
7698 L->getStartLoc(), L->getHeader())
7699 << VecDiagMsg.second;
7700 });
7701 } else if (VectorizeLoop && !InterleaveLoop) {
7702 LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
7703 << ") in " << L->getLocStr() << '\n');
7704 ORE->emit([&]() {
7705 return OptimizationRemarkAnalysis(LV_NAME, IntDiagMsg.first,
7706 L->getStartLoc(), L->getHeader())
7707 << IntDiagMsg.second;
7708 });
7709 } else if (VectorizeLoop && InterleaveLoop) {
7710 LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
7711 << ") in " << L->getLocStr() << '\n');
7712 LLVM_DEBUG(dbgs() << "LV: Interleave Count is " << IC << '\n');
7713 }
7714
7715 // Report the vectorization decision.
7716 if (VF.Width.isScalar()) {
7717 using namespace ore;
7718 assert(IC > 1);
7719 ORE->emit([&]() {
7720 return OptimizationRemark(LV_NAME, "Interleaved", L->getStartLoc(),
7721 L->getHeader())
7722 << "interleaved loop (interleaved count: "
7723 << NV("InterleaveCount", IC) << ")";
7724 });
7725 } else {
7726 // Report the vectorization decision.
7727 reportVectorization(ORE, L, VF.Width, IC);
7728 }
7729 if (ORE->allowExtraAnalysis(LV_NAME))
7731
7732 // If we decided that it is *legal* to interleave or vectorize the loop, then
7733 // do it.
7734
7735 // Whether a scalar epilogue may be created is decided by the epilogue
7736 // lowering policy.
7737 // TODO: Also move check to be based on VPlan.
7738 bool ScalarEpilogueAllowed = LVP.getCostModel().isEpilogueAllowed();
7739
7740 // Destroy the cost model before executing any plan, so that code generation
7741 // cannot rely on cost-modeling decisions.
7742 LVP.clearCostModel();
7743
7744 VPlan &BestPlan = *BestPlanPtr;
7745 // Consider vectorizing the epilogue too if it's profitable.
7746 std::unique_ptr<VPlan> EpiPlan =
7747 LVP.selectBestEpiloguePlan(BestPlan, VF.Width, IC, ScalarEpilogueAllowed);
7748 bool HasBranchWeights =
7749 hasBranchWeightMD(*L->getLoopLatch()->getTerminator());
7750 if (EpiPlan) {
7751 VPlan &BestEpiPlan = *EpiPlan;
7752 VPlan &BestMainPlan = BestPlan;
7753 ElementCount EpilogueVF = BestEpiPlan.getSingleVF();
7754
7755 // The first pass vectorizes the main loop and creates a scalar epilogue
7756 // to be vectorized by executing the plan (potentially with a different
7757 // factor) again shortly afterwards.
7758 BestEpiPlan.getMiddleBlock()->setName("vec.epilog.middle.block");
7759 BestEpiPlan.getVectorPreheader()->setName("vec.epilog.ph");
7761
7762 // Add minimum iteration check for the epilogue plan, followed by runtime
7763 // checks for the main plan.
7764 LVP.addMinimumIterationCheck(BestMainPlan, EpilogueVF, /*UF=*/1,
7766 LVP.attachRuntimeChecks(BestMainPlan, Checks, VF.Width, IC,
7767 HasBranchWeights);
7769 VF.Width, IC, BestMainPlan.requiresScalarEpilogue(), L,
7770 HasBranchWeights ? MinItersBypassWeights : nullptr,
7771 L->getLoopPredecessor()->getTerminator()->getDebugLoc(),
7772 PSE);
7773
7774 LLVM_DEBUG({
7775 dbgs() << "Create Skeleton for epilogue vectorized loop (first pass)\n"
7776 << "Main Loop VF:" << VF.Width << ", Main Loop UF:" << IC
7777 << ", Epilogue Loop VF:" << EpilogueVF << ", Epilogue Loop UF:1\n";
7778 });
7779 InnerLoopVectorizer MainILV(L, PSE, LI, DT, TTI, AC, VF.Width, IC, Checks);
7780 // Keep track of the iteration count check of the main vector loop.
7781 VPBasicBlock *MainBlocks[] = {cast<VPBasicBlock>(
7782 BestMainPlan.getVectorPreheader()->getSinglePredecessor())};
7783 auto ExpandedSCEVs = LVP.executePlan(
7784 VF.Width, IC, BestMainPlan, MainILV, DT,
7786 MainBlocks);
7787 VPBasicBlock *MainCheck = MainBlocks[0];
7788 ++LoopsVectorized;
7790 dbgs() << "intermediate fn:\n" << *L->getHeader()->getParent() << "\n";
7791 });
7792
7793 BasicBlock *EntryBB =
7794 cast<VPIRBasicBlock>(BestMainPlan.getEntry())->getIRBasicBlock();
7795 EntryBB->setName("iter.check");
7797 ->getIRBasicBlock()
7798 ->setName("vec.epilog.iter.check");
7799
7800 // Second pass vectorizes the epilogue and adjusts the control flow
7801 // edges from the first pass.
7802 InnerLoopVectorizer EpilogILV(L, PSE, LI, DT, TTI, AC, EpilogueVF,
7803 /*UnrollFactor=*/1, Checks);
7804 preparePlanForEpilogueVectorLoop(BestMainPlan, BestEpiPlan, ExpandedSCEVs,
7805 VF.Width, IC, EpilogueVF, Config,
7806 *PSE.getSE(), Markers, MainCheck);
7808 LLVM_DEBUG({
7809 dbgs() << "Create Skeleton for epilogue vectorized loop (second pass)\n"
7810 << "Epilogue Loop VF:" << EpilogueVF << ", Epilogue Loop UF:1\n";
7811 });
7812 LVP.executePlan(
7813 EpilogueVF, /*BestUF=*/1, BestEpiPlan, EpilogILV, DT,
7816 dbgs() << "final fn:\n" << *L->getHeader()->getParent() << "\n";
7817 });
7818 ++LoopsEpilogueVectorized;
7819 } else {
7820 InnerLoopVectorizer LB(L, PSE, LI, DT, TTI, AC, VF.Width, IC, Checks);
7821 LVP.addMinimumIterationCheck(BestPlan, VF.Width, IC,
7822 VF.MinProfitableTripCount);
7823 LVP.attachRuntimeChecks(BestPlan, Checks, VF.Width, IC, HasBranchWeights);
7824
7825 if (!IsInnerLoop)
7826 LLVM_DEBUG(dbgs() << "Vectorizing outer loop in \"" << F->getName()
7827 << "\"\n");
7828 LVP.executePlan(VF.Width, IC, BestPlan, LB, DT);
7829 ++LoopsVectorized;
7830 }
7831
7832#ifdef EXPENSIVE_CHECKS
7833 assert(DT->verify(DominatorTree::VerificationLevel::Fast) &&
7834 "DT not preserved correctly");
7835#endif
7836
7837 return true;
7838}
7839
7841 CFGChanged = false;
7842
7843 // Don't attempt if
7844 // 1. the target claims to have no vector registers, and
7845 // 2. interleaving won't help ILP.
7846 //
7847 // The second condition is necessary because, even if the target has no
7848 // vector registers, loop vectorization may still enable scalar
7849 // interleaving.
7850 if (!TTI->getNumberOfRegisters(TTI->getRegisterClassForType(true)) &&
7851 (TTI->getMaxInterleaveFactor(ElementCount::getFixed(1), false) < 2 ||
7852 TTI->getMaxInterleaveFactor(ElementCount::getFixed(1), true) < 2))
7853 return LoopVectorizeResult(false, false);
7854
7855 bool Changed = false;
7856
7857 // The vectorizer requires loops to be in simplified form.
7858 // Since simplification may add new inner loops, it has to run before the
7859 // legality and profitability checks. This means running the loop vectorizer
7860 // will simplify all loops, regardless of whether anything end up being
7861 // vectorized.
7862 for (const auto &L : *LI)
7863 Changed |= CFGChanged |=
7864 simplifyLoop(L, DT, LI, SE, AC, nullptr, false /* PreserveLCSSA */);
7865
7866 // Build up a worklist of inner-loops to vectorize. This is necessary as
7867 // the act of vectorizing or partially unrolling a loop creates new loops
7868 // and can invalidate iterators across the loops.
7869 SmallVector<Loop *, 8> Worklist;
7870
7871 const VectorizeOptions &Opts = getVectorizeOptions(F);
7872 for (Loop *L : *LI)
7873 collectSupportedLoops(Opts, *L, LI, ORE, Worklist);
7874
7875 LoopsAnalyzed += Worklist.size();
7876
7877 // Now walk the identified inner loops.
7878 while (!Worklist.empty()) {
7879 Loop *L = Worklist.pop_back_val();
7880
7881 // For the inner loops we actually process, form LCSSA to simplify the
7882 // transform.
7883 Changed |= formLCSSARecursively(*L, *DT, LI, SE);
7884
7886
7887 if (Changed) {
7888 LAIs->clear();
7889
7890#ifndef NDEBUG
7891 if (VerifySCEV)
7892 SE->verify();
7893#endif
7894 }
7895 }
7896
7897 // Verify once per function rather than once per processed loop, which would
7898 // make the pass quadratic in the number of loops.
7899 assert((!Changed || DT->verify(DominatorTree::VerificationLevel::Fast)) &&
7900 "DT not preserved correctly");
7901 assert((!Changed || !verifyFunction(F, &dbgs())) &&
7902 "Invalid IR produced by LoopVectorize");
7903
7904 // Process each loop nest in the function.
7906}
7907
7910 LI = &AM.getResult<LoopAnalysis>(F);
7911 // There are no loops in the function. Return before computing other
7912 // expensive analyses.
7913 if (LI->empty())
7914 return PreservedAnalyses::all();
7923 AA = &AM.getResult<AAManager>(F);
7924
7925 auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
7926 PSI = MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
7927 // CycleInfo cached by an earlier pass is invalidated when the CFG changes.
7928 // Both BlockFrequencyAnalysis and BranchProbabilityAnalysis depend on it, so
7929 // drop the stale result before either is (re-)computed.
7930 auto ClearStaleCycleInfo = [this, &AM, &F] {
7933 };
7934 GetBFI = [&AM, &F, ClearStaleCycleInfo]() -> BlockFrequencyInfo & {
7935 ClearStaleCycleInfo();
7937 };
7938 GetBPI = [&AM, &F, ClearStaleCycleInfo]() -> const BranchProbabilityInfo & {
7939 ClearStaleCycleInfo();
7941 };
7942 LoopVectorizeResult Result = runImpl(F);
7943 if (!Result.MadeAnyChange)
7944 return PreservedAnalyses::all();
7946
7947 if (isAssignmentTrackingEnabled(*F.getParent())) {
7948 for (auto &BB : F)
7950 }
7951
7952 PA.preserve<LoopAnalysis>();
7956
7957 if (Result.MadeCFGChange) {
7958 // Making CFG changes likely means a loop got vectorized. Indicate that
7959 // extra simplification passes should be run.
7960 // TODO: MadeCFGChanges is not a prefect proxy. Extra passes should only
7961 // be run if runtime checks have been added.
7964 } else {
7966 }
7967 return PA;
7968}
7969
7971 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
7972 static_cast<PassInfoMixin<LoopVectorizePass> *>(this)->printPipeline(
7973 OS, MapClassName2PassName);
7974
7975 OS << '<';
7976 OS << (InterleaveOnlyWhenForced ? "" : "no-") << "interleave-forced-only;";
7977 OS << (VectorizeOnlyWhenForced ? "" : "no-") << "vectorize-forced-only;";
7978 OS << '>';
7979}
static unsigned getIntrinsicID(const SDNode *N)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t 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
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 InstructionCost getCost(const AnalysisOptions &Opts, Instruction &Inst, TTI::TargetCostKind CostKind, TargetTransformInfo &TTI)
Definition CostModel.cpp:33
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,...
static constexpr Value * getValue(Ty &ValueOrUse)
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 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 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 void preparePlanForEpilogueVectorLoop(VPlan &MainPlan, VPlan &Plan, const SCEV2ValueTy &ExpandedSCEVs, ElementCount MainLoopVF, unsigned MainLoopUF, ElementCount EpilogueVF, VFSelectionContext &Config, ScalarEvolution &SE, const MainPlanResumeMarkers &Markers, VPBasicBlock *MainCheck)
Prepare Plan for vectorizing the epilogue loop.
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 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
SmallVector< MachineOperand, 4 > 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
static const CodeGenOptions & getOpts(const TargetMachine &TM)
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
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:509
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
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:757
void insert_range(Range &&R)
Inserts a range of 'std::pair<KeyT, ValueT>' values into the map.
Definition DenseMap.h:894
ValueT lookup_or(const_arg_type_t< KeyT > Val, U &&Default) const
Definition DenseMap.h:803
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:793
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:856
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:321
static constexpr ElementCount getScalable(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:306
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:312
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:317
constexpr bool isPowerOf2() const
Definition TypeSize.h:324
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
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:2909
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.
InnerLoopVectorizer(Loop *OrigLoop, PredicatedScalarEvolution &PSE, LoopInfo *LI, DominatorTree *DT, const TargetTransformInfo *TTI, AssumptionCache *AC, ElementCount VecWidth, unsigned UnrollFactor, GeneratedRTChecks &RTChecks)
DominatorTree * DT
Dominator Tree.
void fixVectorizedLoop(VPTransformState &State)
Fix the vectorized code, taking care of header phi's, and more.
AssumptionCache * AC
Assumption Cache.
IRBuilder Builder
The builder that we use.
unsigned UF
The vectorization unroll factor to use.
GeneratedRTChecks & RTChecks
Structure to hold information about generated runtime checks, responsible for cleaning the checks,...
ElementCount VF
The vectorization SIMD factor to use.
Loop * OrigLoop
The original loop.
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.
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.
iterator_range< SmallPtrSetIterator< llvm::InterleaveGroup< Instruction > * > > getInterleaveGroups()
LLVM_ABI void analyzeInterleaving(bool EnableMaskedInterleavedGroup)
Analyze the interleaved accesses and collect them in interleave groups.
LLVM_ABI void invalidateGroupsRequiringScalarEpilogue()
Invalidate groups that require a scalar epilogue (due to gaps).
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
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
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.
LLVM_ABI bool isFixedOrderRecurrence(const PHINode *Phi) const
Returns True if Phi is a fixed-order recurrence in this loop.
const SmallVector< BasicBlock *, 4 > & getCountableExitingBlocks() const
Returns all exiting blocks with a countable exit, i.e.
const HistogramInfo * getHistogramInfo(Instruction *I) const
Returns a HistogramInfo* for the given instruction if it was determined to be part of a load -> updat...
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.
LLVM_ABI bool isUniformMemOp(Instruction &I, std::optional< ElementCount > VF) const
A uniform memory op is a load or store which accesses the same memory location on all VF lanes,...
bool hasHistograms() const
Returns a list of all known histogram operations in the loop.
const LoopAccessInfo * getLAI() const
LLVM_ABI bool isUniform(Value *V, std::optional< ElementCount > VF) const
Returns true if value V is uniform across VF lanes, when VF is provided, and otherwise if V is invari...
Planner drives the vectorization process after having passed Legality checks.
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:1624
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:1675
bool hasAPlan() const
Returns true if there is at least one VPlan.
LoopVectorizationCostModel & getCostModel()
Return the cost model. Must not be called after clearCostModel().
LoopVectorizationPlanner(Loop *L, LoopInfo *LI, DominatorTree *DT, const TargetLibraryInfo *TLI, const TargetTransformInfo &TTI, LoopVectorizationLegality *Legal, std::unique_ptr< LoopVectorizationCostModel > CM, VFSelectionContext &Config, PredicatedScalarEvolution &PSE, OptimizationRemarkEmitter *ORE, std::function< const BranchProbabilityInfo &()> GetBPI)
unsigned selectInterleaveCount(VPlan &Plan, ElementCount VF, InstructionCost LoopCost)
void attachRuntimeChecks(VPlan &Plan, GeneratedRTChecks &RTChecks, ElementCount VF, unsigned UF, bool HasBranchWeights) const
Attach the runtime checks of RTChecks to Plan.
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.
static bool getDecisionAndClampRange(const std::function< bool(ElementCount)> &Predicate, VFRange &Range)
Test a Predicate on a Range of VF's.
Definition VPlan.cpp:1610
DenseMap< const SCEV *, Value * > executePlan(ElementCount VF, unsigned UF, VPlan &BestPlan, InnerLoopVectorizer &LB, DominatorTree *DT, EpilogueVectorizationKind EpilogueVecKind=EpilogueVectorizationKind::None, MutableArrayRef< VPBasicBlock * > TrackedBlocks={})
void printPlans(raw_ostream &O)
Definition VPlan.cpp:1779
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
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
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.
bool contains(ConstPtrType Ptr) const
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.
static LLVM_ABI OperandValueInfo getOperandInfo(const Value *V)
Collect properties of V used in cost analysis, e.g. OP_PowerOf2.
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::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.
@ 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
iterator_range< op_iterator > op_range
Definition User.h:256
Value * getOperand(unsigned i) const
Definition User.h:207
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:4495
RecipeListTy::iterator iterator
Instruction iterators...
Definition VPlan.h:4522
iterator end()
Definition VPlan.h:4532
iterator begin()
Recipe iterator methods.
Definition VPlan.h:4530
iterator_range< iterator > phis()
Returns an iterator range over the PHI-like recipes in the block.
Definition VPlan.h:4583
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:4542
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:4541
const VPBasicBlock * getExitingBasicBlock() const
Definition VPlan.cpp:198
void setName(const Twine &newName)
Definition VPlan.h:190
size_t getNumPredecessors() const
Definition VPlan.h:248
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:232
VPlan * getPlan()
Definition VPlan.h:201
VPBlockBase * getSinglePredecessor() const
Definition VPlan.h:243
const VPBasicBlock * getEntryBasicBlock() const
Definition VPlan.cpp:183
VPBlockBase * getSingleSuccessor() const
Definition VPlan.h:237
static auto blocksAs(T &&Range)
Return an iterator range over Range with each block cast to BlockTy.
Definition VPlanUtils.h:448
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:411
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:441
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)
void setInsertPoint(const VPInsertPoint &IP)
Set the current insert point.
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, const VPIRAttributes &Attrs={})
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
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
Recipe to expand a SCEV expression.
Definition VPlan.h:4090
A pure virtual base class for all recipes modeling header phis, including phis for first order recurr...
Definition VPlan.h:2509
virtual VPValue * getBackedgeValue()
Returns the incoming value from the loop backedge.
Definition VPlan.h:2552
void setBackedgeValue(VPValue *V)
Update the incoming value from the loop backedge.
Definition VPlan.h:2555
VPValue * getStartValue()
Returns the start value of the phi, if one is set.
Definition VPlan.h:2541
A recipe representing a sequence of load -> update -> store as part of a histogram operation.
Definition VPlan.h:2220
A special type of VPBasicBlock that wraps an existing IR basic block.
Definition VPlan.h:4648
LLVM_ABI_FOR_TEST FastMathFlags getFastMathFlagsOrNone() const
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1329
iterator_range< operand_iterator > operandsWithoutMask()
Returns an iterator range over the operands excluding the mask operand if present.
Definition VPlan.h:1598
VPInstruction * clone() override
Clone the current recipe.
Definition VPlan.h:1508
@ ResumeForEpilogue
Explicit user for values in the main VPlan, used by the epilogue vector loop.
Definition VPlan.h:1438
@ ReductionStartVector
Start vector for reductions with 3 operands: the original start value, the identity value for the red...
Definition VPlan.h:1430
@ ComputeReductionResult
Reduce the operands to the final reduction result using the operation specified via the operation's V...
Definition VPlan.h:1388
unsigned getOpcode() const
Definition VPlan.h:1521
VPValue * getMask() const
Returns the mask for the VPInstruction.
Definition VPlan.h:1594
VPInterleaveRecipe is a recipe for transforming an interleave group of load or stores into one wide l...
Definition VPlan.h:3202
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:405
DebugLoc getDebugLoc() const
Returns the debug location of the recipe.
Definition VPlan.h:555
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:2912
bool isOrdered() const
Returns true, if the phi is part of an ordered reduction.
Definition VPlan.h:2984
bool hasUsesOutsideReductionChain() const
Returns true, if the phi is part of a multi-use reduction.
Definition VPlan.h:2993
bool isInLoop() const
Returns true if the phi is part of an in-loop reduction.
Definition VPlan.h:2987
VPReductionPHIRecipe * cloneWithOperands(VPValue *Start, VPValue *BackedgeValue)
Definition VPlan.h:2948
RecurKind getRecurrenceKind() const
Returns the recurrence kind of the reduction.
Definition VPlan.h:2981
A recipe to represent inloop, ordered or partial reduction operations.
Definition VPlan.h:3295
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
Definition VPlan.h:4720
const VPBlockBase * getEntry() const
Definition VPlan.h:4764
void clearCanonicalIVNUW(VPInstruction *Increment)
Unsets NUW for the canonical IV increment Increment, for loop regions.
Definition VPlan.h:4887
VPRegionValue * getCanonicalIV()
Return the canonical induction variable of the region, null for replicating regions.
Definition VPlan.h:4840
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
Definition VPlan.h:3462
VPSingleDefRecipe is a base class for recipes that model a sequence of one or more output IR that def...
Definition VPlan.h:613
Instruction * getUnderlyingInstr()
Returns the underlying instruction.
Definition VPlan.h:675
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:1445
void replaceAllUsesWith(VPValue *New)
Definition VPlan.cpp:1439
VPWidenCastRecipe is a recipe to create vector cast instructions.
Definition VPlan.h:1921
A recipe for handling GEP instructions.
Definition VPlan.h:2279
VPWidenRecipe is a recipe for producing a widened instruction using the opcode and operands of the re...
Definition VPlan.h:1854
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4907
bool hasVF(ElementCount VF) const
Definition VPlan.h:5130
ElementCount getSingleVF() const
Returns the single VF of the plan, asserting that the plan has exactly one VF.
Definition VPlan.h:5143
VPBasicBlock * getEntry()
Definition VPlan.h:4999
VPValue * getTripCount() const
The trip count of the original loop.
Definition VPlan.h:5071
VPSymbolicValue & getVFxUF()
Returns VF * UF of the vector loop region.
Definition VPlan.h:5102
bool hasUF(unsigned UF) const
Definition VPlan.h:5155
ArrayRef< VPIRBasicBlock * > getExitBlocks() const
Return an ArrayRef containing VPIRBasicBlocks wrapping the exit blocks of the original scalar loop.
Definition VPlan.h:5065
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:5180
VPIRValue * getZero(Type *Ty)
Return a VPIRValue wrapping the null value of type Ty.
Definition VPlan.h:5206
LLVM_ABI_FOR_TEST VPRegionBlock * getVectorLoopRegion()
Returns the VPRegionBlock of the vector loop.
Definition VPlan.cpp:1029
bool hasEarlyExit() const
Returns true if the VPlan is based on a loop with an early exit.
Definition VPlan.h:5313
InstructionCost cost(ElementCount VF, VPCostContext &Ctx)
Return the cost of this plan.
Definition VPlan.cpp:1011
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:5041
VPBasicBlock * getVectorPreheader() const
Returns the preheader of the vector loop region, if one exists, or null otherwise.
Definition VPlan.h:5004
bool requiresScalarEpilogue() const
Returns true if the plan requires a scalar epilogue after the vector loop.
Definition VPlan.h:5027
VPSymbolicValue & getUF()
Returns the UF of the vector loop region.
Definition VPlan.h:5099
bool hasScalarVFOnly() const
Definition VPlan.h:5148
VPBasicBlock * getScalarPreheader() const
Return the VPBasicBlock for the preheader of the scalar loop.
Definition VPlan.h:5055
void execute(VPTransformState *State)
Generate the IR code for this VPlan.
Definition VPlan.cpp:904
bool hasTailFolded() const
Returns true if the vector loop region is tail-folded.
Definition VPlan.h:5020
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
Definition VPlan.h:5061
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:1189
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:390
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
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:201
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:231
constexpr bool isNonZero() const
Definition TypeSize.h:156
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:217
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
constexpr bool isFixed() const
Returns true if the quantity is not scaled by vscale.
Definition TypeSize.h:172
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:166
constexpr bool isZero() const
Definition TypeSize.h:154
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:224
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:253
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
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
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
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_unless< Pattern > m_Unless(const Pattern &P)
Match if the inner matcher does NOT match.
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)
RecipeTy * findSingleUser(VPValue *V, const MatchT &P)
Return the sole user of V matching pattern P, casting it to RecipeTy, or nullptr.
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)
bool match(Val *V, const Pattern &P)
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
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 by all users.
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:151
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
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.
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.
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
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:69
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)
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:85
@ ReadOnly
No side effects to worry about, so we can process any uncountable exits in the loop and branch either...
Definition VPlan.h:89
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:415
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.
void replace(R &&Range, const T &OldValue, const T &NewValue)
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1926
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:600
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 >
bool proveOuterLoopMemorySafety(VPlan &Plan, PredicatedScalarEvolution &PSE, AAResults &AA, const VPDominatorTree &VPDT, const Loop *OuterLoop)
Returns true if the memory accesses in outer loop plain CFG Plan can be vectorized.
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
const VectorizeOptions & getVectorizeOptions(const LLVMContext &C)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
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:80
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.
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...
HistogramUpdateKind UpdateKind
The update operation applied to the histogram buckets.
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:1096
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:3877
A recipe for widening store operations, using the stored value, the address to store to and an option...
Definition VPlan.h:3982
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 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 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 VPIRBasicBlock * modelGeneratedMainLoopBlocks(VPlan &EpiPlan, VPlan &MainPlan, VPBasicBlock *MainCheck)
Model the blocks the executed MainPlan generated for the main vector loop in EpiPlan during epilogue ...
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 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 cse(VPlan &Plan, const VPDominatorTree &VPDT)
Perform common-subexpression-elimination on Plan.
static void attachMemoryChecks(VPlan &Plan, const RuntimePointerChecking &RtPtrChecking, const Loop *TheLoop, ScalarEvolution &SE, ElementCount VF, unsigned UF, bool AddBranchWeights)
Generate the memory runtime checks of RtPtrChecking for TheLoop as recipes and attach the check block...
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 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 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