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