LLVM 24.0.0git
VPlan.cpp
Go to the documentation of this file.
1//===- VPlan.cpp - Vectorizer Plan ----------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This is the LLVM vectorization plan. It represents a candidate for
11/// vectorization, allowing to plan and optimize how to vectorize a given loop
12/// before generating LLVM-IR.
13/// The vectorizer uses vectorization plans to estimate the costs of potential
14/// candidates and if profitable to execute the desired plan, generating vector
15/// LLVM-IR code.
16///
17//===----------------------------------------------------------------------===//
18
19#include "VPlan.h"
21#include "VPlanCFG.h"
22#include "VPlanDominatorTree.h"
23#include "VPlanHelpers.h"
24#include "VPlanPatternMatch.h"
25#include "VPlanTransforms.h"
26#include "VPlanUtils.h"
27#include "VectorizeOptions.h"
29#include "llvm/ADT/STLExtras.h"
32#include "llvm/ADT/Twine.h"
36#include "llvm/IR/BasicBlock.h"
37#include "llvm/IR/CFG.h"
38#include "llvm/IR/IRBuilder.h"
39#include "llvm/IR/Instruction.h"
41#include "llvm/IR/Type.h"
42#include "llvm/IR/Value.h"
45#include "llvm/Support/Debug.h"
51#include <cassert>
52#include <string>
53
54using namespace llvm;
55using namespace llvm::VPlanPatternMatch;
56
57namespace llvm {
59} // namespace llvm
60
61/// @{
62/// Metadata attribute names
63const char LLVMLoopVectorizeFollowupAll[] = "llvm.loop.vectorize.followup_all";
65 "llvm.loop.vectorize.followup_vectorized";
67 "llvm.loop.vectorize.followup_epilogue";
68/// @}
69
70#define DEBUG_TYPE "loop-vectorize"
71
72#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
74 const VPBasicBlock *Parent = R.getParent();
75 VPSlotTracker SlotTracker(Parent ? Parent->getPlan() : nullptr);
76 R.print(OS, "", SlotTracker);
77 return OS;
78}
79#endif
80
82 const ElementCount &VF) const {
83 switch (LaneKind) {
85 // Lane = RuntimeVF - VF.getKnownMinValue() + Lane
86 return Builder.CreateSub(getRuntimeVF(Builder, Builder.getInt32Ty(), VF),
87 Builder.getInt32(VF.getKnownMinValue() - Lane));
89 return Builder.getInt64(Lane);
90 }
91 llvm_unreachable("Unknown lane kind");
92}
93
94#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
96 if (const VPRecipeBase *R = getDefiningRecipe())
97 R->print(OS, "", SlotTracker);
98 else
100}
101
102void VPValue::dump() const {
103 const VPRecipeBase *Instr = getDefiningRecipe();
105 (Instr && Instr->getParent()) ? Instr->getParent()->getPlan() : nullptr);
107 dbgs() << "\n";
108}
109
110void VPRecipeBase::dump() const {
111 VPSlotTracker SlotTracker(getParent() ? getParent()->getPlan() : nullptr);
112 print(dbgs(), "", SlotTracker);
113 dbgs() << "\n";
114}
115#endif
116
117#if !defined(NDEBUG)
118bool VPRecipeValue::isDefinedBy(const VPDef *D) const {
119 return getDefiningRecipe() == D;
120}
121#endif
122
124 auto *RecipeValue = dyn_cast<VPRecipeValue>(this);
125 if (!RecipeValue)
126 return nullptr;
127 if (auto *MultiDef = dyn_cast<VPMultiDefValue>(RecipeValue))
128 return MultiDef->getDef();
129 return static_cast<VPSingleDefRecipe *>(RecipeValue);
130}
131
133 return const_cast<VPValue *>(this)->getDefiningRecipe();
134}
135
137 return cast<VPIRValue>(this)->getValue();
138}
139
141
143 switch (getVPValueID()) {
144 case VPVIRValueSC:
145 return cast<VPIRValue>(this)->getType();
146 case VPRegionValueSC:
147 return cast<VPRegionValue>(this)->getType();
148 case VPVSymbolicSC:
149 return cast<VPSymbolicValue>(this)->getType();
152 return cast<VPRecipeValue>(this)->getScalarType();
153 }
154 llvm_unreachable("Unhandled VPValue subclass");
155}
156
158 assert(Users.empty() &&
159 "trying to delete a VPRecipeValue with remaining users");
160}
161
164 assert(Def && "VPSingleDefValue requires a defining recipe");
165 Def->addDefinedValue(this);
166}
167
169 getDefiningRecipe()->removeDefinedValue(this);
170}
171
173 : VPRecipeValue(VPVMultiDefValueSC, UV, Ty), Def(Def) {
174 assert(Def && "VPMultiDefValue requires a defining recipe");
175 Def->addDefinedValue(this);
176}
177
179 getDefiningRecipe()->removeDefinedValue(this);
180}
181
182/// \return the VPBasicBlock that is the entry of Block, possibly indirectly.
189
196
197/// \return the VPBasicBlock that is the exit of Block, possibly indirectly.
199 const VPBlockBase *Block = this;
201 Block = Region->getExiting();
203}
204
211
213 if (!Successors.empty() || !Parent)
214 return this;
215 assert(Parent->getExiting() == this &&
216 "Block w/o successors not the exiting block of its parent.");
217 return Parent->getEnclosingBlockWithSuccessors();
218}
219
221 if (!Predecessors.empty() || !Parent)
222 return this;
223 assert(Parent->getEntry() == this &&
224 "Block w/o predecessors not the entry of its parent.");
225 return Parent->getEnclosingBlockWithPredecessors();
226}
227
229 iterator It = begin();
230 while (It != end() && It->isPhi())
231 It++;
232 return It;
233}
234
242
243Value *VPTransformState::get(const VPValue *Def, const VPLane &Lane) {
245 "VPRegionValue must be materialized before VPTransformState::get");
247 return Def->getUnderlyingValue();
248
249 if (hasScalarValue(Def, Lane))
250 return Data.VPV2Scalars[Def][Lane.mapToCacheIndex(VF)];
251
252 if (!Lane.isFirstLane() && vputils::isSingleScalar(Def) &&
254 return Data.VPV2Scalars[Def][0];
255 }
256
258 auto *VecPart = Data.VPV2Vector[Def];
259 if (!VecPart->getType()->isVectorTy()) {
260 assert(Lane.isFirstLane() && "cannot get lane > 0 for scalar");
261 return VecPart;
262 }
263 // TODO: Cache created scalar values.
264 Value *LaneV = Lane.getAsRuntimeExpr(Builder, VF);
265 auto *Extract = Builder.CreateExtractElement(VecPart, LaneV);
266 // set(Def, Extract, Instance);
267 return Extract;
268}
269
270Value *VPTransformState::get(const VPValue *Def, bool NeedsSingleScalar) {
272 "VPRegionValue must be materialized before VPTransformState::get");
273 if (NeedsSingleScalar) {
274 assert((VF.isScalar() || isa<VPIRValue, VPSymbolicValue>(Def) ||
276 (hasScalarValue(Def, VPLane(0)) &&
277 Data.VPV2Scalars[Def].size() == 1)) &&
278 "Trying to access a single scalar per part but has multiple scalars "
279 "per part.");
280 return get(Def, VPLane(0));
281 }
282
283 // If Values have been set for this Def return the one relevant for \p Part.
284 if (hasVectorValue(Def))
285 return Data.VPV2Vector[Def];
286
287 auto GetBroadcastInstrs = [this](Value *V) {
288 if (VF.isScalar())
289 return V;
290 // Broadcast the scalar into all locations in the vector.
291 Value *Shuf = Builder.CreateVectorSplat(VF, V, "broadcast");
292 return Shuf;
293 };
294
295 Value *ScalarValue = get(Def, VPLane(0));
298 if (auto *LastInst = dyn_cast<Instruction>(get(Def, LastLane)))
299 // Set the insert point after the last scalarized instruction. This
300 // ensures the insertelement sequence will directly follow the scalar
301 // definitions.
302 if (auto InsertPt = LastInst->getInsertionPointAfterDef())
303 Builder.SetInsertPoint(*InsertPt);
304 Value *VectorValue = GetBroadcastInstrs(ScalarValue);
305 set(Def, VectorValue);
306 return VectorValue;
307}
308
310 const DILocation *DIL = DL;
311 // When a FSDiscriminator is enabled, we don't need to add the multiply
312 // factors to the discriminators.
313 if (DIL &&
314 Builder.GetInsertBlock()
315 ->getParent()
316 ->shouldEmitDebugInfoForProfiling() &&
318 // FIXME: For scalable vectors, assume vscale=1.
319 unsigned UF = Plan->getConcreteUF();
320 auto NewDIL =
321 DIL->cloneByMultiplyingDuplicationFactor(UF * VF.getKnownMinValue());
322 if (NewDIL)
323 Builder.SetCurrentDebugLocation(*NewDIL);
324 else
325 LLVM_DEBUG(dbgs() << "Failed to create new discriminator: "
326 << DIL->getFilename() << " Line: " << DIL->getLine());
327 } else
328 Builder.SetCurrentDebugLocation(DL);
329}
330
332 for (VPBlockBase *VPB : vp_depth_first_shallow(Plan->getEntry())) {
333 if (!VPBlockUtils::isHeader(VPB, VPDT))
334 continue;
335 auto *Header = cast<VPBasicBlock>(VPB);
336 auto *LatchVPBB = cast<VPBasicBlock>(Header->getPredecessors()[1]);
337 BasicBlock *VectorLatchBB = CFG.VPBB2IRBB[LatchVPBB];
338
339 for (VPRecipeBase &R : Header->phis()) {
340 auto *PhiR = cast<VPSingleDefRecipe>(&R);
341 bool NeedsSingleScalar =
344 cast<VPReductionPHIRecipe>(PhiR)->isInLoop());
345
346 Value *Phi = get(PhiR, NeedsSingleScalar);
347 Value *Val = get(PhiR->getOperand(1), NeedsSingleScalar);
348 cast<PHINode>(Phi)->addIncoming(Val, VectorLatchBB);
349 }
350 }
351}
352
353BasicBlock *VPBasicBlock::createEmptyBasicBlock(VPTransformState &State) {
354 auto &CFG = State.CFG;
355 // BB stands for IR BasicBlocks. VPBB stands for VPlan VPBasicBlocks.
356 // Pred stands for Predessor. Prev stands for Previous - last visited/created.
357 BasicBlock *PrevBB = CFG.PrevBB;
358 BasicBlock *NewBB = BasicBlock::Create(PrevBB->getContext(), getName(),
359 PrevBB->getParent(), CFG.ExitBB);
360 LLVM_DEBUG(dbgs() << "LV: created " << NewBB->getName() << '\n');
361
362 return NewBB;
363}
364
366 auto &CFG = State.CFG;
367 BasicBlock *NewBB = CFG.VPBB2IRBB[this];
368
369 // Register NewBB in its loop. In innermost loops its the same for all
370 // BB's.
371 Loop *ParentLoop = State.CurrentParentLoop;
372 // If this block has a sole successor that is an exit block or is an exit
373 // block itself then it needs adding to the same parent loop as the exit
374 // block.
375 VPBlockBase *SuccOrExitVPB = getSingleSuccessor();
376 SuccOrExitVPB = SuccOrExitVPB ? SuccOrExitVPB : this;
377 if (State.Plan->isExitBlock(SuccOrExitVPB)) {
378 ParentLoop = State.LI->getLoopFor(
379 cast<VPIRBasicBlock>(SuccOrExitVPB)->getIRBasicBlock());
380 }
381
382 if (ParentLoop && !State.LI->getLoopFor(NewBB))
383 ParentLoop->addBasicBlockToLoop(NewBB, *State.LI);
384
386 if (VPBlockUtils::isHeader(this, State.VPDT)) {
387 // There's no block for the latch yet, connect to the preheader only.
388 Preds = {getPredecessors()[0]};
389 } else {
390 Preds = to_vector(getPredecessors());
391 }
392
393 // Hook up the new basic block to its predecessors.
394 for (VPBlockBase *PredVPBlock : Preds) {
395 VPBasicBlock *PredVPBB = PredVPBlock->getExitingBasicBlock();
396 auto &PredVPSuccessors = PredVPBB->getHierarchicalSuccessors();
397 assert(CFG.VPBB2IRBB.contains(PredVPBB) &&
398 "Predecessor basic-block not found building successor.");
399 BasicBlock *PredBB = CFG.VPBB2IRBB[PredVPBB];
400 auto *PredBBTerminator = PredBB->getTerminator();
401 LLVM_DEBUG(dbgs() << "LV: draw edge from " << PredBB->getName() << '\n');
402
403 if (isa<UnreachableInst>(PredBBTerminator)) {
404 assert(PredVPSuccessors.size() == 1 &&
405 "Predecessor ending w/o branch must have single successor.");
406 DebugLoc DL = PredBBTerminator->getDebugLoc();
407 PredBBTerminator->eraseFromParent();
408 auto *Br = UncondBrInst::Create(NewBB, PredBB);
409 Br->setDebugLoc(DL);
410 } else if (auto *UBI = dyn_cast<UncondBrInst>(PredBBTerminator)) {
411 UBI->setSuccessor(NewBB);
412 } else {
413 // Set each forward successor here when it is created, excluding
414 // backedges. A backward successor is set when the branch is created.
415 // Generated successors are redirected, as for the entry block and for
416 // blocks bypassing a vector loop during epilogue vectorization. Edges
417 // already present in the generated IR need no update; this happens during
418 // epilogue vectorization, where the plan models blocks generated for the
419 // main vector loop.
420 // TODO: Remove the exception by modeling those terminators using
421 // BranchOnCond.
422 auto *TermBr = cast<CondBrInst>(PredBBTerminator);
423 if (TermBr->getSuccessor(0) != NewBB &&
424 TermBr->getSuccessor(1) != NewBB) {
425 unsigned Idx = PredVPSuccessors.front() == this ? 0 : 1;
426 BasicBlock *ReplacedSucc = TermBr->getSuccessor(Idx);
427 assert(
428 (!ReplacedSucc || isa<VPIRBasicBlock>(PredVPBB)) &&
429 "only VPIRBasicBlock predecessors may have an existing successor "
430 "redirected");
431 if (ReplacedSucc)
432 ReplacedSucc->removePredecessor(PredBB, /*KeepOneInputPHIs=*/true);
433 TermBr->setSuccessor(Idx, NewBB);
434 if (ReplacedSucc)
435 CFG.DTU.applyUpdates({{DominatorTree::Delete, PredBB, ReplacedSucc}});
436 }
437 }
438 CFG.DTU.applyUpdates({{DominatorTree::Insert, PredBB, NewBB}});
439 }
440}
441
444 "VPIRBasicBlock can have at most two successors at the moment!");
445 // Move completely disconnected blocks to their final position.
446 if (IRBB->hasNPredecessors(0) && succ_begin(IRBB) == succ_end(IRBB))
447 IRBB->moveAfter(State->CFG.PrevBB);
448 State->Builder.SetInsertPoint(IRBB->getTerminator());
449 State->CFG.PrevBB = IRBB;
450 State->CFG.VPBB2IRBB[this] = IRBB;
451 executeRecipes(State, IRBB);
452 // Create a branch instruction to terminate IRBB if one was not created yet
453 // and is needed.
454 if (getSingleSuccessor() && isa<UnreachableInst>(IRBB->getTerminator())) {
455 auto *Br = State->Builder.CreateBr(IRBB);
456 Br->setOperand(0, nullptr);
457 IRBB->getTerminator()->eraseFromParent();
458 } else {
459 assert((getNumSuccessors() == 0 ||
460 isa<UncondBrInst, CondBrInst>(IRBB->getTerminator())) &&
461 "other blocks must be terminated by a branch");
462 }
463
464 connectToPredecessors(*State);
465}
466
467VPIRBasicBlock *VPIRBasicBlock::clone() {
468 auto *NewBlock = getPlan()->createEmptyVPIRBasicBlock(IRBB);
469 for (VPRecipeBase &R : Recipes)
470 NewBlock->appendRecipe(R.clone());
471 return NewBlock;
472}
473
475 if (VPBlockUtils::isHeader(this, State->VPDT)) {
476 // Create and register the new vector loop.
477 Loop *PrevParentLoop = State->CurrentParentLoop;
478 State->CurrentParentLoop = State->LI->AllocateLoop();
479
480 // Insert the new loop into the loop nest and register the new basic blocks
481 // before calling any utilities such as SCEV that require valid LoopInfo.
482 if (PrevParentLoop)
483 PrevParentLoop->addChildLoop(State->CurrentParentLoop);
484 else
485 State->LI->addTopLevelLoop(State->CurrentParentLoop);
486 }
487
488 // 1. Create an IR basic block.
489 BasicBlock *NewBB = createEmptyBasicBlock(*State);
490
491 State->Builder.SetInsertPoint(NewBB);
492 // Temporarily terminate with unreachable until CFG is rewired.
493 UnreachableInst *Terminator = State->Builder.CreateUnreachable();
494 State->Builder.SetInsertPoint(Terminator);
495
496 State->CFG.PrevBB = NewBB;
497 State->CFG.VPBB2IRBB[this] = NewBB;
498 connectToPredecessors(*State);
499
500 // 2. Fill the IR basic block with IR instructions.
501 executeRecipes(State, NewBB);
502
503 // If this block is a latch, update CurrentParentLoop.
504 if (VPBlockUtils::isLatch(this, State->VPDT))
505 State->CurrentParentLoop = State->CurrentParentLoop->getParentLoop();
506}
507
508VPBasicBlock *VPBasicBlock::clone() {
509 auto *NewBlock = getPlan()->createVPBasicBlock(getName());
510 for (VPRecipeBase &R : *this)
511 NewBlock->appendRecipe(R.clone());
512 return NewBlock;
513}
514
516 LLVM_DEBUG(dbgs() << "LV: vectorizing VPBB: " << getName()
517 << " in BB: " << BB->getName() << '\n');
518
519 State->CFG.PrevVPBB = this;
520
521 for (VPRecipeBase &Recipe : Recipes) {
522 State->setDebugLocFrom(Recipe.getDebugLoc());
523 Recipe.execute(*State);
524 }
525
526 LLVM_DEBUG(dbgs() << "LV: filled BB: " << *BB);
527}
528
529VPBasicBlock *VPBasicBlock::splitAt(iterator SplitAt) {
530 assert((SplitAt == end() || SplitAt->getParent() == this) &&
531 "can only split at a position in the same block");
532
533 // Create new empty block after the block to split.
534 auto *SplitBlock = getPlan()->createVPBasicBlock(getName() + ".split");
536
537 // If this is the exiting block, make the split the new exiting block.
538 auto *ParentRegion = getParent();
539 if (ParentRegion && ParentRegion->getExiting() == this)
540 ParentRegion->setExiting(SplitBlock);
541
542 // Finally, move the recipes starting at SplitAt to new block.
543 for (VPRecipeBase &ToMove :
544 make_early_inc_range(make_range(SplitAt, this->end())))
545 ToMove.moveBefore(SplitBlock->end());
546
547 return SplitBlock;
548}
549
550/// Return the enclosing loop region for region \p P. The templated version is
551/// used to support both const and non-const block arguments.
552template <typename T> static T *getEnclosingLoopRegionForRegion(T *P) {
553 if (P && P->isReplicator()) {
554 P = P->getParent();
555 // Multiple loop regions can be nested, but replicate regions can only be
556 // nested inside a loop region or must be outside any other region.
557 assert((!P || !P->isReplicator()) && "unexpected nested replicate regions");
558 }
559 return P;
560}
561
565
569
570static bool hasConditionalTerminator(const VPBasicBlock *VPBB) {
571 if (VPBB->empty()) {
572 assert(
573 VPBB->getNumSuccessors() < 2 &&
574 "block with multiple successors doesn't have a recipe as terminator");
575 return false;
576 }
577
578 const VPRecipeBase *R = &VPBB->back();
579 [[maybe_unused]] bool IsSwitch =
581 cast<VPInstruction>(R)->getOpcode() == Instruction::Switch;
582 [[maybe_unused]] bool IsBranchOnTwoConds = match(R, m_BranchOnTwoConds());
583 [[maybe_unused]] bool IsCondBranch =
586 if (VPBB->getNumSuccessors() == 2 ||
587 (VPBB->isExiting() && !VPBB->getParent()->isReplicator())) {
588 assert((IsCondBranch || IsSwitch || IsBranchOnTwoConds) &&
589 "block with multiple successors not terminated by "
590 "conditional branch nor switch recipe");
591
592 return true;
593 }
594
595 if (VPBB->getNumSuccessors() > 2) {
596 assert((IsSwitch || IsBranchOnTwoConds) &&
597 "block with more than 2 successors not terminated by a switch or "
598 "branch-on-two-conds recipe");
599 return true;
600 }
601
602 assert(
603 !IsCondBranch && !IsBranchOnTwoConds &&
604 "block with 0 or 1 successors terminated by conditional branch recipe");
605 return false;
606}
607
609 if (hasConditionalTerminator(this))
610 return &back();
611 return nullptr;
612}
613
615 if (hasConditionalTerminator(this))
616 return &back();
617 return nullptr;
618}
619
621 return getParent() && getParent()->getExitingBasicBlock() == this;
622}
623
624#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
629
630void VPBlockBase::printSuccessors(raw_ostream &O, const Twine &Indent) const {
631 if (!hasSuccessors()) {
632 O << Indent << "No successors\n";
633 } else {
634 O << Indent << "Successor(s): ";
635 ListSeparator LS;
636 for (auto *Succ : getSuccessors())
637 O << LS << Succ->getName();
638 O << '\n';
639 }
640}
641
642void VPBasicBlock::print(raw_ostream &O, const Twine &Indent,
643 VPSlotTracker &SlotTracker) const {
644 O << Indent << getName() << ":\n";
645
646 auto RecipeIndent = Indent + " ";
647 for (const VPRecipeBase &Recipe : *this) {
648 Recipe.print(O, RecipeIndent, SlotTracker);
649 O << '\n';
650 }
651
652 printSuccessors(O, Indent);
653}
654#endif
655
656std::pair<VPBlockBase *, VPBlockBase *>
659 VPBlockBase *Exiting = nullptr;
660 bool InRegion = Entry->getParent();
661 // First, clone blocks reachable from Entry.
662 for (VPBlockBase *BB : vp_depth_first_shallow(Entry)) {
663 VPBlockBase *NewBB = BB->clone();
664 Old2NewVPBlocks[BB] = NewBB;
665 if (InRegion && BB->getNumSuccessors() == 0) {
666 assert(!Exiting && "Multiple exiting blocks?");
667 Exiting = BB;
668 }
669 }
670 assert((!InRegion || Exiting) && "regions must have a single exiting block");
671
672 // Second, update the predecessors & successors of the cloned blocks.
673 for (VPBlockBase *BB : vp_depth_first_shallow(Entry)) {
674 VPBlockBase *NewBB = Old2NewVPBlocks[BB];
676 for (VPBlockBase *Pred : BB->getPredecessors()) {
677 NewPreds.push_back(Old2NewVPBlocks[Pred]);
678 }
679 NewBB->setPredecessors(NewPreds);
681 for (VPBlockBase *Succ : BB->successors()) {
682 NewSuccs.push_back(Old2NewVPBlocks[Succ]);
683 }
684 NewBB->setSuccessors(NewSuccs);
685 }
686
687#if !defined(NDEBUG)
688 // Verify that the order of predecessors and successors matches in the cloned
689 // version.
690 for (const auto &[OldBB, NewBB] :
692 vp_depth_first_shallow(Old2NewVPBlocks[Entry]))) {
693 for (const auto &[OldPred, NewPred] :
694 zip(OldBB->getPredecessors(), NewBB->getPredecessors()))
695 assert(NewPred == Old2NewVPBlocks[OldPred] && "Different predecessors");
696
697 for (const auto &[OldSucc, NewSucc] :
698 zip(OldBB->successors(), NewBB->successors()))
699 assert(NewSucc == Old2NewVPBlocks[OldSucc] && "Different successors");
700 }
701#endif
702
703 return std::make_pair(Old2NewVPBlocks[Entry],
704 Exiting ? Old2NewVPBlocks[Exiting] : nullptr);
705}
706
708 const auto *EntryBB = cast<VPBasicBlock>(getEntry());
709 assert(isReplicator() && EntryBB && EntryBB->size() == 1 &&
710 "not a valid replicating region");
711 return cast<VPBranchOnMaskRecipe>(&EntryBB->front());
712}
713
714VPRegionBlock *VPRegionBlock::clone() {
715 const auto &[NewEntry, NewExiting] = VPBlockUtils::cloneFrom(getEntry());
716 VPlan &Plan = *getPlan();
717 VPRegionValue *CanIV = getCanonicalIV();
718 VPRegionBlock *NewRegion =
719 CanIV ? Plan.createLoopRegion(CanIV->getType(), CanIV->getDebugLoc(),
720 getName(), NewEntry, NewExiting)
721 : Plan.createReplicateRegion(NewEntry, NewExiting, getName());
722
723 if (getHeaderMask())
724 NewRegion->createHeaderMask();
725
726 if (CanIV && !hasCanonicalIVNUW())
727 NewRegion->CanIVInfo->clearNUW();
728
729 for (VPBlockBase *Block : vp_depth_first_shallow(NewEntry))
730 Block->setParent(NewRegion);
731 return NewRegion;
732}
733
735 llvm_unreachable("regions must get dissolved before ::execute");
736}
737
740 for (VPRecipeBase &R : Recipes)
741 Cost += R.cost(VF, Ctx);
742
743 // Charge cost for unconditional branches outside replicate regions that
744 // cannot be folded.
745 const VPBlockBase *Succ = getSingleSuccessor();
746 const VPRegionBlock *Region = getParent();
747 if (Succ && !Succ->getSinglePredecessor() &&
748 (!Region || !Region->isReplicator())) {
749 Cost += Ctx.Opts.force_target_instruction_cost
750 ? InstructionCost(*Ctx.Opts.force_target_instruction_cost)
751 : Ctx.TTI.getCFInstrCost(Instruction::UncondBr, Ctx.CostKind);
752 }
753 return Cost;
754}
755
756const VPBasicBlock *VPBasicBlock::getCFGPredecessor(unsigned Idx) const {
757 const VPBlockBase *Pred = nullptr;
758 if (hasPredecessors()) {
759 Pred = getPredecessors()[Idx];
760 } else {
761 auto *Region = getParent();
762 assert(Region && !Region->isReplicator() && Region->getEntry() == this &&
763 "must be in the entry block of a non-replicate region");
764 assert(Idx < 2 && Region->getNumPredecessors() == 1 &&
765 "loop region has a single predecessor (preheader), its entry block "
766 "has 2 incoming blocks");
767
768 // Idx == 0 selects the predecessor of the region, Idx == 1 selects the
769 // region itself whose exiting block feeds the phi across the backedge.
770 Pred = Idx == 0 ? Region->getSinglePredecessor() : Region;
771 }
772 return Pred->getExitingBasicBlock();
773}
774
776 if (!isReplicator()) {
779 Cost += Block->cost(VF, Ctx);
780 // Add the costs of the loop's backedge and canonical IV increment
781 auto AddCost = [&](InstructionCost C, const char *Name) {
782 if (Ctx.Opts.force_target_instruction_cost)
783 C = InstructionCost(*Ctx.Opts.force_target_instruction_cost);
784 LLVM_DEBUG(dbgs() << "Cost of " << C << " for VF " << VF << ": " << Name
785 << "\n");
786 Cost += C;
787 };
788 AddCost(Ctx.TTI.getCFInstrCost(Instruction::UncondBr, Ctx.CostKind),
789 "vector loop backedge");
791 AddCost(Ctx.TTI.getArithmeticInstrCost(
792 Instruction::Add, getCanonicalIVType(), Ctx.CostKind),
793 "canonical IV increment");
794 return Cost;
795 }
796
797 // Compute the cost of a replicate region. Replicating isn't supported for
798 // scalable vectors, return an invalid cost for them.
799 // TODO: Discard scalable VPlans with replicate recipes earlier after
800 // construction.
801 if (VF.isScalable())
803
804 // Compute and return the cost of the branch on the mask in the entry, the
805 // conditionally executed recipes and the unconditional branch from the
806 // conditionally executed block to the exiting block for each lane.
807 assert(VF.isVector() && "Can only compute vector cost at the moment.");
809
810 // If the vector loop executes at most once and the region is predicated on
811 // the header mask, the branches fold away.
813 match(getEntryBranchOnMask()->getOperand(0),
815 return Then->cost(VF, Ctx);
816
817 InstructionCost Cost = getEntry()->cost(VF, Ctx);
818 Cost += Then->cost(VF, Ctx);
819 InstructionCost ThenBranchCost;
820 if (Ctx.Opts.force_target_instruction_cost) {
821 ThenBranchCost = InstructionCost(*Ctx.Opts.force_target_instruction_cost);
822 } else {
823 ThenBranchCost =
824 VF.getFixedValue() *
825 Ctx.TTI.getCFInstrCost(Instruction::UncondBr, Ctx.CostKind);
826 ThenBranchCost /=
827 Ctx.getCostDivisor(getEntryBranchOnMask()->getExecutionFrequency());
828 }
829 LLVM_DEBUG(dbgs() << "Cost of " << ThenBranchCost << " for VF " << VF
830 << ": unconditional branches from " << Then->getName()
831 << "\n");
832 return Cost + ThenBranchCost;
833}
834
835#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
837 VPSlotTracker &SlotTracker) const {
838 O << Indent << (isReplicator() ? "<xVFxUF> " : "<x1> ") << getName() << ": {";
839 auto NewIndent = Indent + " ";
840 if (auto *CanIV = getCanonicalIV()) {
841 O << '\n';
842 CanIV->print(O, SlotTracker);
843 O << " = CANONICAL-IV\n";
844 }
845 if (auto *HdrMask = getUsedHeaderMask()) {
846 HdrMask->print(O, SlotTracker);
847 O << " = HEADER-MASK\n";
848 }
849 for (auto *BlockBase : vp_depth_first_shallow(Entry)) {
850 O << '\n';
851 BlockBase->print(O, NewIndent, SlotTracker);
852 }
853 O << Indent << "}\n";
854
855 printSuccessors(O, Indent);
856}
857#endif
858
860 auto *Header = cast<VPBasicBlock>(getEntry());
861 auto *ExitingLatch = cast<VPBasicBlock>(getExiting());
862 auto *CanIV = getCanonicalIV();
863 if (!CanIV->user_empty()) {
864 VPlan &Plan = *getPlan();
865 auto *Zero = Plan.getZero(CanIV->getType());
866 DebugLoc DL = CanIV->getDebugLoc();
868 VPBuilder HeaderBuilder(Header->begin());
869 auto *ScalarR =
870 HeaderBuilder.createScalarPhi({Zero, CanIVInc}, DL, "index");
871 CanIV->replaceAllUsesWith(ScalarR);
872 }
873
874 VPBlockBase *Preheader = getSinglePredecessor();
875 VPBlockUtils::disconnectBlocks(Preheader, this);
876
877 for (VPBlockBase *VPB : vp_depth_first_shallow(Entry))
878 VPB->setParent(getParent());
879
880 VPBlockUtils::connectBlocks(Preheader, Header);
881 VPBlockUtils::transferSuccessors(this, ExitingLatch);
882 VPBlockUtils::connectBlocks(ExitingLatch, Header);
883}
884
886 // TODO: Represent the increment as VPRegionValue as well.
887 VPRegionValue *CanIV = getCanonicalIV();
888 assert(CanIV && "Expected a canonical IV");
889
890 if (auto *Inc = vputils::findCanonicalIVIncrement(*getPlan()))
891 return Inc;
892
893 assert(!getPlan()->getVFxUF().isMaterialized() &&
894 "VFxUF can be used only before it is materialized.");
895 auto *ExitingLatch = cast<VPBasicBlock>(getExiting());
896 return VPBuilder(ExitingLatch->getTerminator())
897 .createOverflowingOp(Instruction::Add, {CanIV, &getPlan()->getVFxUF()},
898 {hasCanonicalIVNUW(), /* HasNSW */ false},
899 CanIV->getDebugLoc(), "index.next");
900}
901
902VPlan::VPlan(Loop *L, Type *IdxTy)
903 : VectorTripCount(IdxTy), VF(IdxTy), UF(IdxTy), VFxUF(IdxTy) {
904 setEntry(createVPIRBasicBlock(L->getLoopPreheader()));
905 ScalarHeader = createVPIRBasicBlock(L->getHeader());
906
907 SmallVector<BasicBlock *> IRExitBlocks;
908 L->getUniqueExitBlocks(IRExitBlocks);
909 for (BasicBlock *EB : IRExitBlocks)
910 ExitBlocks.push_back(createVPIRBasicBlock(EB));
911}
912
914 VPSymbolicValue DummyValue(nullptr);
915
916 // Redirect all recipe operands to DummyValue before deleting blocks.
917 for (VPBasicBlock *VPBB :
919 for (VPRecipeBase &R : *VPBB)
920 for (unsigned I = 0, E = R.getNumOperands(); I != E; I++)
921 R.setOperand(I, &DummyValue);
922
923 for (auto [Idx, VPB] : enumerate(CreatedBlocks)) {
924 assert(VPB->getNumber() == Idx && "block with mismatched number");
925 delete VPB;
926 }
927 for (VPValue *VPV : getLiveIns())
928 delete VPV;
929}
930
932 return is_contained(ExitBlocks, VPBB);
933}
934
935/// To make RUN_VPLAN_PASS print final VPlan.
936static void printFinalVPlan(VPlan &) {}
937
938/// Generate the code inside the preheader and body of the vectorized loop.
939/// Assumes a single pre-header basic-block was created for this. Introduce
940/// additional basic-blocks as needed, and fill them all.
943 "all region blocks must be dissolved before ::execute");
944
945 // Initialize CFG state.
946 State->CFG.PrevVPBB = nullptr;
947 State->CFG.ExitBB = State->CFG.PrevBB->getSingleSuccessor();
948
949 // Update VPDominatorTree since VPBasicBlock may be removed after State was
950 // constructed.
951 State->VPDT.recalculate(*this);
952
953 // Disconnect VectorPreHeader from ExitBB in both the CFG and DT.
954 BasicBlock *VectorPreHeader = State->CFG.PrevBB;
955 cast<UncondBrInst>(VectorPreHeader->getTerminator())->setSuccessor(nullptr);
956 State->CFG.DTU.applyUpdates(
957 {{DominatorTree::Delete, VectorPreHeader, State->CFG.ExitBB}});
958
959 LLVM_DEBUG(dbgs() << "Executing best plan with VF=" << State->VF
960 << ", UF=" << getConcreteUF() << '\n');
961 setName("Final VPlan");
962 // TODO: RUN_VPLAN_PASS/VPlanTransforms::runPass should automatically dump
963 // VPlans after some specific stages when "-debug" is specified, but that
964 // hasn't been implemented yet. For now, just do both:
965 LLVM_DEBUG(dump());
967
968 BasicBlock *ScalarPh = State->CFG.ExitBB;
969 VPBasicBlock *ScalarPhVPBB = getScalarPreheader();
970 if (ScalarPhVPBB) {
971 // Disconnect scalar preheader and scalar header, as the dominator tree edge
972 // will be updated as part of VPlan execution. This allows keeping the DTU
973 // logic generic during VPlan execution.
974 State->CFG.DTU.applyUpdates(
975 {{DominatorTree::Delete, ScalarPh, ScalarPh->getSingleSuccessor()}});
976 }
978 Entry);
979 // Generate code for the VPlan, in parts of the vector skeleton, loop body and
980 // successor blocks including the middle, exit and scalar preheader blocks.
981 for (VPBlockBase *Block : RPOT)
982 Block->execute(State);
983
984 if (hasEarlyExit()) {
985 // Fix up LoopInfo for extra dispatch blocks when vectorizing loops with
986 // early exits. For dispatch blocks, we need to find the smallest common
987 // loop of all successors that are in a loop. Note: we only need to update
988 // loop info for blocks after the middle block, but there is no easy way to
989 // get those at this point.
990 for (VPBlockBase *VPB : reverse(RPOT)) {
991 auto *VPBB = dyn_cast<VPBasicBlock>(VPB);
992 if (!VPBB || isa<VPIRBasicBlock>(VPBB))
993 continue;
994 BasicBlock *BB = State->CFG.VPBB2IRBB[VPBB];
995 Loop *L = State->LI->getLoopFor(BB);
996 if (!L || any_of(successors(BB),
997 [L](BasicBlock *Succ) { return L->contains(Succ); }))
998 continue;
999 // Find the innermost loop containing all successors that are in a loop.
1000 // Successors not in any loop don't constrain the target loop.
1001 Loop *Target = nullptr;
1002 for (BasicBlock *Succ : successors(BB)) {
1003 Loop *SuccLoop = State->LI->getLoopFor(Succ);
1004 if (!SuccLoop)
1005 continue;
1006 if (!Target)
1007 Target = SuccLoop;
1008 else
1009 Target = State->LI->getSmallestCommonLoop(Target, SuccLoop);
1010 }
1011 State->LI->removeBlock(BB);
1012 if (Target)
1013 Target->addBasicBlockToLoop(BB, *State->LI);
1014 }
1015 }
1016
1017 // If the original loop is unreachable, delete it and all its blocks.
1018 if (!ScalarPhVPBB) {
1019 // DeleteDeadBlocks will remove single-entry phis. Remove them from the exit
1020 // VPIRBBs in VPlan as well, otherwise we would retain references to deleted
1021 // IR instructions.
1022 for (VPIRBasicBlock *EB : getExitBlocks()) {
1023 for (VPRecipeBase &R : make_early_inc_range(EB->phis())) {
1024 if (R.getNumOperands() == 1)
1025 R.eraseFromParent();
1026 }
1027 }
1028
1029 Loop *OrigLoop =
1030 State->LI->getLoopFor(getScalarHeader()->getIRBasicBlock());
1031 SmallVector<BasicBlock *> Blocks(OrigLoop->block_begin(),
1032 OrigLoop->block_end());
1033 Blocks.push_back(ScalarPh);
1034 while (!OrigLoop->isInnermost())
1035 State->LI->erase(*OrigLoop->begin());
1036 State->LI->erase(OrigLoop);
1037 for (auto *BB : Blocks)
1038 State->LI->removeBlock(BB);
1039 DeleteDeadBlocks(Blocks, &State->CFG.DTU);
1040 }
1041
1042 State->CFG.DTU.flush();
1043
1044 // Fix the latch (backedge) value of all header phis in all loop headers.
1045 State->fixupHeaderPhis();
1046}
1047
1049 // For now only return the cost of the vector loop region, ignoring any other
1050 // blocks, like the preheader or middle blocks, expect for checking them for
1051 // recipes with invalid costs.
1053
1054 // If the cost of the loop region is invalid or any recipe in the skeleton
1055 // outside loop regions are invalid return an invalid cost.
1058 [&VF, &Ctx](VPBasicBlock *VPBB) {
1059 return !VPBB->cost(VF, Ctx).isValid();
1060 }))
1062
1063 return Cost;
1064}
1065
1067 // Find the vector loop region by following the last successor of each block,
1068 // starting from the plan's entry; the vector code path is always the last
1069 // successor. When vectorizing the epilogue, the path leads through the blocks
1070 // generated for the main vector loop. Each block on the path is entered from
1071 // its first predecessor. Stop at a block entered from another predecessor,
1072 // e.g. a loop header entered via its back-edge in a plain CFG, before regions
1073 // are created or after they have been dissolved.
1074 for (VPBlockBase *B = Entry; B;) {
1075 if (auto *R = dyn_cast<VPRegionBlock>(B))
1076 return R->isReplicator() || R->getNumPredecessors() != 1 ? nullptr : R;
1077 if (!B->hasSuccessors())
1078 return nullptr;
1079 VPBlockBase *Succ = B->getSuccessors().back();
1080 if (Succ->getPredecessors().front() != B)
1081 return nullptr;
1082 B = Succ;
1083 }
1084 return nullptr;
1085}
1086
1088 return const_cast<VPlan *>(this)->getVectorLoopRegion();
1089}
1090
1092 const VPRegionBlock *LoopRegion = getVectorLoopRegion();
1093 assert(LoopRegion && "expected a vector loop region");
1095 vp_depth_first_shallow(LoopRegion->getEntry())),
1096 [](const VPRegionBlock *R) { return !R->isReplicator(); });
1097}
1098
1099#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1102
1103 if (!VF.user_empty()) {
1104 O << "\nLive-in ";
1105 VF.printAsOperand(O, SlotTracker);
1106 O << " = VF";
1107 }
1108
1109 if (!UF.user_empty()) {
1110 O << "\nLive-in ";
1111 UF.printAsOperand(O, SlotTracker);
1112 O << " = UF";
1113 }
1114
1115 if (!VFxUF.user_empty()) {
1116 O << "\nLive-in ";
1117 VFxUF.printAsOperand(O, SlotTracker);
1118 O << " = VF * UF";
1119 }
1120
1121 if (!VectorTripCount.user_empty()) {
1122 O << "\nLive-in ";
1123 VectorTripCount.printAsOperand(O, SlotTracker);
1124 O << " = vector-trip-count";
1125 }
1126
1127 O << "\n";
1128 if (TripCount && !TripCount->user_empty()) {
1129 if (isa<VPIRValue>(TripCount))
1130 O << "Live-in ";
1131 TripCount->printAsOperand(O, SlotTracker);
1132 O << " = original trip-count";
1133 O << "\n";
1134 }
1135}
1136
1140
1141 O << "VPlan '" << getName() << "' {";
1142
1143 printLiveIns(O);
1144
1146 RPOT(getEntry());
1147 for (const VPBlockBase *Block : RPOT) {
1148 O << '\n';
1149 Block->print(O, "", SlotTracker);
1150 }
1151
1152 O << "}\n";
1153}
1154
1155std::string VPlan::getName() const {
1156 std::string Out;
1157 raw_string_ostream RSO(Out);
1158 RSO << Name << " for ";
1159 if (!VFs.empty()) {
1160 RSO << "VF={" << VFs[0];
1161 for (ElementCount VF : drop_begin(VFs))
1162 RSO << "," << VF;
1163 RSO << "},";
1164 }
1165
1166 if (UFs.empty()) {
1167 RSO << "UF>=1";
1168 } else {
1169 RSO << "UF={" << UFs[0];
1170 for (unsigned UF : drop_begin(UFs))
1171 RSO << "," << UF;
1172 RSO << "}";
1173 }
1174
1175 return Out;
1176}
1177
1180 VPlanPrinter Printer(O, *this);
1181 Printer.dump();
1182}
1183
1185void VPlan::dump() const { print(dbgs()); }
1186#endif
1187
1188static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry,
1189 DenseMap<VPValue *, VPValue *> &Old2NewVPValues) {
1190 // Update the operands of all cloned recipes starting at NewEntry. This
1191 // traverses all reachable blocks. This is done in two steps, to handle cycles
1192 // in PHI recipes.
1194 OldDeepRPOT(Entry);
1196 NewDeepRPOT(NewEntry);
1197 // First, collect all mappings from old to new VPValues defined by cloned
1198 // recipes.
1199 for (const auto &[OldBB, NewBB] :
1202 assert(OldBB->getRecipeList().size() == NewBB->getRecipeList().size() &&
1203 "blocks must have the same number of recipes");
1204 for (const auto &[OldR, NewR] : zip(*OldBB, *NewBB)) {
1205 assert(OldR.getNumOperands() == NewR.getNumOperands() &&
1206 "recipes must have the same number of operands");
1207 assert(OldR.getNumDefinedValues() == NewR.getNumDefinedValues() &&
1208 "recipes must define the same number of operands");
1209 for (const auto &[OldV, NewV] :
1210 zip(OldR.definedValues(), NewR.definedValues()))
1211 Old2NewVPValues[OldV] = NewV;
1212 }
1213 }
1214
1215 // Update all operands to use cloned VPValues.
1216 for (VPBasicBlock *NewBB :
1218 for (VPRecipeBase &NewR : *NewBB)
1219 for (unsigned I = 0, E = NewR.getNumOperands(); I != E; ++I) {
1220 VPValue *NewOp = Old2NewVPValues.lookup(NewR.getOperand(I));
1221 NewR.setOperand(I, NewOp);
1222 }
1223 }
1224}
1225
1227 unsigned NumBlocksBeforeCloning = CreatedBlocks.size();
1228 // Clone blocks.
1229 const auto &[NewEntry, __] = VPBlockUtils::cloneFrom(Entry);
1230
1231 BasicBlock *ScalarHeaderIRBB = getScalarHeader()->getIRBasicBlock();
1232 VPIRBasicBlock *NewScalarHeader = nullptr;
1233 if (getScalarHeader()->hasPredecessors()) {
1234 NewScalarHeader = cast<VPIRBasicBlock>(*find_if(
1235 vp_depth_first_shallow(NewEntry), [ScalarHeaderIRBB](VPBlockBase *VPB) {
1236 auto *VPIRBB = dyn_cast<VPIRBasicBlock>(VPB);
1237 return VPIRBB && VPIRBB->getIRBasicBlock() == ScalarHeaderIRBB;
1238 }));
1239 } else {
1240 NewScalarHeader = createVPIRBasicBlock(ScalarHeaderIRBB);
1241 }
1242 // Create VPlan, clone live-ins and remap operands in the cloned blocks.
1243 auto *NewPlan =
1244 new VPlan(cast<VPBasicBlock>(NewEntry), NewScalarHeader, getIndexType());
1245 DenseMap<VPValue *, VPValue *> Old2NewVPValues;
1246 for (VPIRValue *OldLiveIn : getLiveIns())
1247 Old2NewVPValues[OldLiveIn] = NewPlan->getOrAddLiveIn(OldLiveIn);
1248
1249 if (auto *TripCountIRV = dyn_cast_or_null<VPIRValue>(TripCount))
1250 Old2NewVPValues[TripCountIRV] = NewPlan->getOrAddLiveIn(TripCountIRV);
1251 // else NewTripCount will be created and inserted into Old2NewVPValues when
1252 // TripCount is cloned. In any case NewPlan->TripCount is updated below.
1253
1254 assert(none_of(Old2NewVPValues.keys(), IsaPred<VPSymbolicValue>) &&
1255 "All VPSymbolicValues must be handled below");
1256
1257 if (auto *LoopRegion = getVectorLoopRegion()) {
1258 auto *NewLoopRegion = NewPlan->getVectorLoopRegion();
1259 for (auto [Old, New] : zip_equal(LoopRegion->getRegionValues(),
1260 NewLoopRegion->getRegionValues())) {
1261 Old2NewVPValues[Old] = New;
1262 if (Old->isMaterialized())
1263 New->markMaterialized();
1264 }
1265 }
1266
1267 // Map and propagate materialized state for symbolic values.
1268 for (auto [OldSV, NewSV] :
1269 {std::pair{&VectorTripCount, &NewPlan->VectorTripCount},
1270 {&VF, &NewPlan->VF},
1271 {&UF, &NewPlan->UF},
1272 {&VFxUF, &NewPlan->VFxUF}}) {
1273 Old2NewVPValues[OldSV] = NewSV;
1274 if (OldSV->isMaterialized())
1275 NewSV->markMaterialized();
1276 }
1277
1278 remapOperands(Entry, NewEntry, Old2NewVPValues);
1279
1280 // Initialize remaining fields of cloned VPlan.
1281 NewPlan->VFs = VFs;
1282 NewPlan->UFs = UFs;
1283 // TODO: Adjust names.
1284 NewPlan->Name = Name;
1285 if (TripCount) {
1286 assert(Old2NewVPValues.contains(TripCount) &&
1287 "TripCount must have been added to Old2NewVPValues");
1288 NewPlan->TripCount = Old2NewVPValues[TripCount];
1289 }
1290
1291 // Transfer all cloned blocks (the second half of all current blocks) from
1292 // current to new VPlan.
1293 unsigned NumBlocksAfterCloning = CreatedBlocks.size();
1294 for (unsigned I :
1295 seq<unsigned>(NumBlocksBeforeCloning, NumBlocksAfterCloning)) {
1296 this->CreatedBlocks[I]->setPlan(NewPlan);
1297 this->CreatedBlocks[I]->setNumber(NewPlan->CreatedBlocks.size());
1298 NewPlan->CreatedBlocks.push_back(this->CreatedBlocks[I]);
1299 }
1300 CreatedBlocks.truncate(NumBlocksBeforeCloning);
1301
1302 // Update ExitBlocks of the new plan.
1303 for (VPBlockBase *VPB : NewPlan->CreatedBlocks) {
1304 if (VPB->getNumSuccessors() == 0 && isa<VPIRBasicBlock>(VPB) &&
1305 VPB != NewScalarHeader)
1306 NewPlan->ExitBlocks.push_back(cast<VPIRBasicBlock>(VPB));
1307 }
1308
1309 return NewPlan;
1310}
1311
1313 auto *VPIRBB = new VPIRBasicBlock(IRBB);
1314 VPIRBB->setPlan(this);
1315 VPIRBB->setNumber(CreatedBlocks.size());
1316 CreatedBlocks.push_back(VPIRBB);
1317 return VPIRBB;
1318}
1319
1321 auto *VPIRBB = createEmptyVPIRBasicBlock(IRBB);
1322 for (Instruction &I :
1323 make_range(IRBB->begin(), IRBB->getTerminator()->getIterator()))
1324 VPIRBB->appendRecipe(VPIRInstruction::create(I));
1325 return VPIRBB;
1326}
1327
1328#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1329
1330Twine VPlanPrinter::getUID(const VPBlockBase *Block) {
1331 return (isa<VPRegionBlock>(Block) ? "cluster_N" : "N") +
1332 Twine(getOrCreateBID(Block));
1333}
1334
1336 Depth = 1;
1337 bumpIndent(0);
1338 OS << "digraph VPlan {\n";
1339 OS << "graph [labelloc=t, fontsize=30; label=\"Vectorization Plan";
1340 if (!Plan.getName().empty())
1341 OS << "\\n" << DOT::EscapeString(Plan.getName());
1342
1343 {
1344 // Print live-ins.
1345 std::string Str;
1346 raw_string_ostream SS(Str);
1347 Plan.printLiveIns(SS);
1349 StringRef(Str).rtrim('\n').split(Lines, "\n");
1350 for (auto Line : Lines)
1351 OS << DOT::EscapeString(Line.str()) << "\\n";
1352 }
1353
1354 OS << "\"]\n";
1355 OS << "node [shape=rect, fontname=Courier, fontsize=30]\n";
1356 OS << "edge [fontname=Courier, fontsize=30]\n";
1357 OS << "compound=true\n";
1358
1359 for (const VPBlockBase *Block : vp_depth_first_shallow(Plan.getEntry()))
1360 dumpBlock(Block);
1361
1362 OS << "}\n";
1363}
1364
1365void VPlanPrinter::dumpBlock(const VPBlockBase *Block) {
1367 dumpBasicBlock(BasicBlock);
1369 dumpRegion(Region);
1370 else
1371 llvm_unreachable("Unsupported kind of VPBlock.");
1372}
1373
1374void VPlanPrinter::drawEdge(const VPBlockBase *From, const VPBlockBase *To,
1375 bool Hidden, const Twine &Label) {
1376 // Due to "dot" we print an edge between two regions as an edge between the
1377 // exiting basic block and the entry basic of the respective regions.
1378 const VPBlockBase *Tail = From->getExitingBasicBlock();
1379 const VPBlockBase *Head = To->getEntryBasicBlock();
1380 OS << Indent << getUID(Tail) << " -> " << getUID(Head);
1381 OS << " [ label=\"" << Label << '\"';
1382 if (Tail != From)
1383 OS << " ltail=" << getUID(From);
1384 if (Head != To)
1385 OS << " lhead=" << getUID(To);
1386 if (Hidden)
1387 OS << "; splines=none";
1388 OS << "]\n";
1389}
1390
1391void VPlanPrinter::dumpEdges(const VPBlockBase *Block) {
1392 auto &Successors = Block->getSuccessors();
1393 if (Successors.size() == 1)
1394 drawEdge(Block, Successors.front(), false, "");
1395 else if (Successors.size() == 2) {
1396 drawEdge(Block, Successors.front(), false, "T");
1397 drawEdge(Block, Successors.back(), false, "F");
1398 } else {
1399 unsigned SuccessorNumber = 0;
1400 for (auto *Successor : Successors)
1401 drawEdge(Block, Successor, false, Twine(SuccessorNumber++));
1402 }
1403}
1404
1405void VPlanPrinter::dumpBasicBlock(const VPBasicBlock *BasicBlock) {
1406 // Implement dot-formatted dump by performing plain-text dump into the
1407 // temporary storage followed by some post-processing.
1408 OS << Indent << getUID(BasicBlock) << " [label =\n";
1409 bumpIndent(1);
1410 std::string Str;
1411 raw_string_ostream SS(Str);
1412 // Use no indentation as we need to wrap the lines into quotes ourselves.
1413 BasicBlock->print(SS, "", SlotTracker);
1414
1415 // We need to process each line of the output separately, so split
1416 // single-string plain-text dump.
1418 StringRef(Str).rtrim('\n').split(Lines, "\n");
1419
1420 auto EmitLine = [&](StringRef Line, StringRef Suffix) {
1421 OS << Indent << '"' << DOT::EscapeString(Line.str()) << "\\l\"" << Suffix;
1422 };
1423
1424 // Don't need the "+" after the last line.
1425 for (auto Line : make_range(Lines.begin(), Lines.end() - 1))
1426 EmitLine(Line, " +\n");
1427 EmitLine(Lines.back(), "\n");
1428
1429 bumpIndent(-1);
1430 OS << Indent << "]\n";
1431
1432 dumpEdges(BasicBlock);
1433}
1434
1435void VPlanPrinter::dumpRegion(const VPRegionBlock *Region) {
1436 OS << Indent << "subgraph " << getUID(Region) << " {\n";
1437 bumpIndent(1);
1438 OS << Indent << "fontname=Courier\n"
1439 << Indent << "label=\""
1440 << DOT::EscapeString(Region->isReplicator() ? "<xVFxUF> " : "<x1> ")
1441 << DOT::EscapeString(Region->getName()) << "\"\n";
1442
1443 if (auto *CanIV = Region->getCanonicalIV()) {
1444 OS << Indent << "\"";
1445 std::string Op;
1446 raw_string_ostream S(Op);
1447 CanIV->printAsOperand(S, SlotTracker);
1448 OS << DOT::EscapeString(Op);
1449 OS << " = CANONICAL-IV\"\n";
1450 }
1451
1452 // Dump the blocks of the region.
1453 assert(Region->getEntry() && "Region contains no inner blocks.");
1454 for (const VPBlockBase *Block : vp_depth_first_shallow(Region->getEntry()))
1455 dumpBlock(Block);
1456 bumpIndent(-1);
1457 OS << Indent << "}\n";
1458 dumpEdges(Region);
1459}
1460
1461#endif
1462
1463/// Returns true if there is a vector loop region and \p VPV is defined in a
1464/// loop region.
1465static bool isDefinedInsideLoopRegions(const VPValue *VPV) {
1466 if (isa<VPRegionValue>(VPV))
1467 return true;
1468 const VPRecipeBase *DefR = VPV->getDefiningRecipe();
1469 return DefR && (DefR->getParent()->getEnclosingLoopRegion() ||
1470 !DefR->getParent()->getPlan()->getVectorLoopRegion());
1471}
1472
1477 replaceUsesWithIf(New, [](VPUser *) { return true; });
1478 if (auto *SV = dyn_cast<VPSymbolicValue>(this))
1479 SV->markMaterialized();
1480}
1481
1483 VPValue *New, llvm::function_ref<bool(VPUser *U)> ShouldReplace) {
1485 // Note that this early exit is required for correctness; the implementation
1486 // below relies on the number of users for this VPValue to decrease, which
1487 // isn't the case if this == New.
1488 if (this == New)
1489 return;
1490
1491 for (unsigned J = 0; J < getNumUsers();) {
1492 VPUser *User = Users[J];
1493 bool RemovedUser = false;
1494 for (unsigned I = 0, E = User->getNumOperands(); I < E; ++I) {
1495 if (User->getOperand(I) != this || !ShouldReplace(User))
1496 continue;
1497
1498 RemovedUser = true;
1499 User->setOperand(I, New);
1500 }
1501 // If a user got removed after updating the current user, the next user to
1502 // update will be moved to the current position, so we only need to
1503 // increment the index if the number of users did not change.
1504 if (!RemovedUser)
1505 J++;
1506 }
1507}
1508
1510 for (unsigned Idx = 0; Idx != getNumOperands(); ++Idx) {
1511 if (getOperand(Idx) == From)
1512 setOperand(Idx, To);
1513 }
1514}
1515
1516#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1518 OS << Tracker.getOrCreateName(this);
1519}
1520
1523 Op->printAsOperand(O, SlotTracker);
1524 });
1525}
1526#endif
1527
1528void VPSlotTracker::assignName(const VPValue *V) {
1529 assert(!VPValue2Name.contains(V) && "VPValue already has a name!");
1530 auto *UV = V->getUnderlyingValue();
1531 auto *VPI = dyn_cast_or_null<VPInstruction>(V);
1532 if (!UV && !(VPI && !VPI->getName().empty())) {
1533 VPValue2Name[V] = (Twine("vp<%") + Twine(NextSlot) + ">").str();
1534 NextSlot++;
1535 return;
1536 }
1537
1538 // Use the name of the underlying Value, wrapped in "ir<>", and versioned by
1539 // appending ".Number" to the name if there are multiple uses.
1540 std::string Name;
1541 if (UV)
1542 Name = getName(UV);
1543 else
1544 Name = VPI->getName();
1545
1546 assert(!Name.empty() && "Name cannot be empty.");
1547 StringRef Prefix = UV ? "ir<" : "vp<%";
1548 std::string BaseName = (Twine(Prefix) + Name + Twine(">")).str();
1549
1550 // First assign the base name for V.
1551 const auto &[A, _] = VPValue2Name.try_emplace(V, BaseName);
1552 // Integer or FP constants with different types will result in the same string
1553 // due to stripping types.
1555 return;
1556
1557 // If it is already used by C > 0 other VPValues, increase the version counter
1558 // C and use it for V.
1559 const auto &[C, UseInserted] = BaseName2Version.try_emplace(BaseName, 0);
1560 if (!UseInserted) {
1561 C->second++;
1562 A->second = (BaseName + Twine(".") + Twine(C->second)).str();
1563 }
1564}
1565
1566void VPSlotTracker::assignNames(const VPlan &Plan) {
1567 if (!Plan.VF.user_empty())
1568 assignName(&Plan.VF);
1569 if (!Plan.UF.user_empty())
1570 assignName(&Plan.UF);
1571 if (!Plan.VFxUF.user_empty())
1572 assignName(&Plan.VFxUF);
1573 assignName(&Plan.VectorTripCount);
1574 for (VPValue *LI : Plan.getLiveIns())
1575 assignName(LI);
1576
1577 ReversePostOrderTraversal<VPBlockDeepTraversalWrapper<const VPBlockBase *>>
1578 RPOT(VPBlockDeepTraversalWrapper<const VPBlockBase *>(Plan.getEntry()));
1579 for (const VPBlockBase *VPB : RPOT) {
1580 if (auto *VPBB = dyn_cast<VPBasicBlock>(VPB))
1581 assignNames(VPBB);
1582 else
1583 for (auto *RV : cast<VPRegionBlock>(VPB)->getRegionValues())
1584 assignName(RV);
1585 }
1586}
1587
1588void VPSlotTracker::assignNames(const VPBasicBlock *VPBB) {
1589 for (const VPRecipeBase &Recipe : *VPBB)
1590 for (VPValue *Def : Recipe.definedValues())
1591 assignName(Def);
1592}
1593
1594ModuleSlotTracker &VPSlotTracker::getOrCreateMST() {
1595 // F is null for unit tests with incomplete IR.
1596 if (!MST) {
1597 MST = std::make_unique<ModuleSlotTracker>(getModule());
1598 if (F)
1599 MST->incorporateFunction(*F);
1600 }
1601 return *MST;
1602}
1603
1604std::string VPSlotTracker::getName(const Value *V) {
1605 std::string Name;
1606 raw_string_ostream S(Name);
1607 // If V isn't an instruction in a basic block or named, it can be printed
1608 // directly without ModuleSlotTracker.
1609 auto *I = dyn_cast<Instruction>(V);
1610 if (!I || I->hasName() || !I->getParent()) {
1611 V->printAsOperand(S, false);
1612 return Name;
1613 }
1614
1615 V->printAsOperand(S, false, getOrCreateMST());
1616 return Name;
1617}
1618
1620 N->printAsOperand(O, getOrCreateMST(), getModule());
1621}
1622
1623std::string VPSlotTracker::getOrCreateName(const VPValue *V) const {
1624 std::string Name = VPValue2Name.lookup(V);
1625 if (!Name.empty())
1626 return Name;
1627
1628 // If no name was assigned, no VPlan was provided when creating the slot
1629 // tracker or it is not reachable from the provided VPlan. This can happen,
1630 // e.g. when trying to print a recipe that has not been inserted into a VPlan
1631 // in a debugger.
1632 // TODO: Update VPSlotTracker constructor to assign names to recipes &
1633 // VPValues not associated with a VPlan, instead of constructing names ad-hoc
1634 // here.
1635
1636 // Use the underlying value's name, if there is one.
1637 if (auto *UV = V->getUnderlyingValue()) {
1638 std::string Name;
1639 raw_string_ostream S(Name);
1640 UV->printAsOperand(S, false);
1641 return (Twine("ir<") + Name + ">").str();
1642 }
1643
1644 return "<badref>";
1645}
1646
1648 const std::function<bool(ElementCount)> &Predicate, VFRange &Range) {
1649 assert(!Range.isEmpty() && "Trying to test an empty VF range.");
1650 bool PredicateAtRangeStart = Predicate(Range.Start);
1651
1652 for (ElementCount TmpVF : VFRange(Range.Start * 2, Range.End))
1653 if (Predicate(TmpVF) != PredicateAtRangeStart) {
1654 Range.End = TmpVF;
1655 break;
1656 }
1657
1658 return PredicateAtRangeStart;
1659}
1660
1662 assert(count_if(VPlans,
1663 [VF](const VPlanPtr &Plan) { return Plan->hasVF(VF); }) ==
1664 1 &&
1665 "Multiple VPlans for VF.");
1666
1667 for (const VPlanPtr &Plan : VPlans) {
1668 if (Plan->hasVF(VF))
1669 return *Plan.get();
1670 }
1671 llvm_unreachable("No plan found!");
1672}
1673
1676 // Reserve first location for self reference to the LoopID metadata node.
1677 MDs.push_back(nullptr);
1678 bool IsUnrollMetadata = false;
1679 MDNode *LoopID = L->getLoopID();
1680 if (LoopID) {
1681 // First find existing loop unrolling disable metadata.
1682 for (unsigned I = 1, IE = LoopID->getNumOperands(); I < IE; ++I) {
1683 auto *MD = dyn_cast<MDNode>(LoopID->getOperand(I));
1684 if (MD) {
1685 const auto *S = dyn_cast<MDString>(MD->getOperand(0));
1686 if (!S)
1687 continue;
1688 if (S->getString().starts_with("llvm.loop.unroll.runtime.disable"))
1689 continue;
1690 IsUnrollMetadata =
1691 S->getString().starts_with("llvm.loop.unroll.disable");
1692 }
1693 MDs.push_back(LoopID->getOperand(I));
1694 }
1695 }
1696
1697 if (!IsUnrollMetadata) {
1698 // Add runtime unroll disable metadata.
1699 LLVMContext &Context = L->getHeader()->getContext();
1700 SmallVector<Metadata *, 1> DisableOperands;
1701 DisableOperands.push_back(
1702 MDString::get(Context, "llvm.loop.unroll.runtime.disable"));
1703 MDNode *DisableNode = MDNode::get(Context, DisableOperands);
1704 MDs.push_back(DisableNode);
1705 MDNode *NewLoopID = MDNode::get(Context, MDs);
1706 // Set operand 0 to refer to the loop id itself.
1707 NewLoopID->replaceOperandWith(0, NewLoopID);
1708 L->setLoopID(NewLoopID);
1709 }
1710}
1711
1713 Loop *VectorLoop, VPBasicBlock *HeaderVPBB, const VPlan &Plan,
1714 bool VectorizingEpilogue, MDNode *OrigLoopID,
1715 std::optional<unsigned> OrigAverageTripCount,
1716 unsigned OrigLoopInvocationWeight, unsigned EstimatedVFxUF,
1717 bool DisableRuntimeUnroll, bool UnrollVectorizedLoop) {
1718 // Update the metadata of the scalar loop. Skip the update when vectorizing
1719 // the epilogue loop to ensure it is updated only once. Also skip the update
1720 // when the scalar loop became unreachable.
1721 auto *ScalarPH = Plan.getScalarPreheader();
1722 if (ScalarPH && !VectorizingEpilogue) {
1723 std::optional<MDNode *> RemainderLoopID =
1726 if (RemainderLoopID) {
1727 OrigLoop->setLoopID(*RemainderLoopID);
1728 } else {
1729 if (DisableRuntimeUnroll)
1731
1732 LoopVectorizeHints Hints(Opts, OrigLoop,
1733 /*InterleaveOnlyWhenForced*/ false, *ORE);
1734 Hints.setAlreadyVectorized();
1735 }
1736 }
1737 // Tag the scalar remainder so downstream passes (e.g. the unroller and
1738 // WarnMissedTransforms) can produce more informative remarks. Only emit
1739 // when remarks are enabled.
1740 if (ORE->enabled() && ScalarPH && ScalarPH->hasPredecessors())
1741 OrigLoop->addIntLoopAttribute("llvm.loop.vectorize.epilogue", 1);
1742
1743 if (!VectorLoop)
1744 return;
1745
1746 if (std::optional<MDNode *> VectorizedLoopID = makeFollowupLoopID(
1747 OrigLoopID, {LLVMLoopVectorizeFollowupAll,
1749 VectorLoop->setLoopID(*VectorizedLoopID);
1750 } else {
1751 // Keep all loop hints from the original loop on the vector loop (we'll
1752 // replace the vectorizer-specific hints below).
1753 if (OrigLoopID)
1754 VectorLoop->setLoopID(OrigLoopID);
1755
1756 if (!VectorizingEpilogue) {
1757 LoopVectorizeHints Hints(Opts, VectorLoop,
1758 /*InterleaveOnlyWhenForced*/ false, *ORE);
1759 Hints.setAlreadyVectorized();
1760 }
1761 }
1762 // Tag the vector loop body so downstream passes can identify it. Only
1763 // emit when remarks are enabled.
1764 if (ORE->enabled())
1765 VectorLoop->addIntLoopAttribute("llvm.loop.vectorize.body", 1);
1766 if (!UnrollVectorizedLoop || VectorizingEpilogue)
1768
1769 // Set/update profile weights for the vector and remainder loops as original
1770 // loop iterations are now distributed among them. Note that original loop
1771 // becomes the scalar remainder loop after vectorization.
1772 //
1773 // For cases like foldTailByMasking() and requiresScalarEpiloque() we may
1774 // end up getting slightly roughened result but that should be OK since
1775 // profile is not inherently precise anyway. Note also possible bypass of
1776 // vector code caused by legality checks is ignored, assigning all the weight
1777 // to the vector loop, optimistically.
1778 //
1779 // For scalable vectorization we can't know at compile time how many
1780 // iterations of the loop are handled in one vector iteration, so instead
1781 // use the value of vscale used for tuning.
1782 unsigned AverageVectorTripCount = 0;
1783 unsigned RemainderAverageTripCount = 0;
1784 auto EC = VectorLoop->getLoopPreheader()->getParent()->getEntryCount();
1785 auto IsProfiled = EC && *EC != 0;
1786 if (!OrigAverageTripCount) {
1787 if (!IsProfiled)
1788 return;
1789 auto &SE = *PSE.getSE();
1790 AverageVectorTripCount = SE.getSmallConstantTripCount(VectorLoop);
1791 if (ProfcheckDisableMetadataFixes || !AverageVectorTripCount)
1792 return;
1793 if (ScalarPH)
1794 RemainderAverageTripCount =
1795 SE.getSmallConstantTripCount(OrigLoop) % EstimatedVFxUF;
1796 // Setting to 1 should be sufficient to generate the correct branch weights.
1797 OrigLoopInvocationWeight = 1;
1798 } else {
1799 // Calculate number of iterations in unrolled loop.
1800 AverageVectorTripCount = *OrigAverageTripCount / EstimatedVFxUF;
1801 // Calculate number of iterations for remainder loop.
1802 RemainderAverageTripCount = *OrigAverageTripCount % EstimatedVFxUF;
1803 }
1804 if (HeaderVPBB) {
1805 setLoopEstimatedTripCount(VectorLoop, AverageVectorTripCount,
1806 OrigLoopInvocationWeight);
1807 }
1808
1809 if (ScalarPH) {
1810 setLoopEstimatedTripCount(OrigLoop, RemainderAverageTripCount,
1811 OrigLoopInvocationWeight);
1812 }
1813}
1814
1815#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1817 if (VPlans.empty()) {
1818 O << "LV: No VPlans built.\n";
1819 return;
1820 }
1821 for (const auto &Plan : VPlans)
1822 if (Opts.vplan_print_in_dot_format)
1823 Plan->printDOT(O);
1824 else
1825 Plan->print(O);
1826}
1827#endif
1828
1829bool llvm::canConstantBeExtended(const APInt *C, Type *NarrowType,
1831 APInt TruncatedVal = C->trunc(NarrowType->getScalarSizeInBits());
1832 unsigned WideSize = C->getBitWidth();
1833 APInt ExtendedVal = ExtKind == TTI::PR_SignExtend
1834 ? TruncatedVal.sext(WideSize)
1835 : TruncatedVal.zext(WideSize);
1836 return ExtendedVal == *C;
1837}
1838
1841 if (auto *IRV = dyn_cast<VPIRValue>(V))
1842 return TTI::getOperandInfo(IRV->getValue());
1843
1844 return {};
1845}
1846
1847#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1849 if (!PlanForSlotTracker)
1850 return nullptr;
1851 if (!SlotTracker)
1852 SlotTracker = std::make_unique<VPSlotTracker>(PlanForSlotTracker);
1853 return SlotTracker.get();
1854}
1855#endif
1856
1859 TTI::VectorInstrContext VIC, bool AlwaysIncludeReplicatingR) {
1860 if (VF.isScalar())
1861 return 0;
1862
1863 assert(!VF.isScalable() &&
1864 "Scalarization overhead not supported for scalable vectors");
1865
1866 InstructionCost ScalarizationCost = 0;
1867 // Compute the cost of scalarizing the result if needed.
1868 if (!ResultTy->isVoidTy()) {
1869 for (Type *VectorTy :
1870 to_vector(getContainedTypes(toVectorizedTy(ResultTy, VF)))) {
1871 ScalarizationCost += TTI.getScalarizationOverhead(
1873 /*Insert=*/true, /*Extract=*/false, CostKind,
1874 /*ForPoisonSrc=*/true, {}, VIC);
1875 }
1876 }
1877 // Compute the cost of scalarizing the operands, skipping ones that do not
1878 // require extraction/scalarization and do not incur any overhead.
1879 SmallPtrSet<const VPValue *, 4> UniqueOperands;
1881 for (auto *Op : Operands) {
1882 if (isa<VPIRValue>(Op) ||
1883 (!AlwaysIncludeReplicatingR &&
1886 cast<VPReplicateRecipe>(Op)->getOpcode() == Instruction::Load) ||
1887 !UniqueOperands.insert(Op).second)
1888 continue;
1889 Tys.push_back(toVectorizedTy(Op->getScalarType(), VF));
1890 }
1891 return ScalarizationCost +
1892 TTI.getOperandsScalarizationOverhead(Tys, CostKind, VIC);
1893}
1894
1896 ElementCount VF) {
1897 const Instruction *UI = R->getUnderlyingInstr();
1898 if (isa<LoadInst>(UI))
1899 return true;
1900 assert(isa<StoreInst>(UI) && "R must either be a load or store");
1901
1902 if (!NumPredStores) {
1903 // Count the number of predicated stores in the VPlan, caching the result.
1904 // Only stores where scatter is not legal are counted, matching the legacy
1905 // cost model behavior.
1906 const VPlan &Plan = *R->getParent()->getPlan();
1907 NumPredStores = 0;
1908 for (const VPRegionBlock *VPRB :
1911 assert(VPRB->isReplicator() && "must only contain replicate regions");
1912 for (const VPBasicBlock *VPBB :
1914 vp_depth_first_shallow(VPRB->getEntry()))) {
1915 for (const VPReplicateRecipe &RepR :
1917 if (!isa<StoreInst>(RepR.getUnderlyingInstr()))
1918 continue;
1919 // Check if scatter is legal for this store. If so, don't count it.
1920 Type *Ty = RepR.getOperand(0)->getScalarType();
1921 auto *VTy = VectorType::get(Ty, VF);
1922 const Align Alignment =
1923 getLoadStoreAlignment(RepR.getUnderlyingInstr());
1924 if (!TTI.isLegalMaskedScatter(VTy, Alignment))
1925 ++(*NumPredStores);
1926 }
1927 }
1928 }
1929 }
1930 return *NumPredStores > Opts.vectorize_num_stores_pred;
1931}
1932
1934 return is_contained({Intrinsic::assume, Intrinsic::lifetime_end,
1935 Intrinsic::lifetime_start, Intrinsic::sideeffect,
1936 Intrinsic::pseudoprobe,
1937 Intrinsic::experimental_noalias_scope_decl},
1938 ID);
1939}
1940
1941uint64_t
1942VPCostContext::getCostDivisor(std::optional<VPExecutionFrequency> Freq) const {
1943 if (CostKind == TTI::TCK_CodeSize || !Freq)
1944 return 1;
1945 // A recorded frequency is neither zero nor always-executing, so the
1946 // probability is non-zero and the division below is safe.
1947 return divideNearest(
1949 vputils::getExecutionProbability(Freq->Freq).getNumerator());
1950}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu next use AMDGPU Next Use Analysis Printer
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:690
Flatten the CFG
#define _
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This file defines the LoopVectorizationLegality class.
This file provides a LoopVectorizationPlanner class.
#define I(x, y, z)
Definition MD5.cpp:57
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
static StringRef getName(Value *V)
SI Fold Operands
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:119
This file implements dominator tree analysis for a single level of a VPlan's H-CFG.
This file contains the declarations of different VPlan-related auxiliary helpers.
This file provides utility VPlan to VPlan transformations.
#define RUN_VPLAN_PASS(PASS,...)
static void addRuntimeUnrollDisableMetaData(Loop *L)
Definition VPlan.cpp:1674
static void printFinalVPlan(VPlan &)
To make RUN_VPLAN_PASS print final VPlan.
Definition VPlan.cpp:936
static T * getEnclosingLoopRegionForRegion(T *P)
Return the enclosing loop region for region P.
Definition VPlan.cpp:552
const char LLVMLoopVectorizeFollowupAll[]
Definition VPlan.cpp:63
static bool isDefinedInsideLoopRegions(const VPValue *VPV)
Returns true if there is a vector loop region and VPV is defined in a loop region.
Definition VPlan.cpp:1465
static bool hasConditionalTerminator(const VPBasicBlock *VPBB)
Definition VPlan.cpp:570
const char LLVMLoopVectorizeFollowupVectorized[]
Definition VPlan.cpp:64
static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry, DenseMap< VPValue *, VPValue * > &Old2NewVPValues)
Definition VPlan.cpp:1188
const char LLVMLoopVectorizeFollowupEpilogue[]
Definition VPlan.cpp:66
This file contains the declarations of the Vectorization Plan base classes:
static bool IsCondBranch(unsigned BrOpc)
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
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1030
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:440
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
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.
size_t size() const
Definition BasicBlock.h:461
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
static uint32_t getDenominator()
std::optional< const DILocation * > cloneByMultiplyingDuplicationFactor(unsigned DF) const
Returns a new DILocation with duplication factor DF * current duplication factor encoded in the discr...
A debug info location.
Definition DebugLoc.h:126
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
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
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
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:317
std::optional< uint64_t > getEntryCount() const
Get the entry count for this function.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:111
static InstructionCost getInvalid(CostType Val=0)
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
A helper class to return the specified delimiter string after the first invocation of operator String...
bool isInnermost() const
Return true if the loop does not contain any (natural) loops.
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
block_iterator block_end() const
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
iterator begin() const
block_iterator block_begin() const
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
static bool getDecisionAndClampRange(const std::function< bool(ElementCount)> &Predicate, VFRange &Range)
Test a Predicate on a Range of VF's.
Definition VPlan.cpp:1647
void printPlans(raw_ostream &O)
Definition VPlan.cpp:1816
Utility class for getting and setting loop vectorizer hints in the form of loop metadata.
LLVM_ABI void setAlreadyVectorized()
Mark the loop L as already vectorized by setting the width to 1.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
void addIntLoopAttribute(StringRef Name, unsigned Value, ArrayRef< StringRef > RemovePrefixes={}) const
Add an integer metadata attribute to this loop's loop-ID node.
Definition LoopInfo.cpp:614
void setLoopID(MDNode *LoopID) const
Set the llvm.loop loop id metadata for this loop.
Definition LoopInfo.cpp:582
Metadata node.
Definition Metadata.h:1081
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1579
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1443
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:595
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
Manage lifetime of a slot tracker for printing IR.
BlockT * getEntry() const
Get the entry BasicBlock of the Region.
Definition RegionInfo.h:323
This class provides computation of slot numbers for LLVM Assembly writing.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
std::pair< iterator, bool > try_emplace(StringRef Key, ArgsTy &&...Args)
Emplace a new element for the specified key into the map if the key isn't already in the map.
Definition StringMap.h:370
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:736
StringRef rtrim(char Char) const
Return string with consecutive Char characters starting from the right removed.
Definition StringRef.h:838
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.
@ TCK_CodeSize
Instruction code size.
llvm::VectorInstrContext VectorInstrContext
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
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
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
This function has undefined behavior.
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:4522
void appendRecipe(VPRecipeBase *Recipe)
Augment the existing recipes of a VPBasicBlock with an additional Recipe as the last recipe.
Definition VPlan.h:4603
RecipeListTy::iterator iterator
Instruction iterators...
Definition VPlan.h:4553
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPBasicBlock,...
Definition VPlan.cpp:474
iterator end()
Definition VPlan.h:4563
iterator begin()
Recipe iterator methods.
Definition VPlan.h:4561
VPBasicBlock * clone() override
Clone the current block and it's recipes, without updating the operands of the cloned recipes.
Definition VPlan.cpp:508
InstructionCost cost(ElementCount VF, VPCostContext &Ctx) override
Return the cost of this VPBasicBlock.
Definition VPlan.cpp:738
const VPBasicBlock * getCFGPredecessor(unsigned Idx) const
Returns the predecessor block at index Idx with the predecessors as per the corresponding plain CFG.
Definition VPlan.cpp:756
iterator getFirstNonPhi()
Return the position of the first non-phi node recipe in the block.
Definition VPlan.cpp:228
void connectToPredecessors(VPTransformState &State)
Connect the VPBBs predecessors' in the VPlan CFG to the IR basic block generated for this VPBB.
Definition VPlan.cpp:365
VPRegionBlock * getEnclosingLoopRegion()
Definition VPlan.cpp:562
VPBasicBlock * splitAt(iterator SplitAt)
Split current block at SplitAt by inserting a new block between the current block and its successors ...
Definition VPlan.cpp:529
RecipeListTy Recipes
The VPRecipes held in the order of output instructions to generate.
Definition VPlan.h:4537
void executeRecipes(VPTransformState *State, BasicBlock *BB)
Execute the recipes in the IR basic block BB.
Definition VPlan.cpp:515
void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override
Print this VPBsicBlock to O, prefixing all lines with Indent.
Definition VPlan.cpp:642
bool isExiting() const
Returns true if the block is exiting it's parent region.
Definition VPlan.cpp:620
VPRecipeBase * getTerminator()
If the block has multiple successors, return the branch recipe terminating the block.
Definition VPlan.cpp:608
const VPRecipeBase & back() const
Definition VPlan.h:4575
bool empty() const
Definition VPlan.h:4572
size_t size() const
Definition VPlan.h:4571
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
Definition VPlan.h:95
void setSuccessors(ArrayRef< VPBlockBase * > NewSuccs)
Set each VPBasicBlock in NewSuccss as successor of this VPBlockBase.
Definition VPlan.h:305
VPRegionBlock * getParent()
Definition VPlan.h:193
const VPBasicBlock * getExitingBasicBlock() const
Definition VPlan.cpp:198
size_t getNumSuccessors() const
Definition VPlan.h:243
iterator_range< VPBlockBase ** > successors()
Definition VPlan.h:225
virtual void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const =0
Print plain-text dump of this VPBlockBase to O, prefixing all lines with Indent.
bool hasPredecessors() const
Returns true if this block has any predecessors.
Definition VPlan.h:223
void printSuccessors(raw_ostream &O, const Twine &Indent) const
Print the successors of this block to O, prefixing all lines with Indent.
Definition VPlan.cpp:630
size_t getNumPredecessors() const
Definition VPlan.h:244
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
Definition VPlan.h:296
VPBlockBase * getEnclosingBlockWithPredecessors()
Definition VPlan.cpp:220
bool hasSuccessors() const
Returns true if this block has any successors.
Definition VPlan.h:221
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:228
virtual InstructionCost cost(ElementCount VF, VPCostContext &Ctx)=0
Return the cost of the block.
VPlan * getPlan()
Definition VPlan.h:197
const std::string & getName() const
Definition VPlan.h:184
VPBlockBase * getSinglePredecessor() const
Definition VPlan.h:239
const VPBlocksTy & getHierarchicalSuccessors()
Definition VPlan.h:263
VPBlockBase * getEnclosingBlockWithSuccessors()
An Enclosing Block of a block B is any block containing B, including B itself.
Definition VPlan.cpp:212
const VPBasicBlock * getEntryBasicBlock() const
Definition VPlan.cpp:183
VPBlockBase * getSingleSuccessor() const
Definition VPlan.h:233
const VPBlocksTy & getSuccessors() const
Definition VPlan.h:217
VPBlockBase(VPBlockTy SC, const std::string &N)
Definition VPlan.h:390
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:338
static bool isLatch(const VPBlockBase *VPB, const VPDominatorTree &VPDT)
Returns true if VPB is a loop latch, using isHeader().
static bool isHeader(const VPBlockBase *VPB, const VPDominatorTree &VPDT)
Returns true if VPB is a loop header, based on regions or VPDT in their absence.
static void connectBlocks(VPBlockBase *From, VPBlockBase *To, unsigned PredIdx=-1u, unsigned SuccIdx=-1u)
Connect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:383
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:401
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:449
static void transferSuccessors(VPBlockBase *Old, VPBlockBase *New)
Transfer successors from Old to New. New must have no successors.
Definition VPlanUtils.h:433
static std::pair< VPBlockBase *, VPBlockBase * > cloneFrom(VPBlockBase *Entry)
Clone the CFG for all nodes reachable from Entry, including cloning the blocks and their recipes.
Definition VPlan.cpp:657
A recipe for generating conditional branches on the bits of a mask.
Definition VPlan.h:3591
VPInstruction * createOverflowingOp(unsigned Opcode, ArrayRef< VPValue * > Operands, VPRecipeWithIRFlags::WrapFlagsTy WrapFlags={false, false}, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="")
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.
This class augments a recipe with a set of VPValues defined by the recipe.
Definition VPlanValue.h:508
A special type of VPBasicBlock that wraps an existing IR basic block.
Definition VPlan.h:4681
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPBasicBlock,...
Definition VPlan.cpp:442
BasicBlock * getIRBasicBlock() const
Definition VPlan.h:4705
VPIRBasicBlock * clone() override
Clone the current block and it's recipes, without updating the operands of the cloned recipes.
Definition VPlan.cpp:467
static LLVM_ABI_FOR_TEST VPIRInstruction * create(Instruction &I)
Create a new VPIRPhi for \I , if it is a PHINode, otherwise create a VPIRInstruction.
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:1322
In what follows, the term "input IR" refers to code that is fed into the vectorizer whereas the term ...
static VPLane getLastLaneForVF(const ElementCount &VF)
Value * getAsRuntimeExpr(IRBuilderBase &Builder, const ElementCount &VF) const
Returns an expression describing the lane index that can be used at runtime.
Definition VPlan.cpp:81
bool isFirstLane() const
Returns true if this is the first lane of the whole vector.
static VPLane getFirstLane()
@ ScalableLast
For ScalableLast, Lane is the offset from the start of the last N-element subvector in a scalable vec...
@ First
For First, Lane is the index into the first N elements of a fixed-vector <N x <ElTy>> or a scalable v...
unsigned mapToCacheIndex(const ElementCount &VF) const
Maps the lane to a cache index based on VF.
LLVM_ABI_FOR_TEST VPMultiDefValue(VPRecipeBase *Def, Value *UV, Type *Ty)
Definition VPlan.cpp:172
~VPMultiDefValue() override
Definition VPlan.cpp:178
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:402
void dump() const
Dump the recipe to stderr (for debugging).
Definition VPlan.cpp:110
void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const
Print the recipe, delegating to printRecipe().
virtual LLVM_ABI_FOR_TEST ~VPRecipeValue()=0
Definition VPlan.cpp:157
VPRecipeValue(unsigned char SC, Value *UV, Type *Ty=nullptr)
Definition VPlanValue.h:342
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
Definition VPlan.h:4753
VPRegionBlock * clone() override
Clone all blocks in the single-entry single-exit region of the block and their recipes without updati...
Definition VPlan.cpp:714
const VPBlockBase * getEntry() const
Definition VPlan.h:4797
void dissolveToCFGLoop()
Remove the current region from its VPlan, connecting its predecessor to its entry,...
Definition VPlan.cpp:859
bool isReplicator() const
An indicator whether this region is to generate multiple replicated instances of output IR correspond...
Definition VPlan.h:4829
VPRegionValue * createHeaderMask()
Create the header mask for the region and return it.
Definition VPlan.h:4900
VPRegionValue * getUsedHeaderMask() const
Return the header mask if it exists and is used, or null otherwise.
Definition VPlan.h:4893
VPInstruction * getOrCreateCanonicalIVIncrement()
Get the canonical IV increment instruction if it exists.
Definition VPlan.cpp:885
InstructionCost cost(ElementCount VF, VPCostContext &Ctx) override
Return the cost of the block.
Definition VPlan.cpp:775
void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override
Print this VPRegionBlock to O (recursively), prefixing all lines with Indent.
Definition VPlan.cpp:836
Type * getCanonicalIVType() const
Return the type of the canonical IV for loop regions.
Definition VPlan.h:4881
const VPBranchOnMaskRecipe * getEntryBranchOnMask() const
Return the VPBranchOnMaskRecipe from the entry block of this replicating region.
Definition VPlan.cpp:707
bool hasCanonicalIVNUW() const
Indicates if NUW is set for the canonical IV increment, for loop regions.
Definition VPlan.h:4917
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPRegionBlock,...
Definition VPlan.cpp:734
VPRegionValue * getCanonicalIV()
Return the canonical induction variable of the region, null for replicating regions.
Definition VPlan.h:4873
const VPBlockBase * getExiting() const
Definition VPlan.h:4809
VPRegionValue * getHeaderMask() const
Return the header mask of the region, or null if not set.
Definition VPlan.h:4886
friend class VPlan
Definition VPlan.h:4754
VPValues are defined by a VPRegionBlock, like the canonical IV.
Definition VPlanValue.h:247
DebugLoc getDebugLoc() const
Returns the debug location of the VPRegionValue.
Definition VPlanValue.h:262
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
VPSingleDefValue(VPSingleDefRecipe *Def, Value *UV=nullptr, Type *Ty=nullptr)
Construct a VPSingleDefValue. Must only be used by VPSingleDefRecipe.
Definition VPlan.cpp:162
~VPSingleDefValue() override
Definition VPlan.cpp:168
friend class VPSingleDefRecipe
Definition VPlanValue.h:360
This class can be used to assign names to VPValues.
std::string getOrCreateName(const VPValue *V) const
Returns the name assigned to V, if there is one, otherwise try to construct one from the underlying v...
Definition VPlan.cpp:1623
const Module * getModule() const
Returns the module the plan operates on, if any.
void printMetadataAsOperand(raw_ostream &O, const MDNode *N)
Print a reference to metadata node N to O.
Definition VPlan.cpp:1619
A symbolic live-in VPValue, used for values like vector trip count, VF, and VFxUF.
Definition VPlanValue.h:212
Type * getType() const
Returns the scalar type of this symbolic value.
Definition VPlanValue.h:227
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:396
void replaceUsesOfWith(VPValue *From, VPValue *To)
Replaces all uses of From in the VPUser with To.
Definition VPlan.cpp:1509
void printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const
Print the operands to O.
Definition VPlan.cpp:1521
operand_range operands()
Definition VPlanValue.h:472
void setOperand(unsigned I, VPValue *New)
Definition VPlanValue.h:445
unsigned getNumOperands() const
Definition VPlanValue.h:436
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
bool isDefinedOutsideLoopRegions() const
Returns true if the VPValue is defined outside any loop.
Definition VPlan.cpp:1473
unsigned getVPValueID() const
Definition VPlanValue.h:101
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
Definition VPlan.cpp:123
void printAsOperand(raw_ostream &OS, VPSlotTracker &Tracker) const
Definition VPlan.cpp:1517
void assertNotMaterialized() const
Assert that this VPValue has not been materialized, if it is a VPSymbolicValue.
Definition VPlanValue.h:580
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
bool user_empty() const
Definition VPlanValue.h:161
@ VPVSingleDefValueSC
A symbolic live-in VPValue without IR backing.
Definition VPlanValue.h:85
@ VPVSymbolicSC
A live-in VPValue wrapping an IR Value.
Definition VPlanValue.h:84
@ VPRegionValueSC
A VPValue defined by a multi-def recipe.
Definition VPlanValue.h:87
@ VPVMultiDefValueSC
A VPValue defined by a VPSingleDefRecipe.
Definition VPlanValue.h:86
void dump() const
Dump the value to stderr (for debugging).
Definition VPlan.cpp:102
void print(raw_ostream &OS, VPSlotTracker &Tracker) const
Definition VPlan.cpp:95
void replaceAllUsesWith(VPValue *New)
Definition VPlan.cpp:1476
unsigned getNumUsers() const
Definition VPlanValue.h:115
LLVM_DUMP_METHOD void dump()
Definition VPlan.cpp:1335
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4940
LLVM_ABI_FOR_TEST void printDOT(raw_ostream &O) const
Print this VPlan in DOT format to O.
Definition VPlan.cpp:1179
friend class VPSlotTracker
Definition VPlan.h:4942
std::string getName() const
Return a string with the name of the plan and the applicable VFs and UFs.
Definition VPlan.cpp:1155
VPBasicBlock * getEntry()
Definition VPlan.h:5032
Type * getIndexType() const
The type of the canonical induction variable of the vector loop.
Definition VPlan.h:5376
void setName(const Twine &newName)
Definition VPlan.h:5209
LLVM_ABI_FOR_TEST ~VPlan()
Definition VPlan.cpp:913
bool isExitBlock(VPBlockBase *VPBB)
Returns true if VPBB is an exit block.
Definition VPlan.cpp:931
friend class VPlanPrinter
Definition VPlan.h:4941
VPSymbolicValue & getVFxUF()
Returns VF * UF of the vector loop region.
Definition VPlan.h:5135
VPIRBasicBlock * createEmptyVPIRBasicBlock(BasicBlock *IRBB)
Create a VPIRBasicBlock wrapping IRBB, but do not create VPIRInstructions wrapping the instructions i...
Definition VPlan.cpp:1312
auto getLiveIns() const
Return the list of live-in VPValues available in the VPlan.
Definition VPlan.h:5273
ArrayRef< VPIRBasicBlock * > getExitBlocks() const
Return an ArrayRef containing VPIRBasicBlocks wrapping the exit blocks of the original scalar loop.
Definition VPlan.h:5098
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
unsigned getConcreteUF() const
Returns the concrete UF of the plan, after unrolling.
Definition VPlan.h:5191
void setEntry(VPBasicBlock *VPBB)
Definition VPlan.h:5021
VPBasicBlock * createVPBasicBlock(const Twine &Name, VPRecipeBase *Recipe=nullptr)
Create a new VPBasicBlock with Name and containing Recipe if present.
Definition VPlan.h:5296
LLVM_ABI_FOR_TEST VPIRBasicBlock * createVPIRBasicBlock(BasicBlock *IRBB)
Create a VPIRBasicBlock from IRBB containing VPIRInstructions for all instructions in IRBB,...
Definition VPlan.cpp:1320
LLVM_DUMP_METHOD void dump() const
Dump the plan to stderr (for debugging).
Definition VPlan.cpp:1185
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
LLVM_ABI_FOR_TEST void print(raw_ostream &O) const
Print this VPlan to O.
Definition VPlan.cpp:1138
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
Definition VPlan.h:5094
void printLiveIns(raw_ostream &O) const
Print the live-ins of this VPlan to O.
Definition VPlan.cpp:1100
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 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.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:201
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:166
An efficient, type-erasing, non-owning reference to a callable.
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.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI std::string EscapeString(const std::string &Label)
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
bool match(Val *V, const Pattern &P)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
VPInstruction_match< VPInstruction::BranchOnTwoConds > m_BranchOnTwoConds()
VPInstruction_match< VPInstruction::BranchOnCount > m_BranchOnCount()
auto m_VPValue()
Match an arbitrary VPValue and ignore it.
VPInstruction_match< VPInstruction::BranchOnCond > m_BranchOnCond()
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...
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.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:846
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:61
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
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2570
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
LLVM_ABI cl::opt< bool > EnableFSDiscriminator
VPBuilderBase<> VPBuilder
Definition VPlan.h:66
Value * getRuntimeVF(IRBuilderBase &B, Type *Ty, ElementCount VF)
Return the runtime value for VF.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI std::optional< MDNode * > makeFollowupLoopID(MDNode *OrigLoopID, ArrayRef< StringRef > FollowupAttrs, const char *InheritOptionsAttrsPrefix="", bool AlwaysNew=false)
Create a new loop identifier for a loop created from a loop transformation.
void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
Definition STLExtras.h:2329
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
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
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
constexpr T divideNearest(U Numerator, V Denominator)
Returns (Numerator / Denominator) rounded by round-half-up.
Definition MathExtras.h:453
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
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
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
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.
bool canConstantBeExtended(const APInt *C, Type *NarrowType, TTI::PartialReductionExtendKind ExtKind)
Check if a constant CI can be safely treated as having been extended from a narrower type with the gi...
Definition VPlan.cpp:1829
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
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
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.
DWARFExpression::Operation Op
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
LLVM_ABI bool setLoopEstimatedTripCount(Loop *L, unsigned EstimatedTripCount, std::optional< unsigned > EstimatedLoopInvocationWeight=std::nullopt)
Set llvm.loop.estimated_trip_count with the value EstimatedTripCount in the loop metadata of L.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:2035
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1788
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
ArrayRef< Type * > getContainedTypes(Type *const &Ty)
Returns the types contained in Ty.
LLVM_ABI void DeleteDeadBlocks(ArrayRef< BasicBlock * > BBs, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified blocks from BB.
std::unique_ptr< VPlan > VPlanPtr
Definition VPlan.h:76
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:866
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
A range of powers-of-2 vectorization factors with fixed start and adjustable end.
Struct to hold various analysis needed for cost computations.
uint64_t getCostDivisor(std::optional< VPExecutionFrequency > Freq) const
Definition VPlan.cpp:1942
TargetTransformInfo::OperandValueInfo getOperandInfo(VPValue *V) const
Returns the OperandInfo for V, if it is a live-in.
Definition VPlan.cpp:1840
static bool isFreeScalarIntrinsic(Intrinsic::ID ID)
Returns true if ID is a pseudo intrinsic that is dropped via scalarization rather than widened.
Definition VPlan.cpp:1933
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,...
std::optional< unsigned > NumPredStores
Number of predicated stores in the VPlan, computed on demand.
InstructionCost getScalarizationOverhead(Type *ResultTy, ArrayRef< const VPValue * > Operands, ElementCount VF, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None, bool AlwaysIncludeReplicatingR=false)
Estimate the overhead of scalarizing a recipe with result type ResultTy and Operands with VF.
Definition VPlan.cpp:1857
TargetTransformInfo::TargetCostKind CostKind
VPSlotTracker * getSlotTracker()
Return a VPSlotTracker to re-use for printing, lazily constructing it on first use.
Definition VPlan.cpp:1848
const TargetTransformInfo & TTI
bool useEmulatedMaskMemRefHack(const VPReplicateRecipe *R, ElementCount VF)
Returns true if an artificially high cost for emulated masked memrefs should be used.
Definition VPlan.cpp:1895
const VectorizeOptions & Opts
A VPValue representing a live-in from the input IR or a constant.
Definition VPlanValue.h:274
Type * getType() const
Returns the type of the underlying IR value.
Definition VPlan.cpp:140
VPTransformState holds information passed down when "executing" a VPlan, needed for generating the ou...
LoopInfo * LI
Hold a pointer to LoopInfo to register new basic blocks in the loop.
void fixupHeaderPhis()
Add the backedge (latch) incoming value to the canonical, reduction and first-order recurrence phis i...
Definition VPlan.cpp:331
struct llvm::VPTransformState::DataState Data
struct llvm::VPTransformState::CFGState CFG
IRBuilderBase & Builder
Hold a reference to the IRBuilder used to generate output IR code.
bool hasScalarValue(const VPValue *Def, VPLane Lane)
Value * get(const VPValue *Def, bool NeedsSingleScalar=false)
Get the generated vector Value for a given VPValue Def if NeedsSingleScalar is false,...
Definition VPlan.cpp:270
const TargetTransformInfo * TTI
Target Transform Info.
VPTransformState(const TargetTransformInfo *TTI, ElementCount VF, LoopInfo *LI, DominatorTree *DT, AssumptionCache *AC, IRBuilderBase &Builder, VPlan *Plan, Loop *CurrentParentLoop)
Definition VPlan.cpp:235
VPlan * Plan
Pointer to the VPlan code is generated for.
void set(const VPValue *Def, Value *V, bool IsScalar=false)
Set the generated vector Value for a given VPValue, if IsScalar is false.
bool hasVectorValue(const VPValue *Def)
VPDominatorTree VPDT
VPlan-based dominator tree.
ElementCount VF
The chosen Vectorization Factor of the loop being vectorized.
AssumptionCache * AC
Hold a pointer to AssumptionCache to register new assumptions after replicating assume calls.
void setDebugLocFrom(DebugLoc DL)
Set the debug location in the builder using the debug location DL.
Definition VPlan.cpp:309
Loop * CurrentParentLoop
The parent loop object for the current scope, or nullptr.