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
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,
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;
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;
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(),
1411 (InstructionCost::CostType)1);
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
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 // Interleave if we vectorized this loop and there is a reduction that could
3562 // benefit from interleaving.
3563 if (VF.isVector() && HasReductions) {
3564 LLVM_DEBUG(dbgs() << "LV: Interleaving because of reductions.\n");
3565 return IC;
3566 }
3567
3568 // For any scalar loop that either requires runtime checks or tail-folding we
3569 // are better off leaving this to the unroller. Note that if we've already
3570 // vectorized the loop we will have done the runtime check and so interleaving
3571 // won't require further checks.
3572 bool ScalarInterleavingRequiresPredication =
3573 (VF.isScalar() && any_of(OrigLoop->blocks(), [this](BasicBlock *BB) {
3574 return Legal->blockNeedsPredication(BB);
3575 }));
3576 bool ScalarInterleavingRequiresRuntimePointerCheck =
3577 (VF.isScalar() && Legal->getRuntimePointerChecking()->Need);
3578
3579 // We want to interleave small loops in order to reduce the loop overhead and
3580 // potentially expose ILP opportunities.
3581 LLVM_DEBUG(dbgs() << "LV: Loop cost is " << LoopCost << '\n'
3582 << "LV: IC is " << IC << '\n'
3583 << "LV: VF is " << VF << '\n');
3584 const bool AggressivelyInterleave =
3585 TTI.enableAggressiveInterleaving(HasReductions);
3586 if (!ScalarInterleavingRequiresRuntimePointerCheck &&
3587 !ScalarInterleavingRequiresPredication &&
3588 LoopCost < Opts.small_loop_cost) {
3589 // We assume that the cost overhead is 1 and we use the cost model
3590 // to estimate the cost of the loop and interleave until the cost of the
3591 // loop overhead is about 5% of the cost of the loop.
3592 unsigned SmallIC =
3593 std::min(IC, (unsigned)llvm::bit_floor<uint64_t>(Opts.small_loop_cost /
3594 LoopCost.getValue()));
3595
3596 // Interleave until store/load ports (estimated by max interleave count) are
3597 // saturated.
3598 unsigned NumStores = 0;
3599 unsigned NumLoads = 0;
3602 for (VPRecipeBase &R : *VPBB) {
3604 NumLoads++;
3605 continue;
3606 }
3608 NumStores++;
3609 continue;
3610 }
3611
3612 if (auto *InterleaveR = dyn_cast<VPInterleaveRecipe>(&R)) {
3613 if (unsigned StoreOps = InterleaveR->getNumStoreOperands())
3614 NumStores += StoreOps;
3615 else
3616 NumLoads += InterleaveR->getNumDefinedValues();
3617 continue;
3618 }
3619 if (auto *RepR = dyn_cast<VPReplicateRecipe>(&R)) {
3620 NumLoads += isa<LoadInst>(RepR->getUnderlyingInstr());
3621 NumStores += isa<StoreInst>(RepR->getUnderlyingInstr());
3622 continue;
3623 }
3624 if (isa<VPHistogramRecipe>(&R)) {
3625 NumLoads++;
3626 NumStores++;
3627 continue;
3628 }
3629 }
3630 }
3631 unsigned StoresIC = IC / (NumStores ? NumStores : 1);
3632 unsigned LoadsIC = IC / (NumLoads ? NumLoads : 1);
3633
3634 // There is little point in interleaving for reductions containing selects
3635 // and compares when VF=1 since it may just create more overhead than it's
3636 // worth for loops with small trip counts. This is because we still have to
3637 // do the final reduction after the loop.
3638 bool HasSelectCmpReductions =
3639 HasReductions &&
3642 [](VPReductionPHIRecipe &RedR) {
3643 return RecurrenceDescriptor::isAnyOfRecurrenceKind(
3644 RedR.getRecurrenceKind()) ||
3645 RecurrenceDescriptor::isFindIVRecurrenceKind(
3646 RedR.getRecurrenceKind());
3647 });
3648 if (HasSelectCmpReductions) {
3649 LLVM_DEBUG(dbgs() << "LV: Not interleaving select-cmp reductions.\n");
3650 return 1;
3651 }
3652
3653 // If we have a scalar reduction (vector reductions are already dealt with
3654 // by this point), we can increase the critical path length if the loop
3655 // we're interleaving is inside another loop. For tree-wise reductions
3656 // set the limit to 2, and for ordered reductions it's best to disable
3657 // interleaving entirely.
3658 if (HasReductions && OrigLoop->getLoopDepth() > 1) {
3659 bool HasOrderedReductions =
3662 [](VPReductionPHIRecipe &RedR) { return RedR.isOrdered(); });
3663 if (HasOrderedReductions) {
3664 LLVM_DEBUG(
3665 dbgs() << "LV: Not interleaving scalar ordered reductions.\n");
3666 return 1;
3667 }
3668
3669 unsigned F = Opts.max_nested_scalar_reduction_interleave;
3670 SmallIC = std::min(SmallIC, F);
3671 StoresIC = std::min(StoresIC, F);
3672 LoadsIC = std::min(LoadsIC, F);
3673 }
3674
3675 if (Opts.enable_loadstore_runtime_interleave &&
3676 std::max(StoresIC, LoadsIC) > SmallIC) {
3677 LLVM_DEBUG(
3678 dbgs() << "LV: Interleaving to saturate store or load ports.\n");
3679 return std::max(StoresIC, LoadsIC);
3680 }
3681
3682 // If there are scalar reductions and TTI has enabled aggressive
3683 // interleaving for reductions, we will interleave to expose ILP.
3684 if (VF.isScalar() && AggressivelyInterleave) {
3685 LLVM_DEBUG(dbgs() << "LV: Interleaving to expose ILP.\n");
3686 // Interleave no less than SmallIC but not as aggressive as the normal IC
3687 // to satisfy the rare situation when resources are too limited.
3688 return std::max(IC / 2, SmallIC);
3689 }
3690
3691 LLVM_DEBUG(dbgs() << "LV: Interleaving to reduce branch cost.\n");
3692 return SmallIC;
3693 }
3694
3695 // Interleave if this is a large loop (small loops are already dealt with by
3696 // this point) that could benefit from interleaving.
3697 if (AggressivelyInterleave) {
3698 LLVM_DEBUG(dbgs() << "LV: Interleaving to expose ILP.\n");
3699 return IC;
3700 }
3701
3702 LLVM_DEBUG(dbgs() << "LV: Not Interleaving.\n");
3703 return 1;
3704}
3705
3707 Instruction *I, ElementCount VF) const {
3708 // TODO: Cost model for emulated masked load/store is completely
3709 // broken. This hack guides the cost model to use an artificially
3710 // high enough value to practically disable vectorization with such
3711 // operations, except where previously deployed legality hack allowed
3712 // using very low cost values. This is to avoid regressions coming simply
3713 // from moving "masked load/store" check from legality to cost model.
3714 // Masked Load/Gather emulation was previously never allowed.
3715 // Limited number of Masked Store/Scatter emulation was allowed.
3717 "Expecting a scalar emulated instruction");
3718 return isa<LoadInst>(I) ||
3719 (isa<StoreInst>(I) && NumPredStores > Opts.vectorize_num_stores_pred);
3720}
3721
3723 assert(VF.isVector() && "Expected VF >= 2");
3724
3725 // If we've already collected the instructions to scalarize or the predicated
3726 // BBs after vectorization, there's nothing to do. Collection may already have
3727 // occurred if we have a user-selected VF and are now computing the expected
3728 // cost for interleaving.
3729 if (InstsToScalarize.contains(VF) ||
3730 PredicatedBBsAfterVectorization.contains(VF))
3731 return;
3732
3733 // Initialize a mapping for VF in InstsToScalalarize. If we find that it's
3734 // not profitable to scalarize any instructions, the presence of VF in the
3735 // map will indicate that we've analyzed it already.
3736 ScalarCostsTy &ScalarCostsVF = InstsToScalarize[VF];
3737
3738 // Find all the instructions that are scalar with predication in the loop and
3739 // determine if it would be better to not if-convert the blocks they are in.
3740 // If so, we also record the instructions to scalarize.
3741 for (BasicBlock *BB : TheLoop->blocks()) {
3743 continue;
3744 for (Instruction &I : *BB)
3745 if (isScalarWithPredication(&I, VF)) {
3746 ScalarCostsTy ScalarCosts;
3747 // Do not apply discount logic for:
3748 // 1. Scalars after vectorization, as there will only be a single copy
3749 // of the instruction.
3750 // 2. Scalable VF, as that would lead to invalid scalarization costs.
3751 // 3. Emulated masked memrefs, if a hacked cost is needed.
3752 if (!isScalarAfterVectorization(&I, VF) && !VF.isScalable() &&
3754 computePredInstDiscount(&I, ScalarCosts, VF) >= 0) {
3755 for (const auto &[I, IC] : ScalarCosts)
3756 ScalarCostsVF.insert({I, IC});
3757 }
3758 // Remember that BB will remain after vectorization.
3759 PredicatedBBsAfterVectorization[VF].insert(BB);
3760 for (auto *Pred : predecessors(BB)) {
3761 if (Pred->getSingleSuccessor() == BB)
3762 PredicatedBBsAfterVectorization[VF].insert(Pred);
3763 }
3764 }
3765 }
3766}
3767
3768InstructionCost LoopVectorizationCostModel::computePredInstDiscount(
3769 Instruction *PredInst, ScalarCostsTy &ScalarCosts, ElementCount VF) {
3770 assert(!isUniformAfterVectorization(PredInst, VF) &&
3771 "Instruction marked uniform-after-vectorization will be predicated");
3772
3773 // Initialize the discount to zero, meaning that the scalar version and the
3774 // vector version cost the same.
3775 InstructionCost Discount = 0;
3776
3777 // Holds instructions to analyze. The instructions we visit are mapped in
3778 // ScalarCosts. Those instructions are the ones that would be scalarized if
3779 // we find that the scalar version costs less.
3781
3782 // Returns true if the given instruction can be scalarized.
3783 auto CanBeScalarized = [&](Instruction *I) -> bool {
3784 // We only attempt to scalarize instructions forming a single-use chain
3785 // from the original predicated block that would otherwise be vectorized.
3786 // Although not strictly necessary, we give up on instructions we know will
3787 // already be scalar to avoid traversing chains that are unlikely to be
3788 // beneficial.
3789 if (!I->hasOneUse() || PredInst->getParent() != I->getParent() ||
3791 return false;
3792
3793 // If the instruction is scalar with predication, it will be analyzed
3794 // separately. We ignore it within the context of PredInst.
3795 if (isScalarWithPredication(I, VF))
3796 return false;
3797
3798 // If any of the instruction's operands are uniform after vectorization,
3799 // the instruction cannot be scalarized. This prevents, for example, a
3800 // masked load from being scalarized.
3801 //
3802 // We assume we will only emit a value for lane zero of an instruction
3803 // marked uniform after vectorization, rather than VF identical values.
3804 // Thus, if we scalarize an instruction that uses a uniform, we would
3805 // create uses of values corresponding to the lanes we aren't emitting code
3806 // for. This behavior can be changed by allowing getScalarValue to clone
3807 // the lane zero values for uniforms rather than asserting.
3808 for (Use &U : I->operands())
3809 if (auto *J = dyn_cast<Instruction>(U.get()))
3810 if (isUniformAfterVectorization(J, VF))
3811 return false;
3812
3813 // Otherwise, we can scalarize the instruction.
3814 return true;
3815 };
3816
3817 // Compute the expected cost discount from scalarizing the entire expression
3818 // feeding the predicated instruction. We currently only consider expressions
3819 // that are single-use instruction chains.
3820 Worklist.push_back(PredInst);
3821 while (!Worklist.empty()) {
3822 Instruction *I = Worklist.pop_back_val();
3823
3824 // If we've already analyzed the instruction, there's nothing to do.
3825 if (ScalarCosts.contains(I))
3826 continue;
3827
3828 // Cannot scalarize fixed-order recurrence phis at the moment.
3830 continue;
3831
3832 // Compute the cost of the vector instruction. Note that this cost already
3833 // includes the scalarization overhead of the predicated instruction.
3834 InstructionCost VectorCost = getInstructionCost(I, VF);
3835
3836 // Compute the cost of the scalarized instruction. This cost is the cost of
3837 // the instruction as if it wasn't if-converted and instead remained in the
3838 // predicated block. We will scale this cost by block probability after
3839 // computing the scalarization overhead.
3840 InstructionCost ScalarCost =
3842
3843 // Compute the scalarization overhead of needed insertelement instructions
3844 // and phi nodes.
3845 if (isScalarWithPredication(I, VF) && !I->getType()->isVoidTy()) {
3846 Type *WideTy = toVectorizedTy(I->getType(), VF);
3847 for (Type *VectorTy : getContainedTypes(WideTy)) {
3848 ScalarCost += TTI.getScalarizationOverhead(
3850 /*Insert=*/true,
3851 /*Extract=*/false, Config.CostKind);
3852 }
3853 ScalarCost += VF.getFixedValue() *
3854 TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
3855 }
3856
3857 // Compute the scalarization overhead of needed extractelement
3858 // instructions. For each of the instruction's operands, if the operand can
3859 // be scalarized, add it to the worklist; otherwise, account for the
3860 // overhead.
3861 for (Use &U : I->operands())
3862 if (auto *J = dyn_cast<Instruction>(U.get())) {
3863 assert(canVectorizeTy(J->getType()) &&
3864 "Instruction has non-scalar type");
3865 if (CanBeScalarized(J))
3866 Worklist.push_back(J);
3867 else if (needsExtract(J, VF)) {
3868 Type *WideTy = toVectorizedTy(J->getType(), VF);
3869 for (Type *VectorTy : getContainedTypes(WideTy)) {
3870 ScalarCost += TTI.getScalarizationOverhead(
3871 cast<VectorType>(VectorTy),
3872 APInt::getAllOnes(VF.getFixedValue()), /*Insert*/ false,
3873 /*Extract*/ true, Config.CostKind);
3874 }
3875 }
3876 }
3877
3878 // Scale the total scalar cost by block probability.
3879 ScalarCost /= getPredBlockCostDivisor(Config.CostKind, I->getParent());
3880
3881 // Compute the discount. A non-negative discount means the vector version
3882 // of the instruction costs more, and scalarizing would be beneficial.
3883 Discount += VectorCost - ScalarCost;
3884 ScalarCosts[I] = ScalarCost;
3885 }
3886
3887 return Discount;
3888}
3889
3892 assert(VF.isScalar() && "must only be called for scalar VFs");
3893
3894 // For each block.
3895 for (BasicBlock *BB : TheLoop->blocks()) {
3896 InstructionCost BlockCost;
3897
3898 // For each instruction in the old loop.
3899 for (Instruction &I : *BB) {
3900 // Skip ignored values.
3901 if (ValuesToIgnore.count(&I) ||
3902 (VF.isVector() && VecValuesToIgnore.count(&I)))
3903 continue;
3904
3906
3907 // Check if we should override the cost.
3908 if (C.isValid() && Opts.force_target_instruction_cost)
3909 C = InstructionCost(*Opts.force_target_instruction_cost);
3910
3911 BlockCost += C;
3912 LLVM_DEBUG(dbgs() << "LV: Found an estimated cost of " << C << " for VF "
3913 << VF << " For instruction: " << I << '\n');
3914 }
3915
3916 // In the scalar loop, we may not always execute the predicated block, if it
3917 // is an if-else block. Thus, scale the block's cost by the probability of
3918 // executing it. getPredBlockCostDivisor will return 1 for blocks that are
3919 // only predicated by the header mask when folding the tail.
3920 Cost += BlockCost / getPredBlockCostDivisor(Config.CostKind, BB);
3921 }
3922
3923 return Cost;
3924}
3925
3926/// Gets the address access SCEV for Ptr, if it should be used for cost modeling
3927/// according to isAddressSCEVForCost.
3928///
3929/// This SCEV can be sent to the Target in order to estimate the address
3930/// calculation cost.
3932 Value *Ptr,
3934 const Loop *TheLoop) {
3935 const SCEV *Addr = PSE.getSCEV(Ptr);
3936 return vputils::isAddressSCEVForCost(Addr, *PSE.getSE(), TheLoop) ? Addr
3937 : nullptr;
3938}
3939
3941LoopVectorizationCostModel::getMemInstScalarizationCost(Instruction *I,
3942 ElementCount VF) {
3943 assert(VF.isVector() &&
3944 "Scalarization cost of instruction implies vectorization.");
3945 if (VF.isScalable())
3947
3948 Type *ValTy = getLoadStoreType(I);
3949 auto *SE = PSE.getSE();
3950
3951 unsigned AS = getLoadStoreAddressSpace(I);
3953 Type *PtrTy = toVectorTy(Ptr->getType(), VF);
3954 // NOTE: PtrTy is a vector to signal `TTI::getAddressComputationCost`
3955 // that it is being called from this specific place.
3956
3957 // Figure out whether the access is strided and get the stride value
3958 // if it's known in compile time
3959 const SCEV *PtrSCEV = getAddressAccessSCEV(Ptr, PSE, TheLoop);
3960
3961 // Get the cost of the scalar memory instruction and address computation.
3963 VF.getFixedValue() *
3964 TTI.getAddressComputationCost(PtrTy, SE, PtrSCEV, Config.CostKind);
3965
3966 // Don't pass *I here, since it is scalar but will actually be part of a
3967 // vectorized loop where the user of it is a vectorized instruction.
3969 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
3970 Cost += VF.getFixedValue() *
3971 TTI.getMemoryOpCost(I->getOpcode(), ValTy->getScalarType(), Alignment,
3972 AS, Config.CostKind, OpInfo);
3973
3974 // Get the overhead of the extractelement and insertelement instructions
3975 // we might create due to scalarization.
3976 Cost += getScalarizationOverhead(I, VF);
3977
3978 // If we have a predicated load/store, it will need extra i1 extracts and
3979 // conditional branches, but may not be executed for each vector lane. Scale
3980 // the cost by the probability of executing the predicated block.
3981 if (isPredicatedInst(I)) {
3982 Cost /= getPredBlockCostDivisor(Config.CostKind, I->getParent());
3983
3984 // Add the cost of an i1 extract and a branch
3985 auto *VecI1Ty =
3987 Cost += TTI.getScalarizationOverhead(
3988 VecI1Ty, APInt::getAllOnes(VF.getFixedValue()),
3989 /*Insert=*/false, /*Extract=*/true, Config.CostKind);
3990 Cost += TTI.getCFInstrCost(Instruction::CondBr, Config.CostKind);
3991
3993 // Artificially setting to a high enough value to practically disable
3994 // vectorization with such operations.
3995 Cost = 3000000;
3996 }
3997
3998 return Cost;
3999}
4000
4001InstructionCost LoopVectorizationCostModel::getConsecutiveMemOpCost(
4002 Instruction *I, ElementCount VF, InstWidening Kind) {
4003 assert((Kind == CM_Widen || Kind == CM_Widen_Reverse) &&
4004 "Expected a consecutive widening decision");
4005 Type *ValTy = getLoadStoreType(I);
4006 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4007 unsigned AS = getLoadStoreAddressSpace(I);
4008
4011 if (isMaskRequired(I)) {
4012 unsigned IID = I->getOpcode() == Instruction::Load
4013 ? Intrinsic::masked_load
4014 : Intrinsic::masked_store;
4015 Cost += TTI.getMemIntrinsicInstrCost(
4016 MemIntrinsicCostAttributes(IID, VectorTy, Alignment, AS),
4017 Config.CostKind);
4018 } else {
4019 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4020 Cost += TTI.getMemoryOpCost(I->getOpcode(), VectorTy, Alignment, AS,
4021 Config.CostKind, OpInfo, I);
4022 }
4023
4024 if (Kind == CM_Widen_Reverse)
4025 Cost += TTI.getShuffleCost(TargetTransformInfo::SK_Reverse, VectorTy,
4026 VectorTy, Config.CostKind, {}, 0);
4027 return Cost;
4028}
4029
4031LoopVectorizationCostModel::getUniformMemOpCost(Instruction *I,
4032 ElementCount VF) const {
4033 assert(isUniformMemOp(*I, VF));
4034
4035 Type *ValTy = getLoadStoreType(I);
4037 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4039 unsigned AS = getLoadStoreAddressSpace(I);
4040 if (isa<LoadInst>(I)) {
4041 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4042 Config.CostKind) +
4043 TTI.getMemoryOpCost(Instruction::Load, ValTy, Alignment, AS,
4044 Config.CostKind) +
4045 TTI.getShuffleCost(TargetTransformInfo::SK_Broadcast, VectorTy,
4046 VectorTy, Config.CostKind);
4047 }
4048 StoreInst *SI = cast<StoreInst>(I);
4049
4050 bool IsLoopInvariantStoreValue = Legal->isInvariant(SI->getValueOperand());
4051 // TODO: We have existing tests that request the cost of extracting element
4052 // VF.getKnownMinValue() - 1 from a scalable vector. This does not represent
4053 // the actual generated code, which involves extracting the last element of
4054 // a scalable vector where the lane to extract is unknown at compile time.
4056 TTI.getAddressComputationCost(PtrTy, nullptr, nullptr, Config.CostKind) +
4057 TTI.getMemoryOpCost(Instruction::Store, ValTy, Alignment, AS,
4058 Config.CostKind);
4059 if (!IsLoopInvariantStoreValue)
4060 Cost += TTI.getIndexedVectorInstrCostFromEnd(Instruction::ExtractElement,
4061 VectorTy, Config.CostKind, 0);
4062 return Cost;
4063}
4064
4066LoopVectorizationCostModel::getGatherScatterCost(Instruction *I,
4067 ElementCount VF) const {
4068 Type *ValTy = getLoadStoreType(I);
4069 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4072 Type *PtrTy = Ptr->getType();
4073
4074 if (!isUniform(Ptr, VF))
4075 PtrTy = toVectorTy(PtrTy, VF);
4076
4077 unsigned IID = I->getOpcode() == Instruction::Load
4078 ? Intrinsic::masked_gather
4079 : Intrinsic::masked_scatter;
4080 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4081 Config.CostKind) +
4082 TTI.getMemIntrinsicInstrCost(
4083 MemIntrinsicCostAttributes(IID, VectorTy, Ptr, isMaskRequired(I),
4084 Alignment, I),
4085 Config.CostKind);
4086}
4087
4089LoopVectorizationCostModel::getInterleaveGroupCost(Instruction *I,
4090 ElementCount VF) const {
4091 const auto *Group = getInterleavedAccessGroup(I);
4092 assert(Group && "Fail to get an interleaved access group.");
4093
4094 Instruction *InsertPos = Group->getInsertPos();
4095 Type *ValTy = getLoadStoreType(InsertPos);
4096 auto *VectorTy = cast<VectorType>(toVectorTy(ValTy, VF));
4097 unsigned AS = getLoadStoreAddressSpace(InsertPos);
4098
4099 unsigned InterleaveFactor = Group->getFactor();
4100 auto *WideVecTy = VectorType::get(ValTy, VF * InterleaveFactor);
4101
4102 // Holds the indices of existing members in the interleaved group.
4103 SmallVector<unsigned, 4> Indices;
4104 for (unsigned IF = 0; IF < InterleaveFactor; IF++)
4105 if (Group->getMember(IF))
4106 Indices.push_back(IF);
4107
4108 // Calculate the cost of the whole interleaved group.
4109 bool UseMaskForGaps =
4110 (Group->requiresScalarEpilogue() && !isEpilogueAllowed()) ||
4111 (isa<StoreInst>(I) && !Group->isFull());
4112 InstructionCost Cost = TTI.getInterleavedMemoryOpCost(
4113 InsertPos->getOpcode(), WideVecTy, Group->getFactor(), Indices,
4114 Group->getAlign(), AS, Config.CostKind, isMaskRequired(I),
4115 UseMaskForGaps);
4116
4117 if (Group->isReverse()) {
4118 // TODO: Add support for reversed masked interleaved access.
4120 "Reverse masked interleaved access not supported.");
4121 Cost += Group->getNumMembers() *
4122 TTI.getShuffleCost(TargetTransformInfo::SK_Reverse, VectorTy,
4123 VectorTy, Config.CostKind, {}, 0);
4124 }
4125 return Cost;
4126}
4127
4129LoopVectorizationCostModel::getMemoryInstructionCost(Instruction *I,
4130 ElementCount VF) {
4131 // Calculate scalar cost only. Vectorization cost should be ready at this
4132 // moment.
4133 if (VF.isScalar()) {
4134 Type *ValTy = getLoadStoreType(I);
4137 unsigned AS = getLoadStoreAddressSpace(I);
4138
4139 TTI::OperandValueInfo OpInfo = TTI::getOperandInfo(I->getOperand(0));
4140 return TTI.getAddressComputationCost(PtrTy, nullptr, nullptr,
4141 Config.CostKind) +
4142 TTI.getMemoryOpCost(I->getOpcode(), ValTy, Alignment, AS,
4143 Config.CostKind, OpInfo, I);
4144 }
4145 return getWideningCost(I, VF);
4146}
4147
4149LoopVectorizationCostModel::getScalarizationOverhead(Instruction *I,
4150 ElementCount VF) const {
4151
4152 // There is no mechanism yet to create a scalable scalarization loop,
4153 // so this is currently Invalid.
4154 if (VF.isScalable())
4156
4157 if (VF.isScalar())
4158 return 0;
4159
4161 Type *RetTy = toVectorizedTy(I->getType(), VF);
4162 if (!RetTy->isVoidTy() &&
4163 (!isa<LoadInst>(I) || !TTI.supportsEfficientVectorElementLoadStore())) {
4164
4166 if (isa<LoadInst>(I))
4167 VIC = TTI::VectorInstrContext::Load;
4168 else if (isa<StoreInst>(I))
4169 VIC = TTI::VectorInstrContext::Store;
4170
4171 for (Type *VectorTy : getContainedTypes(RetTy)) {
4172 Cost += TTI.getScalarizationOverhead(
4174 /*Insert=*/true, /*Extract=*/false, Config.CostKind,
4175 /*ForPoisonSrc=*/true, {}, VIC);
4176 }
4177 }
4178
4179 // Some targets keep addresses scalar.
4180 if (isa<LoadInst>(I) && !TTI.prefersVectorizedAddressing())
4181 return Cost;
4182
4183 // Some targets support efficient element stores.
4184 if (isa<StoreInst>(I) && TTI.supportsEfficientVectorElementLoadStore())
4185 return Cost;
4186
4187 // Collect operands to consider.
4188 CallInst *CI = dyn_cast<CallInst>(I);
4189 Instruction::op_range Ops = CI ? CI->args() : I->operands();
4190
4191 // Skip operands that do not require extraction/scalarization and do not incur
4192 // any overhead.
4194 for (auto *V : filterExtractingOperands(Ops, VF))
4195 Tys.push_back(maybeVectorizeType(V->getType(), VF));
4196
4198 ? TTI::VectorInstrContext::Store
4200 return Cost +
4201 TTI.getOperandsScalarizationOverhead(Tys, Config.CostKind, OperandVIC);
4202}
4203
4205 if (VF.isScalar())
4206 return;
4207
4208 // TODO: We should generate better code and update the cost model for
4209 // predicated uniform stores. Today they are treated as any other
4210 // predicated store (see added test cases in
4211 // invariant-store-vectorization.ll).
4212 NumPredStores = 0;
4213 for (BasicBlock *BB : TheLoop->blocks())
4214 for (Instruction &I : *BB)
4216 ++NumPredStores;
4217
4218 for (BasicBlock *BB : TheLoop->blocks()) {
4219 // For each instruction in the old loop.
4220 for (Instruction &I : *BB) {
4222
4223 // Ignore if no pointer found or a widening decision has already been
4224 // made.
4225 if (!Ptr || (getWideningDecision(&I, VF) != CM_Unknown))
4226 continue;
4227
4228 LLVM_DEBUG(dbgs() << "LV: Memory widening: calculating best strategy for "
4229 << I << '\n');
4230 if (isUniformMemOp(I, VF)) {
4231 auto IsLegalToScalarize = [&]() {
4232 if (!VF.isScalable())
4233 // Scalarization of fixed length vectors "just works".
4234 return true;
4235
4236 // We have dedicated lowering for unpredicated uniform loads and
4237 // stores. Note that even with tail folding we know that at least
4238 // one lane is active (i.e. generalized predication is not possible
4239 // here), and the logic below depends on this fact.
4240 if (!foldTailByMasking())
4241 return true;
4242
4243 // For scalable vectors, a uniform memop load is always
4244 // uniform-by-parts and we know how to scalarize that.
4245 if (isa<LoadInst>(I))
4246 return true;
4247
4248 // A uniform store isn't neccessarily uniform-by-part
4249 // and we can't assume scalarization.
4250 auto &SI = cast<StoreInst>(I);
4251 return TheLoop->isLoopInvariant(SI.getValueOperand());
4252 };
4253
4254 const InstructionCost GatherScatterCost =
4255 isLegalGatherOrScatter(&I, VF) ? getGatherScatterCost(&I, VF)
4257
4258 // Load: Scalar load + broadcast
4259 // Store: Scalar store + isLoopInvariantStoreValue ? 0 : extract
4260 // FIXME: This cost is a significant under-estimate for tail folded
4261 // memory ops.
4262 const InstructionCost ScalarizationCost =
4263 IsLegalToScalarize() ? getUniformMemOpCost(&I, VF)
4265
4266 // Choose better solution for the current VF, Note that Invalid
4267 // costs compare as maximumal large. If both are invalid, we get
4268 // scalable invalid which signals a failure and a vectorization abort.
4269 LLVM_DEBUG(dbgs() << "LV: Memory widening: uniform memory op has "
4270 "GatherScatterCost = "
4271 << GatherScatterCost << ", ScalarizationCost = "
4272 << ScalarizationCost << '\n');
4273 if (GatherScatterCost < ScalarizationCost)
4274 setWideningDecision(&I, VF, CM_GatherScatter, GatherScatterCost);
4275 else
4276 setWideningDecision(&I, VF, CM_Scalarize, ScalarizationCost);
4277 continue;
4278 }
4279
4280 // We assume that widening is the best solution when possible.
4281 if (std::optional<InstWidening> Decision =
4283 InstructionCost WidenCost = getConsecutiveMemOpCost(&I, VF, *Decision);
4284 LLVM_DEBUG(
4285 dbgs() << "LV: Memory widening: can be widened normally with cost "
4286 << WidenCost << '\n');
4287 setWideningDecision(&I, VF, *Decision, WidenCost);
4288 continue;
4289 }
4290
4291 // Choose between Interleaving, Gather/Scatter or Scalarization.
4293 unsigned NumAccesses = 1;
4294 if (isAccessInterleaved(&I)) {
4295 const auto *Group = getInterleavedAccessGroup(&I);
4296 assert(Group && "Fail to get an interleaved access group.");
4297
4298 NumAccesses = Group->getNumMembers();
4300 InterleaveCost = getInterleaveGroupCost(&I, VF);
4301 }
4302
4303 InstructionCost GatherScatterCost =
4305 ? getGatherScatterCost(&I, VF) * NumAccesses
4307
4308 InstructionCost ScalarizationCost =
4309 getMemInstScalarizationCost(&I, VF) * NumAccesses;
4310
4311 // Choose better solution for the current VF,
4312 // write down this decision and use it during vectorization.
4314 InstWidening Decision;
4315 if (InterleaveCost <= GatherScatterCost &&
4316 InterleaveCost < ScalarizationCost) {
4317 Decision = CM_Interleave;
4318 Cost = InterleaveCost;
4319 } else if (GatherScatterCost < ScalarizationCost) {
4320 Decision = CM_GatherScatter;
4321 Cost = GatherScatterCost;
4322 } else {
4323 Decision = CM_Scalarize;
4324 Cost = ScalarizationCost;
4325 }
4326 LLVM_DEBUG(
4327 dbgs() << "LV: Memory widening: InterleaveCost = " << InterleaveCost
4328 << ", GatherScatterCost = " << GatherScatterCost
4329 << ", ScalarizationCost = " << ScalarizationCost << '\n');
4330
4331 // If the instructions belongs to an interleave group, the whole group
4332 // receives the same decision. The whole group receives the cost, but
4333 // the cost will actually be assigned to one instruction.
4334 if (const auto *Group = getInterleavedAccessGroup(&I)) {
4335 if (Decision == CM_Scalarize) {
4336 for (Instruction *I : Group->members())
4337 setWideningDecision(I, VF, Decision,
4338 getMemInstScalarizationCost(I, VF));
4339 } else {
4340 setWideningDecision(Group, VF, Decision, Cost);
4341 }
4342 } else
4343 setWideningDecision(&I, VF, Decision, Cost);
4344 }
4345 }
4346
4347 // Make sure that any load of address and any other address computation
4348 // remains scalar unless there is gather/scatter support. This avoids
4349 // inevitable extracts into address registers, and also has the benefit of
4350 // activating LSR more, since that pass can't optimize vectorized
4351 // addresses.
4352 if (TTI.prefersVectorizedAddressing())
4353 return;
4354
4355 // Start with all scalar pointer uses.
4357 for (BasicBlock *BB : TheLoop->blocks())
4358 for (Instruction &I : *BB) {
4359 Instruction *PtrDef =
4361 if (PtrDef && TheLoop->contains(PtrDef) &&
4363 AddrDefs.insert(PtrDef);
4364 }
4365
4366 // Add all instructions used to generate the addresses.
4368 append_range(Worklist, AddrDefs);
4369 while (!Worklist.empty()) {
4370 Instruction *I = Worklist.pop_back_val();
4371 for (auto &Op : I->operands())
4372 if (auto *InstOp = dyn_cast<Instruction>(Op))
4373 if (TheLoop->contains(InstOp) && !isa<PHINode>(InstOp) &&
4374 AddrDefs.insert(InstOp))
4375 Worklist.push_back(InstOp);
4376 }
4377
4378 auto UpdateMemOpUserCost = [this, VF](LoadInst *LI) {
4379 // If there are direct memory op users of the newly scalarized load,
4380 // their cost may have changed because there's no scalarization
4381 // overhead for the operand. Update it.
4382 for (User *U : LI->users()) {
4384 continue;
4386 continue;
4387 auto UI = cast<Instruction>(U);
4388 LLVM_DEBUG(
4389 dbgs() << "LV: Memory widening: updating decision for load user "
4390 << *UI << '\n');
4392 UI, VF, CM_Scalarize,
4393 getMemInstScalarizationCost(cast<Instruction>(U), VF));
4394 }
4395 };
4396 for (auto *I : AddrDefs) {
4397 if (isa<LoadInst>(I)) {
4398 // Setting the desired widening decision should ideally be handled in
4399 // by cost functions, but since this involves the task of finding out
4400 // if the loaded register is involved in an address computation, it is
4401 // instead changed here when we know this is the case.
4402 InstWidening Decision = getWideningDecision(I, VF);
4403 if (!isPredicatedInst(I) &&
4404 (Decision == CM_Widen || Decision == CM_Widen_Reverse ||
4405 (!isUniformMemOp(*I, VF) && Decision == CM_Scalarize))) {
4406 // Scalarize a widened load of address or update the cost of a scalar
4407 // load of an address.
4408 LLVM_DEBUG(dbgs() << "LV: Memory widening: updating decision for load "
4409 << *I << '\n');
4411 I, VF, CM_Scalarize,
4412 (VF.getKnownMinValue() *
4413 getMemoryInstructionCost(I, ElementCount::getFixed(1))));
4414 UpdateMemOpUserCost(cast<LoadInst>(I));
4415 } else if (const auto *Group = getInterleavedAccessGroup(I)) {
4416 // Scalarize all members of this interleaved group when any member
4417 // is used as an address. The address-used load skips scalarization
4418 // overhead, other members include it.
4419 for (Instruction *Member : Group->members()) {
4420 InstructionCost Cost = AddrDefs.contains(Member)
4421 ? (VF.getKnownMinValue() *
4422 getMemoryInstructionCost(
4423 Member, ElementCount::getFixed(1)))
4424 : getMemInstScalarizationCost(Member, VF);
4425 LLVM_DEBUG(
4426 dbgs()
4427 << "LV: Memory widening: updating decision for interleave member "
4428 << *Member << '\n');
4430 UpdateMemOpUserCost(cast<LoadInst>(Member));
4431 }
4432 }
4433 } else {
4434 // Cannot scalarize fixed-order recurrence phis at the moment.
4435 if (isa<PHINode>(I) && Legal->isFixedOrderRecurrence(cast<PHINode>(I)))
4436 continue;
4437
4438 // Make sure I gets scalarized and a cost estimate without
4439 // scalarization overhead.
4440 ForcedScalars[VF].insert(I);
4441 }
4442 }
4443}
4444
4446 if (!Legal->isInvariant(Op))
4447 return false;
4448 // Consider Op invariant, if it or its operands aren't predicated
4449 // instruction in the loop. In that case, it is not trivially hoistable.
4450 auto *OpI = dyn_cast<Instruction>(Op);
4451 return !OpI || !TheLoop->contains(OpI) ||
4452 (!isPredicatedInst(OpI) &&
4453 (!isa<PHINode>(OpI) || OpI->getParent() != TheLoop->getHeader()) &&
4454 all_of(OpI->operands(),
4455 [this](Value *Op) { return shouldConsiderInvariant(Op); }));
4456}
4457
4460 ElementCount VF) {
4461 // If we know that this instruction will remain uniform, check the cost of
4462 // the scalar version.
4464 VF = ElementCount::getFixed(1);
4465
4466 if (VF.isVector() && isProfitableToScalarize(I, VF))
4467 return InstsToScalarize[VF][I];
4468
4469 // Forced scalars do not have any scalarization overhead.
4470 auto ForcedScalar = ForcedScalars.find(VF);
4471 if (VF.isVector() && ForcedScalar != ForcedScalars.end()) {
4472 auto InstSet = ForcedScalar->second;
4473 if (InstSet.count(I))
4475 VF.getKnownMinValue();
4476 }
4477
4478 const auto &MinBWs = Config.getMinimalBitwidths();
4479 uint64_t InstrMinBWs = MinBWs.lookup(I);
4480 Type *RetTy = I->getType();
4482 RetTy = IntegerType::get(RetTy->getContext(), InstrMinBWs);
4483 auto *SE = PSE.getSE();
4484
4485 Type *VectorTy;
4486 if (isScalarAfterVectorization(I, VF)) {
4487 [[maybe_unused]] auto HasSingleCopyAfterVectorization =
4488 [this](Instruction *I, ElementCount VF) -> bool {
4489 if (VF.isScalar())
4490 return true;
4491
4492 auto Scalarized = InstsToScalarize.find(VF);
4493 assert(Scalarized != InstsToScalarize.end() &&
4494 "VF not yet analyzed for scalarization profitability");
4495 return !Scalarized->second.count(I) &&
4496 llvm::all_of(I->users(), [&](User *U) {
4497 auto *UI = cast<Instruction>(U);
4498 return !Scalarized->second.count(UI);
4499 });
4500 };
4501
4502 // With the exception of GEPs and PHIs, after scalarization there should
4503 // only be one copy of the instruction generated in the loop. This is
4504 // because the VF is either 1, or any instructions that need scalarizing
4505 // have already been dealt with by the time we get here. As a result,
4506 // it means we don't have to multiply the instruction cost by VF.
4507 assert(I->getOpcode() == Instruction::GetElementPtr ||
4508 I->getOpcode() == Instruction::PHI ||
4509 (I->getOpcode() == Instruction::BitCast &&
4510 I->getType()->isPointerTy()) ||
4511 HasSingleCopyAfterVectorization(I, VF));
4512 VectorTy = RetTy;
4513 } else
4514 VectorTy = toVectorizedTy(RetTy, VF);
4515
4516 if (VF.isVector() && VectorTy->isVectorTy() &&
4517 !TTI.getNumberOfParts(VectorTy))
4519
4520 // TODO: We need to estimate the cost of intrinsic calls.
4521 switch (I->getOpcode()) {
4522 case Instruction::GetElementPtr:
4523 // We mark this instruction as zero-cost because the cost of GEPs in
4524 // vectorized code depends on whether the corresponding memory instruction
4525 // is scalarized or not. Therefore, we handle GEPs with the memory
4526 // instruction cost.
4527 return 0;
4528 case Instruction::UncondBr:
4529 case Instruction::CondBr: {
4530 // In cases of scalarized and predicated instructions, there will be VF
4531 // predicated blocks in the vectorized loop. Each branch around these
4532 // blocks requires also an extract of its vector compare i1 element.
4533 // Note that the conditional branch from the loop latch will be replaced by
4534 // a single branch controlling the loop, so there is no extra overhead from
4535 // scalarization.
4536 bool ScalarPredicatedBB = false;
4538 if (VF.isVector() && BI &&
4539 (PredicatedBBsAfterVectorization[VF].count(BI->getSuccessor(0)) ||
4540 PredicatedBBsAfterVectorization[VF].count(BI->getSuccessor(1))) &&
4541 BI->getParent() != TheLoop->getLoopLatch())
4542 ScalarPredicatedBB = true;
4543
4544 if (ScalarPredicatedBB) {
4545 // Not possible to scalarize scalable vector with predicated instructions.
4546 if (VF.isScalable())
4548 // Return cost for branches around scalarized and predicated blocks.
4549 auto *VecI1Ty =
4551 return (TTI.getScalarizationOverhead(
4552 VecI1Ty, APInt::getAllOnes(VF.getFixedValue()),
4553 /*Insert*/ false, /*Extract*/ true, Config.CostKind) +
4554 (TTI.getCFInstrCost(Instruction::CondBr, Config.CostKind) *
4555 VF.getFixedValue()));
4556 }
4557
4558 if (I->getParent() == TheLoop->getLoopLatch() || VF.isScalar())
4559 // The back-edge branch will remain, as will all scalar branches.
4560 return TTI.getCFInstrCost(Instruction::UncondBr, Config.CostKind);
4561
4562 // This branch will be eliminated by if-conversion.
4563 return 0;
4564 // Note: We currently assume zero cost for an unconditional branch inside
4565 // a predicated block since it will become a fall-through, although we
4566 // may decide in the future to call TTI for all branches.
4567 }
4568 case Instruction::Switch: {
4569 if (VF.isScalar())
4570 return TTI.getCFInstrCost(Instruction::Switch, Config.CostKind);
4571 auto *Switch = cast<SwitchInst>(I);
4572 return Switch->getNumCases() *
4573 TTI.getCmpSelInstrCost(
4574 Instruction::ICmp,
4575 toVectorTy(Switch->getCondition()->getType(), VF),
4576 toVectorTy(Type::getInt1Ty(I->getContext()), VF),
4577 CmpInst::ICMP_EQ, Config.CostKind);
4578 }
4579 case Instruction::PHI: {
4580 auto *Phi = cast<PHINode>(I);
4581
4582 // First-order recurrences are replaced by vector shuffles inside the loop.
4583 if (VF.isVector() && Legal->isFixedOrderRecurrence(Phi)) {
4584 return TTI.getShuffleCost(
4586 cast<VectorType>(VectorTy), Config.CostKind, {}, -1);
4587 }
4588
4589 // Phi nodes in non-header blocks (not inductions, reductions, etc.) are
4590 // converted into select instructions. We require N - 1 selects per phi
4591 // node, where N is the number of incoming values.
4592 if (VF.isVector() && Phi->getParent() != TheLoop->getHeader()) {
4593 Type *ResultTy = Phi->getType();
4594
4595 // All instructions in an Any-of reduction chain are narrowed to bool.
4596 // Check if that is the case for this phi node.
4597 auto *HeaderUser = cast_if_present<PHINode>(
4598 find_singleton<User>(Phi->users(), [this](User *U, bool) -> User * {
4599 auto *Phi = dyn_cast<PHINode>(U);
4600 if (Phi && Phi->getParent() == TheLoop->getHeader())
4601 return Phi;
4602 return nullptr;
4603 }));
4604 if (HeaderUser) {
4605 auto &ReductionVars = Legal->getReductionVars();
4606 auto Iter = ReductionVars.find(HeaderUser);
4607 if (Iter != ReductionVars.end() &&
4609 Iter->second.getRecurrenceKind()))
4610 ResultTy = Type::getInt1Ty(Phi->getContext());
4611 }
4612 return (Phi->getNumIncomingValues() - 1) *
4613 TTI.getCmpSelInstrCost(
4614 Instruction::Select, toVectorTy(ResultTy, VF),
4615 toVectorTy(Type::getInt1Ty(Phi->getContext()), VF),
4616 CmpInst::BAD_ICMP_PREDICATE, Config.CostKind);
4617 }
4618
4619 // When tail folding with EVL, if the phi is part of an out of loop
4620 // reduction then it will be transformed into a wide vp_merge.
4621 if (VF.isVector() && foldTailWithEVL() &&
4622 Legal->getReductionVars().contains(Phi) &&
4623 !Config.isInLoopReduction(Phi)) {
4625 Intrinsic::vp_merge, toVectorTy(Phi->getType(), VF),
4626 {toVectorTy(Type::getInt1Ty(Phi->getContext()), VF)});
4627 return TTI.getIntrinsicInstrCost(ICA, Config.CostKind);
4628 }
4629
4630 return TTI.getCFInstrCost(Instruction::PHI, Config.CostKind);
4631 }
4632 case Instruction::UDiv:
4633 case Instruction::SDiv:
4634 case Instruction::URem:
4635 case Instruction::SRem:
4636 if (VF.isVector() && isPredicatedInst(I)) {
4637 const auto [ScalarCost, MaskedCost] = getDivRemSpeculationCost(I, VF);
4638 return isDivRemScalarWithPredication(ScalarCost, MaskedCost) ? ScalarCost
4639 : MaskedCost;
4640 }
4641 // We've proven all lanes safe to speculate, fall through.
4642 [[fallthrough]];
4643 case Instruction::Add:
4644 case Instruction::Sub: {
4645 auto Info = Legal->getHistogramInfo(I);
4646 if (Info && VF.isVector()) {
4647 const HistogramInfo *HGram = Info.value();
4648 // Assume that a non-constant update value (or a constant != 1) requires
4649 // a multiply, and add that into the cost.
4651 ConstantInt *RHS = dyn_cast<ConstantInt>(I->getOperand(1));
4652 if (!RHS || RHS->getZExtValue() != 1)
4653 MulCost = TTI.getArithmeticInstrCost(Instruction::Mul, VectorTy,
4654 Config.CostKind);
4655
4656 // Find the cost of the histogram operation itself.
4657 Type *PtrTy = VectorType::get(HGram->Load->getPointerOperandType(), VF);
4658 Type *ScalarTy = I->getType();
4659 Type *MaskTy = VectorType::get(Type::getInt1Ty(I->getContext()), VF);
4660 IntrinsicCostAttributes ICA(Intrinsic::experimental_vector_histogram_add,
4661 Type::getVoidTy(I->getContext()),
4662 {PtrTy, ScalarTy, MaskTy});
4663
4664 // Add the costs together with the add/sub operation.
4665 return TTI.getIntrinsicInstrCost(ICA, Config.CostKind) + MulCost +
4666 TTI.getArithmeticInstrCost(I->getOpcode(), VectorTy,
4667 Config.CostKind);
4668 }
4669 [[fallthrough]];
4670 }
4671 case Instruction::FAdd:
4672 case Instruction::FSub:
4673 case Instruction::Mul:
4674 case Instruction::FMul:
4675 case Instruction::FDiv:
4676 case Instruction::FRem:
4677 case Instruction::Shl:
4678 case Instruction::LShr:
4679 case Instruction::AShr:
4680 case Instruction::And:
4681 case Instruction::Or:
4682 case Instruction::Xor: {
4683 // If we're speculating on the stride being 1, the multiplication may
4684 // fold away. We can generalize this for all operations using the notion
4685 // of neutral elements. (TODO)
4686 if (I->getOpcode() == Instruction::Mul &&
4687 ((TheLoop->isLoopInvariant(I->getOperand(0)) &&
4688 PSE.getSCEV(I->getOperand(0))->isOne()) ||
4689 (TheLoop->isLoopInvariant(I->getOperand(1)) &&
4690 PSE.getSCEV(I->getOperand(1))->isOne())))
4691 return 0;
4692
4693 // Certain instructions can be cheaper to vectorize if they have a constant
4694 // second vector operand. One example of this are shifts on x86.
4695 Value *Op2 = I->getOperand(1);
4696 if (!isa<Constant>(Op2) && TheLoop->isLoopInvariant(Op2) &&
4697 PSE.getSE()->isSCEVable(Op2->getType()) &&
4698 isa<SCEVConstant>(PSE.getSCEV(Op2))) {
4699 Op2 = cast<SCEVConstant>(PSE.getSCEV(Op2))->getValue();
4700 }
4701 auto Op2Info = TTI.getOperandInfo(Op2);
4702 if (Op2Info.Kind == TargetTransformInfo::OK_AnyValue &&
4705
4706 SmallVector<const Value *, 4> Operands(I->operand_values());
4707 return TTI.getArithmeticInstrCost(
4708 I->getOpcode(), VectorTy, Config.CostKind,
4709 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4710 Op2Info, Operands, I, TLI);
4711 }
4712 case Instruction::FNeg: {
4713 return TTI.getArithmeticInstrCost(
4714 I->getOpcode(), VectorTy, Config.CostKind,
4715 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4716 {TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
4717 I->getOperand(0), I);
4718 }
4719 case Instruction::Select: {
4721 const SCEV *CondSCEV = SE->getSCEV(SI->getCondition());
4722 bool ScalarCond = (SE->isLoopInvariant(CondSCEV, TheLoop));
4723
4724 const Value *Op0, *Op1;
4725 using namespace llvm::PatternMatch;
4726 if (!ScalarCond && (match(I, m_LogicalAnd(m_Value(Op0), m_Value(Op1))) ||
4727 match(I, m_LogicalOr(m_Value(Op0), m_Value(Op1))))) {
4728 // select x, y, false --> x & y
4729 // select x, true, y --> x | y
4730 const auto [Op1VK, Op1VP] = TTI::getOperandInfo(Op0);
4731 const auto [Op2VK, Op2VP] = TTI::getOperandInfo(Op1);
4732 assert(Op0->getType()->getScalarSizeInBits() == 1 &&
4733 Op1->getType()->getScalarSizeInBits() == 1);
4734
4735 return TTI.getArithmeticInstrCost(
4736 match(I, m_LogicalOr()) ? Instruction::Or : Instruction::And,
4737 VectorTy, Config.CostKind, {Op1VK, Op1VP}, {Op2VK, Op2VP}, {Op0, Op1},
4738 I);
4739 }
4740
4741 Type *CondTy = SI->getCondition()->getType();
4742 if (!ScalarCond)
4743 CondTy = VectorType::get(CondTy, VF);
4744
4746 if (auto *Cmp = dyn_cast<CmpInst>(SI->getCondition()))
4747 Pred = Cmp->getPredicate();
4748 return TTI.getCmpSelInstrCost(
4749 I->getOpcode(), VectorTy, CondTy, Pred, Config.CostKind,
4750 {TTI::OK_AnyValue, TTI::OP_None}, {TTI::OK_AnyValue, TTI::OP_None}, I);
4751 }
4752 case Instruction::ICmp:
4753 case Instruction::FCmp: {
4754 Type *ValTy = I->getOperand(0)->getType();
4755
4757 [[maybe_unused]] Instruction *Op0AsInstruction =
4758 dyn_cast<Instruction>(I->getOperand(0));
4759 assert((!canTruncateToMinimalBitwidth(Op0AsInstruction, VF) ||
4760 InstrMinBWs == MinBWs.lookup(Op0AsInstruction)) &&
4761 "if both the operand and the compare are marked for "
4762 "truncation, they must have the same bitwidth");
4763 ValTy = IntegerType::get(ValTy->getContext(), InstrMinBWs);
4764 }
4765
4766 VectorTy = toVectorTy(ValTy, VF);
4767 return TTI.getCmpSelInstrCost(
4768 I->getOpcode(), VectorTy, CmpInst::makeCmpResultType(VectorTy),
4769 cast<CmpInst>(I)->getPredicate(), Config.CostKind,
4770 {TTI::OK_AnyValue, TTI::OP_None}, {TTI::OK_AnyValue, TTI::OP_None}, I);
4771 }
4772 case Instruction::Store:
4773 case Instruction::Load: {
4774 ElementCount Width = VF;
4775 if (Width.isVector()) {
4776 InstWidening Decision = getWideningDecision(I, Width);
4777 assert(Decision != CM_Unknown &&
4778 "CM decision should be taken at this point");
4781 if (Decision == CM_Scalarize)
4782 Width = ElementCount::getFixed(1);
4783 }
4784 VectorTy = toVectorTy(getLoadStoreType(I), Width);
4785 return getMemoryInstructionCost(I, VF);
4786 }
4787 case Instruction::BitCast:
4788 if (I->getType()->isPointerTy())
4789 return 0;
4790 [[fallthrough]];
4791 case Instruction::ZExt:
4792 case Instruction::SExt:
4793 case Instruction::FPToUI:
4794 case Instruction::FPToSI:
4795 case Instruction::FPExt:
4796 case Instruction::PtrToInt:
4797 case Instruction::IntToPtr:
4798 case Instruction::SIToFP:
4799 case Instruction::UIToFP:
4800 case Instruction::Trunc:
4801 case Instruction::FPTrunc: {
4802 // Computes the CastContextHint from a Load/Store instruction.
4803 auto ComputeCCH = [&](Instruction *I) -> TTI::CastContextHint {
4805 "Expected a load or a store!");
4806
4807 if (VF.isScalar() || !TheLoop->contains(I))
4809
4810 switch (getWideningDecision(I, VF)) {
4822 llvm_unreachable("Instr did not go through cost modelling?");
4825 }
4826
4827 llvm_unreachable("Unhandled case!");
4828 };
4829
4830 unsigned Opcode = I->getOpcode();
4832 // For Trunc, the context is the only user, which must be a StoreInst.
4833 if (Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) {
4834 if (I->hasOneUse())
4835 if (StoreInst *Store = dyn_cast<StoreInst>(*I->user_begin()))
4836 CCH = ComputeCCH(Store);
4837 }
4838 // For Z/Sext, the context is the operand, which must be a LoadInst.
4839 else if (Opcode == Instruction::ZExt || Opcode == Instruction::SExt ||
4840 Opcode == Instruction::FPExt) {
4841 if (LoadInst *Load = dyn_cast<LoadInst>(I->getOperand(0)))
4842 CCH = ComputeCCH(Load);
4843 }
4844
4845 // We optimize the truncation of induction variables having constant
4846 // integer steps. The cost of these truncations is the same as the scalar
4847 // operation.
4848 if (isOptimizableIVTruncate(I, VF)) {
4849 auto *Trunc = cast<TruncInst>(I);
4850 return TTI.getCastInstrCost(Instruction::Trunc, Trunc->getDestTy(),
4851 Trunc->getSrcTy(), CCH, Config.CostKind,
4852 Trunc);
4853 }
4854
4855 Type *SrcScalarTy = I->getOperand(0)->getType();
4856 Instruction *Op0AsInstruction = dyn_cast<Instruction>(I->getOperand(0));
4857 if (canTruncateToMinimalBitwidth(Op0AsInstruction, VF))
4858 SrcScalarTy = IntegerType::get(SrcScalarTy->getContext(),
4859 MinBWs.lookup(Op0AsInstruction));
4860 Type *SrcVecTy =
4861 VectorTy->isVectorTy() ? toVectorTy(SrcScalarTy, VF) : SrcScalarTy;
4862
4864 // If the result type is <= the source type, there will be no extend
4865 // after truncating the users to the minimal required bitwidth.
4866 if (VectorTy->getScalarSizeInBits() <= SrcVecTy->getScalarSizeInBits() &&
4867 (I->getOpcode() == Instruction::ZExt ||
4868 I->getOpcode() == Instruction::SExt))
4869 return 0;
4870 }
4871
4872 return TTI.getCastInstrCost(Opcode, VectorTy, SrcVecTy, CCH,
4873 Config.CostKind, I);
4874 }
4875 case Instruction::Call:
4876 return getVectorCallCost(cast<CallInst>(I), VF);
4877 case Instruction::ExtractValue:
4878 return TTI.getInstructionCost(I, Config.CostKind);
4879 case Instruction::Alloca:
4880 // We cannot easily widen alloca to a scalable alloca, as
4881 // the result would need to be a vector of pointers.
4882 if (VF.isScalable())
4884 return TTI.getArithmeticInstrCost(Instruction::Mul, RetTy, Config.CostKind);
4885 case Instruction::Freeze:
4886 return TTI::TCC_Free;
4887 default:
4888 // This opcode is unknown. Assume that it is the same as 'mul'.
4889 return TTI.getArithmeticInstrCost(Instruction::Mul, VectorTy,
4890 Config.CostKind);
4891 } // end of switch.
4892}
4893
4895 // Ignore ephemeral values.
4897
4898 SmallVector<Value *, 4> DeadInterleavePointerOps;
4900
4901 // If a scalar epilogue is required, users outside the loop won't use
4902 // live-outs from the vector loop but from the scalar epilogue. Ignore them if
4903 // that is the case.
4904 bool RequiresScalarEpilogue = requiresScalarEpilogue(true);
4905 auto IsLiveOutDead = [this, RequiresScalarEpilogue](User *U) {
4906 return RequiresScalarEpilogue &&
4907 !TheLoop->contains(cast<Instruction>(U)->getParent());
4908 };
4909
4911 DFS.perform(LI);
4912 for (BasicBlock *BB : reverse(make_range(DFS.beginRPO(), DFS.endRPO())))
4913 for (Instruction &I : reverse(*BB)) {
4914 if (VecValuesToIgnore.contains(&I) || ValuesToIgnore.contains(&I))
4915 continue;
4916
4917 // Add instructions that would be trivially dead and are only used by
4918 // values already ignored to DeadOps to seed worklist.
4920 all_of(I.users(), [this, IsLiveOutDead](User *U) {
4921 return VecValuesToIgnore.contains(U) ||
4922 ValuesToIgnore.contains(U) || IsLiveOutDead(U);
4923 }))
4924 DeadOps.push_back(&I);
4925
4926 // For interleave groups, we only create a pointer for the start of the
4927 // interleave group. Queue up addresses of group members except the insert
4928 // position for further processing.
4929 if (isAccessInterleaved(&I)) {
4930 auto *Group = getInterleavedAccessGroup(&I);
4931 if (Group->getInsertPos() == &I)
4932 continue;
4933 Value *PointerOp = getLoadStorePointerOperand(&I);
4934 DeadInterleavePointerOps.push_back(PointerOp);
4935 }
4936
4937 // Queue branches for analysis. They are dead, if their successors only
4938 // contain dead instructions.
4939 if (isa<CondBrInst>(&I))
4940 DeadOps.push_back(&I);
4941 }
4942
4943 // Mark ops feeding interleave group members as free, if they are only used
4944 // by other dead computations.
4945 for (unsigned I = 0; I != DeadInterleavePointerOps.size(); ++I) {
4946 auto *Op = dyn_cast<Instruction>(DeadInterleavePointerOps[I]);
4947 if (!Op || !TheLoop->contains(Op) || any_of(Op->users(), [this](User *U) {
4948 Instruction *UI = cast<Instruction>(U);
4949 return !VecValuesToIgnore.contains(U) &&
4950 (!isAccessInterleaved(UI) ||
4951 getInterleavedAccessGroup(UI)->getInsertPos() == UI);
4952 }))
4953 continue;
4954 VecValuesToIgnore.insert(Op);
4955 append_range(DeadInterleavePointerOps, Op->operands());
4956 }
4957
4958 // Mark ops that would be trivially dead and are only used by ignored
4959 // instructions as free.
4960 BasicBlock *Header = TheLoop->getHeader();
4961
4962 // Returns true if the block contains only dead instructions. Such blocks will
4963 // be removed by VPlan-to-VPlan transforms and won't be considered by the
4964 // VPlan-based cost model, so skip them in the legacy cost-model as well.
4965 auto IsEmptyBlock = [this](BasicBlock *BB) {
4966 return all_of(*BB, [this](Instruction &I) {
4967 return ValuesToIgnore.contains(&I) || VecValuesToIgnore.contains(&I) ||
4969 });
4970 };
4971 SmallPtrSet<Instruction *, 16> ProcessedDeadOps;
4972 for (unsigned I = 0; I != DeadOps.size(); ++I) {
4973 auto *Op = dyn_cast<Instruction>(DeadOps[I]);
4974
4975 // Check if the branch should be considered dead.
4976 if (auto *Br = dyn_cast_or_null<CondBrInst>(Op)) {
4977 BasicBlock *ThenBB = Br->getSuccessor(0);
4978 BasicBlock *ElseBB = Br->getSuccessor(1);
4979 // Don't considers branches leaving the loop for simplification.
4980 if (!TheLoop->contains(ThenBB) || !TheLoop->contains(ElseBB))
4981 continue;
4982 bool ThenEmpty = IsEmptyBlock(ThenBB);
4983 bool ElseEmpty = IsEmptyBlock(ElseBB);
4984 if ((ThenEmpty && ElseEmpty) ||
4985 (ThenEmpty && ThenBB->getSingleSuccessor() == ElseBB &&
4986 ElseBB->phis().empty()) ||
4987 (ElseEmpty && ElseBB->getSingleSuccessor() == ThenBB &&
4988 ThenBB->phis().empty())) {
4989 VecValuesToIgnore.insert(Br);
4990 DeadOps.push_back(Br->getCondition());
4991 }
4992 continue;
4993 }
4994
4995 // Skip any op that shouldn't be considered dead.
4996 if (!Op || !TheLoop->contains(Op) ||
4997 (isa<PHINode>(Op) && Op->getParent() == Header) ||
4999 any_of(Op->users(), [this, IsLiveOutDead](User *U) {
5000 return !VecValuesToIgnore.contains(U) &&
5001 !ValuesToIgnore.contains(U) && !IsLiveOutDead(U);
5002 }))
5003 continue;
5004
5005 // If all of Op's users are in ValuesToIgnore, add it to ValuesToIgnore
5006 // which applies for both scalar and vector versions. Otherwise it is only
5007 // dead in vector versions, so only add it to VecValuesToIgnore.
5008 bool BecameScalarDead = false;
5009 if (all_of(Op->users(),
5010 [this](User *U) { return ValuesToIgnore.contains(U); }))
5011 BecameScalarDead = ValuesToIgnore.insert(Op).second;
5012
5013 VecValuesToIgnore.insert(Op);
5014 // Shared operands may be queued more than once. Propagate deadness once,
5015 // and again if an instruction previously dead only in the vector loop
5016 // becomes dead in the scalar loop too.
5017 if (ProcessedDeadOps.insert(Op).second || BecameScalarDead)
5018 append_range(DeadOps, Op->operands());
5019 }
5020
5021 // Ignore type-promoting instructions we identified during reduction
5022 // detection.
5023 for (const RecurrenceDescriptor &RedDes :
5024 Legal->getReductionVars().values()) {
5025 VecValuesToIgnore.insert_range(RedDes.getCastInsts());
5026 }
5027 // Ignore type-casting instructions we identified during induction
5028 // detection.
5029 for (const InductionDescriptor &IndDes : Legal->getInductionVars().values())
5030 VecValuesToIgnore.insert_range(IndDes.getCastInsts());
5031}
5032
5033void LoopVectorizationPlanner::plan(ElementCount UserVF, unsigned UserIC) {
5034 CM->collectValuesToIgnore();
5035 Config.collectElementTypesForWidening(&CM->ValuesToIgnore);
5036
5037 FixedScalableVFPair MaxFactors = CM->computeMaxVF(UserVF, UserIC);
5038 if (!MaxFactors) // Cases that should not to be vectorized nor interleaved.
5039 return;
5040
5041 Config.collectInLoopReductions();
5042 // Cases that may be vectorized may be optimized by unit stride predicates.
5043 // TODO: Currently unit stride predicates are added unconditionally, even if
5044 // they are not used for the selected VF (e.g. when only interleaving).
5045 if (MaxFactors.FixedVF.isVector() || MaxFactors.ScalableVF.isVector())
5046 Legal->collectUnitStridePredicates();
5047
5048 auto VPlan1 = tryToBuildVPlan1(*CM);
5049 if (!VPlan1)
5050 return;
5051
5052 LLVM_DEBUG(dbgs() << "LV: VPlan created successfully. Loop can be "
5053 "vectorized.\n");
5054
5055 if (!OrigLoop->isInnermost()) {
5056 // For outer loops, computeMaxVF returns a single non-scalar VF; build a
5057 // plan for that VF only.
5058 ElementCount VF =
5059 MaxFactors.FixedVF ? MaxFactors.FixedVF : MaxFactors.ScalableVF;
5060 buildVPlans(*VPlan1, VF, VF, *CM);
5062 return;
5063 }
5064
5065 // Compute the minimal bitwidths required for integer operations in the loop
5066 // for later use by the cost model.
5067 Config.computeMinimalBitwidths();
5068
5069 // Invalidate interleave groups if all blocks of loop will be predicated.
5070 if (CM->blockNeedsPredicationForAnyReason(OrigLoop->getHeader()) &&
5071 !useMaskedInterleavedAccesses(Opts, TTI)) {
5072 LLVM_DEBUG(
5073 dbgs()
5074 << "LV: Invalidate all interleaved groups due to fold-tail by masking "
5075 "which requires masked-interleaved support.\n");
5076 if (CM->InterleaveInfo.invalidateGroups())
5077 // Invalidating interleave groups also requires invalidating all decisions
5078 // based on them, which includes widening decisions and uniform and scalar
5079 // values.
5080 CM->invalidateCostModelingDecisions();
5081 }
5082
5083 if (CM->foldTailByMasking())
5084 Legal->prepareToFoldTailByMasking();
5085
5086 ElementCount MaxUserVF =
5087 UserVF.isScalable() ? MaxFactors.ScalableVF : MaxFactors.FixedVF;
5088 if (UserVF) {
5089 if (!ElementCount::isKnownLE(UserVF, MaxUserVF)) {
5091 "UserVF ignored because it may be larger than the maximal safe VF",
5092 "InvalidUserVF", ORE, OrigLoop);
5093 } else {
5094 assert(UserVF.isPowerOf2() && "VF needs to be a power of two");
5095 // Collect the instructions (and their associated costs) that will be more
5096 // profitable to scalarize.
5097 CM->collectNonVectorizedAndSetWideningDecisions(UserVF);
5098 buildVPlans(*VPlan1, UserVF, UserVF, *CM);
5100 if (EpilogueUserVF.isVector() &&
5101 ElementCount::isKnownLT(EpilogueUserVF, UserVF)) {
5102 CM->collectNonVectorizedAndSetWideningDecisions(EpilogueUserVF);
5103 buildVPlans(*VPlan1, EpilogueUserVF, EpilogueUserVF, *CM);
5104 }
5105 if (!VPlans.empty() && VPlans.front()->getSingleVF() == UserVF) {
5106 // For scalar VF, skip VPlan cost check as VPlan cost is designed for
5107 // vector VFs only.
5108 if (UserVF.isScalar() ||
5109 cost(*VPlans.front(), UserVF, /*RU=*/nullptr, *CM).isValid()) {
5110 LLVM_DEBUG(dbgs() << "LV: Using user VF " << UserVF << ".\n");
5112 return;
5113 }
5114 }
5115 VPlans.clear();
5116 reportVectorizationInfo("UserVF ignored because of invalid costs.",
5117 "InvalidCost", ORE, OrigLoop);
5118 }
5119 }
5120
5121 // Collect the Vectorization Factor Candidates.
5122 SmallVector<ElementCount> VFCandidates;
5123 for (auto VF = ElementCount::getFixed(1);
5124 ElementCount::isKnownLE(VF, MaxFactors.FixedVF); VF *= 2)
5125 VFCandidates.push_back(VF);
5126 for (auto VF = ElementCount::getScalable(1);
5127 ElementCount::isKnownLE(VF, MaxFactors.ScalableVF); VF *= 2)
5128 VFCandidates.push_back(VF);
5129
5130 for (const auto &VF : VFCandidates) {
5131 // Collect Uniform and Scalar instructions after vectorization with VF.
5132 CM->collectNonVectorizedAndSetWideningDecisions(VF);
5133 }
5134
5135 buildVPlans(*VPlan1, ElementCount::getFixed(1), MaxFactors.FixedVF, *CM);
5136 buildVPlans(*VPlan1, ElementCount::getScalable(1), MaxFactors.ScalableVF,
5137 *CM);
5138
5140}
5141
5145 bool ReusePrintingSlotTracker)
5146 : Opts(Config.getOpts()), TTI(Config.getTTI()), TLI(TLI),
5147 LLVMCtx(Plan.getContext()), CM(CM), Config(Config),
5148 CostKind(Config.CostKind), PSE(Config.getPSE()), L(Config.getLoop()) {
5149#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5150 if (ReusePrintingSlotTracker)
5151 PlanForSlotTracker = &Plan;
5152#endif
5153}
5154
5156 ElementCount VF) const {
5157 InstructionCost Cost = CM.getInstructionCost(UI, VF);
5158 if (Cost.isValid() && Opts.force_target_instruction_cost)
5159 return InstructionCost(*Opts.force_target_instruction_cost);
5160 return Cost;
5161}
5162
5163bool VPCostContext::skipCostComputation(Instruction *UI, bool IsVector) const {
5164 return CM.ValuesToIgnore.contains(UI) ||
5165 (IsVector && CM.VecValuesToIgnore.contains(UI)) ||
5166 SkipCostComputation.contains(UI);
5167}
5168
5174
5176 return CM.isScalarWithPredication(I, VF) ||
5177 CM.isUniformAfterVectorization(I, VF) || CM.isForcedScalar(I, VF) ||
5178 (VF.isVector() && CM.isProfitableToScalarize(I, VF));
5179}
5180
5182 return CM.isMaskRequired(I);
5183}
5184
5188 return TC && TC->getValue().ule(VF.getKnownMinValue());
5189}
5190
5192LoopVectorizationPlanner::precomputeCosts(VPlan &Plan, ElementCount VF,
5193 VPCostContext &CostCtx) const {
5195
5196 // If the vector loop gets executed exactly once with the given VF, ignore the
5197 // costs of comparison and induction instructions, as they'll get simplified
5198 // away.
5199 // TODO: Remove this code after stepping away from the legacy cost model and
5200 // adding code to simplify VPlans before calculating their costs.
5201 auto TC = getSmallConstantTripCount(PSE.getSE(), OrigLoop);
5202 if (TC == VF && !Plan.hasTailFolded())
5203 addFullyUnrolledInstructionsToIgnore(OrigLoop, Legal->getInductionVars(),
5204 CostCtx.SkipCostComputation);
5205
5206 // Pre-compute the costs for branches except for the backedge, as the number
5207 // of replicate regions in a VPlan may not directly match the number of
5208 // branches, which would lead to different decisions.
5209 // TODO: Compute cost of branches for each replicate region in the VPlan,
5210 // which is more accurate than the legacy cost model.
5211 for (BasicBlock *BB : OrigLoop->blocks()) {
5212 if (CostCtx.skipCostComputation(BB->getTerminator(), VF.isVector()))
5213 continue;
5214 CostCtx.SkipCostComputation.insert(BB->getTerminator());
5215 if (BB == OrigLoop->getLoopLatch())
5216 continue;
5217 auto BranchCost = CostCtx.getLegacyCost(BB->getTerminator(), VF);
5218 Cost += BranchCost;
5219 }
5220
5221 // Don't apply special costs when instruction cost is forced to make sure the
5222 // forced cost is used for each recipe.
5223 if (Opts.force_target_instruction_cost)
5224 return Cost;
5225
5226 // Pre-compute costs for instructions that are forced-scalar or profitable to
5227 // scalarize. For most such instructions, their scalarization costs are
5228 // accounted for here using the legacy cost model. However, some opcodes
5229 // are excluded from these precomputed scalarization costs and are instead
5230 // modeled later by the VPlan cost model (see UseVPlanCostModel below).
5231 for (Instruction *ForcedScalar : CostCtx.CM.ForcedScalars[VF]) {
5232 if (CostCtx.skipCostComputation(ForcedScalar, VF.isVector()))
5233 continue;
5234 CostCtx.SkipCostComputation.insert(ForcedScalar);
5235 InstructionCost ForcedCost = CostCtx.getLegacyCost(ForcedScalar, VF);
5236 LLVM_DEBUG({
5237 dbgs() << "Cost of " << ForcedCost << " for VF " << VF
5238 << ": forced scalar " << *ForcedScalar << "\n";
5239 });
5240 Cost += ForcedCost;
5241 }
5242
5243 // Don't apply legacy scalarization costs if nothing remains scalar &
5244 // predicated.
5245 if (!hasReplicatorRegion(Plan))
5246 return Cost;
5247
5248 auto UseVPlanCostModel = [](Instruction *I) -> bool {
5249 switch (I->getOpcode()) {
5250 case Instruction::SDiv:
5251 case Instruction::UDiv:
5252 case Instruction::SRem:
5253 case Instruction::URem:
5254 return true;
5255 default:
5256 return false;
5257 }
5258 };
5259 // Only charge legacy scalarization costs for instructions VPlan replicates.
5260 SmallPtrSet<Instruction *, 8> Replicated;
5261 for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
5263 for (VPReplicateRecipe &RepR : make_isa_range<VPReplicateRecipe>(*VPBB))
5264 Replicated.insert(RepR.getUnderlyingInstr());
5265 for (const auto &[Scalarized, ScalarCost] : CostCtx.CM.InstsToScalarize[VF]) {
5266 if (!Replicated.contains(Scalarized) || UseVPlanCostModel(Scalarized) ||
5267 CostCtx.skipCostComputation(Scalarized, VF.isVector()))
5268 continue;
5269 CostCtx.SkipCostComputation.insert(Scalarized);
5270 LLVM_DEBUG({
5271 dbgs() << "Cost of " << ScalarCost << " for VF " << VF
5272 << ": profitable to scalarize " << *Scalarized << "\n";
5273 });
5274 Cost += ScalarCost;
5275 }
5276
5277 return Cost;
5278}
5279
5280#ifndef NDEBUG
5281/// Returns the frequency with which \p VPBB executes, as recorded on its
5282/// recipes. All recipes of a block share the same frequency.
5283static std::optional<VPExecutionFrequency>
5285 if (VPBB->empty())
5286 return std::nullopt;
5287 return cast<VPInstruction>(&VPBB->front())->getExecutionFrequency();
5288}
5289#endif
5290
5292LoopVectorizationPlanner::cost(VPlan &Plan, ElementCount VF,
5293 VPRegisterUsage *RU,
5294 LoopVectorizationCostModel &PlanCM) const {
5295 VPCostContext CostCtx(*TLI, Plan, PlanCM, Config,
5296 /*ReusePrintingSlotTracker=*/true);
5297 InstructionCost Cost = precomputeCosts(Plan, VF, CostCtx);
5298 LLVM_DEBUG(dbgs() << "Precomputed costs for VF " << VF << ": " << Cost
5299 << '\n');
5300
5301 // Now compute and add the VPlan-based cost.
5302 Cost += Plan.cost(VF, CostCtx);
5303
5304 // Add the cost of spills due to excess register usage
5305 if (RU && Config.shouldConsiderRegPressureForVF(VF)) {
5306 InstructionCost SpillCost = RU->spillCost(
5307 TTI, Config.CostKind, Opts.force_target_num_vector_regs.value_or(0));
5308 LLVM_DEBUG(dbgs() << "Spill costs for VF " << VF << ": " << SpillCost
5309 << '\n');
5310 Cost += SpillCost;
5311 }
5312
5313#ifndef NDEBUG
5314 unsigned EstimatedWidth =
5315 estimateElementCount(VF, Config.getVScaleForTuning());
5316 LLVM_DEBUG(dbgs() << "Cost for VF " << VF << ": " << Cost
5317 << " (Estimated cost per lane: ");
5318 if (Cost.isValid()) {
5319 APFloat CostPerLane(APFloat::IEEEdouble());
5320 APFloat EstimatedWidthAsAPFloat(APFloat::IEEEdouble());
5321 (void)CostPerLane.convertFromAPInt(APInt(64, (uint64_t)Cost.getValue()),
5322 false, APFloat::rmTowardZero);
5323 (void)EstimatedWidthAsAPFloat.convertFromAPInt(
5324 APInt(64, (uint64_t)EstimatedWidth), false, APFloat::rmTowardZero);
5325 (void)CostPerLane.divide(EstimatedWidthAsAPFloat, APFloat::rmTowardZero);
5326
5327 SmallString<16> Str;
5328 CostPerLane.toString(Str, 3);
5329 LLVM_DEBUG(dbgs() << Str);
5330 } else /* No point dividing an invalid cost - it will still be invalid */
5331 LLVM_DEBUG(dbgs() << "Invalid");
5332 LLVM_DEBUG(dbgs() << ")\n");
5333#endif
5334 return Cost;
5335}
5336
5337std::pair<VectorizationFactor, VPlan *>
5339 if (VPlans.empty())
5340 return {VectorizationFactor::Disabled(), nullptr};
5341 // If there is a single VPlan with a single VF, return it directly.
5342 VPlan &FirstPlan = *VPlans[0];
5343
5344 ElementCount UserVF = Config.getHints().getWidth();
5345 if (VPlans.size() == 1) {
5346 // For outer loops, the plan has a single vector VF determined by the
5347 // heuristic.
5348 assert((FirstPlan.hasScalarVFOnly() || hasPlanWithVF(UserVF) ||
5349 FirstPlan.isOuterLoop()) &&
5350 "must have a single scalar VF, UserVF or an outer loop");
5351 return {VectorizationFactor(FirstPlan.getSingleVF(), 0, 0), &FirstPlan};
5352 }
5353
5354 if (hasPlanWithVF(UserVF) && hasForcedEpilogueVF() && VPlans.size() == 2) {
5355 assert(VPlans[0]->getSingleVF() == UserVF &&
5356 "expected second plan to be for the forced UserVF");
5357 assert(VPlans[1]->getSingleVF() == EpilogueVectorizationForceVF &&
5358 "expected first plan to be for the forced epilogue VF");
5359 return {VectorizationFactor(UserVF, 0, 0), VPlans[0].get()};
5360 }
5361
5362 LLVM_DEBUG(dbgs() << "LV: Computing best VF using cost kind: "
5363 << (Config.CostKind == TTI::TCK_RecipThroughput
5364 ? "Reciprocal Throughput\n"
5365 : Config.CostKind == TTI::TCK_Latency
5366 ? "Instruction Latency\n"
5367 : Config.CostKind == TTI::TCK_CodeSize ? "Code Size\n"
5368 : Config.CostKind == TTI::TCK_SizeAndLatency
5369 ? "Code Size and Latency\n"
5370 : "Unknown\n"));
5371
5373 assert(FirstPlan.hasVF(ScalarVF) &&
5374 "More than a single plan/VF w/o any plan having scalar VF");
5375
5376 // TODO: Compute scalar cost using VPlan-based cost model.
5377 InstructionCost ScalarCost = CM->expectedCost(ScalarVF);
5378 LLVM_DEBUG(dbgs() << "LV: Scalar loop costs: " << ScalarCost << ".\n");
5379 VectorizationFactor ScalarFactor(ScalarVF, ScalarCost, ScalarCost);
5380 VectorizationFactor BestFactor = ScalarFactor;
5381
5382 bool ForceVectorization =
5383 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
5384 if (ForceVectorization) {
5385 // Ignore scalar width, because the user explicitly wants vectorization.
5386 // Initialize cost to max so that VF = 2 is, at least, chosen during cost
5387 // evaluation.
5388 BestFactor.Cost = InstructionCost::getMax();
5389 }
5390
5391 VPlan *PlanForBestVF = &FirstPlan;
5392 ElementCount ExactTC = getSmallConstantTripCount(PSE.getSE(), OrigLoop);
5393
5394 for (auto &P : VPlans) {
5395 ArrayRef<ElementCount> VFs(P->vectorFactors().begin(),
5396 P->vectorFactors().end());
5397
5398 // For loops where the Trip Count is below the TailFoldingThreshold, only
5399 // consider the largest VF to result in at most one vector iteration, and at
5400 // most one scalar iteration.
5401 // FIXME: Encode this decision directly in LVPlanner.
5402 if (!ForceVectorization && P->hasScalarTail() && ExactTC.isFixed() &&
5403 ExactTC.getFixedValue() > 0 &&
5404 ExactTC.getFixedValue() <= TTI.getMinTripCountTailFoldingThreshold()) {
5405 VFs = VFs.take_back(1);
5406 }
5407
5409 bool ConsiderRegPressure = any_of(VFs, [this](ElementCount VF) {
5410 return Config.shouldConsiderRegPressureForVF(VF);
5411 });
5412 if (ConsiderRegPressure)
5413 RUs = calculateRegisterUsageForPlan(*P, VFs, TTI);
5414
5415 for (unsigned I = 0; I < VFs.size(); I++) {
5416 ElementCount VF = VFs[I];
5417 if (VF.isScalar())
5418 continue;
5419 if (!ForceVectorization && !willGenerateVectors(*P, VF, TTI)) {
5420 LLVM_DEBUG(
5421 dbgs()
5422 << "LV: Not considering vector loop of width " << VF
5423 << " because it will not generate any vector instructions.\n");
5424 continue;
5425 }
5426 if (Config.OptForSize && !ForceVectorization && hasReplicatorRegion(*P)) {
5427 LLVM_DEBUG(
5428 dbgs()
5429 << "LV: Not considering vector loop of width " << VF
5430 << " because it would cause replicated blocks to be generated,"
5431 << " which isn't allowed when optimizing for size.\n");
5432 continue;
5433 }
5434
5436 cost(*P, VF, ConsiderRegPressure ? &RUs[I] : nullptr, *CM);
5437 VectorizationFactor CurrentFactor(VF, Cost, ScalarCost);
5438
5439 if (isMoreProfitable(CurrentFactor, BestFactor, P->hasScalarTail())) {
5440 BestFactor = CurrentFactor;
5441 PlanForBestVF = P.get();
5442 }
5443
5444 // If profitable add it to ProfitableVF list.
5445 if (isMoreProfitable(CurrentFactor, ScalarFactor, P->hasScalarTail()))
5446 ProfitableVFs.push_back(CurrentFactor);
5447 }
5448 }
5449
5450 VPlan &BestPlan = *PlanForBestVF;
5451
5452 assert((BestFactor.Width.isScalar() || BestFactor.ScalarCost > 0) &&
5453 "when vectorizing, the scalar cost must be computed.");
5454
5455 LLVM_DEBUG(dbgs() << "LV: Selecting VF: " << BestFactor.Width << ".\n");
5456 return {BestFactor, &BestPlan};
5457}
5458
5460 Loop *L, LoopInfo *LI, DominatorTree *DT, const TargetLibraryInfo *TLI,
5462 std::unique_ptr<LoopVectorizationCostModel> CM, VFSelectionContext &Config,
5464 std::function<const BranchProbabilityInfo &()> GetBPI)
5465 : Opts(Config.getOpts()), OrigLoop(L), LI(LI), DT(DT), TLI(TLI), TTI(TTI),
5466 Legal(Legal), CM(std::move(CM)), Config(Config), PSE(PSE), ORE(ORE),
5467 GetBPI(GetBPI) {}
5468
5470
5472
5474 ElementCount BestVF, unsigned BestUF, VPlan &BestVPlan,
5476 EpilogueVectorizationKind EpilogueVecKind) {
5477 assert(BestVPlan.hasVF(BestVF) &&
5478 "Trying to execute plan with unsupported VF");
5479 assert(BestVPlan.hasUF(BestUF) &&
5480 "Trying to execute plan with unsupported UF");
5481 if (BestVPlan.hasEarlyExit())
5482 ++LoopsEarlyExitVectorized;
5483
5485 *PSE.getSE(), TTI, Config.CostKind, BestVF, BestUF);
5486 if (!BestVPlan.hasTailFolded() &&
5487 TTI.hasMultiVectorLoadStore(BestUF,
5490 BestUF, TTI);
5491 // TODO: Move to VPlan transform stage once the transition to the VPlan-based
5492 // cost model is complete for better cost estimates.
5493 RUN_VPLAN_PASS(VPlanTransforms::unrollByUF, BestVPlan, BestUF);
5497 bool HasBranchWeights =
5498 hasBranchWeightMD(*OrigLoop->getLoopLatch()->getTerminator());
5499 if (HasBranchWeights) {
5500 std::optional<unsigned> VScale = Config.getVScaleForTuning();
5502 BestVPlan, BestVF, VScale);
5503 }
5504
5505 if (vputils::findIncomingAliasMask(BestVPlan)) {
5506 assert(BestVPlan.hasTailFolded() && "Expected tail folding to be enabled");
5508 *Legal->getRuntimePointerChecking()->getDiffChecks(),
5509 HasBranchWeights);
5510 ++LoopsPartialAliasVectorized;
5511 }
5512
5513 // Retrieving VectorPH now when it's easier while VPlan still has Regions.
5514 VPBasicBlock *VectorPH = cast<VPBasicBlock>(BestVPlan.getVectorPreheader());
5515
5517 BestVF, BestUF, PSE);
5518 RUN_VPLAN_PASS(VPlanTransforms::optimizeForVFAndUF, BestVPlan, BestVF, BestUF,
5519 PSE);
5521 // Check if scalar epilogue is required, before simplifying constant branches.
5522 const bool RequiresScalarEpilogue = BestVPlan.requiresScalarEpilogue();
5523 if (EpilogueVecKind == EpilogueVectorizationKind::None)
5525 /*OnlyLatches=*/false);
5526 if (BestVPlan.getEntry()->getSingleSuccessor() ==
5527 BestVPlan.getScalarPreheader()) {
5528 // TODO: The vector loop would be dead, should not even try to vectorize.
5529 ORE->emit([&]() {
5530 return OptimizationRemarkAnalysis(DEBUG_TYPE, "VectorizationDead",
5531 OrigLoop->getStartLoc(),
5532 OrigLoop->getHeader())
5533 << "Created vector loop never executes due to insufficient trip "
5534 "count.";
5535 });
5537 }
5538
5540
5542 // Convert the exit condition to AVLNext == 0 for EVL tail folded loops.
5544 // Regions are dissolved after optimizing for VF and UF, which completely
5545 // removes unneeded loop regions first.
5546 const bool HasTailFolded = BestVPlan.hasTailFolded();
5548 // Expand BranchOnTwoConds after dissolution, when latch has direct access to
5549 // its successors.
5551 // Convert loops with variable-length stepping after regions are dissolved.
5553 // Remove dead back-edges for single-iteration loops with BranchOnCond(true).
5554 // Only process loop latches to avoid removing edges from the middle block,
5555 // which may be needed for epilogue vectorization.
5557 /*OnlyLatches=*/true);
5559 VectorPH);
5560 std::optional<uint64_t> MaxRuntimeStep = getMaxRuntimeElementCount(
5561 BestVF * BestUF, *OrigLoop->getHeader()->getParent());
5562
5563 assert((LI->getUniqueLatchExitBlock(*OrigLoop) || RequiresScalarEpilogue) &&
5564 "loops not exiting via the latch without required epilogue?");
5566 VectorPH, HasTailFolded, RequiresScalarEpilogue,
5567 &BestVPlan.getVFxUF(), MaxRuntimeStep);
5569 BestVF);
5570 // Limit expansions to VPInstruction to when not vectorizing the epilogue.
5571 // Currently this code path still relies on code re-using SCEVs expanded
5572 // directly to IR instructions.
5573 if (EpilogueVecKind == EpilogueVectorizationKind::None)
5575 *PSE.getSE());
5577 RUN_VPLAN_PASS(VPlanTransforms::cse, BestVPlan, VPDominatorTree(BestVPlan));
5579 // Removing branches and incoming values may expose additional simplification
5580 // opportunities.
5582 /*OnlyLatches=*/EpilogueVecKind !=
5585 RUN_VPLAN_PASS(VPlanTransforms::simplifyKnownEVL, BestVPlan, BestVF, PSE);
5586
5587 // 0. Generate SCEV-dependent code in the entry, including TripCount, before
5588 // making any changes to the CFG.
5589 DenseMap<const SCEV *, Value *> ExpandedSCEVs =
5590 RUN_VPLAN_PASS(VPlanTransforms::expandSCEVs, BestVPlan, *PSE.getSE());
5591
5592 // Perform the actual loop transformation.
5593 VPTransformState State(&TTI, BestVF, LI, DT, ILV.AC, ILV.Builder, &BestVPlan,
5594 OrigLoop->getParentLoop());
5595
5596#ifdef EXPENSIVE_CHECKS
5597 assert(DT->verify(DominatorTree::VerificationLevel::Fast));
5598#endif
5599
5600 // 1. Create the scalar preheader; all other blocks are created during VPlan
5601 // execution.
5602 State.CFG.PrevBB = OrigLoop->getLoopPreheader();
5603 assert(State.CFG.PrevBB && "Invalid loop structure");
5604 BasicBlock *ScalarPHBB = SplitBlock(
5605 State.CFG.PrevBB, State.CFG.PrevBB->getTerminator(), DT, LI, nullptr,
5606 EpilogueVecKind == EpilogueVectorizationKind::Epilogue
5607 ? "vec.epilog.scalar.ph"
5608 : "scalar.ph");
5609 if (VPBasicBlock *ScalarPH = BestVPlan.getScalarPreheader())
5610 replaceVPBBWithIRVPBB(ScalarPH, ScalarPHBB, &BestVPlan);
5612
5613 assert(verifyVPlanIsValid(BestVPlan) && "final VPlan is invalid");
5614
5615 // After vectorization, the exit blocks of the original loop will have
5616 // additional predecessors. Invalidate SCEVs for the exit phis in case SE
5617 // looked through single-entry phis.
5618 ScalarEvolution &SE = *PSE.getSE();
5619 for (VPIRBasicBlock *Exit : BestVPlan.getExitBlocks()) {
5620 if (!Exit->hasPredecessors())
5621 continue;
5622 for (VPRecipeBase &PhiR : Exit->phis())
5624 &cast<VPIRPhi>(PhiR).getIRPhi());
5625 }
5626
5627 // Query whether the target wants loops it vectorizes to remain eligible for
5628 // runtime unrolling. Do this here, on the original loop and before its SCEV
5629 // is forgotten below.
5631 TTI.getUnrollingPreferences(OrigLoop, SE, UP, ORE);
5632 bool UnrollVectorizedLoop = UP.UnrollVectorizedLoop;
5633
5634 // Forget the original loop and block dispositions.
5635 SE.forgetLoop(OrigLoop);
5637
5638 //===------------------------------------------------===//
5639 //
5640 // Notice: any optimization or new instruction that go
5641 // into the code below should also be implemented in
5642 // the cost-model.
5643 //
5644 //===------------------------------------------------===//
5645
5646 // Retrieve loop information before executing the plan, which may remove the
5647 // original loop, if it becomes unreachable.
5648 MDNode *LID = OrigLoop->getLoopID();
5649 unsigned OrigLoopInvocationWeight = 0;
5650 std::optional<unsigned> OrigAverageTripCount =
5651 getLoopEstimatedTripCount(OrigLoop, &OrigLoopInvocationWeight);
5652
5653 BestVPlan.execute(&State);
5654
5655 // 2.6. Maintain Loop Hints
5656 // Keep all loop hints from the original loop on the vector loop (we'll
5657 // replace the vectorizer-specific hints below).
5658 VPBasicBlock *HeaderVPBB = vputils::getFirstLoopHeader(BestVPlan, State.VPDT);
5659 // Add metadata to disable runtime unrolling a scalar loop when there
5660 // are no runtime checks about strides and memory. A scalar loop that is
5661 // rarely used is not worth unrolling.
5662 bool DisableRuntimeUnroll = !ILV.RTChecks.hasChecks() && !BestVF.isScalar();
5664 HeaderVPBB ? LI->getLoopFor(State.CFG.VPBB2IRBB.lookup(HeaderVPBB))
5665 : nullptr,
5666 HeaderVPBB, BestVPlan,
5667 EpilogueVecKind == EpilogueVectorizationKind::Epilogue, LID,
5668 OrigAverageTripCount, OrigLoopInvocationWeight,
5669 estimateElementCount(BestVF * BestUF, Config.getVScaleForTuning()),
5670 DisableRuntimeUnroll, UnrollVectorizedLoop);
5671
5672 // 3. Fix the vectorized code: take care of header phi's, live-outs,
5673 // predication, updating analyses.
5674 ILV.fixVectorizedLoop(State);
5675
5676 // Wrap the generated blocks in VPIRBasicBlocks, so they can be used in the
5677 // epilogue plan.
5678 if (EpilogueVecKind == EpilogueVectorizationKind::MainLoop)
5680 vp_depth_first_shallow(BestVPlan.getEntry()))))
5681 if (!isa<VPIRBasicBlock>(VPBB))
5682 replaceVPBBWithIRVPBB(VPBB, State.CFG.VPBB2IRBB.at(VPBB), &BestVPlan);
5683
5684 return ExpandedSCEVs;
5685}
5686
5688 return CM.isPredicatedInst(I);
5689}
5690
5692 return CM.TTI.prefersVectorizedAddressing();
5693}
5694
5696 VFRange &Range) {
5697 assert((VPI->getOpcode() == Instruction::Load ||
5698 VPI->getOpcode() == Instruction::Store) &&
5699 "Must be called with either a load or store");
5701
5702 auto WillWiden = [&](ElementCount VF) -> bool {
5704 CM.getWideningDecision(I, VF);
5706 "CM decision should be taken at this point.");
5708 return true;
5709 if (CM.isScalarAfterVectorization(I, VF) ||
5710 CM.isProfitableToScalarize(I, VF))
5711 return false;
5713 };
5714
5716 return nullptr;
5717
5718 // If a mask is not required, drop it - use unmasked version for safe loads.
5719 // TODO: Determine if mask is needed in VPlan.
5720 VPValue *Mask = CM.isMaskRequired(I) ? VPI->getMask() : nullptr;
5721
5722 // Determine if the pointer operand of the access is either consecutive or
5723 // reverse consecutive.
5725 CM.getWideningDecision(I, Range.Start);
5727 bool Consecutive =
5729
5730 VPValue *Ptr = VPI->getOpcode() == Instruction::Load ? VPI->getOperand(0)
5731 : VPI->getOperand(1);
5732 Builder.setInsertPoint(VPI);
5733 if (Consecutive) {
5734 Ptr = Builder.createConsecutiveVectorPointer(Ptr, getLoadStoreType(I),
5735 Reverse, VPI->getDebugLoc());
5736 }
5737
5738 if (Reverse && Mask)
5739 Mask = Builder.createNaryOp(VPInstruction::Reverse, Mask, I->getDebugLoc());
5740
5741 if (VPI->getOpcode() == Instruction::Load) {
5742 auto *Load = cast<LoadInst>(I);
5743 auto *LoadR = Builder.createWidenLoad(*Load, Ptr, Mask, Consecutive, *VPI,
5744 Load->getDebugLoc());
5745 if (Reverse)
5746 return Builder.createNaryOp(VPInstruction::Reverse, LoadR,
5747 LoadR->getDebugLoc());
5748 return LoadR;
5749 }
5750
5752 VPValue *StoredVal = VPI->getOperand(0);
5753 if (Reverse)
5754 StoredVal = Builder.createNaryOp(VPInstruction::Reverse, StoredVal,
5755 Store->getDebugLoc());
5756 return Builder.createWidenStore(*Store, Ptr, StoredVal, Mask, Consecutive,
5757 *VPI, Store->getDebugLoc());
5758}
5759
5760bool VPRecipeBuilder::shouldWiden(Instruction *I, VFRange &Range) const {
5762 "Instruction should have been handled earlier");
5763 // Instruction should be widened, unless it is scalar after vectorization,
5764 // scalarization is profitable or it is predicated.
5765 auto WillScalarize = [this, I](ElementCount VF) -> bool {
5766 return CM.isScalarAfterVectorization(I, VF) ||
5767 CM.isProfitableToScalarize(I, VF) ||
5768 CM.isScalarWithPredication(I, VF);
5769 };
5771 Range);
5772}
5773
5774VPRecipeWithIRFlags *VPRecipeBuilder::tryToWiden(VPInstruction *VPI) {
5775 auto *I = VPI->getUnderlyingInstr();
5776 switch (VPI->getOpcode()) {
5777 default:
5778 return nullptr;
5779 case Instruction::SDiv:
5780 case Instruction::UDiv:
5781 case Instruction::SRem:
5782 case Instruction::URem:
5783 // If not provably safe, use a masked intrinsic.
5784 if (CM.isPredicatedInst(I))
5785 return new VPWidenIntrinsicRecipe(
5787 I->getType(), {}, {}, VPI->getDebugLoc());
5788 [[fallthrough]];
5789 case Instruction::Add:
5790 case Instruction::And:
5791 case Instruction::AShr:
5792 case Instruction::FAdd:
5793 case Instruction::FCmp:
5794 case Instruction::FDiv:
5795 case Instruction::FMul:
5796 case Instruction::FNeg:
5797 case Instruction::FRem:
5798 case Instruction::FSub:
5799 case Instruction::ICmp:
5800 case Instruction::LShr:
5801 case Instruction::Mul:
5802 case Instruction::Or:
5803 case Instruction::Select:
5804 case Instruction::Shl:
5805 case Instruction::Sub:
5806 case Instruction::Xor:
5807 case Instruction::Freeze:
5808 case Instruction::ExtractValue:
5809 return new VPWidenRecipe(*I, VPI->operandsWithoutMask(), *VPI, *VPI,
5810 VPI->getDebugLoc());
5811 };
5812}
5813
5815 if (VPI->getOpcode() != Instruction::Store)
5816 return nullptr;
5817
5818 auto HistInfo =
5819 Legal->getHistogramInfo(cast<StoreInst>(VPI->getUnderlyingInstr()));
5820 if (!HistInfo)
5821 return nullptr;
5822
5823 const HistogramInfo *HI = *HistInfo;
5824
5826 // Bucket address.
5827 HGramOps.push_back(VPI->getOperand(1));
5828 // Increment value.
5829 HGramOps.push_back(Plan.getOrAddLiveIn(HI->Update->getOperand(1)));
5830
5831 // In case of predicated execution (due to tail-folding, or conditional
5832 // execution, or both), pass the relevant mask.
5833 if (CM.isMaskRequired(HI->Store))
5834 HGramOps.push_back(VPI->getMask());
5835
5836 return new VPHistogramRecipe(HI->UpdateKind, HGramOps,
5837 cast<VPIRMetadata>(*VPI), VPI->getDebugLoc());
5838}
5839
5841 VPInstruction *VPI, VPBuilder &FinalRedStoresBuilder) {
5842 StoreInst *SI;
5843 if ((SI = dyn_cast<StoreInst>(VPI->getUnderlyingInstr())) &&
5844 Legal->isInvariantAddressOfReduction(SI->getPointerOperand())) {
5845 // Only create recipe for the final invariant store of the reduction.
5846 if (Legal->isInvariantStoreOfReduction(SI)) {
5847 VPValue *Val = VPI->getOperand(0);
5848 VPValue *Addr = VPI->getOperand(1);
5849 // We need to store the exiting value of the reduction, so use the blend
5850 // if tail folded.
5851 if (auto *Blend = VPlanPatternMatch::findUserOf<VPBlendRecipe>(Val))
5852 Val = Blend;
5853 [[maybe_unused]] auto *Rdx =
5855 assert((isa<VPIRValue>(Val) || !Rdx || Rdx->getBackedgeValue() == Val) &&
5856 "Store of reduction thats not the backedge value?");
5857 auto *Recipe = new VPReplicateRecipe(
5858 SI, {Val, Addr}, true /* IsUniform */, nullptr /*Mask*/, *VPI, *VPI,
5859 VPI->getDebugLoc());
5860 FinalRedStoresBuilder.insert(Recipe);
5861 }
5862 VPI->eraseFromParent();
5863 return true;
5864 }
5865
5866 return false;
5867}
5868
5870 VFRange &Range) {
5871 auto *I = VPI->getUnderlyingInstr();
5873 [&](ElementCount VF) { return CM.isUniformAfterVectorization(I, VF); },
5874 Range);
5875
5876 bool IsPredicated = CM.isPredicatedInst(I);
5877
5878 // Even if the instruction is not marked as uniform, there are certain
5879 // intrinsic calls that can be effectively treated as such, so we check for
5880 // them here. Conservatively, we only do this for scalable vectors, since
5881 // for fixed-width VFs we can always fall back on full scalarization.
5882 if (!IsUniform && Range.Start.isScalable() && isa<IntrinsicInst>(I)) {
5883 switch (cast<IntrinsicInst>(I)->getIntrinsicID()) {
5884 case Intrinsic::assume:
5885 case Intrinsic::lifetime_start:
5886 case Intrinsic::lifetime_end:
5887 // For scalable vectors if one of the operands is variant then we still
5888 // want to mark as uniform, which will generate one instruction for just
5889 // the first lane of the vector. We can't scalarize the call in the same
5890 // way as for fixed-width vectors because we don't know how many lanes
5891 // there are.
5892 //
5893 // The reasons for doing it this way for scalable vectors are:
5894 // 1. For the assume intrinsic generating the instruction for the first
5895 // lane is still be better than not generating any at all. For
5896 // example, the input may be a splat across all lanes.
5897 // 2. For the lifetime start/end intrinsics the pointer operand only
5898 // does anything useful when the input comes from a stack object,
5899 // which suggests it should always be uniform. For non-stack objects
5900 // the effect is to poison the object, which still allows us to
5901 // remove the call.
5902 IsUniform = true;
5903 break;
5904 default:
5905 break;
5906 }
5907 }
5908 VPValue *BlockInMask = nullptr;
5909 if (!IsPredicated) {
5910 // Finalize the recipe for Instr, first if it is not predicated.
5911 LLVM_DEBUG(dbgs() << "LV: Scalarizing:" << *I << "\n");
5912 } else {
5913 LLVM_DEBUG(dbgs() << "LV: Scalarizing and predicating:" << *I << "\n");
5914 // Instructions marked for predication are replicated and a mask operand is
5915 // added initially. Masked replicate recipes will later be placed under an
5916 // if-then construct to prevent side-effects. Generate recipes to compute
5917 // the block mask for this region.
5918 BlockInMask = VPI->getMask();
5919 }
5920
5921 // Note that there is some custom logic to mark some intrinsics as uniform
5922 // manually above for scalable vectors, which this assert needs to account for
5923 // as well.
5924 assert((Range.Start.isScalar() || !IsUniform || !IsPredicated ||
5925 (Range.Start.isScalable() && isa<IntrinsicInst>(I))) &&
5926 "Should not predicate a uniform recipe");
5927 if (IsUniform) {
5929 VPI->getOpcode(), VPI->operandsWithoutMask(), BlockInMask, *VPI, *VPI,
5930 VPI->getDebugLoc(), VPI->getScalarType(), I);
5931 }
5932 auto *Recipe = new VPReplicateRecipe(I, VPI->operandsWithoutMask(),
5933 /*IsSingleScalar=*/false, BlockInMask,
5934 *VPI, *VPI, VPI->getDebugLoc());
5935 return Recipe;
5936}
5937
5940 VFRange &Range) {
5941 assert(!R->isPhi() && "phis must be handled earlier");
5942 auto *VPI = cast<VPInstruction>(R);
5943 assert(VPI->getOpcode() != Instruction::Call &&
5944 "Call should have been handled by makeCallWideningDecisions");
5945
5946 // All widen recipes below deal only with VF > 1.
5948 [&](ElementCount VF) { return VF.isScalar(); }, Range))
5949 return nullptr;
5950
5951 Instruction *Instr = R->getUnderlyingInstr();
5952 assert(!is_contained({Instruction::Load, Instruction::Store},
5953 VPI->getOpcode()) &&
5954 "Should have been handled prior to this!");
5955
5956 // An extractvalue takes the shape of its operand: we cannot extract a lane
5957 // from a widened struct, nor build a struct from replicated lanes.
5958 if (VPI->getOpcode() == Instruction::ExtractValue &&
5960 if (VPRecipeBase *OpR = VPI->getOperand(0)->getDefiningRecipe())
5962 return tryToWiden(VPI);
5963 if (VPI->getOpcode() == Instruction::ExtractValue)
5964 return new VPReplicateRecipe(Instr, VPI->operandsWithoutMask(),
5966 /*Mask=*/nullptr, *VPI, *VPI,
5967 VPI->getDebugLoc());
5968
5969 if (!shouldWiden(Instr, Range))
5970 return nullptr;
5971
5972 if (VPI->getOpcode() == Instruction::GetElementPtr) {
5973 auto *GEP = cast<GetElementPtrInst>(Instr);
5974 return new VPWidenGEPRecipe(GEP->getSourceElementType(),
5975 VPI->operandsWithoutMask(), *VPI,
5976 VPI->getDebugLoc(), GEP);
5977 }
5978
5979 if (Instruction::isCast(VPI->getOpcode())) {
5980 auto *CI = cast<CastInst>(Instr);
5981 return new VPWidenCastRecipe(CI->getOpcode(), VPI->getOperand(0),
5982 VPI->getScalarType(), CI, *VPI, *VPI,
5983 VPI->getDebugLoc());
5984 }
5985
5986 return tryToWiden(VPI);
5987}
5988
5989// To allow RUN_VPLAN_PASS to print the VPlan after VF/UF independent
5990// optimizations.
5992
5993#ifndef NDEBUG
5994/// Cross-check the execution frequencies recorded in \p Plan against
5995/// BlockFrequencyInfo for the blocks of \p OrigLoop.
5996/// FIXME: Temporary verification aid, to be removed.
5997static bool verifyExecutionFrequenciesMatchBFI(VPlan &Plan, Loop *OrigLoop,
5998 LoopInfo *LI,
6000 // Limited to loops with the latch as only exiting block
6001 if (OrigLoop->getExitingBlock() != OrigLoop->getLoopLatch())
6002 return true;
6003
6004 // Visit the loop body in the same order as recordExecutionFrequencies. Both
6005 // are reverse post-orders of the same CFG, so indices correspond.
6008 assert(Blocks.size() == OrigLoop->getNumBlocks() &&
6009 "loop body and original loop must have the same blocks");
6010
6011 LoopBlocksRPO OrigRPO(OrigLoop);
6012 OrigRPO.perform(LI);
6013
6014 // Only request the expensive BFI once the cheap bail-outs are past.
6015 BlockFrequencyInfo &BFI = CM.getBFI();
6016 uint64_t HeaderFreq = BFI.getBlockFreq(OrigLoop->getHeader()).getFrequency();
6017 if (HeaderFreq == 0)
6018 return true;
6019
6020 // BFI's fixed-point mass propagation loses up to 1 ULP per edge, so bound the
6021 // error by the number of edges in the region.
6022 uint64_t Edges = 0;
6023 for (const VPBasicBlock *VPBB : Blocks)
6024 Edges += VPBB->getNumSuccessors();
6025 uint64_t Tolerance = Edges + BranchProbability::getDenominator() / HeaderFreq;
6026
6027 for (const auto &[VPBB, BB] :
6028 zip_equal(drop_begin(Blocks), drop_begin(OrigRPO))) {
6029 // Nothing to check for blocks without a recorded frequency.
6030 std::optional<VPExecutionFrequency> Freq =
6032 if (!Freq)
6033 continue;
6035
6036 // Clamp to the header's frequency, which BFI's rounding may exceed.
6039 std::min(BBFreq, HeaderFreq), HeaderFreq);
6040 if (AbsoluteDifference(Computed.getNumerator(), Expected.getNumerator()) <=
6041 Tolerance)
6042 continue;
6043
6044 errs() << "Block frequency mismatch for " << VPBB->getName() << ": VPlan "
6045 << Computed << ", BlockFrequencyInfo " << Expected << "\n";
6046 return false;
6047 }
6048 return true;
6049}
6050#endif
6051
6053LoopVectorizationPlanner::tryToBuildVPlan1(LoopVectorizationCostModel &PlanCM) {
6054 bool IsInnerLoop = OrigLoop->isInnermost();
6055
6056 // Set up loop versioning for inner loops with memory runtime checks.
6057 // Outer loops don't have LoopAccessInfo since canVectorizeMemory() is not
6058 // called for them.
6059 std::optional<LoopVersioning> LVer;
6060 if (IsInnerLoop) {
6061 const LoopAccessInfo *LAI = Legal->getLAI();
6062 LVer.emplace(*LAI, LAI->getRuntimePointerChecking()->getChecks(), OrigLoop,
6063 LI, DT, PSE.getSE());
6064 if (!LAI->getRuntimePointerChecking()->getChecks().empty() &&
6066 // Only use noalias metadata when using memory checks guaranteeing no
6067 // overlap across all iterations.
6068 LVer->prepareNoAliasMetadata();
6069 }
6070 }
6071
6072 // Create initial base VPlan0, to serve as common starting point for all
6073 // candidates built later for specific VF ranges.
6074 auto VPlan0 = VPlanTransforms::buildVPlan0(
6075 OrigLoop, *LI, Legal->getWidestInductionType(), PSE,
6076 LVer ? &*LVer : nullptr, GetBPI);
6077
6078 VPDominatorTree VPDT(*VPlan0);
6079 if (const LoopAccessInfo *LAI = Legal->getLAI())
6081 LAI->getSymbolicStrides(), VPDT);
6084 if (IsInnerLoop) {
6086 assert(verifyExecutionFrequenciesMatchBFI(*VPlan0, OrigLoop, LI, PlanCM) &&
6087 "execution frequencies do not match the loop's block frequencies");
6088 }
6089
6090 // Create recipes for header phis. For outer loops, reductions, recurrences
6091 // and in-loop reductions are empty since legality doesn't detect them.
6092 if (!RUN_VPLAN_PASS(
6093 VPlanTransforms::createHeaderPhiRecipes, *VPlan0, PSE, *OrigLoop, ORE,
6094 VPDT, Legal->getInductionVars(), Legal->getReductionVars(),
6095 Legal->getFixedOrderRecurrences(), Config.getInLoopReductions(),
6096 Config.getHints().allowReordering())) {
6097 return nullptr;
6098 }
6099
6100 if (const LoopAccessInfo *LAI = Legal->getLAI())
6102 LAI->getSymbolicStrides(), VPDT);
6103
6104 // Without -vplan-outer-loop-legality-checks, trust the explicit vectorization
6105 // pragma that vectorizing the outer loop is safe.
6106 if (!IsInnerLoop && Opts.vplan_outer_loop_legality_checks &&
6107 !proveOuterLoopMemorySafety(*VPlan0, PSE, *Legal->getAA(), VPDT,
6108 OrigLoop)) {
6110 "Cannot prove outer loop memory accesses safe",
6111 "cannot prove memory accesses in outer loop are safe to vectorize",
6112 "CantProveOuterLoopMemSafety", ORE, OrigLoop);
6113 return nullptr;
6114 }
6115
6116 // Add surviving induction predicates to PSE and check constraints.
6117 bool ForceVectorization =
6118 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
6119 bool OptForSize =
6120 !ForceVectorization &&
6121 (PlanCM.EpilogueLoweringStatus == CM_EpilogueNotAllowedOptSize ||
6122 PlanCM.EpilogueLoweringStatus == CM_EpilogueNotAllowedLowTripLoop);
6123 unsigned SCEVCheckThreshold = ForceVectorization
6124 ? Opts.pragma_vectorize_scev_check_threshold
6125 : Opts.vectorize_scev_check_threshold;
6127 OptForSize, SCEVCheckThreshold, ORE, OrigLoop))
6128 return nullptr;
6129
6131
6132 // If we're vectorizing a loop with an uncountable exit, make sure that the
6133 // recipes are safe to handle.
6134 // TODO: Remove this once we can properly check the VPlan itself for the
6135 // presence of an uncountable exit.
6136 if (Legal->hasUncountableEarlyExit()) {
6138 OrigLoop))
6139 return nullptr;
6140
6141 // TODO: Check target preference for style.
6144 ORE, OrigLoop, PSE, *DT, Legal->getAssumptionCache(),
6145 EEStyle)) {
6146 return nullptr;
6147 }
6148 } else {
6150 }
6151
6153 getDebugLocFromInstOrOperands(Legal->getPrimaryInduction()));
6154 if (PlanCM.foldTailByMasking())
6156
6158
6159 return VPlan0;
6160}
6161
6162void LoopVectorizationPlanner::buildVPlans(VPlan &VPlan1, ElementCount MinVF,
6163 ElementCount MaxVF,
6165 if (ElementCount::isKnownGT(MinVF, MaxVF))
6166 return;
6167
6168 auto MaxVFTimes2 = MaxVF * 2;
6169 for (ElementCount VF = MinVF; ElementCount::isKnownLT(VF, MaxVFTimes2);) {
6170 VFRange SubRange = {VF, MaxVFTimes2};
6171 auto Plan = tryToBuildVPlan(std::unique_ptr<VPlan>(VPlan1.duplicate()),
6172 SubRange, PlanCM);
6173 VF = SubRange.End;
6174
6175 if (!Plan)
6176 continue;
6177
6178 // Now optimize the initial VPlan.
6182 Config.getMinimalBitwidths());
6184 // TODO: try to put addExplicitVectorLength close to addActiveLaneMask
6185 if (PlanCM.foldTailWithEVL()) {
6187 Config.getMaxSafeElements());
6189 }
6190
6191 if (auto P =
6193 VPlans.push_back(std::move(P));
6194
6197 useActiveLaneMask(Style),
6199
6201 assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
6202 VPlans.push_back(std::move(Plan));
6203 }
6204}
6205
6207LoopVectorizationPlanner::tryToBuildVPlan(VPlanPtr Plan, VFRange &Range,
6209
6210 // For outer loops, the plan only needs basic recipe conversion and induction
6211 // live-out optimization; the full inner-loop recipe building below does not
6212 // apply (no widening decisions, interleave groups, reductions, etc.).
6213 if (Plan->isOuterLoop()) {
6214 for (ElementCount VF : Range)
6215 Plan->addVF(VF);
6217 *Plan, *TLI, PSE, OrigLoop))
6218 return nullptr;
6220 OrigLoop);
6221 return Plan;
6222 }
6223
6224 using namespace llvm::VPlanPatternMatch;
6225 SmallPtrSet<const InterleaveGroup<Instruction> *, 1> InterleaveGroups;
6226
6227 // ---------------------------------------------------------------------------
6228 // Build initial VPlan: Scan the body of the loop in a topological order to
6229 // visit each basic block after having visited its predecessor basic blocks.
6230 // ---------------------------------------------------------------------------
6231
6232 bool RequiresScalarEpilogueCheck =
6234 [&PlanCM](ElementCount VF) {
6235 return !PlanCM.requiresScalarEpilogue(VF.isVector());
6236 },
6237 Range);
6238 // Update the branch in the middle block if a scalar epilogue is required.
6239 VPBasicBlock *MiddleVPBB = Plan->getMiddleBlock();
6240 if (!RequiresScalarEpilogueCheck && MiddleVPBB->getNumSuccessors() == 2) {
6241 auto *BranchOnCond = cast<VPInstruction>(MiddleVPBB->getTerminator());
6242 assert(MiddleVPBB->getSuccessors()[1] == Plan->getScalarPreheader() &&
6243 "second successor must be scalar preheader");
6244 BranchOnCond->setOperand(0, Plan->getFalse());
6245 }
6246
6247 // Don't use getDecisionAndClampRange here, because we don't know the UF
6248 // so this function is better to be conservative, rather than to split
6249 // it up into different VPlans.
6250 // TODO: Consider using getDecisionAndClampRange here to split up VPlans.
6251 bool IVUpdateMayOverflow = false;
6252 for (ElementCount VF : Range)
6253 IVUpdateMayOverflow |= !isIndvarOverflowCheckKnownFalse(Opts, &PlanCM, VF);
6254
6256 // Use NUW for the induction increment if we proved that it won't overflow in
6257 // the vector loop or when not folding the tail. In the later case, we know
6258 // that the canonical induction increment will not overflow as the vector trip
6259 // count is >= increment and a multiple of the increment.
6260 VPRegionBlock *LoopRegion = Plan->getVectorLoopRegion();
6261 bool HasNUW = !IVUpdateMayOverflow || Style == TailFoldingStyle::None;
6262 if (!HasNUW) {
6263 auto *IVInc =
6264 LoopRegion->getExitingBasicBlock()->getTerminator()->getOperand(0);
6265 assert(match(IVInc,
6266 m_VPInstruction<Instruction::Add>(
6267 m_Specific(LoopRegion->getCanonicalIV()), m_VPValue())) &&
6268 "Did not find the canonical IV increment");
6269 LoopRegion->clearCanonicalIVNUW(cast<VPInstruction>(IVInc));
6270 }
6271
6272 // ---------------------------------------------------------------------------
6273 // Pre-construction: record ingredients whose recipes we'll need to further
6274 // process after constructing the initial VPlan.
6275 // ---------------------------------------------------------------------------
6276
6277 // For each interleave group which is relevant for this (possibly trimmed)
6278 // Range, add it to the set of groups to be later applied to the VPlan and add
6279 // placeholders for its members' Recipes which we'll be replacing with a
6280 // single VPInterleaveRecipe.
6281 for (InterleaveGroup<Instruction> *IG :
6283 auto ApplyIG = [IG, &PlanCM](ElementCount VF) -> bool {
6284 bool Result = (VF.isVector() && // Query is illegal for VF == 1
6285 PlanCM.getWideningDecision(IG->getInsertPos(), VF) ==
6287 // For scalable vectors, the interleave factors must be <= 8 since we
6288 // require the (de)interleaveN intrinsics instead of shufflevectors.
6289 assert((!Result || !VF.isScalable() || IG->getFactor() <= 8) &&
6290 "Unsupported interleave factor for scalable vectors");
6291 return Result;
6292 };
6293 if (!getDecisionAndClampRange(ApplyIG, Range))
6294 continue;
6295 InterleaveGroups.insert(IG);
6296 }
6297
6298 // ---------------------------------------------------------------------------
6299 // Construct wide recipes and apply predication for original scalar
6300 // VPInstructions in the loop.
6301 // ---------------------------------------------------------------------------
6302 VPRecipeBuilder RecipeBuilder(*Plan, Legal, PlanCM, Builder);
6303
6305 Range.Start);
6306
6307 VPCostContext CostCtx(*TLI, *Plan, PlanCM, Config);
6308
6310 RecipeBuilder, CostCtx);
6311
6313
6314 // Widened calls may only use the first lane of some operands.
6316 RecipeBuilder, CostCtx))
6318
6320 PSE);
6321
6322 // Convert remaining VPInstructions to widen or replicate recipes.
6323 // TODO: This legacy code should eventually be migrated to VPlan.
6324 VPBasicBlock *HeaderVPBB = LoopRegion->getEntryBasicBlock();
6325 for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
6326 vp_depth_first_shallow(HeaderVPBB))) {
6327 // All types but VPInstructions are already widened and don't need extra
6328 // processing. We process VPInstructions below.
6329 assert(
6330 all_of(
6331 make_range(VPBB->getFirstNonPhi(), VPBB->end()),
6332 IsaPred<VPWidenCanonicalIVRecipe, VPBlendRecipe, VPReductionRecipe,
6333 VPReplicateRecipe, VPWidenLoadRecipe, VPWidenStoreRecipe,
6334 VPWidenCallRecipe, VPWidenIntrinsicRecipe,
6335 VPVectorPointerRecipe, VPVectorEndPointerRecipe,
6336 VPHistogramRecipe, VPInstruction>) &&
6337 "Unexpected recipe");
6338 for (VPInstruction &VPI :
6340 // We represent single-scalar casts directly as VPInstructions.
6341 if (Instruction::isCast(VPI.getOpcode()) &&
6343 continue;
6344
6345 // Only VPInstrutions with an underlying value need to be processed.
6346 if (!VPI.getUnderlyingValue())
6347 continue;
6348
6349 Builder.setInsertPoint(&VPI);
6350
6351 VPRecipeBase *Recipe =
6352 RecipeBuilder.tryToCreateWidenNonPhiRecipe(&VPI, Range);
6353 if (!Recipe)
6354 Recipe = RecipeBuilder.handleReplication(&VPI, Range);
6355 Builder.insert(Recipe);
6356
6357 if (Recipe->getNumDefinedValues() == 1) {
6358 VPI.replaceAllUsesWith(Recipe->getVPSingleValue());
6359 } else {
6360 assert(Recipe->getNumDefinedValues() == 0 &&
6361 "Unexpected multidef recipe");
6362 }
6363 VPI.eraseFromParent();
6364 }
6365 }
6366
6367 assert(isa<VPRegionBlock>(LoopRegion) &&
6368 !LoopRegion->getEntryBasicBlock()->empty() &&
6369 "entry block must be set to a VPRegionBlock having a non-empty entry "
6370 "VPBasicBlock");
6371
6373 Range);
6374
6375 // ---------------------------------------------------------------------------
6376 // Transform initial VPlan: Apply previously taken decisions, in order, to
6377 // bring the VPlan to its final state.
6378 // ---------------------------------------------------------------------------
6379
6380 addReductionResultComputation(Plan, Range.Start, PlanCM);
6381
6382 // Optimize FindIV reductions to use sentinel-based approach when possible.
6384 *OrigLoop);
6386 OrigLoop);
6387
6388 // Apply mandatory transformation to handle reductions with multiple in-loop
6389 // uses if possible, bail out otherwise.
6391 OrigLoop))
6392 return nullptr;
6393 // Apply mandatory transformation to handle FP maxnum/minnum reduction with
6394 // NaNs if possible, bail out otherwise.
6396 return nullptr;
6397
6398 // Create whole-vector selects for find-last recurrences.
6400 return nullptr;
6401
6403
6404 // Create partial reduction recipes for scaled reductions and transform
6405 // recipes to abstract recipes if it is legal and beneficial and clamp the
6406 // range for better cost estimation.
6408 Range);
6410 Range);
6411
6412 // Interleave memory: for each Interleave Group we marked earlier as relevant
6413 // for this VPlan, replace the Recipes widening its memory instructions with a
6414 // single VPInterleaveRecipe at its insertion point.
6416 InterleaveGroups, PlanCM.isEpilogueAllowed());
6417
6418 // Convert memory recipes to strided access recipes if the strided access is
6419 // legal and profitable.
6421 *OrigLoop, CostCtx, Range);
6422
6423 // Ensure scalar VF plans only contain VF=1, as required by hasScalarVFOnly.
6424 if (Range.Start.isScalar())
6425 Range.End = Range.Start * 2;
6426
6427 for (ElementCount VF : Range)
6428 Plan->addVF(VF);
6429 Plan->setName("Initial VPlan");
6430
6432
6433 if (PlanCM.maskPartialAliasing())
6435
6436 assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid");
6437 return Plan;
6438}
6439
6440void LoopVectorizationPlanner::addReductionResultComputation(
6441 VPlanPtr &Plan, ElementCount MinVF, LoopVectorizationCostModel &PlanCM) {
6442 using namespace VPlanPatternMatch;
6443 VPRegionBlock *VectorLoopRegion = Plan->getVectorLoopRegion();
6444 VPBasicBlock *MiddleVPBB = Plan->getMiddleBlock();
6445 VPBasicBlock *LatchVPBB = VectorLoopRegion->getExitingBasicBlock();
6446 Builder.setInsertPoint(&*std::prev(std::prev(LatchVPBB->end())));
6447 VPBasicBlock::iterator IP = MiddleVPBB->getFirstNonPhi();
6448 VPValue *HeaderMask = Plan->getVectorLoopRegion()->getHeaderMask();
6449 for (VPRecipeBase &R : make_early_inc_range(
6450 Plan->getVectorLoopRegion()->getEntryBasicBlock()->phis())) {
6451 VPReductionPHIRecipe *PhiR = dyn_cast<VPReductionPHIRecipe>(&R);
6452 if (!PhiR)
6453 continue;
6454
6455 // Clean up reductions that have become invariant.
6456 if (PhiR->getBackedgeValue() == PhiR) {
6457 PhiR->replaceAllUsesWith(PhiR->getStartValue());
6458 PhiR->eraseFromParent();
6459 continue;
6460 }
6461
6462 RecurKind RecurrenceKind = PhiR->getRecurrenceKind();
6463 const RecurrenceDescriptor &RdxDesc = Legal->getRecurrenceDescriptor(
6465 Type *PhiTy = PhiR->getScalarType();
6466
6467 // Convert a VPBlendRecipe backedge to a select.
6468 if (auto *Blend = dyn_cast<VPBlendRecipe>(PhiR->getBackedgeValue())) {
6469 if (Blend->getNumIncomingValues() == 2 &&
6470 Blend->getMask(0) == HeaderMask) {
6471 auto *Sel = VPBuilder(Blend).createSelect(
6472 Blend->getMask(0), Blend->getIncomingValue(0),
6473 Blend->getIncomingValue(1), {}, "", *Blend);
6474 Blend->replaceAllUsesWith(Sel);
6475 Blend->eraseFromParent();
6476 }
6477 }
6478
6479 auto *OrigExitingVPV = PhiR->getBackedgeValue();
6480 auto *NewExitingVPV = OrigExitingVPV;
6481
6482 // Remove the predicated select if the target doesn't want it.
6483 VPValue *V;
6484 if (!PlanCM.usePredicatedReductionSelect(
6485 RecurrenceKind, PhiR->hasUsesOutsideReductionChain()) &&
6486 match(PhiR->getBackedgeValue(),
6487 m_Select(m_Specific(HeaderMask), m_VPValue(V), m_Specific(PhiR))))
6488 PhiR->setBackedgeValue(V);
6489
6490 // We want code in the middle block to appear to execute on the location of
6491 // the scalar loop's latch terminator because: (a) it is all compiler
6492 // generated, (b) these instructions are always executed after evaluating
6493 // the latch conditional branch, and (c) other passes may add new
6494 // predecessors which terminate on this line. This is the easiest way to
6495 // ensure we don't accidentally cause an extra step back into the loop while
6496 // debugging.
6497 DebugLoc ExitDL = OrigLoop->getLoopLatch()->getTerminator()->getDebugLoc();
6498
6499 // TODO: At the moment ComputeReductionResult also drives creation of the
6500 // bc.merge.rdx phi nodes, hence it needs to be created unconditionally here
6501 // even for in-loop reductions, until the reduction resume value handling is
6502 // also modeled in VPlan.
6503 VPInstruction *FinalReductionResult;
6504 VPBuilder::InsertPointGuard Guard(Builder);
6505 Builder.setInsertPoint(MiddleVPBB, IP);
6506 // For AnyOf reductions, find the select among PhiR's users and convert
6507 // the reduction phi to operate on bools before creating the final
6508 // reduction result.
6509 if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RecurrenceKind)) {
6510 auto *AnyOfSelect = cast<VPSingleDefRecipe>(
6512 VPValue *Start = PhiR->getStartValue();
6513 bool TrueValIsPhi = AnyOfSelect->getOperand(1) == PhiR;
6514 // NewVal is the non-phi operand of the select.
6515 VPValue *NewVal = TrueValIsPhi ? AnyOfSelect->getOperand(2)
6516 : AnyOfSelect->getOperand(1);
6517
6518 // Adjust AnyOf reductions; replace the reduction phi for the selected
6519 // value with a boolean reduction phi node to check if the condition is
6520 // true in any iteration. The final value is selected by the final
6521 // ComputeReductionResult.
6522 VPValue *Cmp = AnyOfSelect->getOperand(0);
6523 // If the compare is checking the reduction PHI node, adjust it to check
6524 // the start value.
6525 if (VPRecipeBase *CmpR = Cmp->getDefiningRecipe())
6526 CmpR->replaceUsesOfWith(PhiR, PhiR->getStartValue());
6527 Builder.setInsertPoint(AnyOfSelect);
6528
6529 // If the true value of the select is the reduction phi, the new value
6530 // is selected if the negated condition is true in any iteration.
6531 if (TrueValIsPhi)
6532 Cmp = Builder.createNot(Cmp);
6533
6534 // Build a fresh i1 chain (phi, or, and i1 versions of any blend/select
6535 // the exiting value flows through).
6536 auto *NewPhiR =
6537 PhiR->cloneWithOperands(Plan->getFalse(), Plan->getFalse());
6538 NewPhiR->insertBefore(PhiR);
6539 VPValue *NewExiting = Builder.createOr(NewPhiR, Cmp);
6540
6541 // The exiting value may flow through a chain of VPBlendRecipes and
6542 // select recipes (VPInstruction, VPWidenRecipe or VPReplicateRecipe with
6543 // Select opcode) before reaching OrigExitingVPV. Clone each chain link
6544 // in topological order so each clone refers to the already-rewritten i1
6545 // operands via Substitutions.
6546 DenseMap<VPValue *, VPValue *> Substitutions = {{AnyOfSelect, NewExiting},
6547 {PhiR, NewPhiR}};
6548 std::function<void(VPSingleDefRecipe *)> CloneChain =
6549 [&](VPSingleDefRecipe *Old) {
6550 if (Substitutions.contains(Old))
6551 return;
6553 for (VPValue *Op : Old->operands()) {
6554 if (isa<VPBlendRecipe>(Op) ||
6556 CloneChain(cast<VPSingleDefRecipe>(Op));
6557 NewOps.push_back(Substitutions.lookup_or(Op, Op));
6558 }
6559 VPSingleDefRecipe *New;
6560 if (auto *B = dyn_cast<VPBlendRecipe>(Old))
6561 New = B->cloneWithOperands(NewOps);
6562 else if (auto *W = dyn_cast<VPWidenRecipe>(Old))
6563 New = W->cloneWithOperands(NewOps);
6564 else if (auto *Rep = dyn_cast<VPReplicateRecipe>(Old))
6565 New = Rep->cloneWithOperands(NewOps);
6566 else
6567 New = cast<VPInstruction>(Old)->cloneWithOperands(NewOps);
6568 New->insertBefore(Old);
6569 Substitutions[Old] = New;
6570 };
6571
6572 if (OrigExitingVPV != AnyOfSelect) {
6573 CloneChain(cast<VPSingleDefRecipe>(OrigExitingVPV));
6574 NewExiting = Substitutions.lookup(OrigExitingVPV);
6575 }
6576 NewPhiR->setOperand(1, NewExiting);
6577 PhiR->replaceAllUsesWith(Plan->getPoison(PhiR->getScalarType()));
6578
6579 Builder.setInsertPoint(MiddleVPBB, IP);
6580 FinalReductionResult =
6581 Builder.createAnyOfReduction(NewExiting, NewVal, Start, ExitDL);
6582 } else {
6583 // If the vector reduction can be performed in a smaller type, we
6584 // truncate then extend the loop exit value to enable InstCombine to
6585 // evaluate the entire expression in the smaller type.
6586 VPValue *ReductionOp = NewExitingVPV;
6587 Instruction::CastOps ExtendOpc = Instruction::CastOpsEnd;
6588 if (MinVF.isVector() && PhiTy != RdxDesc.getRecurrenceType()) {
6589 assert(!PhiR->isInLoop() && "Unexpected truncated inloop reduction!");
6591 "Unexpected truncated min-max recurrence!");
6592 Type *RdxTy = RdxDesc.getRecurrenceType();
6593 ExtendOpc = RdxDesc.isSigned() ? Instruction::SExt : Instruction::ZExt;
6594 {
6595 VPBuilder::InsertPointGuard Guard(Builder);
6596 Builder.setInsertPoint(
6597 NewExitingVPV->getDefiningRecipe()->getParent(),
6598 std::next(NewExitingVPV->getDefiningRecipe()->getIterator()));
6599 ReductionOp =
6600 Builder.createWidenCast(Instruction::Trunc, NewExitingVPV, RdxTy);
6601 VPWidenCastRecipe *Extnd =
6602 Builder.createWidenCast(ExtendOpc, ReductionOp, PhiTy);
6603 if (PhiR->getOperand(1) == NewExitingVPV)
6604 PhiR->setOperand(1, Extnd);
6605 }
6606 }
6607
6608 VPIRFlags Flags(RecurrenceKind, PhiR->isOrdered(), PhiR->isInLoop(),
6609 PhiR->getFastMathFlagsOrNone());
6610 FinalReductionResult = Builder.createNaryOp(
6611 VPInstruction::ComputeReductionResult, {ReductionOp}, Flags, ExitDL);
6612 if (ExtendOpc != Instruction::CastOpsEnd)
6613 FinalReductionResult = Builder.createScalarCast(
6614 ExtendOpc, FinalReductionResult, PhiTy, {});
6615 }
6616
6617 // Update all users outside the vector region. Also replace redundant
6618 // extracts.
6619 for (auto *U : to_vector(OrigExitingVPV->users())) {
6620 auto *Parent = cast<VPRecipeBase>(U)->getParent();
6621 if (FinalReductionResult == U || Parent->getParent())
6622 continue;
6623 // Skip ComputeReductionResult and FindIV reductions when they are not the
6624 // final result.
6625 if (match(U, m_VPInstruction<VPInstruction::ComputeReductionResult>()) ||
6627 match(U, m_VPInstruction<Instruction::ICmp>())))
6628 continue;
6629 U->replaceUsesOfWith(OrigExitingVPV, FinalReductionResult);
6630
6631 // Look through ExtractLastPart.
6633 U = cast<VPInstruction>(U)->getSingleUser();
6634
6637 cast<VPInstruction>(U)->replaceAllUsesWith(FinalReductionResult);
6638 }
6639
6640 RecurKind RK = PhiR->getRecurrenceKind();
6645 VPBuilder PHBuilder(Plan->getVectorPreheader());
6646 VPValue *Iden = Plan->getOrAddLiveIn(
6647 getRecurrenceIdentity(RK, PhiTy, PhiR->getFastMathFlagsOrNone()));
6648 auto *ScaleFactorVPV = Plan->getConstantInt(32, 1);
6649 VPValue *StartV = PHBuilder.createNaryOp(
6651 {PhiR->getStartValue(), Iden, ScaleFactorVPV}, *PhiR);
6652 PhiR->setOperand(0, StartV);
6653 }
6654 }
6655
6657}
6658
6660 VPlan &Plan, GeneratedRTChecks &RTChecks, ElementCount VF, unsigned UF,
6661 bool HasBranchWeights) const {
6662 const auto &[SCEVCheckCond, SCEVCheckBlock] = RTChecks.getSCEVChecks();
6663 if (SCEVCheckBlock && SCEVCheckBlock->hasNPredecessors(0)) {
6664 assert((!Config.OptForSize ||
6665 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled) &&
6666 "Cannot SCEV check stride or overflow when optimizing for size");
6668 SCEVCheckBlock, HasBranchWeights);
6669 }
6670 const auto &[MemCheckCond, MemCheckBlock] = RTChecks.getMemRuntimeChecks();
6671 if (MemCheckBlock && MemCheckBlock->hasNPredecessors(0)) {
6672 // VPlan-native path does not do any analysis for runtime checks
6673 // currently.
6674 assert((!Opts.enable_vplan_native_path || !Plan.isOuterLoop()) &&
6675 "Runtime checks are not supported for outer loops yet");
6676
6677 if (Config.OptForSize) {
6678 assert(
6679 Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled &&
6680 "Cannot emit memory checks when optimizing for size, unless forced "
6681 "to vectorize.");
6682 ORE->emit([&]() {
6683 return OptimizationRemarkAnalysis(DEBUG_TYPE, "VectorizationCodeSize",
6684 OrigLoop->getStartLoc(),
6685 OrigLoop->getHeader())
6686 << "Code-size may be reduced by not forcing "
6687 "vectorization, or by source-code modifications "
6688 "eliminating the need for runtime checks "
6689 "(e.g., adding 'restrict').";
6690 });
6691 }
6692 const auto &RtPtrChecking = *Legal->getRuntimePointerChecking();
6693 auto DiffChecks = RtPtrChecking.getDiffChecks();
6694 auto HasUnsupportedBounds = [&]() {
6695 // VPSCEVExpander expands AddRecs in the plan's entry, not the check
6696 // block.
6697 auto IsUnsupported = [](const SCEV *S) {
6699 };
6700 if (DiffChecks)
6701 return any_of(*DiffChecks, [&](const PointerDiffInfo &C) {
6702 return IsUnsupported(C.SrcStart) || IsUnsupported(C.SinkStart);
6703 });
6704 return any_of(RtPtrChecking.CheckingGroups,
6705 [&](const RuntimeCheckingPtrGroup &CG) {
6706 return IsUnsupported(CG.Low) || IsUnsupported(CG.High);
6707 });
6708 };
6709 // The VPlan expander cannot hoist bounds out of an enclosing loop.
6710 if (OrigLoop->getParentLoop() || HasUnsupportedBounds())
6712 MemCheckCond, MemCheckBlock, HasBranchWeights);
6713
6714 // Erase the temporary IR before recipe expansion can reuse its values.
6715 RTChecks.eraseMemCheckBlock();
6717 *PSE.getSE(), VF, UF, OrigLoop->getStartLoc(),
6718 HasBranchWeights);
6719 }
6720}
6721
6723 VPlan &Plan, ElementCount VF, unsigned UF,
6724 ElementCount MinProfitableTripCount) const {
6725 const uint32_t *BranchWeights =
6726 hasBranchWeightMD(*OrigLoop->getLoopLatch()->getTerminator())
6728 : nullptr;
6730 MinProfitableTripCount, Plan.requiresScalarEpilogue(),
6731 Plan.hasTailFolded(), OrigLoop, BranchWeights,
6732 OrigLoop->getLoopPredecessor()->getTerminator()->getDebugLoc(),
6733 PSE, Plan.getEntry());
6734}
6735
6736// Determine how to lower the epilogue, which depends on 1) optimising
6737// for minimum code-size, 2) tail-folding compiler options, 3) loop
6738// hints forcing tail-folding, and 4) a TTI hook that analyses whether the loop
6739// is suitable for tail-folding.
6740// This function determines epilogue lowering for the main vector loop while
6741// epilogue lowering for the tail-folded epilogue path will be handled
6742// separately in getEpilogueTailLowering.
6743static EpilogueLowering
6744getEpilogueLowering(const VectorizeOptions &Opts, Function *F, Loop *L,
6745 LoopVectorizeHints &Hints, bool OptForSize,
6748 InterleavedAccessInfo *IAI) {
6749 // 1) OptSize takes precedence over all other options, i.e. if this is set,
6750 // don't look at hints or options, and don't request an epilogue.
6751 if (F->hasOptSize() ||
6752 (OptForSize && Hints.getForce() != LoopVectorizeHints::FK_Enabled))
6754
6755 // 2) If set, obey the directives
6756 if (Opts.tail_folding_policy) {
6757 switch (*Opts.tail_folding_policy) {
6759 return CM_EpilogueAllowed;
6764 };
6765 }
6766
6767 // 3) If set, obey the hints
6768 switch (Hints.getPredicate()) {
6772 return CM_EpilogueAllowed;
6773 };
6774
6775 // 4) if the TTI hook indicates this is profitable, request tail-folding.
6776 TailFoldingInfo TFI(TLI, &LVL, IAI);
6777 if (TTI->preferTailFoldingOverEpilogue(&TFI))
6779
6780 return CM_EpilogueAllowed;
6781}
6782
6783// Emit a remark if there are stores to floats that required a floating point
6784// extension. If the vectorized loop was generated with floating point there
6785// will be a performance penalty from the conversion overhead and the change in
6786// the vector width.
6789 for (BasicBlock *BB : L->getBlocks()) {
6790 for (Instruction &Inst : *BB) {
6791 if (auto *S = dyn_cast<StoreInst>(&Inst)) {
6792 if (S->getValueOperand()->getType()->isFloatTy())
6793 Worklist.push_back(S);
6794 }
6795 }
6796 }
6797
6798 // Traverse the floating point stores upwards searching, for floating point
6799 // conversions.
6802 while (!Worklist.empty()) {
6803 auto *I = Worklist.pop_back_val();
6804 if (!L->contains(I))
6805 continue;
6806 if (!Visited.insert(I).second)
6807 continue;
6808
6809 // Emit a remark if the floating point store required a floating
6810 // point conversion.
6811 // TODO: More work could be done to identify the root cause such as a
6812 // constant or a function return type and point the user to it.
6813 if (isa<FPExtInst>(I) && EmittedRemark.insert(I).second)
6814 ORE->emit([&]() {
6815 return OptimizationRemarkAnalysis(LV_NAME, "VectorMixedPrecision",
6816 I->getDebugLoc(), L->getHeader())
6817 << "floating point conversion changes vector width. "
6818 << "Mixed floating point precision requires an up/down "
6819 << "cast that will negatively impact performance.";
6820 });
6821
6822 for (Use &Op : I->operands())
6823 if (auto *OpI = dyn_cast<Instruction>(Op))
6824 Worklist.push_back(OpI);
6825 }
6826}
6827
6828/// For loops with uncountable early exits, find the cost of doing work when
6829/// exiting the loop early, such as calculating the final exit values of
6830/// variables used outside the loop.
6831/// TODO: This is currently overly pessimistic because the loop may not take
6832/// the early exit, but better to keep this conservative for now. In future,
6833/// it might be possible to relax this by using branch probabilities.
6835 VPlan &Plan, ElementCount VF) {
6836 InstructionCost Cost = 0;
6837 for (auto *ExitVPBB : Plan.getExitBlocks()) {
6838 for (auto *PredVPBB : ExitVPBB->getPredecessors()) {
6839 // If the predecessor is not the middle.block, then it must be the
6840 // vector.early.exit block, which may contain work to calculate the exit
6841 // values of variables used outside the loop.
6842 if (PredVPBB != Plan.getMiddleBlock()) {
6843 LLVM_DEBUG(dbgs() << "Calculating cost of work in exit block "
6844 << PredVPBB->getName() << ":\n");
6845 Cost += PredVPBB->cost(VF, CostCtx);
6846 }
6847 }
6848 }
6849 return Cost;
6850}
6851
6852/// This function determines whether or not it's still profitable to vectorize
6853/// the loop given the extra work we have to do outside of the loop:
6854/// 1. Perform the runtime checks before entering the loop to ensure it's safe
6855/// to vectorize.
6856/// 2. In the case of loops with uncountable early exits, we may have to do
6857/// extra work when exiting the loop early, such as calculating the final
6858/// exit values of variables used outside the loop.
6859/// 3. The middle block.
6860static bool isOutsideLoopWorkProfitable(GeneratedRTChecks &Checks,
6861 VectorizationFactor &VF, Loop *L,
6863 VPCostContext &CostCtx, VPlan &Plan,
6864 EpilogueLowering SEL,
6865 std::optional<unsigned> VScale) {
6866 InstructionCost RtC = Checks.getCost();
6867 if (!RtC.isValid())
6868 return false;
6869
6870 // When interleaving only scalar and vector cost will be equal, which in turn
6871 // would lead to a divide by 0. Fall back to hard threshold.
6872 if (VF.Width.isScalar()) {
6873 // TODO: Should we rename VectorizeMemoryCheckThreshold?
6875 LLVM_DEBUG(
6876 dbgs()
6877 << "LV: Interleaving only is not profitable due to runtime checks\n");
6878 return false;
6879 }
6880 return true;
6881 }
6882
6883 // The scalar cost should only be 0 when vectorizing with a user specified
6884 // VF/IC. In those cases, runtime checks should always be generated.
6885 uint64_t ScalarC = VF.ScalarCost.getValue();
6886 if (ScalarC == 0)
6887 return true;
6888
6889 InstructionCost TotalCost = RtC;
6890 // Add on the cost of any work required in the vector early exit block, if
6891 // one exists.
6892 TotalCost += calculateEarlyExitCost(CostCtx, Plan, VF.Width);
6893 TotalCost += Plan.getMiddleBlock()->cost(VF.Width, CostCtx);
6894
6895 // First, compute the minimum iteration count required so that the vector
6896 // loop outperforms the scalar loop.
6897 // The total cost of the scalar loop is
6898 // ScalarC * TC
6899 // where
6900 // * TC is the actual trip count of the loop.
6901 // * ScalarC is the cost of a single scalar iteration.
6902 //
6903 // The total cost of the vector loop is
6904 // TotalCost + VecC * (TC / VF) + EpiC
6905 // where
6906 // * TotalCost is the sum of the costs cost of
6907 // - the generated runtime checks, i.e. RtC
6908 // - performing any additional work in the vector.early.exit block for
6909 // loops with uncountable early exits.
6910 // - the middle block, if ExpectedTC <= VF.Width.
6911 // * VecC is the cost of a single vector iteration.
6912 // * TC is the actual trip count of the loop
6913 // * VF is the vectorization factor
6914 // * EpiCost is the cost of the generated epilogue, including the cost
6915 // of the remaining scalar operations.
6916 //
6917 // Vectorization is profitable once the total vector cost is less than the
6918 // total scalar cost:
6919 // TotalCost + VecC * (TC / VF) + EpiC < ScalarC * TC
6920 //
6921 // Now we can compute the minimum required trip count TC as
6922 // VF * (TotalCost + EpiC) / (ScalarC * VF - VecC) < TC
6923 //
6924 // For now we assume the epilogue cost EpiC = 0 for simplicity. Note that
6925 // the computations are performed on doubles, not integers and the result
6926 // is rounded up, hence we get an upper estimate of the TC.
6927 unsigned IntVF = estimateElementCount(VF.Width, VScale);
6928 uint64_t Div = ScalarC * IntVF - VF.Cost.getValue();
6929 uint64_t MinTC1 =
6930 Div == 0 ? 0 : divideCeil(TotalCost.getValue() * IntVF, Div);
6931
6932 // Second, compute a minimum iteration count so that the cost of the
6933 // runtime checks is only a fraction of the total scalar loop cost. This
6934 // adds a loop-dependent bound on the overhead incurred if the runtime
6935 // checks fail. In case the runtime checks fail, the cost is RtC + ScalarC
6936 // * TC. To bound the runtime check to be a fraction 1/X of the scalar
6937 // cost, compute
6938 // RtC < ScalarC * TC * (1 / X) ==> RtC * X / ScalarC < TC
6939 uint64_t MinTC2 = divideCeil(RtC.getValue() * 10, ScalarC);
6940
6941 // Now pick the larger minimum. If it is not a multiple of VF and an epilogue
6942 // is allowed, choose the next closest multiple of VF. This should partly
6943 // compensate for ignoring the epilogue cost.
6944 uint64_t MinTC = std::max(MinTC1, MinTC2);
6945 if (SEL == CM_EpilogueAllowed)
6946 MinTC = alignTo(MinTC, IntVF);
6948
6949 LLVM_DEBUG(
6950 dbgs() << "LV: Minimum required TC for runtime checks to be profitable:"
6951 << VF.MinProfitableTripCount << "\n");
6952
6953 // Skip vectorization if the expected trip count is less than the minimum
6954 // required trip count.
6955 if (auto ExpectedTC = getSmallBestKnownTC(CostCtx.Opts, PSE, L)) {
6956 if (ElementCount::isKnownLT(*ExpectedTC, VF.MinProfitableTripCount)) {
6957 LLVM_DEBUG(dbgs() << "LV: Vectorization is not beneficial: expected "
6958 "trip count < minimum profitable VF ("
6959 << *ExpectedTC << " < " << VF.MinProfitableTripCount
6960 << ")\n");
6961
6962 return false;
6963 }
6964 }
6965 return true;
6966}
6967
6969 : InterleaveOnlyWhenForced(Opts.InterleaveOnlyWhenForced),
6970 VectorizeOnlyWhenForced(Opts.VectorizeOnlyWhenForced) {}
6971
6972/// ResumeForEpilogue markers in the main plan, used by the epilogue plan.
6977
6978/// Prepare \p MainPlan for vectorizing the main vector loop during epilogue
6979/// vectorization.
6981 using namespace VPlanPatternMatch;
6982 // When vectorizing the epilogue, FindFirstIV & FindLastIV reductions can
6983 // introduce multiple uses of undef/poison. If the reduction start value may
6984 // be undef or poison it needs to be frozen and the frozen start has to be
6985 // used when computing the reduction result. We also need to use the frozen
6986 // value in the resume phi generated by the main vector loop, as this is also
6987 // used to compute the reduction result after the epilogue vector loop. The
6988 // epilogue plan re-uses the frozen values.
6989 VPBuilder Builder(MainPlan.getEntry());
6990 for (VPInstruction &VPI :
6992 VPValue *OrigStart;
6993 if (!matchFindIVResult(&VPI, m_VPValue(), m_VPValue(OrigStart)))
6994 continue;
6996 continue;
6997 VPInstruction *Freeze = Builder.createFreeze(OrigStart, {}, "fr");
6998 VPI.setOperand(2, Freeze);
6999 OrigStart->replaceUsesWithIf(Freeze, IsaPred<VPPhi>);
7000 }
7001
7002 VPValue *VectorTC = nullptr;
7003 auto *Term =
7005 [[maybe_unused]] bool MatchedTC =
7006 match(Term, m_BranchOnCount(m_VPValue(), m_VPValue(VectorTC)));
7007 assert(MatchedTC && "must match vector trip count");
7008
7009 VPBasicBlock *MiddleVPBB = MainPlan.getMiddleBlock();
7010 VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
7011 VPInstruction *VectorTCMarker = MiddleBuilder.createNaryOp(
7013 {VectorTC, MainPlan.getZero(VectorTC->getScalarType())});
7014
7015 // Create ResumeForEpilogue instructions for the resume phis of the
7016 // VPIRPhis and their bypass values in the scalar header of the main plan and
7017 // return them so they can be used as resume values when vectorizing the
7018 // epilogue.
7019 VPRecipeBase *MiddleTerm = MiddleVPBB->getTerminator();
7020 MiddleBuilder.setInsertPoint(
7021 MiddleVPBB, MiddleTerm ? MiddleTerm->getIterator() : MiddleVPBB->end());
7022 auto ResumeValues = to_vector(
7023 map_range(MainPlan.getScalarHeader()->phis(), [&](VPRecipeBase &R) {
7024 auto *ResumePhi = cast<VPPhi>(R.getOperand(0));
7025 assert(ResumePhi->getNumIncoming() == 2 &&
7026 ResumePhi->getIncomingBlock(0) == MiddleVPBB &&
7027 "expected resume phi merging middle block and bypass value");
7028 return MiddleBuilder.createNaryOp(VPInstruction::ResumeForEpilogue,
7029 ResumePhi->operands());
7030 }));
7031 return {VectorTCMarker, std::move(ResumeValues)};
7032}
7033
7034/// Replace the resume phis in \p MainPlan's scalar preheader by their bypass
7035/// values. The epilogue plan creates them after \p MainPlan executed.
7036static void removeScalarResumePhis(VPlan &MainPlan) {
7037 for (VPRecipeBase &R :
7039 auto *ResumePhi = cast<VPPhi>(&R);
7040 assert(ResumePhi->getIncomingBlock(0) == MainPlan.getMiddleBlock() &&
7041 all_equal(drop_begin(ResumePhi->operands())) &&
7042 "expected resume phi merging middle block and bypass values");
7043 ResumePhi->replaceAllUsesWith(ResumePhi->getOperand(1));
7044 ResumePhi->eraseFromParent();
7045 }
7046}
7047
7048/// Prepare \p Plan for vectorizing the epilogue loop. That is, re-use expanded
7049/// SCEVs from \p ExpandedSCEVs and set resume values for header recipes.
7051 VPlan &MainPlan, VPlan &Plan, Loop *L, const SCEV2ValueTy &ExpandedSCEVs,
7052 ElementCount MainLoopVF, unsigned MainLoopUF, ElementCount EpilogueVF,
7055 // Build a map from the scalar-header PHI to the ResumeForEpilogue markers
7056 // from the main plan.
7057 // TODO: Replace the IR PHI key.
7058 DenseMap<PHINode *, VPInstruction *> IRPhiToResumeForEpi;
7059 for (auto [HeaderPhi, ResumeForEpi] :
7060 zip_equal(MainPlan.getScalarHeader()->phis(), Markers.ResumeValues))
7061 IRPhiToResumeForEpi[&cast<VPIRPhi>(HeaderPhi).getIRPhi()] = ResumeForEpi;
7062 VPIRBasicBlock *EpilogueCheck = RUN_VPLAN_PASS(
7064 VPRegionBlock *VectorLoop = Plan.getVectorLoopRegion();
7065 VPBasicBlock *Header = VectorLoop->getEntryBasicBlock();
7066 Header->setName("vec.epilog.vector.body");
7067
7068 // When skipping the epilogue vector loop, the scalar loop resumes at the
7069 // values computed by the main vector loop.
7070 for (auto [R, ResumeForEpi] :
7071 zip_equal(Plan.getScalarHeader()->phis(), Markers.ResumeValues))
7072 cast<VPPhi>(R.getOperand(0))
7073 ->setIncomingValueForBlock(
7074 EpilogueCheck,
7075 Plan.getOrAddLiveIn(ResumeForEpi->getUnderlyingValue()));
7076
7077 VPBasicBlock *VectorPH = Plan.getVectorPreheader();
7078 assert(VectorPH->getNumPredecessors() == 2 &&
7079 VectorPH->getPredecessors()[0] == EpilogueCheck &&
7080 "vector preheader must be entered from the epilogue check first");
7081 // Returns the value to resume at for \p ResumeForEpi: a phi in the vector
7082 // preheader merging the value computed by the main vector loop with the
7083 // value used when the main vector loop has been bypassed, or the former if
7084 // both are equal.
7085 auto GetResumeValue = [&](VPInstruction *ResumeForEpi,
7086 const Twine &Name) -> VPValue * {
7087 VPValue *MainV = Plan.getOrAddLiveIn(ResumeForEpi->getUnderlyingValue());
7088 VPValue *BypassV =
7089 Plan.getOrAddLiveIn(ResumeForEpi->getOperand(1)->getUnderlyingValue());
7090 if (MainV == BypassV)
7091 return MainV;
7092 return VPBuilder(VectorPH, VectorPH->getFirstNonPhi())
7093 .createScalarPhi({MainV, BypassV}, {}, Name);
7094 };
7095
7096 VPValue *IV = VectorLoop->getCanonicalIV();
7097 // When vectorizing the epilogue loop, the canonical induction needs to start
7098 // at the resume value from the main vector loop. Find the resume value
7099 // created during execution of the main VPlan. Add this resume value as an
7100 // offset to the canonical IV of the epilogue loop.
7101 VPValue *VPV = GetResumeValue(Markers.VectorTC, "vec.epilog.resume.val");
7102 assert(all_of(IV->users(),
7103 [](const VPUser *U) {
7104 if (isa<VPScalarIVStepsRecipe, VPDerivedIVRecipe>(U))
7105 return true;
7106 auto *VPI = dyn_cast<VPInstruction>(U);
7107 if (!VPI)
7108 return false;
7109 // Only users linear in the canonical IV (e.g. scaling it by
7110 // a stride) stay correct when offsetting it below; others,
7111 // like header masks, may need an epilogue-relative IV.
7112 return Instruction::isCast(VPI->getOpcode()) ||
7113 is_contained({Instruction::Add, Instruction::Mul,
7114 Instruction::Shl},
7115 VPI->getOpcode());
7116 }) &&
7117 "the canonical IV should only be used by its increment, casts, "
7118 "stride scaling, ScalarIVSteps or DerivedIV when resetting the start "
7119 "value");
7120 VPBuilder Builder(Header, Header->getFirstNonPhi());
7121 VPInstruction *Add = Builder.createAdd(IV, VPV);
7122 // Replace all users of the canonical IV and its increment with the offset
7123 // version, except for the Add itself and the canonical IV increment.
7125 assert(Increment && "Must have a canonical IV increment at this point");
7126 IV->replaceUsesWithIf(
7127 Add, [Add, Increment](VPUser *U) { return U != Add && U != Increment; });
7128 VPInstruction *OffsetIVInc =
7130 Increment->replaceAllUsesWith(OffsetIVInc);
7131 OffsetIVInc->setOperand(0, Increment);
7132
7133 // Resume values must be created in the vector preheader.
7134 VPBuilder PHBuilder(VectorPH, VectorPH->getFirstNonPhi());
7135
7136 // Ensure that the start values for all header phi recipes are updated before
7137 // vectorizing the epilogue loop.
7138 for (VPRecipeBase &R : Header->phis()) {
7139 VPValue *ResumeVPV = nullptr;
7140 // TODO: Move setting of resume values to prepareToExecute.
7141 if (auto *ReductionPhi = dyn_cast<VPReductionPHIRecipe>(&R)) {
7142 // Find the reduction result by searching users of the phi or its backedge
7143 // value.
7144 auto IsReductionResult = [](VPRecipeBase *R) {
7145 auto *VPI = dyn_cast<VPInstruction>(R);
7146 return VPI && VPI->getOpcode() == VPInstruction::ComputeReductionResult;
7147 };
7148 auto *RdxResult = cast<VPInstruction>(
7149 vputils::findRecipe(ReductionPhi->getBackedgeValue(), IsReductionResult));
7150 assert(RdxResult && "expected to find reduction result");
7151
7152 VPInstruction *ResumeForEpi = IRPhiToResumeForEpi.at(
7153 cast<PHINode>(ReductionPhi->getUnderlyingInstr()));
7154
7155 // Check for FindIV pattern by looking for icmp user of RdxResult.
7156 // The pattern is: select(icmp ne RdxResult, Sentinel), RdxResult, Start
7157 using namespace VPlanPatternMatch;
7158 VPValue *SentinelVPV = nullptr;
7159 bool IsFindIV = any_of(RdxResult->users(), [&](VPUser *U) {
7160 return match(U, VPlanPatternMatch::m_SpecificICmp(
7161 ICmpInst::ICMP_NE, m_Specific(RdxResult),
7162 m_VPValue(SentinelVPV)));
7163 });
7164
7165 RecurKind RK = ReductionPhi->getRecurrenceKind();
7166 ResumeVPV = GetResumeValue(ResumeForEpi, "bc.merge.rdx");
7167 if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RK) || IsFindIV) {
7168 VPValue *BypassOp = ResumeForEpi->getOperand(1);
7169 assert((isa<VPIRValue>(BypassOp) ||
7171 BypassOp,
7172 m_VPInstruction<Instruction::Freeze>(m_VPValue()))) &&
7173 "expected live-in or Freeze");
7174 VPValue *StartV = Plan.getOrAddLiveIn(BypassOp->getUnderlyingValue());
7176 // VPReductionPHIRecipes for AnyOf reductions expect a boolean as
7177 // start value; compare the final value from the main vector loop
7178 // to the start value.
7179 ResumeVPV = PHBuilder.createICmp(CmpInst::ICMP_NE, ResumeVPV, StartV);
7180 } else {
7181 assert(isa<VPIRValue>(SentinelVPV) &&
7182 "sentinel must be a live-in to be used in the preheader");
7183 // Use the start value frozen for the main plan, if any, when
7184 // computing the reduction result.
7185 if (match(BypassOp, m_Freeze(m_VPValue())))
7186 for (VPUser *U : RdxResult->users()) {
7187 auto *VPI = dyn_cast<VPInstruction>(U);
7188 if (VPI && matchFindIVResult(VPI, m_VPValue(), m_VPValue()))
7189 VPI->setOperand(2, StartV);
7190 }
7191
7192 // Adjust resume: select(icmp eq ResumeVPV, StartV), Sentinel,
7193 // ResumeVPV
7194 VPValue *Cmp =
7195 PHBuilder.createICmp(CmpInst::ICMP_EQ, ResumeVPV, StartV);
7196 ResumeVPV = PHBuilder.createSelect(Cmp, SentinelVPV, ResumeVPV);
7197 }
7198 // TODO: materializeBroadcasts does not cover values in the vector
7199 // preheader.
7200 ReductionPhi->setStartValue(
7201 PHBuilder.createNaryOp(VPInstruction::Broadcast, ResumeVPV));
7202 continue;
7203 }
7204 if (auto *VPI = dyn_cast<VPInstruction>(ReductionPhi->getStartValue())) {
7206 "unexpected start value");
7207 // Partial sub-reductions always start at 0 and account for the
7208 // reduction start value in a final subtraction. Update it to use the
7209 // resume value from the main vector loop.
7210 if (ReductionPhi->getVFScaleFactor() > 1 &&
7212 auto *Sub = cast<VPInstruction>(RdxResult->getSingleUser());
7213 assert((Sub->getOpcode() == Instruction::Sub ||
7214 Sub->getOpcode() == Instruction::FSub) &&
7215 "Unexpected opcode");
7216 assert(isa<VPIRValue>(Sub->getOperand(0)) &&
7217 "Expected operand to match the original start value of the "
7218 "reduction");
7219 // For integer sub-reductions, verify start value is zero.
7220 // For FP sub-reductions, verify start value is negative zero.
7221 [[maybe_unused]] auto StartValueIsIdentity = [&] {
7222 Value *IdentityValue =
7223 getRecurrenceIdentity(RK, ResumeVPV->getScalarType(),
7224 ReductionPhi->getFastMathFlagsOrNone());
7225 auto *StartValue = dyn_cast<VPIRValue>(VPI->getOperand(0));
7226 return StartValue && StartValue->getValue() == IdentityValue;
7227 };
7228 assert(StartValueIsIdentity() &&
7229 "Expected start value for partial sub-reduction to be zero "
7230 "(or negative zero)");
7231
7232 Sub->setOperand(0, ResumeVPV);
7233 } else {
7234 // The start vector may be shared by multiple reductions, so create
7235 // a new one using the resume.
7236 auto *NewStart = cast<VPInstruction>(VPI->clone());
7237 NewStart->setOperand(0, ResumeVPV);
7238 NewStart->insertBefore(VPI);
7239 ReductionPhi->setStartValue(NewStart);
7240 }
7241 continue;
7242 }
7243 } else {
7244 // Retrieve the induction resume value via ResumeForEpilogue.
7245 PHINode *IndPhi = cast<VPWidenInductionRecipe>(&R)->getPHINode();
7246 ResumeVPV =
7247 GetResumeValue(IRPhiToResumeForEpi.at(IndPhi), "bc.resume.val");
7248 }
7249 assert(ResumeVPV && "Must have a resume value");
7250 cast<VPHeaderPHIRecipe>(&R)->setStartValue(ResumeVPV);
7251 }
7252
7253 // Re-use the SCEVs expanded for the main loop instead of expanding them
7254 // again, which also lets simplifyLiveInsWithSCEV fold their users.
7255 // TODO: Remove once the epilogue plan uses the main plan's VPValues directly.
7257 make_isa_range<VPExpandSCEVRecipe>(*Plan.getEntry()))) {
7258 assert(ExpandedSCEVs.contains(ExpandR.getSCEV()) &&
7259 "Epilogue plan needs a SCEV not expanded for the main loop");
7260 VPValue *ExpandedVal =
7261 Plan.getOrAddLiveIn(ExpandedSCEVs.lookup(ExpandR.getSCEV()));
7262 ExpandR.replaceAllUsesWith(ExpandedVal);
7263 if (Plan.getTripCount() == &ExpandR)
7264 Plan.resetTripCount(ExpandedVal);
7265 ExpandR.eraseFromParent();
7266 }
7267
7268 auto VScale = Config.getVScaleForTuning();
7269 unsigned MainLoopStep = estimateElementCount(MainLoopVF * MainLoopUF, VScale);
7270 unsigned EpilogueLoopStep = estimateElementCount(EpilogueVF, VScale);
7272 Plan.getOrAddLiveIn(Markers.VectorTC->getUnderlyingValue()),
7273 Plan.requiresScalarEpilogue(), EpilogueVF, MainLoopStep,
7274 EpilogueLoopStep, SE);
7275}
7276
7278 const VectorizeOptions &Opts = getVectorizeOptions(*L);
7279 assert((Opts.enable_vplan_native_path || L->isInnermost()) &&
7280 "VPlan-native path is not enabled. Only process inner loops.");
7281
7282 LLVM_DEBUG(dbgs() << "\nLV: Checking a loop in '"
7283 << L->getHeader()->getParent()->getName() << "' from "
7284 << L->getLocStr() << "\n");
7285
7286 LoopVectorizeHints Hints(
7287 Opts, L, InterleaveOnlyWhenForced || !Opts.interleave_loops, *ORE, TTI);
7288
7289 LLVM_DEBUG(
7290 dbgs() << "LV: Loop hints:"
7291 << " force="
7293 ? "disabled"
7295 ? "enabled"
7296 : "?"))
7297 << " width=" << Hints.getWidth()
7298 << " interleave=" << Hints.getInterleave() << "\n");
7299
7300 // Function containing loop
7301 Function *F = L->getHeader()->getParent();
7302
7303 // Looking at the diagnostic output is the only way to determine if a loop
7304 // was vectorized (other than looking at the IR or machine code), so it
7305 // is important to generate an optimization remark for each loop. Most of
7306 // these messages are generated as OptimizationRemarkAnalysis. Remarks
7307 // generated as OptimizationRemark and OptimizationRemarkMissed are
7308 // less verbose reporting vectorized loops and unvectorized loops that may
7309 // benefit from vectorization, respectively.
7310
7311 if (!Hints.allowVectorization(
7312 F, L, VectorizeOnlyWhenForced || !Opts.vectorize_loops)) {
7313 LLVM_DEBUG(dbgs() << "LV: Loop hints prevent vectorization.\n");
7314 return false;
7315 }
7316
7317 PredicatedScalarEvolution PSE(*SE, *L);
7318
7319 // Query this against the original loop and save it here because the profile
7320 // of the original loop header may change as the transformation happens.
7321 bool OptForSize = llvm::shouldOptimizeForSize(
7322 L->getHeader(), PSI,
7323 PSI && PSI->hasProfileSummary() ? &GetBFI() : nullptr,
7325
7326 // Check if it is legal to vectorize the loop.
7327 LoopVectorizationRequirements Requirements;
7328 LoopVectorizationLegality LVL(Opts, L, PSE, DT, TTI, TLI, F, *LAIs, LI, ORE,
7329 &Requirements, &Hints, DB, AC,
7330 /*AllowRuntimeSCEVChecks=*/!OptForSize, AA);
7331 if (!LVL.canVectorize(Opts.enable_vplan_native_path)) {
7332 LLVM_DEBUG(dbgs() << "LV: Not vectorizing: Cannot prove legality.\n");
7333 Hints.emitRemarkWithHints();
7334 return false;
7335 }
7336
7337 bool IsInnerLoop = L->isInnermost();
7338
7339 // Outer loops require a computable trip count.
7340 if (!IsInnerLoop && isa<SCEVCouldNotCompute>(PSE.getBackedgeTakenCount())) {
7341 LLVM_DEBUG(dbgs() << "LV: cannot compute the outer-loop trip count\n");
7342 return false;
7343 }
7344
7345 if (LVL.hasUncountableEarlyExit()) {
7346 if (!Opts.enable_early_exit_vectorization) {
7347 reportVectorizationFailure("Auto-vectorization of loops with uncountable "
7348 "early exit is not enabled",
7349 "UncountableEarlyExitLoopsDisabled", ORE, L);
7350 return false;
7351 }
7353 !Opts.enable_early_exit_vectorization_with_side_effects) {
7354 reportVectorizationFailure("Auto-vectorization of loops with uncountable "
7355 "early exit and side effects is not enabled",
7356 "UncountableEarlyExitSideEffectLoopsDisabled",
7357 ORE, L);
7358 return false;
7359 }
7360 }
7361
7362 InterleavedAccessInfo IAI(PSE, L, DT, LI, LVL.getLAI(), OptForSize);
7363 // If an override option has been passed in for interleaved accesses, use it.
7364 bool UseInterleaved =
7365 IsInnerLoop && valueOr(Opts.enable_interleaved_mem_accesses,
7366 TTI->enableInterleavedAccessVectorization());
7367
7368 // Analyze interleaved memory accesses.
7369 if (UseInterleaved)
7371
7372 if (LVL.hasUncountableEarlyExit()) {
7373 BasicBlock *LoopLatch = L->getLoopLatch();
7374 if (IAI.requiresScalarEpilogue() ||
7375 any_of(LVL.getCountableExitingBlocks(), not_equal_to(LoopLatch))) {
7376 reportVectorizationFailure("Auto-vectorization of early exit loops "
7377 "requiring a scalar epilogue is unsupported",
7378 "UncountableEarlyExitUnsupported", ORE, L);
7379 return false;
7380 }
7381 }
7382
7383 // Check the function attributes and profiles to find out if this function
7384 // should be optimized for size.
7385 EpilogueLowering SEL =
7386 getEpilogueLowering(Opts, F, L, Hints, OptForSize, TTI, TLI, LVL, &IAI);
7387
7388 // Check the loop for a trip count threshold: vectorize loops with a tiny trip
7389 // count by optimizing for size, to minimize overheads.
7390 auto ExpectedTC = getSmallBestKnownTC(Opts, PSE, L);
7391 if (ExpectedTC && ExpectedTC->isFixed() &&
7392 ExpectedTC->getFixedValue() < Opts.vectorizer_min_trip_count) {
7393 LLVM_DEBUG(dbgs() << "LV: Found a loop with a very small trip count. "
7394 << "This loop is worth vectorizing only if no scalar "
7395 << "iteration overheads are incurred.");
7397 LLVM_DEBUG(dbgs() << " But vectorizing was explicitly forced.\n");
7398 else {
7399 LLVM_DEBUG(dbgs() << "\n");
7400 // Tail-folded loops are efficient even when the loop
7401 // iteration count is low. However, setting the epilogue policy to
7402 // `CM_EpilogueNotAllowedLowTripLoop` prevents vectorizing loops
7403 // with runtime checks. It's more effective to let
7404 // `isOutsideLoopWorkProfitable` determine if vectorization is
7405 // beneficial for the loop. If the trip count is below the target's
7406 // minimum for tail-folding, the tail cannot be folded, so treat it like
7407 // any other low trip count loop.
7408 if (SEL != CM_EpilogueNotNeededFoldTail ||
7409 ExpectedTC->getFixedValue() <=
7410 TTI->getMinTripCountTailFoldingThreshold())
7412 }
7413 }
7414
7415 // Check the function attributes to see if implicit floats or vectors are
7416 // allowed.
7417 if (F->hasFnAttribute(Attribute::NoImplicitFloat)) {
7419 "Can't vectorize when the NoImplicitFloat attribute is used",
7420 "loop not vectorized due to NoImplicitFloat attribute",
7421 "NoImplicitFloat", ORE, L);
7422 Hints.emitRemarkWithHints();
7423 return false;
7424 }
7425
7426 // Check if the target supports potentially unsafe FP vectorization.
7427 // FIXME: Add a check for the type of safety issue (denormal, signaling)
7428 // for the target we're vectorizing for, to make sure none of the
7429 // additional fp-math flags can help.
7430 if (Hints.isPotentiallyUnsafe() &&
7431 TTI->isFPVectorizationPotentiallyUnsafe()) {
7433 "Potentially unsafe FP op prevents vectorization",
7434 "loop not vectorized due to unsafe FP support.", "UnsafeFP", ORE, L);
7435 Hints.emitRemarkWithHints();
7436 return false;
7437 }
7438
7439 // If the flag is set, use that instead and override the TTI behaviour.
7440 bool AllowOrderedReductions =
7441 valueOr(Opts.force_ordered_reductions, TTI->enableOrderedReductions());
7442 if (!LVL.canVectorizeFPMath(AllowOrderedReductions)) {
7443 ORE->emit([&]() {
7444 auto *ExactFPMathInst = Requirements.getExactFPInst();
7445 return OptimizationRemarkAnalysisFPCommute(DEBUG_TYPE, "CantReorderFPOps",
7446 ExactFPMathInst->getDebugLoc(),
7447 ExactFPMathInst->getParent())
7448 << "loop not vectorized: cannot prove it is safe to reorder "
7449 "floating-point operations";
7450 });
7451 LLVM_DEBUG(dbgs() << "LV: loop not vectorized: cannot prove it is safe to "
7452 "reorder floating-point operations\n");
7453 Hints.emitRemarkWithHints();
7454 return false;
7455 }
7456
7457 // Use the cost model.
7458 VFSelectionContext Config(Opts, *TTI, &LVL, L, *F, PSE, DB, ORE, &Hints,
7459 OptForSize);
7460 // Use the planner for vectorization.
7462 L, LI, DT, TLI, *TTI, &LVL,
7463 std::make_unique<LoopVectorizationCostModel>(
7464 SEL, L, PSE, LI, &LVL, *TTI, TLI, AC, ORE, GetBFI, F, IAI, Config),
7465 Config, PSE, ORE, GetBPI);
7466
7467 EpilogueLowering EpilogueTailLoweringStatus = getEpilogueTailLowering(
7468 Opts, LVP.getCostModel(), L, ORE, LVL, Hints, TTI);
7469 if (EpilogueTailLoweringStatus ==
7471 // TODO: Apply tail-folding on the vectorized epilogue loop.
7472 LLVM_DEBUG(dbgs() << "LV: epilogue tail-folding is not supported yet\n");
7474 "The epilogue-tail-folding policy prefer-fold-tail is not supported "
7475 "yet, fall back to a normal epilogue",
7476 "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
7477 }
7478
7479 // Get user vectorization factor and interleave count.
7480 ElementCount UserVF = Hints.getWidth();
7481 unsigned UserIC = Hints.getInterleave();
7482 // Outer loops don't have LoopAccessInfo, so skip the safety check and reset
7483 // UserIC (interleaving is not supported for outer loops).
7484 if (!IsInnerLoop)
7485 UserIC = 0;
7486 else if (UserIC > 1 && !LVL.isSafeForAnyVectorWidth())
7487 UserIC = 1;
7488
7489 // Plan how to best vectorize.
7490 LVP.plan(UserVF, UserIC);
7491 auto [VF, BestPlanPtr] = LVP.computeBestVF();
7492 unsigned IC = 1;
7493
7494 // For VPlan build stress testing of outer loops, bail after plan
7495 // construction.
7496 if (!IsInnerLoop && Opts.vplan_build_outerloop_stress_test)
7497 return false;
7498
7499 if (IsInnerLoop && ORE->allowExtraAnalysis(LV_NAME))
7501
7502 assert((IsInnerLoop || !LVP.getCostModel().maskPartialAliasing()) &&
7503 "Did not expect to alias-mask outer loop");
7504
7505 GeneratedRTChecks Checks(Opts, PSE, DT, LI, TTI, Config.CostKind,
7507 if (IsInnerLoop && LVP.hasPlanWithVF(VF.Width)) {
7508 // Select the interleave count.
7509 IC = LVP.selectInterleaveCount(*BestPlanPtr, VF.Width, VF.Cost);
7510
7511 unsigned SelectedIC = UserIC > 0 ? UserIC : IC;
7512 // Optimistically generate runtime checks if they are needed. Drop them if
7513 // they turn out to not be profitable.
7514 if (VF.Width.isVector() || SelectedIC > 1) {
7515 Checks.create(L, *LVL.getLAI(), PSE.getPredicate(), VF.Width, SelectedIC,
7516 *ORE);
7517
7518 // Bail out early if either the SCEV or memory runtime checks are known to
7519 // fail. In that case, the vector loop would never execute.
7520 using namespace llvm::PatternMatch;
7521 if ((Checks.getSCEVChecks().first &&
7522 match(Checks.getSCEVChecks().first, m_One())) ||
7523 (Checks.getMemRuntimeChecks().first &&
7524 match(Checks.getMemRuntimeChecks().first, m_One()))) {
7526 "runtime checks are known to fail, so we will never enter the "
7527 "vector loop",
7528 "RuntimeChecksNeverEnterVectorLoop", ORE, L);
7529 return false;
7530 }
7531 }
7532
7533 // Check if it is profitable to vectorize with runtime checks.
7534 bool ForceVectorization =
7536 VPCostContext CostCtx(*TLI, *BestPlanPtr, LVP.getCostModel(), Config,
7537 /*ReusePrintingSlotTracker=*/true);
7538 if (!ForceVectorization &&
7539 !isOutsideLoopWorkProfitable(Checks, VF, L, PSE, CostCtx, *BestPlanPtr,
7540 SEL, Config.getVScaleForTuning())) {
7541 ORE->emit([&]() {
7543 DEBUG_TYPE, "CantReorderMemOps", L->getStartLoc(),
7544 L->getHeader())
7545 << "loop not vectorized: cannot prove it is safe to reorder "
7546 "memory operations";
7547 });
7548 LLVM_DEBUG(dbgs() << "LV: Too many memory checks needed.\n");
7549 Hints.emitRemarkWithHints();
7550 return false;
7551 }
7552 }
7553
7554 // Identify the diagnostic messages that should be produced.
7555 std::pair<StringRef, std::string> VecDiagMsg, IntDiagMsg;
7556 bool VectorizeLoop = true, InterleaveLoop = true;
7557 if (VF.Width.isScalar()) {
7558 if (LVP.hasVectorPlan()) {
7559 LLVM_DEBUG(
7560 dbgs() << "LV: Vectorization is possible but not beneficial.\n");
7561 VecDiagMsg = {
7562 "VectorizationNotBeneficial",
7563 "the cost-model indicates that vectorization is not beneficial"};
7564 } else {
7565 LLVM_DEBUG(dbgs() << "LV: Vectorization is not possible. Failed to "
7566 "create any vector VPlans.\n");
7567 VecDiagMsg = {"VectorizationNotPossible",
7568 "vectorization is not possible"};
7569 }
7570 VectorizeLoop = false;
7571 }
7572
7573 if (UserIC == 1 && Hints.getInterleave() > 1) {
7575 "UserIC should only be ignored due to unsafe dependencies");
7576 LLVM_DEBUG(dbgs() << "LV: Ignoring user-specified interleave count.\n");
7577 IntDiagMsg = {"InterleavingUnsafe",
7578 "Ignoring user-specified interleave count due to possibly "
7579 "unsafe dependencies in the loop."};
7580 InterleaveLoop = false;
7581 } else if (!LVP.hasPlanWithVF(VF.Width) && UserIC > 1) {
7582 // Tell the user interleaving was avoided up-front, despite being explicitly
7583 // requested.
7584 LLVM_DEBUG(dbgs() << "LV: Ignoring UserIC, because vectorization and "
7585 "interleaving should be avoided up front\n");
7586 IntDiagMsg = {"InterleavingAvoided",
7587 "Ignoring UserIC, because interleaving was avoided up front"};
7588 InterleaveLoop = false;
7589 } else if (IC == 1 && UserIC <= 1) {
7590 // Tell the user interleaving is not beneficial.
7591 if (LVP.hasAPlan()) {
7592 LLVM_DEBUG(dbgs() << "LV: Interleaving is not beneficial.\n");
7593 IntDiagMsg = {
7594 "InterleavingNotBeneficial",
7595 "the cost-model indicates that interleaving is not beneficial"};
7596 if (UserIC == 1) {
7597 IntDiagMsg.first = "InterleavingNotBeneficialAndDisabled";
7598 IntDiagMsg.second +=
7599 " and is explicitly disabled or interleave count is set to 1";
7600 }
7601 } else {
7602 LLVM_DEBUG(dbgs() << "LV: Interleaving is not possible. Failed to create"
7603 << " any vplans\n");
7604 IntDiagMsg = {"InterleavingNotPossible", "interleaving is not possible"};
7605 }
7606 InterleaveLoop = false;
7607 } else if (IC > 1 && UserIC == 1) {
7608 // Tell the user interleaving is beneficial, but it explicitly disabled.
7609 LLVM_DEBUG(dbgs() << "LV: Interleaving is beneficial but is explicitly "
7610 "disabled.\n");
7611 IntDiagMsg = {"InterleavingBeneficialButDisabled",
7612 "the cost-model indicates that interleaving is beneficial "
7613 "but is explicitly disabled or interleave count is set to 1"};
7614 InterleaveLoop = false;
7615 }
7616
7617 // If there is a histogram in the loop, do not just interleave without
7618 // vectorizing. The order of operations will be incorrect without the
7619 // histogram intrinsics, which are only used for recipes with VF > 1.
7620 if (!VectorizeLoop && InterleaveLoop && LVL.hasHistograms()) {
7621 LLVM_DEBUG(dbgs() << "LV: Not interleaving without vectorization due "
7622 << "to histogram operations.\n");
7623 IntDiagMsg = {
7624 "HistogramPreventsScalarInterleaving",
7625 "Unable to interleave without vectorization due to constraints on "
7626 "the order of histogram operations"};
7627 InterleaveLoop = false;
7628 }
7629
7630 // Override IC if user provided an interleave count.
7631 IC = UserIC > 0 ? UserIC : IC;
7632
7633 if (LVP.getCostModel().maskPartialAliasing()) {
7634 LLVM_DEBUG(
7635 dbgs()
7636 << "LV: Not interleaving due to partial aliasing vectorization.\n");
7637 IntDiagMsg = {
7638 "PartialAliasingVectorization",
7639 "Unable to interleave due to partial aliasing vectorization."};
7640 InterleaveLoop = false;
7641 IC = 1;
7642 }
7643
7644 // FIXME: Enable interleaving for EE-with-side-effects.
7645 if (InterleaveLoop && LVL.hasUncountableExitWithSideEffects()) {
7646 LLVM_DEBUG(dbgs() << "LV: Not interleaving due to EE with side effects.\n");
7647 IntDiagMsg = {"EEWithSideEffectsPreventsInterleaving",
7648 "Unable to interleave due to early exit with side effects."};
7649 InterleaveLoop = false;
7650 IC = 1;
7651 }
7652
7653 // Emit diagnostic messages, if any.
7654 if (!VectorizeLoop && !InterleaveLoop) {
7655 // Do not vectorize or interleaving the loop.
7656 ORE->emit([&]() {
7657 return OptimizationRemarkMissed(LV_NAME, VecDiagMsg.first,
7658 L->getStartLoc(), L->getHeader())
7659 << VecDiagMsg.second;
7660 });
7661 ORE->emit([&]() {
7662 return OptimizationRemarkMissed(LV_NAME, IntDiagMsg.first,
7663 L->getStartLoc(), L->getHeader())
7664 << IntDiagMsg.second;
7665 });
7666 return false;
7667 }
7668
7669 if (!VectorizeLoop && InterleaveLoop) {
7670 LLVM_DEBUG(dbgs() << "LV: Interleave Count is " << IC << '\n');
7671 ORE->emit([&]() {
7672 return OptimizationRemarkAnalysis(LV_NAME, VecDiagMsg.first,
7673 L->getStartLoc(), L->getHeader())
7674 << VecDiagMsg.second;
7675 });
7676 } else if (VectorizeLoop && !InterleaveLoop) {
7677 LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
7678 << ") in " << L->getLocStr() << '\n');
7679 ORE->emit([&]() {
7680 return OptimizationRemarkAnalysis(LV_NAME, IntDiagMsg.first,
7681 L->getStartLoc(), L->getHeader())
7682 << IntDiagMsg.second;
7683 });
7684 } else if (VectorizeLoop && InterleaveLoop) {
7685 LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
7686 << ") in " << L->getLocStr() << '\n');
7687 LLVM_DEBUG(dbgs() << "LV: Interleave Count is " << IC << '\n');
7688 }
7689
7690 // Report the vectorization decision.
7691 if (VF.Width.isScalar()) {
7692 using namespace ore;
7693 assert(IC > 1);
7694 ORE->emit([&]() {
7695 return OptimizationRemark(LV_NAME, "Interleaved", L->getStartLoc(),
7696 L->getHeader())
7697 << "interleaved loop (interleaved count: "
7698 << NV("InterleaveCount", IC) << ")";
7699 });
7700 } else {
7701 // Report the vectorization decision.
7702 reportVectorization(ORE, L, VF.Width, IC);
7703 }
7704 if (ORE->allowExtraAnalysis(LV_NAME))
7706
7707 // If we decided that it is *legal* to interleave or vectorize the loop, then
7708 // do it.
7709
7710 // Whether a scalar epilogue may be created is decided by the epilogue
7711 // lowering policy.
7712 // TODO: Also move check to be based on VPlan.
7713 bool ScalarEpilogueAllowed = LVP.getCostModel().isEpilogueAllowed();
7714
7715 // Destroy the cost model before executing any plan, so that code generation
7716 // cannot rely on cost-modeling decisions.
7717 LVP.clearCostModel();
7718
7719 VPlan &BestPlan = *BestPlanPtr;
7720 // Consider vectorizing the epilogue too if it's profitable.
7721 std::unique_ptr<VPlan> EpiPlan =
7722 LVP.selectBestEpiloguePlan(BestPlan, VF.Width, IC, ScalarEpilogueAllowed);
7723 bool HasBranchWeights =
7724 hasBranchWeightMD(*L->getLoopLatch()->getTerminator());
7725 if (EpiPlan) {
7726 VPlan &BestEpiPlan = *EpiPlan;
7727 VPlan &BestMainPlan = BestPlan;
7728 ElementCount EpilogueVF = BestEpiPlan.getSingleVF();
7729
7730 // The first pass vectorizes the main loop and creates a scalar epilogue
7731 // to be vectorized by executing the plan (potentially with a different
7732 // factor) again shortly afterwards.
7733 BestEpiPlan.getMiddleBlock()->setName("vec.epilog.middle.block");
7734 BestEpiPlan.getVectorPreheader()->setName("vec.epilog.ph");
7736
7737 // Add minimum iteration check for the epilogue plan, followed by runtime
7738 // checks for the main plan.
7739 LVP.addMinimumIterationCheck(BestMainPlan, EpilogueVF, /*UF=*/1,
7741 LVP.attachRuntimeChecks(BestMainPlan, Checks, VF.Width, IC,
7742 HasBranchWeights);
7744 VF.Width, IC, BestMainPlan.requiresScalarEpilogue(), L,
7745 HasBranchWeights ? MinItersBypassWeights : nullptr,
7746 L->getLoopPredecessor()->getTerminator()->getDebugLoc(),
7747 PSE);
7748 removeScalarResumePhis(BestMainPlan);
7749
7750 LLVM_DEBUG({
7751 dbgs() << "Create Skeleton for epilogue vectorized loop (first pass)\n"
7752 << "Main Loop VF:" << VF.Width << ", Main Loop UF:" << IC
7753 << ", Epilogue Loop VF:" << EpilogueVF << ", Epilogue Loop UF:1\n";
7754 });
7755 InnerLoopVectorizer MainILV(L, PSE, LI, DT, TTI, AC, VF.Width, IC, Checks);
7756 auto ExpandedSCEVs = LVP.executePlan(
7757 VF.Width, IC, BestMainPlan, MainILV, DT,
7759 ++LoopsVectorized;
7761 dbgs() << "intermediate fn:\n" << *L->getHeader()->getParent() << "\n";
7762 });
7763
7764 BasicBlock *EntryBB =
7765 cast<VPIRBasicBlock>(BestMainPlan.getEntry())->getIRBasicBlock();
7766 EntryBB->setName("iter.check");
7768 ->getIRBasicBlock()
7769 ->setName("vec.epilog.iter.check");
7770
7771 // Second pass vectorizes the epilogue and adjusts the control flow
7772 // edges from the first pass.
7773 InnerLoopVectorizer EpilogILV(L, PSE, LI, DT, TTI, AC, EpilogueVF,
7774 /*UnrollFactor=*/1, Checks);
7775 preparePlanForEpilogueVectorLoop(BestMainPlan, BestEpiPlan, L,
7776 ExpandedSCEVs, VF.Width, IC, EpilogueVF,
7777 LVP, Config, *PSE.getSE(), Markers);
7779 LLVM_DEBUG({
7780 dbgs() << "Create Skeleton for epilogue vectorized loop (second pass)\n"
7781 << "Epilogue Loop VF:" << EpilogueVF << ", Epilogue Loop UF:1\n";
7782 });
7783 LVP.executePlan(
7784 EpilogueVF, /*BestUF=*/1, BestEpiPlan, EpilogILV, DT,
7787 dbgs() << "final fn:\n" << *L->getHeader()->getParent() << "\n";
7788 });
7789 ++LoopsEpilogueVectorized;
7790 } else {
7791 InnerLoopVectorizer LB(L, PSE, LI, DT, TTI, AC, VF.Width, IC, Checks);
7792 LVP.addMinimumIterationCheck(BestPlan, VF.Width, IC,
7793 VF.MinProfitableTripCount);
7794 LVP.attachRuntimeChecks(BestPlan, Checks, VF.Width, IC, HasBranchWeights);
7795
7796 if (!IsInnerLoop)
7797 LLVM_DEBUG(dbgs() << "Vectorizing outer loop in \"" << F->getName()
7798 << "\"\n");
7799 LVP.executePlan(VF.Width, IC, BestPlan, LB, DT);
7800 ++LoopsVectorized;
7801 }
7802
7803#ifdef EXPENSIVE_CHECKS
7804 assert(DT->verify(DominatorTree::VerificationLevel::Fast) &&
7805 "DT not preserved correctly");
7806#endif
7807
7808 return true;
7809}
7810
7812 CFGChanged = false;
7813
7814 // Don't attempt if
7815 // 1. the target claims to have no vector registers, and
7816 // 2. interleaving won't help ILP.
7817 //
7818 // The second condition is necessary because, even if the target has no
7819 // vector registers, loop vectorization may still enable scalar
7820 // interleaving.
7821 if (!TTI->getNumberOfRegisters(TTI->getRegisterClassForType(true)) &&
7822 (TTI->getMaxInterleaveFactor(ElementCount::getFixed(1), false) < 2 ||
7823 TTI->getMaxInterleaveFactor(ElementCount::getFixed(1), true) < 2))
7824 return LoopVectorizeResult(false, false);
7825
7826 bool Changed = false;
7827
7828 // The vectorizer requires loops to be in simplified form.
7829 // Since simplification may add new inner loops, it has to run before the
7830 // legality and profitability checks. This means running the loop vectorizer
7831 // will simplify all loops, regardless of whether anything end up being
7832 // vectorized.
7833 for (const auto &L : *LI)
7834 Changed |= CFGChanged |=
7835 simplifyLoop(L, DT, LI, SE, AC, nullptr, false /* PreserveLCSSA */);
7836
7837 // Build up a worklist of inner-loops to vectorize. This is necessary as
7838 // the act of vectorizing or partially unrolling a loop creates new loops
7839 // and can invalidate iterators across the loops.
7840 SmallVector<Loop *, 8> Worklist;
7841
7842 const VectorizeOptions &Opts = getVectorizeOptions(F);
7843 for (Loop *L : *LI)
7844 collectSupportedLoops(Opts, *L, LI, ORE, Worklist);
7845
7846 LoopsAnalyzed += Worklist.size();
7847
7848 // Now walk the identified inner loops.
7849 while (!Worklist.empty()) {
7850 Loop *L = Worklist.pop_back_val();
7851
7852 // For the inner loops we actually process, form LCSSA to simplify the
7853 // transform.
7854 Changed |= formLCSSARecursively(*L, *DT, LI, SE);
7855
7857
7858 if (Changed) {
7859 LAIs->clear();
7860
7861#ifndef NDEBUG
7862 if (VerifySCEV)
7863 SE->verify();
7864#endif
7865 }
7866 }
7867
7868 // Verify once per function rather than once per processed loop, which would
7869 // make the pass quadratic in the number of loops.
7870 assert((!Changed || DT->verify(DominatorTree::VerificationLevel::Fast)) &&
7871 "DT not preserved correctly");
7872 assert((!Changed || !verifyFunction(F, &dbgs())) &&
7873 "Invalid IR produced by LoopVectorize");
7874
7875 // Process each loop nest in the function.
7877}
7878
7881 LI = &AM.getResult<LoopAnalysis>(F);
7882 // There are no loops in the function. Return before computing other
7883 // expensive analyses.
7884 if (LI->empty())
7885 return PreservedAnalyses::all();
7894 AA = &AM.getResult<AAManager>(F);
7895
7896 auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
7897 PSI = MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
7898 // CycleInfo cached by an earlier pass is invalidated when the CFG changes.
7899 // Both BlockFrequencyAnalysis and BranchProbabilityAnalysis depend on it, so
7900 // drop the stale result before either is (re-)computed.
7901 auto ClearStaleCycleInfo = [this, &AM, &F] {
7904 };
7905 GetBFI = [&AM, &F, ClearStaleCycleInfo]() -> BlockFrequencyInfo & {
7906 ClearStaleCycleInfo();
7908 };
7909 GetBPI = [&AM, &F, ClearStaleCycleInfo]() -> const BranchProbabilityInfo & {
7910 ClearStaleCycleInfo();
7912 };
7913 LoopVectorizeResult Result = runImpl(F);
7914 if (!Result.MadeAnyChange)
7915 return PreservedAnalyses::all();
7917
7918 if (isAssignmentTrackingEnabled(*F.getParent())) {
7919 for (auto &BB : F)
7921 }
7922
7923 PA.preserve<LoopAnalysis>();
7927
7928 if (Result.MadeCFGChange) {
7929 // Making CFG changes likely means a loop got vectorized. Indicate that
7930 // extra simplification passes should be run.
7931 // TODO: MadeCFGChanges is not a prefect proxy. Extra passes should only
7932 // be run if runtime checks have been added.
7935 } else {
7937 }
7938 return PA;
7939}
7940
7942 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
7943 static_cast<PassInfoMixin<LoopVectorizePass> *>(this)->printPipeline(
7944 OS, MapClassName2PassName);
7945
7946 OS << '<';
7947 OS << (InterleaveOnlyWhenForced ? "" : "no-") << "interleave-forced-only;";
7948 OS << (VectorizeOnlyWhenForced ? "" : "no-") << "vectorize-forced-only;";
7949 OS << '>';
7950}
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 cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
static InstructionCost getCost(Instruction &Inst, TTI::TargetCostKind CostKind, TargetTransformInfo &TTI)
Definition CostModel.cpp:73
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
This file defines the DenseMap class.
#define DEBUG_TYPE
This is the interface for a simple mod/ref and alias analysis over globals.
Hexagon Common GEP
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This defines the Use class.
static bool hasNoUnsignedWrap(BinaryOperator &I)
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static cl::opt< ElementCount, true > VectorizationFactor("force-vector-width", cl::Hidden, cl::desc("Sets the SIMD width. Zero is autoselect."), cl::location(VectorizerParams::VectorizationFactor))
This header provides classes for managing per-loop analyses.
static const char * VerboseDebug
#define LV_NAME
This file defines the LoopVectorizationLegality class.
This file provides a LoopVectorizationPlanner class.
static unsigned getMaxTCFromNonZeroRange(PredicatedScalarEvolution &PSE, Loop *L)
Get the maximum trip count for L from the SCEV unsigned range, excluding zero from the range.
static Type * maybeVectorizeType(Type *Ty, ElementCount VF)
static ElementCount getSmallConstantTripCount(ScalarEvolution *SE, const Loop *L)
A version of ScalarEvolution::getSmallConstantTripCount that returns an ElementCount to include loops...
static void legacyCSE(BasicBlock *BB)
FIXME: This legacy common-subexpression-elimination routine is scheduled for removal,...
static VPIRBasicBlock * replaceVPBBWithIRVPBB(VPBasicBlock *VPBB, BasicBlock *IRBB, VPlan *Plan=nullptr)
Replace VPBB with a VPIRBasicBlock wrapping IRBB.
static Intrinsic::ID getMaskedDivRemIntrinsic(unsigned Opcode)
static DebugLoc getDebugLocFromInstOrOperands(Instruction *I)
Look for a meaningful debug location on the instruction or its operands.
static EpilogueLowering getEpilogueTailLowering(const VectorizeOptions &Opts, const LoopVectorizationCostModel &MainCM, const Loop *L, OptimizationRemarkEmitter *ORE, LoopVectorizationLegality &LVL, const LoopVectorizeHints &Hints, TargetTransformInfo *TTI)
Determine how to lower the epilogue for the vector epilogue loop.
static bool useActiveLaneMaskForControlFlow(TailFoldingStyle Style)
static std::optional< VPExecutionFrequency > getRecordedExecutionFrequency(const VPBasicBlock *VPBB)
Returns the frequency with which VPBB executes, as recorded on its recipes.
static void collectSupportedLoops(const VectorizeOptions &Opts, Loop &L, LoopInfo *LI, OptimizationRemarkEmitter *ORE, SmallVectorImpl< Loop * > &V)
static unsigned estimateElementCount(ElementCount VF, std::optional< unsigned > VScale)
This function attempts to return a value that represents the ElementCount at runtime.
static bool hasVectorLibraryVariantFor(const CallInst &CI, ElementCount VF, bool MaskRequired, const TargetLibraryInfo *TLI)
Returns true iff CI has a library vector variant usable at VF.
static constexpr uint32_t MinItersBypassWeights[]
static void preparePlanForEpilogueVectorLoop(VPlan &MainPlan, VPlan &Plan, Loop *L, const SCEV2ValueTy &ExpandedSCEVs, ElementCount MainLoopVF, unsigned MainLoopUF, ElementCount EpilogueVF, LoopVectorizationPlanner &LVP, VFSelectionContext &Config, ScalarEvolution &SE, const MainPlanResumeMarkers &Markers)
Prepare Plan for vectorizing the epilogue loop.
static Function * getVectorLibraryVariantFor(const CallInst &CI, ElementCount VF, bool MaskRequired, const TargetLibraryInfo *TLI)
Returns the vector library variant function of CI usable at VF, respecting MaskRequired,...
static bool isExplicitVecOuterLoop(const VectorizeOptions &Opts, Loop *OuterLp, OptimizationRemarkEmitter *ORE)
static bool hasForcedEpilogueVF()
static void printOptimizedVPlan(VPlan &)
static bool isIndvarOverflowCheckKnownFalse(const VectorizeOptions &Opts, const LoopVectorizationCostModel *Cost, ElementCount VF, std::optional< unsigned > UF=std::nullopt)
For the given VF and UF and maximum trip count computed for the loop, return whether the induction va...
static const SCEV * getAddressAccessSCEV(Value *Ptr, PredicatedScalarEvolution &PSE, const Loop *TheLoop)
Gets the address access SCEV for Ptr, if it should be used for cost modeling according to isAddressSC...
static void removeScalarResumePhis(VPlan &MainPlan)
Replace the resume phis in MainPlan's scalar preheader by their bypass values.
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
const SmallVectorImpl< MachineOperand > & Cond
SI Fold Operands
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file contains some templates that are useful if you are working with the STL at all.
#define OP(OPC)
Definition Instruction.h:46
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
#define DEBUG_WITH_TYPE(TYPE,...)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
Definition Debug.h:72
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.
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.
std::optional< const HistogramInfo * > getHistogramInfo(Instruction *I) const
Returns a HistogramInfo* for the given instruction if it was determined to be part of a load -> updat...
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 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.
DenseMap< const SCEV *, Value * > executePlan(ElementCount VF, unsigned UF, VPlan &BestPlan, InnerLoopVectorizer &LB, DominatorTree *DT, EpilogueVectorizationKind EpilogueVecKind=EpilogueVectorizationKind::None)
EpilogueVectorizationKind
Generate the IR code for the vectorized loop captured in VPlan BestPlan according to the best selecte...
@ MainLoop
Vectorizing the main loop of epilogue vectorization.
void clearCostModel()
Destroy the cost model.
VPlan & getPlanFor(ElementCount VF) const
Return the VPlan for VF.
Definition VPlan.cpp:1645
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:1696
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:1631
void printPlans(raw_ostream &O)
Definition VPlan.cpp:1800
std::unique_ptr< VPlan > selectBestEpiloguePlan(VPlan &MainPlan, ElementCount MainLoopVF, unsigned IC, bool ScalarEpilogueAllowed)
void plan(ElementCount UserVF, unsigned UserIC)
Build VPlans for the specified UserVF and UserIC if they are non-zero or all applicable candidate VFs...
void addMinimumIterationCheck(VPlan &Plan, ElementCount VF, unsigned UF, ElementCount MinProfitableTripCount) const
Create a check to Plan to see if the vector loop should be executed based on its trip count.
bool hasPlanWithVF(ElementCount VF) const
Look through the existing plans and return true if we have one with vectorization factor VF.
std::pair< VectorizationFactor, VPlan * > computeBestVF()
Compute and return the most profitable vectorization factor and the corresponding best VPlan.
This holds vectorization requirements that must be verified late in the process.
Utility class for getting and setting loop vectorizer hints in the form of loop metadata.
LLVM_ABI bool allowVectorization(Function *F, Loop *L, bool VectorizeOnlyWhenForced) const
LLVM_ABI void emitRemarkWithHints() const
Dumps all the hint information.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Metadata node.
Definition Metadata.h:1081
bool empty() const
Definition MapVector.h:79
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition MapVector.h:126
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
Diagnostic information for optimization analysis remarks related to pointer aliasing.
Diagnostic information for optimization analysis remarks related to floating-point non-commutativity.
Diagnostic information for optimization analysis remarks.
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for missed-optimization remarks.
Diagnostic information for applied optimization remarks.
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
ScalarEvolution * getSE() const
Returns the ScalarEvolution analysis used.
LLVM_ABI const SCEVPredicate & getPredicate() const
LLVM_ABI unsigned getSmallConstantMaxTripCount()
Returns the upper bound of the loop trip count as a normal unsigned value, or 0 if the trip count is ...
LLVM_ABI const SCEV * getBackedgeTakenCount()
Get the (predicated) backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSCEV(Value *V)
Returns the SCEV expression of V, in the context of the current SCEV predicate.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
Type * getRecurrenceType() const
Returns the type of the recurrence.
static bool isFindLastRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static bool isAnyOfRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static LLVM_ABI bool isSubRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is for a sub operation.
bool isSigned() const
Returns true if all source operands of the recurrence are SExtInsts.
static bool isFindIVRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static bool isMinMaxRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is any min/max kind.
Holds information about the memory runtime legality checks to verify that a group of pointers do not ...
std::optional< ArrayRef< PointerDiffInfo > > getDiffChecks() const
const SmallVectorImpl< RuntimePointerCheck > & getChecks() const
Returns the checks that generateChecks created.
This class uses information about analyze scalars to rewrite expressions in canonical form.
ScalarEvolution * getSE()
bool isInsertedInstruction(Instruction *I) const
Return true if the specified instruction was inserted by the code rewriter.
LLVM_ABI Value * expandCodeForPredicate(const SCEVPredicate *Pred, Instruction *Loc)
Generates a code sequence that evaluates this predicate.
LLVM_ABI void eraseDeadInstructions(Value *Root)
Remove inserted instructions that are dead, e.g.
virtual bool isAlwaysTrue() const =0
Returns true if the predicate is always true.
This class represents an analyzed expression in the program.
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
Type * getType() const
Return the LLVM type of this SCEV expression.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI const SCEV * getElementCount(Type *Ty, ElementCount EC, SCEVFlags Flags=SCEV::FlagNone)
LLVM_ABI const SCEV * getURemExpr(SCEVUse LHS, SCEVUse RHS)
Represents an unsigned remainder expression based on unsigned division.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getTripCountFromExitCount(const SCEV *ExitCount)
A version of getTripCountFromExitCount below which always picks an evaluation type which can not resu...
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI void forgetLoop(const Loop *L)
This method should be called by the client when it has changed a loop in a way that may effect Scalar...
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI SCEVUse getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
ConstantRange getUnsignedRange(const SCEV *S)
Determine the unsigned range for a particular SCEV.
LLVM_ABI void forgetValue(Value *V)
This method should be called by the client when it has changed a value in a way that may effect its v...
LLVM_ABI void forgetBlockAndLoopDispositions(Value *V=nullptr)
Called when the client has changed the disposition of values in a loop or block.
const SCEV * getMinusOne(Type *Ty)
Return a SCEV for the constant -1 of a specific type.
LLVM_ABI void forgetLcssaPhiWithNewPredecessor(Loop *L, PHINode *V)
Forget LCSSA phi node V of loop L to which a new predecessor was added, such that it may no longer be...
LLVM_ABI SCEVUse getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
APInt getUnsignedRangeMax(const SCEV *S)
Determine the max of the unsigned range for a particular SCEV.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
This class represents the LLVM 'select' instruction.
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
void insert_range(Range &&R)
Definition SetVector.h:182
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:268
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
Definition SetVector.h:258
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
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
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:4465
RecipeListTy::iterator iterator
Instruction iterators...
Definition VPlan.h:4492
iterator end()
Definition VPlan.h:4502
iterator begin()
Recipe iterator methods.
Definition VPlan.h:4500
iterator_range< iterator > phis()
Returns an iterator range over the PHI-like recipes in the block.
Definition VPlan.h:4553
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:4512
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:4511
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
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:429
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New)
Reassociate all the blocks connected to Old so that they now point to New.
Definition VPlanUtils.h:392
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:422
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)
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:4078
A pure virtual base class for all recipes modeling header phis, including phis for first order recurr...
Definition VPlan.h:2495
virtual VPValue * getBackedgeValue()
Returns the incoming value from the loop backedge.
Definition VPlan.h:2538
void setBackedgeValue(VPValue *V)
Update the incoming value from the loop backedge.
Definition VPlan.h:2541
VPValue * getStartValue()
Returns the start value of the phi, if one is set.
Definition VPlan.h:2527
A recipe representing a sequence of load -> update -> store as part of a histogram operation.
Definition VPlan.h:2206
A special type of VPBasicBlock that wraps an existing IR basic block.
Definition VPlan.h:4618
LLVM_ABI_FOR_TEST FastMathFlags getFastMathFlagsOrNone() const
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1315
iterator_range< operand_iterator > operandsWithoutMask()
Returns an iterator range over the operands excluding the mask operand if present.
Definition VPlan.h:1584
VPInstruction * clone() override
Clone the current recipe.
Definition VPlan.h:1494
@ ResumeForEpilogue
Explicit user for values in the main VPlan, used by the epilogue vector loop.
Definition VPlan.h:1424
@ ReductionStartVector
Start vector for reductions with 3 operands: the original start value, the identity value for the red...
Definition VPlan.h:1416
@ ComputeReductionResult
Reduce the operands to the final reduction result using the operation specified via the operation's V...
Definition VPlan.h:1374
unsigned getOpcode() const
Definition VPlan.h:1507
VPValue * getMask() const
Returns the mask for the VPInstruction.
Definition VPlan.h:1580
VPInterleaveRecipe is a recipe for transforming an interleave group of load or stores into one wide l...
Definition VPlan.h:3188
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:2898
bool isOrdered() const
Returns true, if the phi is part of an ordered reduction.
Definition VPlan.h:2970
bool hasUsesOutsideReductionChain() const
Returns true, if the phi is part of a multi-use reduction.
Definition VPlan.h:2979
bool isInLoop() const
Returns true if the phi is part of an in-loop reduction.
Definition VPlan.h:2973
VPReductionPHIRecipe * cloneWithOperands(VPValue *Start, VPValue *BackedgeValue)
Definition VPlan.h:2934
RecurKind getRecurrenceKind() const
Returns the recurrence kind of the reduction.
Definition VPlan.h:2967
A recipe to represent inloop, ordered or partial reduction operations.
Definition VPlan.h:3281
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
Definition VPlan.h:4690
const VPBlockBase * getEntry() const
Definition VPlan.h:4734
void clearCanonicalIVNUW(VPInstruction *Increment)
Unsets NUW for the canonical IV increment Increment, for loop regions.
Definition VPlan.h:4857
VPRegionValue * getCanonicalIV()
Return the canonical induction variable of the region, null for replicating regions.
Definition VPlan.h:4810
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
Definition VPlan.h:3448
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:1464
void replaceAllUsesWith(VPValue *New)
Definition VPlan.cpp:1458
VPWidenCastRecipe is a recipe to create vector cast instructions.
Definition VPlan.h:1907
A recipe for handling GEP instructions.
Definition VPlan.h:2265
VPWidenRecipe is a recipe for producing a widened instruction using the opcode and operands of the re...
Definition VPlan.h:1840
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4877
bool hasVF(ElementCount VF) const
Definition VPlan.h:5113
ElementCount getSingleVF() const
Returns the single VF of the plan, asserting that the plan has exactly one VF.
Definition VPlan.h:5126
VPBasicBlock * getEntry()
Definition VPlan.h:4973
VPValue * getTripCount() const
The trip count of the original loop.
Definition VPlan.h:5045
VPSymbolicValue & getVFxUF()
Returns VF * UF of the vector loop region.
Definition VPlan.h:5085
bool hasUF(unsigned UF) const
Definition VPlan.h:5138
ArrayRef< VPIRBasicBlock * > getExitBlocks() const
Return an ArrayRef containing VPIRBasicBlocks wrapping the exit blocks of the original scalar loop.
Definition VPlan.h:5039
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:5163
VPIRValue * getZero(Type *Ty)
Return a VPIRValue wrapping the null value of type Ty.
Definition VPlan.h:5189
LLVM_ABI_FOR_TEST VPRegionBlock * getVectorLoopRegion()
Returns the VPRegionBlock of the vector loop.
Definition VPlan.cpp:1030
bool hasEarlyExit() const
Returns true if the VPlan is based on a loop with an early exit.
Definition VPlan.h:5296
InstructionCost cost(ElementCount VF, VPCostContext &Ctx)
Return the cost of this plan.
Definition VPlan.cpp:1012
LLVM_ABI_FOR_TEST bool isOuterLoop() const
Returns true if this VPlan is for an outer loop, i.e., its vector loop region contains a nested loop ...
Definition VPlan.cpp:1060
VPBasicBlock * getMiddleBlock()
Returns the 'middle' block of the plan, that is the block that selects whether to execute the scalar ...
Definition VPlan.h:5015
VPBasicBlock * getVectorPreheader() const
Returns the preheader of the vector loop region, if one exists, or null otherwise.
Definition VPlan.h:4978
bool requiresScalarEpilogue() const
Returns true if the plan requires a scalar epilogue after the vector loop.
Definition VPlan.h:5001
VPSymbolicValue & getUF()
Returns the UF of the vector loop region.
Definition VPlan.h:5082
bool hasScalarVFOnly() const
Definition VPlan.h:5131
VPBasicBlock * getScalarPreheader() const
Return the VPBasicBlock for the preheader of the scalar loop.
Definition VPlan.h:5029
void execute(VPTransformState *State)
Generate the IR code for this VPlan.
Definition VPlan.cpp:905
bool hasTailFolded() const
Returns true if the vector loop region is tail-folded.
Definition VPlan.h:4994
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
Definition VPlan.h:5035
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:1201
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
Changed
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
void reportVectorizationFailure(const StringRef DebugMsg, const StringRef OREMsg, const StringRef ORETag, OptimizationRemarkEmitter *ORE, const Loop *TheLoop, Instruction *I=nullptr)
Reports a vectorization failure: print DebugMsg for debugging purposes along with the corresponding o...
void reportVectorizationInfo(const StringRef Msg, const StringRef ORETag, OptimizationRemarkEmitter *ORE, const Loop *TheLoop, Instruction *I=nullptr, DebugLoc DL={})
Reports an informative message: print Msg for debugging purposes as well as an optimization remark.
void reportVectorization(OptimizationRemarkEmitter *ORE, Loop *TheLoop, ElementCount VFWidth, unsigned IC)
Report successful vectorization of the loop.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
OneOps_match< OpTy, Instruction::Freeze > m_Freeze(const OpTy &Op)
Matches FreezeInst.
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
bind_cst_ty m_scev_APInt(const APInt *&C)
Match an SCEV constant and bind it to an APInt.
match_bind< const SCEVMulExpr > m_scev_Mul(const SCEVMulExpr *&V)
bool match(const SCEV *S, const Pattern &P)
SCEVBinaryExpr_match< SCEVMulExpr, Op0_t, Op1_t, SCEV::FlagNone, true > m_scev_c_Mul(const Op0_t &Op0, const Op1_t &Op1)
bool matchFindIVResult(VPInstruction *VPI, Op0_t ReducedIV, Op1_t Start)
Match FindIV result pattern: select(icmp ne ComputeReductionResult(ReducedIV), Sentinel),...
VPInstruction_match< VPInstruction::ExtractLastLane, Op0_t > m_ExtractLastLane(const Op0_t &Op0)
VPInstruction_match< VPInstruction::BranchOnCount > m_BranchOnCount()
auto m_VPValue()
Match an arbitrary VPValue and ignore it.
VPInstruction_match< VPInstruction::ExtractLastPart, Op0_t > m_ExtractLastPart(const Op0_t &Op0)
VPRecipeBase * findUserOf(VPValue *V, const MatchT &P)
If V is used by a recipe matching pattern P, return it.
bool match(Val *V, const Pattern &P)
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:150
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.
auto cast_if_present(const Y &Val)
cast_if_present<X> - Functionally identical to cast, except that a null value is accepted.
Definition Casting.h:683
LLVM_ABI bool RemoveRedundantDbgInstrs(BasicBlock *BB)
Try to remove redundant dbg.value instructions from given basic block.
LLVM_ABI std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Return either:
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
unsigned getLoadStoreAddressSpace(const Value *I)
A helper function that returns the address space of the pointer operand of load or store instruction.
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.
RecurKind
These are the kinds of recurrences that we support.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
LLVM_ABI Value * getRecurrenceIdentity(RecurKind K, Type *Tp, FastMathFlags FMF)
Given information about an recurrence kind, return the identity for the @llvm.vector....
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the specified block at the specified instruction.
constexpr T AbsoluteDifference(U X, V Y)
Subtract two unsigned integers, X and Y, of type T and return the absolute value of the result.
Definition MathExtras.h:595
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
ArrayRef(const T &OneElt) -> ArrayRef< T >
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
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2182
@ 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
bool SCEVExprContains(const SCEV *Root, PredTy Pred)
Return true if any node in Root satisfies the predicate Pred.
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...
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:1102
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:3865
A recipe for widening store operations, using the stored value, the address to store to and an option...
Definition VPlan.h:3970
static void simplifyLiveInsWithSCEV(VPlan &Plan, PredicatedScalarEvolution &PSE)
Check Plan's live-ins and replace them with constants, if they can be simplified via SCEV.
static void addMinimumVectorEpilogueIterationCheck(VPlan &Plan, VPValue *MainVectorTripCount, bool RequiresScalarEpilogue, ElementCount EpilogueVF, unsigned MainLoopStep, unsigned EpilogueLoopStep, ScalarEvolution &SE)
Add a check to Plan to see if the epilogue vector loop should be executed.
static bool makeCallWideningDecisions(VPlan &Plan, VFRange &Range, VPRecipeBuilder &RecipeBuilder, VPCostContext &CostCtx)
Convert call VPInstructions in Plan into widened call, vector intrinsic or replicate recipes based on...
static void expandSCEVsToVPInstructions(VPlan &Plan, ScalarEvolution &SE)
Expand VPExpandSCEVRecipes in Plan's entry block to VPInstructions.
static void materializeBroadcasts(VPlan &Plan)
Add explicit broadcasts for live-ins and VPValues defined in Plan's entry block if they are used as v...
static void createInterleaveGroups(VPlan &Plan, const SmallPtrSetImpl< const InterleaveGroup< Instruction > * > &InterleaveGroups, const bool &EpilogueAllowed)
static LLVM_ABI_FOR_TEST bool handleUncountableEarlyExits(VPlan &Plan, OptimizationRemarkEmitter *ORE, Loop *TheLoop, PredicatedScalarEvolution &PSE, DominatorTree &DT, AssumptionCache *AC, UncountableExitStyle Style)
Update Plan to account for uncountable early exits by introducing appropriate branching logic in the ...
static bool simplifyKnownEVL(VPlan &Plan, ElementCount VF, PredicatedScalarEvolution &PSE)
Try to simplify VPInstruction::ExplicitVectorLength recipes when the AVL is known to be <= VF,...
static void introduceMasksAndLinearize(VPlan &Plan)
Predicate and linearize the control-flow in the only loop region of Plan.
static void materializeFactors(VPlan &Plan, VPBasicBlock *VectorPH, ElementCount VF)
Materialize UF, VF and VFxUF to be computed explicitly using VPInstructions.
static void foldTailByMasking(VPlan &Plan)
Adapts the vector loop region for tail folding by introducing a header mask and conditionally executi...
static void materializeBackedgeTakenCount(VPlan &Plan, VPBasicBlock *VectorPH)
Materialize the backedge-taken count to be computed explicitly using VPInstructions.
static LLVM_ABI_FOR_TEST bool tryToConvertVPInstructionsToVPRecipes(VPlan &Plan, const TargetLibraryInfo &TLI, PredicatedScalarEvolution &PSE, Loop *OuterLoop)
Replaces the VPInstructions in Plan with corresponding widen recipes.
static bool handleMultiUseReductions(VPlan &Plan, OptimizationRemarkEmitter *ORE, Loop *TheLoop)
Try to legalize reductions with multiple in-loop uses.
static void convertToVariableLengthStep(VPlan &Plan)
Transform loops with variable-length stepping after region dissolution.
static void materializeHeaderMask(VPlan &Plan, bool UseActiveLaneMask, bool UseActiveLaneMaskForControlFlow)
Materialize the abstract header mask of the loop region into concrete recipes: an active-lane-mask if...
static void recordExecutionFrequencies(VPlan &Plan)
Add execution frequencies to each recipe in the loop body of Plan.
static void attachMemoryChecks(VPlan &Plan, const RuntimePointerChecking &RtPtrChecking, ScalarEvolution &SE, ElementCount VF, unsigned UF, DebugLoc DL, bool AddBranchWeights)
Generate the memory runtime checks of RtPtrChecking as recipes and attach the check block to 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 LLVM_ABI_FOR_TEST void addMiddleCheck(VPlan &Plan)
If a check is needed to guard executing the scalar epilogue loop, it will be added to the middle bloc...
static void narrowInductionTruncates(VPlan &Plan, VFRange &Range, const TargetTransformInfo &TTI, PredicatedScalarEvolution &PSE)
Replace truncates of a wide induction, or of that induction's increment, by a VPWidenIntOrFpInduction...
static void expandBranchOnTwoConds(VPlan &Plan)
Expand BranchOnTwoConds instructions into explicit CFG with BranchOnCond instructions.
static void materializeVectorTripCount(VPlan &Plan, VPBasicBlock *VectorPHVPBB, bool TailByMasking, bool RequiresScalarEpilogue, VPValue *Step, std::optional< uint64_t > MaxRuntimeStep=std::nullopt)
Materialize vector trip count computations to a set of VPInstructions.
static void hoistPredicatedLoads(VPlan &Plan, PredicatedScalarEvolution &PSE, const Loop *L)
Hoist predicated loads from the same address to the loop entry block, if they are guaranteed to execu...
static void attachAliasMaskToHeaderMask(VPlan &Plan)
Attaches the alias-mask to the existing header-mask.
static void removeRedundantExpandSCEVRecipes(VPlan &Plan)
Replace each VPExpandSCEVRecipe in Plan's entry block with an earlier VPExpandSCEVRecipe there expand...
static void optimizeFindIVReductions(VPlan &Plan, PredicatedScalarEvolution &PSE, Loop &L)
Optimize FindLast reductions selecting IVs (or expressions of IVs) by converting them to FindIV reduc...
static void convertToAbstractRecipes(VPlan &Plan, VPCostContext &Ctx, VFRange &Range)
This function converts initial recipes to the abstract recipes and clamps Range based on cost model f...
static void materializeConstantVectorTripCount(VPlan &Plan, ElementCount BestVF, unsigned BestUF, PredicatedScalarEvolution &PSE)
static void makeScalarizationDecisions(VPlan &Plan, VFRange &Range)
Make VPlan-based scalarization decision prior to delegating to the ones made by the legacy CM.
static void replaceWideCanonicalIVWithWideIV(VPlan &Plan, ScalarEvolution &SE, const TargetTransformInfo &TTI, TargetTransformInfo::TargetCostKind CostKind, ElementCount VF, unsigned UF)
Replace a VPWidenCanonicalIVRecipe if it is present in Plan, with a VPWidenIntOrFpInductionRecipe,...
static LLVM_ABI_FOR_TEST std::unique_ptr< VPlan > buildVPlan0(Loop *TheLoop, LoopInfo &LI, Type *InductionTy, PredicatedScalarEvolution &PSE, LoopVersioning *LVer=nullptr, function_ref< const BranchProbabilityInfo &()> GetBPI=nullptr)
Create a base VPlan0, serving as the common starting point for all later candidates.
static void optimizeInductionLiveOutUsers(VPlan &Plan, PredicatedScalarEvolution &PSE, const Loop *L)
If there's a single exit block, optimize its phi recipes that use exiting IV values by feeding them p...
static void addExplicitVectorLength(VPlan &Plan, const std::optional< unsigned > &MaxEVLSafeElements)
Add a VPCurrentIterationPHIRecipe and related recipes to Plan and replaces all uses of the canonical ...
static void adjustFirstOrderRecurrenceMiddleUsers(VPlan &Plan, VFRange &Range)
Adjust first-order recurrence users in the middle block: create penultimate element extracts for LCSS...
static void optimizeEVLMasks(VPlan &Plan)
Optimize recipes which use an EVL-based header mask to VP intrinsics, for example:
static bool handleMaxMinNumReductions(VPlan &Plan)
Check if Plan contains any FMaxNum or FMinNum reductions.
static void removeDeadRecipes(VPlan &Plan)
Remove dead recipes from Plan.
static void attachCheckBlock(VPlan &Plan, Value *Cond, BasicBlock *CheckBlock, bool AddBranchWeights)
static LLVM_ABI_FOR_TEST void handleCountableEarlyExits(VPlan &Plan)
Disconnect countable early exits from the loop.
static VPIRBasicBlock * modelGeneratedMainLoopBlocks(VPlan &EpiPlan, VPlan &MainPlan)
Model the blocks the executed MainPlan generated for the main vector loop in EpiPlan during epilogue ...
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 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