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"
28#include "llvm/ADT/STLExtras.h"
31#include "llvm/ADT/Twine.h"
35#include "llvm/IR/BasicBlock.h"
36#include "llvm/IR/CFG.h"
37#include "llvm/IR/IRBuilder.h"
38#include "llvm/IR/Instruction.h"
40#include "llvm/IR/Type.h"
41#include "llvm/IR/Value.h"
44#include "llvm/Support/Debug.h"
50#include <cassert>
51#include <string>
52
53using namespace llvm;
54using namespace llvm::VPlanPatternMatch;
55
56namespace llvm {
60} // namespace llvm
61
62/// @{
63/// Metadata attribute names
64const char LLVMLoopVectorizeFollowupAll[] = "llvm.loop.vectorize.followup_all";
66 "llvm.loop.vectorize.followup_vectorized";
68 "llvm.loop.vectorize.followup_epilogue";
69/// @}
70
72 "vplan-print-in-dot-format", cl::Hidden,
73 cl::desc("Use dot format instead of plain text when dumping VPlans"));
74
75#define DEBUG_TYPE "loop-vectorize"
76
77#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
79 const VPBasicBlock *Parent = R.getParent();
80 VPSlotTracker SlotTracker(Parent ? Parent->getPlan() : nullptr);
81 R.print(OS, "", SlotTracker);
82 return OS;
83}
84#endif
85
87 const ElementCount &VF) const {
88 switch (LaneKind) {
90 // Lane = RuntimeVF - VF.getKnownMinValue() + Lane
91 return Builder.CreateSub(getRuntimeVF(Builder, Builder.getInt32Ty(), VF),
92 Builder.getInt32(VF.getKnownMinValue() - Lane));
94 return Builder.getInt64(Lane);
95 }
96 llvm_unreachable("Unknown lane kind");
97}
98
99#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
101 if (const VPRecipeBase *R = getDefiningRecipe())
102 R->print(OS, "", SlotTracker);
103 else
105}
106
107void VPValue::dump() const {
108 const VPRecipeBase *Instr = getDefiningRecipe();
110 (Instr && Instr->getParent()) ? Instr->getParent()->getPlan() : nullptr);
112 dbgs() << "\n";
113}
114
115void VPRecipeBase::dump() const {
116 VPSlotTracker SlotTracker(getParent() ? getParent()->getPlan() : nullptr);
117 print(dbgs(), "", SlotTracker);
118 dbgs() << "\n";
119}
120#endif
121
122#if !defined(NDEBUG)
123bool VPRecipeValue::isDefinedBy(const VPDef *D) const {
124 return getDefiningRecipe() == D;
125}
126#endif
127
129 auto *RecipeValue = dyn_cast<VPRecipeValue>(this);
130 if (!RecipeValue)
131 return nullptr;
132 if (auto *MultiDef = dyn_cast<VPMultiDefValue>(RecipeValue))
133 return MultiDef->getDef();
134 return static_cast<VPSingleDefRecipe *>(RecipeValue);
135}
136
138 return const_cast<VPValue *>(this)->getDefiningRecipe();
139}
140
142 return cast<VPIRValue>(this)->getValue();
143}
144
146
148 switch (getVPValueID()) {
149 case VPVIRValueSC:
150 return cast<VPIRValue>(this)->getType();
151 case VPRegionValueSC:
152 return cast<VPRegionValue>(this)->getType();
153 case VPVSymbolicSC:
154 return cast<VPSymbolicValue>(this)->getType();
157 return cast<VPRecipeValue>(this)->getScalarType();
158 }
159 llvm_unreachable("Unhandled VPValue subclass");
160}
161
163 assert(Users.empty() &&
164 "trying to delete a VPRecipeValue with remaining users");
165}
166
169 assert(Def && "VPSingleDefValue requires a defining recipe");
170 Def->addDefinedValue(this);
171}
172
174 getDefiningRecipe()->removeDefinedValue(this);
175}
176
178 : VPRecipeValue(VPVMultiDefValueSC, UV, Ty), Def(Def) {
179 assert(Def && "VPMultiDefValue requires a defining recipe");
180 Def->addDefinedValue(this);
181}
182
184 getDefiningRecipe()->removeDefinedValue(this);
185}
186
187/// \return the VPBasicBlock that is the entry of Block, possibly indirectly.
194
201
202/// \return the VPBasicBlock that is the exit of Block, possibly indirectly.
204 const VPBlockBase *Block = this;
206 Block = Region->getExiting();
208}
209
216
218 if (!Successors.empty() || !Parent)
219 return this;
220 assert(Parent->getExiting() == this &&
221 "Block w/o successors not the exiting block of its parent.");
222 return Parent->getEnclosingBlockWithSuccessors();
223}
224
226 if (!Predecessors.empty() || !Parent)
227 return this;
228 assert(Parent->getEntry() == this &&
229 "Block w/o predecessors not the entry of its parent.");
230 return Parent->getEnclosingBlockWithPredecessors();
231}
232
234 iterator It = begin();
235 while (It != end() && It->isPhi())
236 It++;
237 return It;
238}
239
247
248Value *VPTransformState::get(const VPValue *Def, const VPLane &Lane) {
250 "VPRegionValue must be materialized before VPTransformState::get");
252 return Def->getUnderlyingValue();
253
254 if (hasScalarValue(Def, Lane))
255 return Data.VPV2Scalars[Def][Lane.mapToCacheIndex(VF)];
256
257 if (!Lane.isFirstLane() && vputils::isSingleScalar(Def) &&
259 return Data.VPV2Scalars[Def][0];
260 }
261
263 auto *VecPart = Data.VPV2Vector[Def];
264 if (!VecPart->getType()->isVectorTy()) {
265 assert(Lane.isFirstLane() && "cannot get lane > 0 for scalar");
266 return VecPart;
267 }
268 // TODO: Cache created scalar values.
269 Value *LaneV = Lane.getAsRuntimeExpr(Builder, VF);
270 auto *Extract = Builder.CreateExtractElement(VecPart, LaneV);
271 // set(Def, Extract, Instance);
272 return Extract;
273}
274
275Value *VPTransformState::get(const VPValue *Def, bool NeedsSingleScalar) {
277 "VPRegionValue must be materialized before VPTransformState::get");
278 if (NeedsSingleScalar) {
279 assert((VF.isScalar() || isa<VPIRValue, VPSymbolicValue>(Def) ||
281 (hasScalarValue(Def, VPLane(0)) &&
282 Data.VPV2Scalars[Def].size() == 1)) &&
283 "Trying to access a single scalar per part but has multiple scalars "
284 "per part.");
285 return get(Def, VPLane(0));
286 }
287
288 // If Values have been set for this Def return the one relevant for \p Part.
289 if (hasVectorValue(Def))
290 return Data.VPV2Vector[Def];
291
292 auto GetBroadcastInstrs = [this](Value *V) {
293 if (VF.isScalar())
294 return V;
295 // Broadcast the scalar into all locations in the vector.
296 Value *Shuf = Builder.CreateVectorSplat(VF, V, "broadcast");
297 return Shuf;
298 };
299
300 Value *ScalarValue = get(Def, VPLane(0));
303 if (auto *LastInst = dyn_cast<Instruction>(get(Def, LastLane)))
304 // Set the insert point after the last scalarized instruction. This
305 // ensures the insertelement sequence will directly follow the scalar
306 // definitions.
307 if (auto InsertPt = LastInst->getInsertionPointAfterDef())
308 Builder.SetInsertPoint(*InsertPt);
309 Value *VectorValue = GetBroadcastInstrs(ScalarValue);
310 set(Def, VectorValue);
311 return VectorValue;
312}
313
315 const DILocation *DIL = DL;
316 // When a FSDiscriminator is enabled, we don't need to add the multiply
317 // factors to the discriminators.
318 if (DIL &&
319 Builder.GetInsertBlock()
320 ->getParent()
321 ->shouldEmitDebugInfoForProfiling() &&
323 // FIXME: For scalable vectors, assume vscale=1.
324 unsigned UF = Plan->getConcreteUF();
325 auto NewDIL =
326 DIL->cloneByMultiplyingDuplicationFactor(UF * VF.getKnownMinValue());
327 if (NewDIL)
328 Builder.SetCurrentDebugLocation(*NewDIL);
329 else
330 LLVM_DEBUG(dbgs() << "Failed to create new discriminator: "
331 << DIL->getFilename() << " Line: " << DIL->getLine());
332 } else
333 Builder.SetCurrentDebugLocation(DL);
334}
335
337 for (VPBlockBase *VPB : vp_depth_first_shallow(Plan->getEntry())) {
338 if (!VPBlockUtils::isHeader(VPB, VPDT))
339 continue;
340 auto *Header = cast<VPBasicBlock>(VPB);
341 auto *LatchVPBB = cast<VPBasicBlock>(Header->getPredecessors()[1]);
342 BasicBlock *VectorLatchBB = CFG.VPBB2IRBB[LatchVPBB];
343
344 for (VPRecipeBase &R : Header->phis()) {
345 auto *PhiR = cast<VPSingleDefRecipe>(&R);
346 bool NeedsSingleScalar =
347 isa<VPPhi>(PhiR) || (isa<VPReductionPHIRecipe>(PhiR) &&
348 cast<VPReductionPHIRecipe>(PhiR)->isInLoop());
349
350 Value *Phi = get(PhiR, NeedsSingleScalar);
351 Value *Val = get(PhiR->getOperand(1), NeedsSingleScalar);
352 cast<PHINode>(Phi)->addIncoming(Val, VectorLatchBB);
353 }
354 }
355}
356
357BasicBlock *VPBasicBlock::createEmptyBasicBlock(VPTransformState &State) {
358 auto &CFG = State.CFG;
359 // BB stands for IR BasicBlocks. VPBB stands for VPlan VPBasicBlocks.
360 // Pred stands for Predessor. Prev stands for Previous - last visited/created.
361 BasicBlock *PrevBB = CFG.PrevBB;
362 BasicBlock *NewBB = BasicBlock::Create(PrevBB->getContext(), getName(),
363 PrevBB->getParent(), CFG.ExitBB);
364 LLVM_DEBUG(dbgs() << "LV: created " << NewBB->getName() << '\n');
365
366 return NewBB;
367}
368
370 auto &CFG = State.CFG;
371 BasicBlock *NewBB = CFG.VPBB2IRBB[this];
372
373 // Register NewBB in its loop. In innermost loops its the same for all
374 // BB's.
375 Loop *ParentLoop = State.CurrentParentLoop;
376 // If this block has a sole successor that is an exit block or is an exit
377 // block itself then it needs adding to the same parent loop as the exit
378 // block.
379 VPBlockBase *SuccOrExitVPB = getSingleSuccessor();
380 SuccOrExitVPB = SuccOrExitVPB ? SuccOrExitVPB : this;
381 if (State.Plan->isExitBlock(SuccOrExitVPB)) {
382 ParentLoop = State.LI->getLoopFor(
383 cast<VPIRBasicBlock>(SuccOrExitVPB)->getIRBasicBlock());
384 }
385
386 if (ParentLoop && !State.LI->getLoopFor(NewBB))
387 ParentLoop->addBasicBlockToLoop(NewBB, *State.LI);
388
390 if (VPBlockUtils::isHeader(this, State.VPDT)) {
391 // There's no block for the latch yet, connect to the preheader only.
392 Preds = {getPredecessors()[0]};
393 } else {
394 Preds = to_vector(getPredecessors());
395 }
396
397 // Hook up the new basic block to its predecessors.
398 for (VPBlockBase *PredVPBlock : Preds) {
399 VPBasicBlock *PredVPBB = PredVPBlock->getExitingBasicBlock();
400 auto &PredVPSuccessors = PredVPBB->getHierarchicalSuccessors();
401 assert(CFG.VPBB2IRBB.contains(PredVPBB) &&
402 "Predecessor basic-block not found building successor.");
403 BasicBlock *PredBB = CFG.VPBB2IRBB[PredVPBB];
404 auto *PredBBTerminator = PredBB->getTerminator();
405 LLVM_DEBUG(dbgs() << "LV: draw edge from " << PredBB->getName() << '\n');
406
407 if (isa<UnreachableInst>(PredBBTerminator)) {
408 assert(PredVPSuccessors.size() == 1 &&
409 "Predecessor ending w/o branch must have single successor.");
410 DebugLoc DL = PredBBTerminator->getDebugLoc();
411 PredBBTerminator->eraseFromParent();
412 auto *Br = UncondBrInst::Create(NewBB, PredBB);
413 Br->setDebugLoc(DL);
414 } else if (auto *UBI = dyn_cast<UncondBrInst>(PredBBTerminator)) {
415 UBI->setSuccessor(NewBB);
416 } else {
417 // Set each forward successor here when it is created, excluding
418 // backedges. A backward successor is set when the branch is created.
419 // Generated successors are redirected, as for the entry block and for
420 // blocks bypassing both vector loops during epilogue vectorization. Edges
421 // already present in the generated IR need no update; this happens during
422 // epilogue vectorization, where the plan models blocks generated for the
423 // main vector loop.
424 // TODO: Remove the exception by modeling those terminators using
425 // BranchOnCond.
426 auto *TermBr = cast<CondBrInst>(PredBBTerminator);
427 if (TermBr->getSuccessor(0) != NewBB &&
428 TermBr->getSuccessor(1) != NewBB) {
429 unsigned Idx = PredVPSuccessors.front() == this ? 0 : 1;
430 BasicBlock *ReplacedSucc = TermBr->getSuccessor(Idx);
431 assert(
432 (!ReplacedSucc || isa<VPIRBasicBlock>(PredVPBB)) &&
433 "only VPIRBasicBlock predecessors may have an existing successor "
434 "redirected");
435 if (ReplacedSucc)
436 ReplacedSucc->removePredecessor(PredBB, /*KeepOneInputPHIs=*/true);
437 TermBr->setSuccessor(Idx, NewBB);
438 if (ReplacedSucc)
439 CFG.DTU.applyUpdates({{DominatorTree::Delete, PredBB, ReplacedSucc}});
440 }
441 }
442 CFG.DTU.applyUpdates({{DominatorTree::Insert, PredBB, NewBB}});
443 }
444}
445
448 "VPIRBasicBlock can have at most two successors at the moment!");
449 // Move completely disconnected blocks to their final position.
450 if (IRBB->hasNPredecessors(0) && succ_begin(IRBB) == succ_end(IRBB))
451 IRBB->moveAfter(State->CFG.PrevBB);
452 State->Builder.SetInsertPoint(IRBB->getTerminator());
453 State->CFG.PrevBB = IRBB;
454 State->CFG.VPBB2IRBB[this] = IRBB;
455 executeRecipes(State, IRBB);
456 // Create a branch instruction to terminate IRBB if one was not created yet
457 // and is needed.
458 if (getSingleSuccessor() && isa<UnreachableInst>(IRBB->getTerminator())) {
459 auto *Br = State->Builder.CreateBr(IRBB);
460 Br->setOperand(0, nullptr);
461 IRBB->getTerminator()->eraseFromParent();
462 } else {
463 assert((getNumSuccessors() == 0 ||
464 isa<UncondBrInst, CondBrInst>(IRBB->getTerminator())) &&
465 "other blocks must be terminated by a branch");
466 }
467
468 connectToPredecessors(*State);
469}
470
471VPIRBasicBlock *VPIRBasicBlock::clone() {
472 auto *NewBlock = getPlan()->createEmptyVPIRBasicBlock(IRBB);
473 for (VPRecipeBase &R : Recipes)
474 NewBlock->appendRecipe(R.clone());
475 return NewBlock;
476}
477
479 if (VPBlockUtils::isHeader(this, State->VPDT)) {
480 // Create and register the new vector loop.
481 Loop *PrevParentLoop = State->CurrentParentLoop;
482 State->CurrentParentLoop = State->LI->AllocateLoop();
483
484 // Insert the new loop into the loop nest and register the new basic blocks
485 // before calling any utilities such as SCEV that require valid LoopInfo.
486 if (PrevParentLoop)
487 PrevParentLoop->addChildLoop(State->CurrentParentLoop);
488 else
489 State->LI->addTopLevelLoop(State->CurrentParentLoop);
490 }
491
492 // 1. Create an IR basic block.
493 BasicBlock *NewBB = createEmptyBasicBlock(*State);
494
495 State->Builder.SetInsertPoint(NewBB);
496 // Temporarily terminate with unreachable until CFG is rewired.
497 UnreachableInst *Terminator = State->Builder.CreateUnreachable();
498 State->Builder.SetInsertPoint(Terminator);
499
500 State->CFG.PrevBB = NewBB;
501 State->CFG.VPBB2IRBB[this] = NewBB;
502 connectToPredecessors(*State);
503
504 // 2. Fill the IR basic block with IR instructions.
505 executeRecipes(State, NewBB);
506
507 // If this block is a latch, update CurrentParentLoop.
508 if (VPBlockUtils::isLatch(this, State->VPDT))
509 State->CurrentParentLoop = State->CurrentParentLoop->getParentLoop();
510}
511
512VPBasicBlock *VPBasicBlock::clone() {
513 auto *NewBlock = getPlan()->createVPBasicBlock(getName());
514 for (VPRecipeBase &R : *this)
515 NewBlock->appendRecipe(R.clone());
516 return NewBlock;
517}
518
520 LLVM_DEBUG(dbgs() << "LV: vectorizing VPBB: " << getName()
521 << " in BB: " << BB->getName() << '\n');
522
523 State->CFG.PrevVPBB = this;
524
525 for (VPRecipeBase &Recipe : Recipes) {
526 State->setDebugLocFrom(Recipe.getDebugLoc());
527 Recipe.execute(*State);
528 }
529
530 LLVM_DEBUG(dbgs() << "LV: filled BB: " << *BB);
531}
532
533VPBasicBlock *VPBasicBlock::splitAt(iterator SplitAt) {
534 assert((SplitAt == end() || SplitAt->getParent() == this) &&
535 "can only split at a position in the same block");
536
537 // Create new empty block after the block to split.
538 auto *SplitBlock = getPlan()->createVPBasicBlock(getName() + ".split");
540
541 // If this is the exiting block, make the split the new exiting block.
542 auto *ParentRegion = getParent();
543 if (ParentRegion && ParentRegion->getExiting() == this)
544 ParentRegion->setExiting(SplitBlock);
545
546 // Finally, move the recipes starting at SplitAt to new block.
547 for (VPRecipeBase &ToMove :
548 make_early_inc_range(make_range(SplitAt, this->end())))
549 ToMove.moveBefore(*SplitBlock, SplitBlock->end());
550
551 return SplitBlock;
552}
553
554/// Return the enclosing loop region for region \p P. The templated version is
555/// used to support both const and non-const block arguments.
556template <typename T> static T *getEnclosingLoopRegionForRegion(T *P) {
557 if (P && P->isReplicator()) {
558 P = P->getParent();
559 // Multiple loop regions can be nested, but replicate regions can only be
560 // nested inside a loop region or must be outside any other region.
561 assert((!P || !P->isReplicator()) && "unexpected nested replicate regions");
562 }
563 return P;
564}
565
569
573
574static bool hasConditionalTerminator(const VPBasicBlock *VPBB) {
575 if (VPBB->empty()) {
576 assert(
577 VPBB->getNumSuccessors() < 2 &&
578 "block with multiple successors doesn't have a recipe as terminator");
579 return false;
580 }
581
582 const VPRecipeBase *R = &VPBB->back();
583 [[maybe_unused]] bool IsSwitch =
585 cast<VPInstruction>(R)->getOpcode() == Instruction::Switch;
586 [[maybe_unused]] bool IsBranchOnTwoConds = match(R, m_BranchOnTwoConds());
587 [[maybe_unused]] bool IsCondBranch =
590 if (VPBB->getNumSuccessors() == 2 ||
591 (VPBB->isExiting() && !VPBB->getParent()->isReplicator())) {
592 assert((IsCondBranch || IsSwitch || IsBranchOnTwoConds) &&
593 "block with multiple successors not terminated by "
594 "conditional branch nor switch recipe");
595
596 return true;
597 }
598
599 if (VPBB->getNumSuccessors() > 2) {
600 assert((IsSwitch || IsBranchOnTwoConds) &&
601 "block with more than 2 successors not terminated by a switch or "
602 "branch-on-two-conds recipe");
603 return true;
604 }
605
606 assert(
607 !IsCondBranch && !IsBranchOnTwoConds &&
608 "block with 0 or 1 successors terminated by conditional branch recipe");
609 return false;
610}
611
613 if (hasConditionalTerminator(this))
614 return &back();
615 return nullptr;
616}
617
619 if (hasConditionalTerminator(this))
620 return &back();
621 return nullptr;
622}
623
625 return getParent() && getParent()->getExitingBasicBlock() == this;
626}
627
628#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
633
634void VPBlockBase::printSuccessors(raw_ostream &O, const Twine &Indent) const {
635 if (!hasSuccessors()) {
636 O << Indent << "No successors\n";
637 } else {
638 O << Indent << "Successor(s): ";
639 ListSeparator LS;
640 for (auto *Succ : getSuccessors())
641 O << LS << Succ->getName();
642 O << '\n';
643 }
644}
645
646void VPBasicBlock::print(raw_ostream &O, const Twine &Indent,
647 VPSlotTracker &SlotTracker) const {
648 O << Indent << getName() << ":\n";
649
650 auto RecipeIndent = Indent + " ";
651 for (const VPRecipeBase &Recipe : *this) {
652 Recipe.print(O, RecipeIndent, SlotTracker);
653 O << '\n';
654 }
655
656 printSuccessors(O, Indent);
657}
658#endif
659
660std::pair<VPBlockBase *, VPBlockBase *>
663 VPBlockBase *Exiting = nullptr;
664 bool InRegion = Entry->getParent();
665 // First, clone blocks reachable from Entry.
666 for (VPBlockBase *BB : vp_depth_first_shallow(Entry)) {
667 VPBlockBase *NewBB = BB->clone();
668 Old2NewVPBlocks[BB] = NewBB;
669 if (InRegion && BB->getNumSuccessors() == 0) {
670 assert(!Exiting && "Multiple exiting blocks?");
671 Exiting = BB;
672 }
673 }
674 assert((!InRegion || Exiting) && "regions must have a single exiting block");
675
676 // Second, update the predecessors & successors of the cloned blocks.
677 for (VPBlockBase *BB : vp_depth_first_shallow(Entry)) {
678 VPBlockBase *NewBB = Old2NewVPBlocks[BB];
680 for (VPBlockBase *Pred : BB->getPredecessors()) {
681 NewPreds.push_back(Old2NewVPBlocks[Pred]);
682 }
683 NewBB->setPredecessors(NewPreds);
685 for (VPBlockBase *Succ : BB->successors()) {
686 NewSuccs.push_back(Old2NewVPBlocks[Succ]);
687 }
688 NewBB->setSuccessors(NewSuccs);
689 }
690
691#if !defined(NDEBUG)
692 // Verify that the order of predecessors and successors matches in the cloned
693 // version.
694 for (const auto &[OldBB, NewBB] :
696 vp_depth_first_shallow(Old2NewVPBlocks[Entry]))) {
697 for (const auto &[OldPred, NewPred] :
698 zip(OldBB->getPredecessors(), NewBB->getPredecessors()))
699 assert(NewPred == Old2NewVPBlocks[OldPred] && "Different predecessors");
700
701 for (const auto &[OldSucc, NewSucc] :
702 zip(OldBB->successors(), NewBB->successors()))
703 assert(NewSucc == Old2NewVPBlocks[OldSucc] && "Different successors");
704 }
705#endif
706
707 return std::make_pair(Old2NewVPBlocks[Entry],
708 Exiting ? Old2NewVPBlocks[Exiting] : nullptr);
709}
710
712 const auto *EntryBB = cast<VPBasicBlock>(getEntry());
713 assert(isReplicator() && EntryBB && EntryBB->size() == 1 &&
714 "not a valid replicating region");
715 return cast<VPBranchOnMaskRecipe>(&EntryBB->front());
716}
717
718VPRegionBlock *VPRegionBlock::clone() {
719 const auto &[NewEntry, NewExiting] = VPBlockUtils::cloneFrom(getEntry());
720 VPlan &Plan = *getPlan();
721 VPRegionValue *CanIV = getCanonicalIV();
722 VPRegionBlock *NewRegion =
723 CanIV ? Plan.createLoopRegion(CanIV->getType(), CanIV->getDebugLoc(),
724 getName(), NewEntry, NewExiting)
725 : Plan.createReplicateRegion(NewEntry, NewExiting, getName());
726
727 if (getHeaderMask())
728 NewRegion->createHeaderMask();
729
730 if (CanIV && !hasCanonicalIVNUW())
731 NewRegion->CanIVInfo->clearNUW();
732
733 for (VPBlockBase *Block : vp_depth_first_shallow(NewEntry))
734 Block->setParent(NewRegion);
735 return NewRegion;
736}
737
739 llvm_unreachable("regions must get dissolved before ::execute");
740}
741
744 for (VPRecipeBase &R : Recipes)
745 Cost += R.cost(VF, Ctx);
746 return Cost;
747}
748
749const VPBasicBlock *VPBasicBlock::getCFGPredecessor(unsigned Idx) const {
750 const VPBlockBase *Pred = nullptr;
751 if (hasPredecessors()) {
752 Pred = getPredecessors()[Idx];
753 } else {
754 auto *Region = getParent();
755 assert(Region && !Region->isReplicator() && Region->getEntry() == this &&
756 "must be in the entry block of a non-replicate region");
757 assert(Idx < 2 && Region->getNumPredecessors() == 1 &&
758 "loop region has a single predecessor (preheader), its entry block "
759 "has 2 incoming blocks");
760
761 // Idx == 0 selects the predecessor of the region, Idx == 1 selects the
762 // region itself whose exiting block feeds the phi across the backedge.
763 Pred = Idx == 0 ? Region->getSinglePredecessor() : Region;
764 }
765 return Pred->getExitingBasicBlock();
766}
767
769 if (!isReplicator()) {
772 Cost += Block->cost(VF, Ctx);
773 // Add the costs of the loop's backedge and canonical IV increment
774 auto AddCost = [&](InstructionCost C, const char *Name) {
775 if (ForceTargetInstructionCost.getNumOccurrences())
777 LLVM_DEBUG(dbgs() << "Cost of " << C << " for VF " << VF << ": " << Name
778 << "\n");
779 Cost += C;
780 };
781 AddCost(Ctx.TTI.getCFInstrCost(Instruction::UncondBr, Ctx.CostKind),
782 "vector loop backedge");
784 AddCost(Ctx.TTI.getArithmeticInstrCost(
785 Instruction::Add, getCanonicalIVType(), Ctx.CostKind),
786 "canonical IV increment");
787 return Cost;
788 }
789
790 // Compute the cost of a replicate region. Replicating isn't supported for
791 // scalable vectors, return an invalid cost for them.
792 // TODO: Discard scalable VPlans with replicate recipes earlier after
793 // construction.
794 if (VF.isScalable())
796
797 // Compute and return the cost of the conditionally executed recipes.
798 assert(VF.isVector() && "Can only compute vector cost at the moment.");
800 return Then->cost(VF, Ctx);
801}
802
803#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
805 VPSlotTracker &SlotTracker) const {
806 O << Indent << (isReplicator() ? "<xVFxUF> " : "<x1> ") << getName() << ": {";
807 auto NewIndent = Indent + " ";
808 if (auto *CanIV = getCanonicalIV()) {
809 O << '\n';
810 CanIV->print(O, SlotTracker);
811 O << " = CANONICAL-IV\n";
812 }
813 if (auto *HdrMask = getUsedHeaderMask()) {
814 HdrMask->print(O, SlotTracker);
815 O << " = HEADER-MASK\n";
816 }
817 for (auto *BlockBase : vp_depth_first_shallow(Entry)) {
818 O << '\n';
819 BlockBase->print(O, NewIndent, SlotTracker);
820 }
821 O << Indent << "}\n";
822
823 printSuccessors(O, Indent);
824}
825#endif
826
828 auto *Header = cast<VPBasicBlock>(getEntry());
829 auto *ExitingLatch = cast<VPBasicBlock>(getExiting());
830 auto *CanIV = getCanonicalIV();
831 if (!CanIV->user_empty()) {
832 VPlan &Plan = *getPlan();
833 auto *Zero = Plan.getZero(CanIV->getType());
834 DebugLoc DL = CanIV->getDebugLoc();
836 VPBuilder HeaderBuilder(Header, Header->begin());
837 auto *ScalarR =
838 HeaderBuilder.createScalarPhi({Zero, CanIVInc}, DL, "index");
839 CanIV->replaceAllUsesWith(ScalarR);
840 }
841
842 VPBlockBase *Preheader = getSinglePredecessor();
843 VPBlockUtils::disconnectBlocks(Preheader, this);
844
845 for (VPBlockBase *VPB : vp_depth_first_shallow(Entry))
846 VPB->setParent(getParent());
847
848 VPBlockUtils::connectBlocks(Preheader, Header);
849 VPBlockUtils::transferSuccessors(this, ExitingLatch);
850 VPBlockUtils::connectBlocks(ExitingLatch, Header);
851}
852
854 // TODO: Represent the increment as VPRegionValue as well.
855 VPRegionValue *CanIV = getCanonicalIV();
856 assert(CanIV && "Expected a canonical IV");
857
858 if (auto *Inc = vputils::findCanonicalIVIncrement(*getPlan()))
859 return Inc;
860
861 assert(!getPlan()->getVFxUF().isMaterialized() &&
862 "VFxUF can be used only before it is materialized.");
863 auto *ExitingLatch = cast<VPBasicBlock>(getExiting());
864 return VPBuilder(ExitingLatch->getTerminator())
865 .createOverflowingOp(Instruction::Add, {CanIV, &getPlan()->getVFxUF()},
866 {hasCanonicalIVNUW(), /* HasNSW */ false},
867 CanIV->getDebugLoc(), "index.next");
868}
869
870VPlan::VPlan(Loop *L, Type *IdxTy)
871 : VectorTripCount(IdxTy), VF(IdxTy), UF(IdxTy), VFxUF(IdxTy) {
872 setEntry(createVPIRBasicBlock(L->getLoopPreheader()));
873 ScalarHeader = createVPIRBasicBlock(L->getHeader());
874
875 SmallVector<BasicBlock *> IRExitBlocks;
876 L->getUniqueExitBlocks(IRExitBlocks);
877 for (BasicBlock *EB : IRExitBlocks)
878 ExitBlocks.push_back(createVPIRBasicBlock(EB));
879}
880
882 VPSymbolicValue DummyValue(nullptr);
883
884 // Redirect all recipe operands to DummyValue before deleting blocks.
885 for (VPBasicBlock *VPBB :
887 for (VPRecipeBase &R : *VPBB)
888 for (unsigned I = 0, E = R.getNumOperands(); I != E; I++)
889 R.setOperand(I, &DummyValue);
890
891 for (auto [Idx, VPB] : enumerate(CreatedBlocks)) {
892 assert(VPB->getNumber() == Idx && "block with mismatched number");
893 delete VPB;
894 }
895 for (VPValue *VPV : getLiveIns())
896 delete VPV;
897 delete BackedgeTakenCount;
898}
899
901 return is_contained(ExitBlocks, VPBB);
902}
903
904/// To make RUN_VPLAN_PASS print final VPlan.
905static void printFinalVPlan(VPlan &) {}
906
907/// Generate the code inside the preheader and body of the vectorized loop.
908/// Assumes a single pre-header basic-block was created for this. Introduce
909/// additional basic-blocks as needed, and fill them all.
912 "all region blocks must be dissolved before ::execute");
913
914 // Initialize CFG state.
915 State->CFG.PrevVPBB = nullptr;
916 State->CFG.ExitBB = State->CFG.PrevBB->getSingleSuccessor();
917
918 // Update VPDominatorTree since VPBasicBlock may be removed after State was
919 // constructed.
920 State->VPDT.recalculate(*this);
921
922 // Disconnect VectorPreHeader from ExitBB in both the CFG and DT.
923 BasicBlock *VectorPreHeader = State->CFG.PrevBB;
924 cast<UncondBrInst>(VectorPreHeader->getTerminator())->setSuccessor(nullptr);
925 State->CFG.DTU.applyUpdates(
926 {{DominatorTree::Delete, VectorPreHeader, State->CFG.ExitBB}});
927
928 LLVM_DEBUG(dbgs() << "Executing best plan with VF=" << State->VF
929 << ", UF=" << getConcreteUF() << '\n');
930 setName("Final VPlan");
931 // TODO: RUN_VPLAN_PASS/VPlanTransforms::runPass should automatically dump
932 // VPlans after some specific stages when "-debug" is specified, but that
933 // hasn't been implemented yet. For now, just do both:
934 LLVM_DEBUG(dump());
936
937 BasicBlock *ScalarPh = State->CFG.ExitBB;
938 VPBasicBlock *ScalarPhVPBB = getScalarPreheader();
939 if (ScalarPhVPBB) {
940 // Disconnect scalar preheader and scalar header, as the dominator tree edge
941 // will be updated as part of VPlan execution. This allows keeping the DTU
942 // logic generic during VPlan execution.
943 State->CFG.DTU.applyUpdates(
944 {{DominatorTree::Delete, ScalarPh, ScalarPh->getSingleSuccessor()}});
945 }
947 Entry);
948 // Generate code for the VPlan, in parts of the vector skeleton, loop body and
949 // successor blocks including the middle, exit and scalar preheader blocks.
950 for (VPBlockBase *Block : RPOT)
951 Block->execute(State);
952
953 if (hasEarlyExit()) {
954 // Fix up LoopInfo for extra dispatch blocks when vectorizing loops with
955 // early exits. For dispatch blocks, we need to find the smallest common
956 // loop of all successors that are in a loop. Note: we only need to update
957 // loop info for blocks after the middle block, but there is no easy way to
958 // get those at this point.
959 for (VPBlockBase *VPB : reverse(RPOT)) {
960 auto *VPBB = dyn_cast<VPBasicBlock>(VPB);
961 if (!VPBB || isa<VPIRBasicBlock>(VPBB))
962 continue;
963 BasicBlock *BB = State->CFG.VPBB2IRBB[VPBB];
964 Loop *L = State->LI->getLoopFor(BB);
965 if (!L || any_of(successors(BB),
966 [L](BasicBlock *Succ) { return L->contains(Succ); }))
967 continue;
968 // Find the innermost loop containing all successors that are in a loop.
969 // Successors not in any loop don't constrain the target loop.
970 Loop *Target = nullptr;
971 for (BasicBlock *Succ : successors(BB)) {
972 Loop *SuccLoop = State->LI->getLoopFor(Succ);
973 if (!SuccLoop)
974 continue;
975 if (!Target)
976 Target = SuccLoop;
977 else
978 Target = State->LI->getSmallestCommonLoop(Target, SuccLoop);
979 }
980 State->LI->removeBlock(BB);
981 if (Target)
982 Target->addBasicBlockToLoop(BB, *State->LI);
983 }
984 }
985
986 // If the original loop is unreachable, delete it and all its blocks.
987 if (!ScalarPhVPBB) {
988 // DeleteDeadBlocks will remove single-entry phis. Remove them from the exit
989 // VPIRBBs in VPlan as well, otherwise we would retain references to deleted
990 // IR instructions.
991 for (VPIRBasicBlock *EB : getExitBlocks()) {
992 for (VPRecipeBase &R : make_early_inc_range(EB->phis())) {
993 if (R.getNumOperands() == 1)
994 R.eraseFromParent();
995 }
996 }
997
998 Loop *OrigLoop =
999 State->LI->getLoopFor(getScalarHeader()->getIRBasicBlock());
1000 SmallVector<BasicBlock *> Blocks(OrigLoop->block_begin(),
1001 OrigLoop->block_end());
1002 Blocks.push_back(ScalarPh);
1003 while (!OrigLoop->isInnermost())
1004 State->LI->erase(*OrigLoop->begin());
1005 State->LI->erase(OrigLoop);
1006 for (auto *BB : Blocks)
1007 State->LI->removeBlock(BB);
1008 DeleteDeadBlocks(Blocks, &State->CFG.DTU);
1009 }
1010
1011 State->CFG.DTU.flush();
1012
1013 // Fix the latch (backedge) value of all header phis in all loop headers.
1014 State->fixupHeaderPhis();
1015}
1016
1018 // For now only return the cost of the vector loop region, ignoring any other
1019 // blocks, like the preheader or middle blocks, expect for checking them for
1020 // recipes with invalid costs.
1022
1023 // If the cost of the loop region is invalid or any recipe in the skeleton
1024 // outside loop regions are invalid return an invalid cost.
1027 [&VF, &Ctx](VPBasicBlock *VPBB) {
1028 return !VPBB->cost(VF, Ctx).isValid();
1029 }))
1031
1032 return Cost;
1033}
1034
1036 // Find the vector loop region by following the last successor of each block,
1037 // starting from the plan's entry; the vector code path is always the last
1038 // successor. Every block on the path has a single predecessor, except the
1039 // vector preheader, which is also entered from the block bypassing the main
1040 // vector loop when vectorizing the epilogue. Stop at any other block with
1041 // multiple predecessors: in a plain CFG that is the loop header (no region
1042 // exists yet), in a region based CFG the scalar preheader.
1043 for (VPBlockBase *B = Entry; B;) {
1044 if (auto *R = dyn_cast<VPRegionBlock>(B))
1045 return R->isReplicator() || R->getNumPredecessors() != 1 ? nullptr : R;
1046 VPBlockBase *Succ =
1047 B->hasSuccessors() ? B->getSuccessors().back() : nullptr;
1048 if (B->getNumPredecessors() > 1 && !isa_and_present<VPRegionBlock>(Succ))
1049 return nullptr;
1050 B = Succ;
1051 }
1052 return nullptr;
1053}
1054
1056 return const_cast<VPlan *>(this)->getVectorLoopRegion();
1057}
1058
1060 const VPRegionBlock *LoopRegion = getVectorLoopRegion();
1061 assert(LoopRegion && "expected a vector loop region");
1063 vp_depth_first_shallow(LoopRegion->getEntry())),
1064 [](const VPRegionBlock *R) { return !R->isReplicator(); });
1065}
1066
1067#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1070
1071 if (!VF.user_empty()) {
1072 O << "\nLive-in ";
1073 VF.printAsOperand(O, SlotTracker);
1074 O << " = VF";
1075 }
1076
1077 if (!UF.user_empty()) {
1078 O << "\nLive-in ";
1079 UF.printAsOperand(O, SlotTracker);
1080 O << " = UF";
1081 }
1082
1083 if (!VFxUF.user_empty()) {
1084 O << "\nLive-in ";
1085 VFxUF.printAsOperand(O, SlotTracker);
1086 O << " = VF * UF";
1087 }
1088
1089 if (!VectorTripCount.user_empty()) {
1090 O << "\nLive-in ";
1091 VectorTripCount.printAsOperand(O, SlotTracker);
1092 O << " = vector-trip-count";
1093 }
1094
1095 if (BackedgeTakenCount && !BackedgeTakenCount->user_empty()) {
1096 O << "\nLive-in ";
1097 BackedgeTakenCount->printAsOperand(O, SlotTracker);
1098 O << " = backedge-taken count";
1099 }
1100
1101 O << "\n";
1102 if (TripCount && !TripCount->user_empty()) {
1103 if (isa<VPIRValue>(TripCount))
1104 O << "Live-in ";
1105 TripCount->printAsOperand(O, SlotTracker);
1106 O << " = original trip-count";
1107 O << "\n";
1108 }
1109}
1110
1114
1115 O << "VPlan '" << getName() << "' {";
1116
1117 printLiveIns(O);
1118
1120 RPOT(getEntry());
1121 for (const VPBlockBase *Block : RPOT) {
1122 O << '\n';
1123 Block->print(O, "", SlotTracker);
1124 }
1125
1126 O << "}\n";
1127}
1128
1129std::string VPlan::getName() const {
1130 std::string Out;
1131 raw_string_ostream RSO(Out);
1132 RSO << Name << " for ";
1133 if (!VFs.empty()) {
1134 RSO << "VF={" << VFs[0];
1135 for (ElementCount VF : drop_begin(VFs))
1136 RSO << "," << VF;
1137 RSO << "},";
1138 }
1139
1140 if (UFs.empty()) {
1141 RSO << "UF>=1";
1142 } else {
1143 RSO << "UF={" << UFs[0];
1144 for (unsigned UF : drop_begin(UFs))
1145 RSO << "," << UF;
1146 RSO << "}";
1147 }
1148
1149 return Out;
1150}
1151
1154 VPlanPrinter Printer(O, *this);
1155 Printer.dump();
1156}
1157
1159void VPlan::dump() const { print(dbgs()); }
1160#endif
1161
1162static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry,
1163 DenseMap<VPValue *, VPValue *> &Old2NewVPValues) {
1164 // Update the operands of all cloned recipes starting at NewEntry. This
1165 // traverses all reachable blocks. This is done in two steps, to handle cycles
1166 // in PHI recipes.
1168 OldDeepRPOT(Entry);
1170 NewDeepRPOT(NewEntry);
1171 // First, collect all mappings from old to new VPValues defined by cloned
1172 // recipes.
1173 for (const auto &[OldBB, NewBB] :
1176 assert(OldBB->getRecipeList().size() == NewBB->getRecipeList().size() &&
1177 "blocks must have the same number of recipes");
1178 for (const auto &[OldR, NewR] : zip(*OldBB, *NewBB)) {
1179 assert(OldR.getNumOperands() == NewR.getNumOperands() &&
1180 "recipes must have the same number of operands");
1181 assert(OldR.getNumDefinedValues() == NewR.getNumDefinedValues() &&
1182 "recipes must define the same number of operands");
1183 for (const auto &[OldV, NewV] :
1184 zip(OldR.definedValues(), NewR.definedValues()))
1185 Old2NewVPValues[OldV] = NewV;
1186 }
1187 }
1188
1189 // Update all operands to use cloned VPValues.
1190 for (VPBasicBlock *NewBB :
1192 for (VPRecipeBase &NewR : *NewBB)
1193 for (unsigned I = 0, E = NewR.getNumOperands(); I != E; ++I) {
1194 VPValue *NewOp = Old2NewVPValues.lookup(NewR.getOperand(I));
1195 NewR.setOperand(I, NewOp);
1196 }
1197 }
1198}
1199
1201 unsigned NumBlocksBeforeCloning = CreatedBlocks.size();
1202 // Clone blocks.
1203 const auto &[NewEntry, __] = VPBlockUtils::cloneFrom(Entry);
1204
1205 BasicBlock *ScalarHeaderIRBB = getScalarHeader()->getIRBasicBlock();
1206 VPIRBasicBlock *NewScalarHeader = nullptr;
1207 if (getScalarHeader()->hasPredecessors()) {
1208 NewScalarHeader = cast<VPIRBasicBlock>(*find_if(
1209 vp_depth_first_shallow(NewEntry), [ScalarHeaderIRBB](VPBlockBase *VPB) {
1210 auto *VPIRBB = dyn_cast<VPIRBasicBlock>(VPB);
1211 return VPIRBB && VPIRBB->getIRBasicBlock() == ScalarHeaderIRBB;
1212 }));
1213 } else {
1214 NewScalarHeader = createVPIRBasicBlock(ScalarHeaderIRBB);
1215 }
1216 // Create VPlan, clone live-ins and remap operands in the cloned blocks.
1217 auto *NewPlan =
1218 new VPlan(cast<VPBasicBlock>(NewEntry), NewScalarHeader, getIndexType());
1219 DenseMap<VPValue *, VPValue *> Old2NewVPValues;
1220 for (VPIRValue *OldLiveIn : getLiveIns())
1221 Old2NewVPValues[OldLiveIn] = NewPlan->getOrAddLiveIn(OldLiveIn);
1222
1223 if (auto *TripCountIRV = dyn_cast_or_null<VPIRValue>(TripCount))
1224 Old2NewVPValues[TripCountIRV] = NewPlan->getOrAddLiveIn(TripCountIRV);
1225 // else NewTripCount will be created and inserted into Old2NewVPValues when
1226 // TripCount is cloned. In any case NewPlan->TripCount is updated below.
1227
1228 assert(none_of(Old2NewVPValues.keys(), IsaPred<VPSymbolicValue>) &&
1229 "All VPSymbolicValues must be handled below");
1230
1231 if (auto *LoopRegion = getVectorLoopRegion()) {
1232 auto *NewLoopRegion = NewPlan->getVectorLoopRegion();
1233 for (auto [Old, New] : zip_equal(LoopRegion->getRegionValues(),
1234 NewLoopRegion->getRegionValues())) {
1235 Old2NewVPValues[Old] = New;
1236 if (Old->isMaterialized())
1237 New->markMaterialized();
1238 }
1239 }
1240
1241 if (BackedgeTakenCount)
1242 NewPlan->BackedgeTakenCount =
1243 new VPSymbolicValue(BackedgeTakenCount->getType());
1244
1245 // Map and propagate materialized state for symbolic values.
1246 for (auto [OldSV, NewSV] :
1247 {std::pair{&VectorTripCount, &NewPlan->VectorTripCount},
1248 {&VF, &NewPlan->VF},
1249 {&UF, &NewPlan->UF},
1250 {&VFxUF, &NewPlan->VFxUF},
1251 {BackedgeTakenCount, NewPlan->BackedgeTakenCount}}) {
1252 if (!OldSV)
1253 continue;
1254 Old2NewVPValues[OldSV] = NewSV;
1255 if (OldSV->isMaterialized())
1256 NewSV->markMaterialized();
1257 }
1258
1259 remapOperands(Entry, NewEntry, Old2NewVPValues);
1260
1261 // Initialize remaining fields of cloned VPlan.
1262 NewPlan->VFs = VFs;
1263 NewPlan->UFs = UFs;
1264 // TODO: Adjust names.
1265 NewPlan->Name = Name;
1266 if (TripCount) {
1267 assert(Old2NewVPValues.contains(TripCount) &&
1268 "TripCount must have been added to Old2NewVPValues");
1269 NewPlan->TripCount = Old2NewVPValues[TripCount];
1270 }
1271
1272 // Transfer all cloned blocks (the second half of all current blocks) from
1273 // current to new VPlan.
1274 unsigned NumBlocksAfterCloning = CreatedBlocks.size();
1275 for (unsigned I :
1276 seq<unsigned>(NumBlocksBeforeCloning, NumBlocksAfterCloning)) {
1277 this->CreatedBlocks[I]->setPlan(NewPlan);
1278 this->CreatedBlocks[I]->setNumber(NewPlan->CreatedBlocks.size());
1279 NewPlan->CreatedBlocks.push_back(this->CreatedBlocks[I]);
1280 }
1281 CreatedBlocks.truncate(NumBlocksBeforeCloning);
1282
1283 // Update ExitBlocks of the new plan.
1284 for (VPBlockBase *VPB : NewPlan->CreatedBlocks) {
1285 if (VPB->getNumSuccessors() == 0 && isa<VPIRBasicBlock>(VPB) &&
1286 VPB != NewScalarHeader)
1287 NewPlan->ExitBlocks.push_back(cast<VPIRBasicBlock>(VPB));
1288 }
1289
1290 return NewPlan;
1291}
1292
1294 auto *VPIRBB = new VPIRBasicBlock(IRBB);
1295 VPIRBB->setPlan(this);
1296 VPIRBB->setNumber(CreatedBlocks.size());
1297 CreatedBlocks.push_back(VPIRBB);
1298 return VPIRBB;
1299}
1300
1302 auto *VPIRBB = createEmptyVPIRBasicBlock(IRBB);
1303 for (Instruction &I :
1304 make_range(IRBB->begin(), IRBB->getTerminator()->getIterator()))
1305 VPIRBB->appendRecipe(VPIRInstruction::create(I));
1306 return VPIRBB;
1307}
1308
1309#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1310
1311Twine VPlanPrinter::getUID(const VPBlockBase *Block) {
1312 return (isa<VPRegionBlock>(Block) ? "cluster_N" : "N") +
1313 Twine(getOrCreateBID(Block));
1314}
1315
1317 Depth = 1;
1318 bumpIndent(0);
1319 OS << "digraph VPlan {\n";
1320 OS << "graph [labelloc=t, fontsize=30; label=\"Vectorization Plan";
1321 if (!Plan.getName().empty())
1322 OS << "\\n" << DOT::EscapeString(Plan.getName());
1323
1324 {
1325 // Print live-ins.
1326 std::string Str;
1327 raw_string_ostream SS(Str);
1328 Plan.printLiveIns(SS);
1330 StringRef(Str).rtrim('\n').split(Lines, "\n");
1331 for (auto Line : Lines)
1332 OS << DOT::EscapeString(Line.str()) << "\\n";
1333 }
1334
1335 OS << "\"]\n";
1336 OS << "node [shape=rect, fontname=Courier, fontsize=30]\n";
1337 OS << "edge [fontname=Courier, fontsize=30]\n";
1338 OS << "compound=true\n";
1339
1340 for (const VPBlockBase *Block : vp_depth_first_shallow(Plan.getEntry()))
1341 dumpBlock(Block);
1342
1343 OS << "}\n";
1344}
1345
1346void VPlanPrinter::dumpBlock(const VPBlockBase *Block) {
1348 dumpBasicBlock(BasicBlock);
1350 dumpRegion(Region);
1351 else
1352 llvm_unreachable("Unsupported kind of VPBlock.");
1353}
1354
1355void VPlanPrinter::drawEdge(const VPBlockBase *From, const VPBlockBase *To,
1356 bool Hidden, const Twine &Label) {
1357 // Due to "dot" we print an edge between two regions as an edge between the
1358 // exiting basic block and the entry basic of the respective regions.
1359 const VPBlockBase *Tail = From->getExitingBasicBlock();
1360 const VPBlockBase *Head = To->getEntryBasicBlock();
1361 OS << Indent << getUID(Tail) << " -> " << getUID(Head);
1362 OS << " [ label=\"" << Label << '\"';
1363 if (Tail != From)
1364 OS << " ltail=" << getUID(From);
1365 if (Head != To)
1366 OS << " lhead=" << getUID(To);
1367 if (Hidden)
1368 OS << "; splines=none";
1369 OS << "]\n";
1370}
1371
1372void VPlanPrinter::dumpEdges(const VPBlockBase *Block) {
1373 auto &Successors = Block->getSuccessors();
1374 if (Successors.size() == 1)
1375 drawEdge(Block, Successors.front(), false, "");
1376 else if (Successors.size() == 2) {
1377 drawEdge(Block, Successors.front(), false, "T");
1378 drawEdge(Block, Successors.back(), false, "F");
1379 } else {
1380 unsigned SuccessorNumber = 0;
1381 for (auto *Successor : Successors)
1382 drawEdge(Block, Successor, false, Twine(SuccessorNumber++));
1383 }
1384}
1385
1386void VPlanPrinter::dumpBasicBlock(const VPBasicBlock *BasicBlock) {
1387 // Implement dot-formatted dump by performing plain-text dump into the
1388 // temporary storage followed by some post-processing.
1389 OS << Indent << getUID(BasicBlock) << " [label =\n";
1390 bumpIndent(1);
1391 std::string Str;
1392 raw_string_ostream SS(Str);
1393 // Use no indentation as we need to wrap the lines into quotes ourselves.
1394 BasicBlock->print(SS, "", SlotTracker);
1395
1396 // We need to process each line of the output separately, so split
1397 // single-string plain-text dump.
1399 StringRef(Str).rtrim('\n').split(Lines, "\n");
1400
1401 auto EmitLine = [&](StringRef Line, StringRef Suffix) {
1402 OS << Indent << '"' << DOT::EscapeString(Line.str()) << "\\l\"" << Suffix;
1403 };
1404
1405 // Don't need the "+" after the last line.
1406 for (auto Line : make_range(Lines.begin(), Lines.end() - 1))
1407 EmitLine(Line, " +\n");
1408 EmitLine(Lines.back(), "\n");
1409
1410 bumpIndent(-1);
1411 OS << Indent << "]\n";
1412
1413 dumpEdges(BasicBlock);
1414}
1415
1416void VPlanPrinter::dumpRegion(const VPRegionBlock *Region) {
1417 OS << Indent << "subgraph " << getUID(Region) << " {\n";
1418 bumpIndent(1);
1419 OS << Indent << "fontname=Courier\n"
1420 << Indent << "label=\""
1421 << DOT::EscapeString(Region->isReplicator() ? "<xVFxUF> " : "<x1> ")
1422 << DOT::EscapeString(Region->getName()) << "\"\n";
1423
1424 if (auto *CanIV = Region->getCanonicalIV()) {
1425 OS << Indent << "\"";
1426 std::string Op;
1427 raw_string_ostream S(Op);
1428 CanIV->printAsOperand(S, SlotTracker);
1429 OS << DOT::EscapeString(Op);
1430 OS << " = CANONICAL-IV\"\n";
1431 }
1432
1433 // Dump the blocks of the region.
1434 assert(Region->getEntry() && "Region contains no inner blocks.");
1435 for (const VPBlockBase *Block : vp_depth_first_shallow(Region->getEntry()))
1436 dumpBlock(Block);
1437 bumpIndent(-1);
1438 OS << Indent << "}\n";
1439 dumpEdges(Region);
1440}
1441
1442#endif
1443
1444/// Returns true if there is a vector loop region and \p VPV is defined in a
1445/// loop region.
1446static bool isDefinedInsideLoopRegions(const VPValue *VPV) {
1447 if (isa<VPRegionValue>(VPV))
1448 return true;
1449 const VPRecipeBase *DefR = VPV->getDefiningRecipe();
1450 return DefR && (DefR->getParent()->getEnclosingLoopRegion() ||
1451 !DefR->getParent()->getPlan()->getVectorLoopRegion());
1452}
1453
1458 replaceUsesWithIf(New, [](VPUser &) { return true; });
1459 if (auto *SV = dyn_cast<VPSymbolicValue>(this))
1460 SV->markMaterialized();
1461}
1462
1464 VPValue *New, llvm::function_ref<bool(VPUser &U)> ShouldReplace) {
1466 // Note that this early exit is required for correctness; the implementation
1467 // below relies on the number of users for this VPValue to decrease, which
1468 // isn't the case if this == New.
1469 if (this == New)
1470 return;
1471
1472 for (unsigned J = 0; J < getNumUsers();) {
1473 VPUser *User = Users[J];
1474 bool RemovedUser = false;
1475 for (unsigned I = 0, E = User->getNumOperands(); I < E; ++I) {
1476 if (User->getOperand(I) != this || !ShouldReplace(*User))
1477 continue;
1478
1479 RemovedUser = true;
1480 User->setOperand(I, New);
1481 }
1482 // If a user got removed after updating the current user, the next user to
1483 // update will be moved to the current position, so we only need to
1484 // increment the index if the number of users did not change.
1485 if (!RemovedUser)
1486 J++;
1487 }
1488}
1489
1491 for (unsigned Idx = 0; Idx != getNumOperands(); ++Idx) {
1492 if (getOperand(Idx) == From)
1493 setOperand(Idx, To);
1494 }
1495}
1496
1497#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1499 OS << Tracker.getOrCreateName(this);
1500}
1501
1504 Op->printAsOperand(O, SlotTracker);
1505 });
1506}
1507#endif
1508
1509void VPSlotTracker::assignName(const VPValue *V) {
1510 assert(!VPValue2Name.contains(V) && "VPValue already has a name!");
1511 auto *UV = V->getUnderlyingValue();
1512 auto *VPI = dyn_cast_or_null<VPInstruction>(V);
1513 if (!UV && !(VPI && !VPI->getName().empty())) {
1514 VPValue2Name[V] = (Twine("vp<%") + Twine(NextSlot) + ">").str();
1515 NextSlot++;
1516 return;
1517 }
1518
1519 // Use the name of the underlying Value, wrapped in "ir<>", and versioned by
1520 // appending ".Number" to the name if there are multiple uses.
1521 std::string Name;
1522 if (UV)
1523 Name = getName(UV);
1524 else
1525 Name = VPI->getName();
1526
1527 assert(!Name.empty() && "Name cannot be empty.");
1528 StringRef Prefix = UV ? "ir<" : "vp<%";
1529 std::string BaseName = (Twine(Prefix) + Name + Twine(">")).str();
1530
1531 // First assign the base name for V.
1532 const auto &[A, _] = VPValue2Name.try_emplace(V, BaseName);
1533 // Integer or FP constants with different types will result in the same string
1534 // due to stripping types.
1536 return;
1537
1538 // If it is already used by C > 0 other VPValues, increase the version counter
1539 // C and use it for V.
1540 const auto &[C, UseInserted] = BaseName2Version.try_emplace(BaseName, 0);
1541 if (!UseInserted) {
1542 C->second++;
1543 A->second = (BaseName + Twine(".") + Twine(C->second)).str();
1544 }
1545}
1546
1547void VPSlotTracker::assignNames(const VPlan &Plan) {
1548 if (!Plan.VF.user_empty())
1549 assignName(&Plan.VF);
1550 if (!Plan.UF.user_empty())
1551 assignName(&Plan.UF);
1552 if (!Plan.VFxUF.user_empty())
1553 assignName(&Plan.VFxUF);
1554 assignName(&Plan.VectorTripCount);
1555 if (Plan.BackedgeTakenCount)
1556 assignName(Plan.BackedgeTakenCount);
1557 for (VPValue *LI : Plan.getLiveIns())
1558 assignName(LI);
1559
1560 ReversePostOrderTraversal<VPBlockDeepTraversalWrapper<const VPBlockBase *>>
1561 RPOT(VPBlockDeepTraversalWrapper<const VPBlockBase *>(Plan.getEntry()));
1562 for (const VPBlockBase *VPB : RPOT) {
1563 if (auto *VPBB = dyn_cast<VPBasicBlock>(VPB))
1564 assignNames(VPBB);
1565 else
1566 for (auto *RV : cast<VPRegionBlock>(VPB)->getRegionValues())
1567 assignName(RV);
1568 }
1569}
1570
1571void VPSlotTracker::assignNames(const VPBasicBlock *VPBB) {
1572 for (const VPRecipeBase &Recipe : *VPBB)
1573 for (VPValue *Def : Recipe.definedValues())
1574 assignName(Def);
1575}
1576
1577ModuleSlotTracker &VPSlotTracker::getOrCreateMST() {
1578 // F is null for unit tests with incomplete IR.
1579 if (!MST) {
1580 MST = std::make_unique<ModuleSlotTracker>(getModule());
1581 if (F)
1582 MST->incorporateFunction(*F);
1583 }
1584 return *MST;
1585}
1586
1587std::string VPSlotTracker::getName(const Value *V) {
1588 std::string Name;
1589 raw_string_ostream S(Name);
1590 // If V isn't an instruction in a basic block or named, it can be printed
1591 // directly without ModuleSlotTracker.
1592 auto *I = dyn_cast<Instruction>(V);
1593 if (!I || I->hasName() || !I->getParent()) {
1594 V->printAsOperand(S, false);
1595 return Name;
1596 }
1597
1598 V->printAsOperand(S, false, getOrCreateMST());
1599 return Name;
1600}
1601
1603 N->printAsOperand(O, getOrCreateMST(), getModule());
1604}
1605
1606std::string VPSlotTracker::getOrCreateName(const VPValue *V) const {
1607 std::string Name = VPValue2Name.lookup(V);
1608 if (!Name.empty())
1609 return Name;
1610
1611 // If no name was assigned, no VPlan was provided when creating the slot
1612 // tracker or it is not reachable from the provided VPlan. This can happen,
1613 // e.g. when trying to print a recipe that has not been inserted into a VPlan
1614 // in a debugger.
1615 // TODO: Update VPSlotTracker constructor to assign names to recipes &
1616 // VPValues not associated with a VPlan, instead of constructing names ad-hoc
1617 // here.
1618
1619 // Use the underlying value's name, if there is one.
1620 if (auto *UV = V->getUnderlyingValue()) {
1621 std::string Name;
1622 raw_string_ostream S(Name);
1623 UV->printAsOperand(S, false);
1624 return (Twine("ir<") + Name + ">").str();
1625 }
1626
1627 return "<badref>";
1628}
1629
1631 const std::function<bool(ElementCount)> &Predicate, VFRange &Range) {
1632 assert(!Range.isEmpty() && "Trying to test an empty VF range.");
1633 bool PredicateAtRangeStart = Predicate(Range.Start);
1634
1635 for (ElementCount TmpVF : VFRange(Range.Start * 2, Range.End))
1636 if (Predicate(TmpVF) != PredicateAtRangeStart) {
1637 Range.End = TmpVF;
1638 break;
1639 }
1640
1641 return PredicateAtRangeStart;
1642}
1643
1645 assert(count_if(VPlans,
1646 [VF](const VPlanPtr &Plan) { return Plan->hasVF(VF); }) ==
1647 1 &&
1648 "Multiple VPlans for VF.");
1649
1650 for (const VPlanPtr &Plan : VPlans) {
1651 if (Plan->hasVF(VF))
1652 return *Plan.get();
1653 }
1654 llvm_unreachable("No plan found!");
1655}
1656
1659 // Reserve first location for self reference to the LoopID metadata node.
1660 MDs.push_back(nullptr);
1661 bool IsUnrollMetadata = false;
1662 MDNode *LoopID = L->getLoopID();
1663 if (LoopID) {
1664 // First find existing loop unrolling disable metadata.
1665 for (unsigned I = 1, IE = LoopID->getNumOperands(); I < IE; ++I) {
1666 auto *MD = dyn_cast<MDNode>(LoopID->getOperand(I));
1667 if (MD) {
1668 const auto *S = dyn_cast<MDString>(MD->getOperand(0));
1669 if (!S)
1670 continue;
1671 if (S->getString().starts_with("llvm.loop.unroll.runtime.disable"))
1672 continue;
1673 IsUnrollMetadata =
1674 S->getString().starts_with("llvm.loop.unroll.disable");
1675 }
1676 MDs.push_back(LoopID->getOperand(I));
1677 }
1678 }
1679
1680 if (!IsUnrollMetadata) {
1681 // Add runtime unroll disable metadata.
1682 LLVMContext &Context = L->getHeader()->getContext();
1683 SmallVector<Metadata *, 1> DisableOperands;
1684 DisableOperands.push_back(
1685 MDString::get(Context, "llvm.loop.unroll.runtime.disable"));
1686 MDNode *DisableNode = MDNode::get(Context, DisableOperands);
1687 MDs.push_back(DisableNode);
1688 MDNode *NewLoopID = MDNode::get(Context, MDs);
1689 // Set operand 0 to refer to the loop id itself.
1690 NewLoopID->replaceOperandWith(0, NewLoopID);
1691 L->setLoopID(NewLoopID);
1692 }
1693}
1694
1696 Loop *VectorLoop, VPBasicBlock *HeaderVPBB, const VPlan &Plan,
1697 bool VectorizingEpilogue, MDNode *OrigLoopID,
1698 std::optional<unsigned> OrigAverageTripCount,
1699 unsigned OrigLoopInvocationWeight, unsigned EstimatedVFxUF,
1700 bool DisableRuntimeUnroll, bool UnrollVectorizedLoop) {
1701 // Update the metadata of the scalar loop. Skip the update when vectorizing
1702 // the epilogue loop to ensure it is updated only once. Also skip the update
1703 // when the scalar loop became unreachable.
1704 auto *ScalarPH = Plan.getScalarPreheader();
1705 if (ScalarPH && !VectorizingEpilogue) {
1706 std::optional<MDNode *> RemainderLoopID =
1709 if (RemainderLoopID) {
1710 OrigLoop->setLoopID(*RemainderLoopID);
1711 } else {
1712 if (DisableRuntimeUnroll)
1714
1715 LoopVectorizeHints Hints(OrigLoop, /*InterleaveOnlyWhenForced*/ false,
1716 *ORE);
1717 Hints.setAlreadyVectorized();
1718 }
1719 }
1720 // Tag the scalar remainder so downstream passes (e.g. the unroller and
1721 // WarnMissedTransforms) can produce more informative remarks. Only emit
1722 // when remarks are enabled.
1723 if (ORE->enabled() && ScalarPH && ScalarPH->hasPredecessors())
1724 OrigLoop->addIntLoopAttribute("llvm.loop.vectorize.epilogue", 1);
1725
1726 if (!VectorLoop)
1727 return;
1728
1729 if (std::optional<MDNode *> VectorizedLoopID = makeFollowupLoopID(
1730 OrigLoopID, {LLVMLoopVectorizeFollowupAll,
1732 VectorLoop->setLoopID(*VectorizedLoopID);
1733 } else {
1734 // Keep all loop hints from the original loop on the vector loop (we'll
1735 // replace the vectorizer-specific hints below).
1736 if (OrigLoopID)
1737 VectorLoop->setLoopID(OrigLoopID);
1738
1739 if (!VectorizingEpilogue) {
1740 LoopVectorizeHints Hints(VectorLoop, /*InterleaveOnlyWhenForced*/ false,
1741 *ORE);
1742 Hints.setAlreadyVectorized();
1743 }
1744 }
1745 // Tag the vector loop body so downstream passes can identify it. Only
1746 // emit when remarks are enabled.
1747 if (ORE->enabled())
1748 VectorLoop->addIntLoopAttribute("llvm.loop.vectorize.body", 1);
1749 if (!UnrollVectorizedLoop || VectorizingEpilogue)
1751
1752 // Set/update profile weights for the vector and remainder loops as original
1753 // loop iterations are now distributed among them. Note that original loop
1754 // becomes the scalar remainder loop after vectorization.
1755 //
1756 // For cases like foldTailByMasking() and requiresScalarEpiloque() we may
1757 // end up getting slightly roughened result but that should be OK since
1758 // profile is not inherently precise anyway. Note also possible bypass of
1759 // vector code caused by legality checks is ignored, assigning all the weight
1760 // to the vector loop, optimistically.
1761 //
1762 // For scalable vectorization we can't know at compile time how many
1763 // iterations of the loop are handled in one vector iteration, so instead
1764 // use the value of vscale used for tuning.
1765 unsigned AverageVectorTripCount = 0;
1766 unsigned RemainderAverageTripCount = 0;
1767 auto EC = VectorLoop->getLoopPreheader()->getParent()->getEntryCount();
1768 auto IsProfiled = EC && *EC != 0;
1769 if (!OrigAverageTripCount) {
1770 if (!IsProfiled)
1771 return;
1772 auto &SE = *PSE.getSE();
1773 AverageVectorTripCount = SE.getSmallConstantTripCount(VectorLoop);
1774 if (ProfcheckDisableMetadataFixes || !AverageVectorTripCount)
1775 return;
1776 if (ScalarPH)
1777 RemainderAverageTripCount =
1778 SE.getSmallConstantTripCount(OrigLoop) % EstimatedVFxUF;
1779 // Setting to 1 should be sufficient to generate the correct branch weights.
1780 OrigLoopInvocationWeight = 1;
1781 } else {
1782 // Calculate number of iterations in unrolled loop.
1783 AverageVectorTripCount = *OrigAverageTripCount / EstimatedVFxUF;
1784 // Calculate number of iterations for remainder loop.
1785 RemainderAverageTripCount = *OrigAverageTripCount % EstimatedVFxUF;
1786 }
1787 if (HeaderVPBB) {
1788 setLoopEstimatedTripCount(VectorLoop, AverageVectorTripCount,
1789 OrigLoopInvocationWeight);
1790 }
1791
1792 if (ScalarPH) {
1793 setLoopEstimatedTripCount(OrigLoop, RemainderAverageTripCount,
1794 OrigLoopInvocationWeight);
1795 }
1796}
1797
1798#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1800 if (VPlans.empty()) {
1801 O << "LV: No VPlans built.\n";
1802 return;
1803 }
1804 for (const auto &Plan : VPlans)
1806 Plan->printDOT(O);
1807 else
1808 Plan->print(O);
1809}
1810#endif
1811
1812bool llvm::canConstantBeExtended(const APInt *C, Type *NarrowType,
1814 APInt TruncatedVal = C->trunc(NarrowType->getScalarSizeInBits());
1815 unsigned WideSize = C->getBitWidth();
1816 APInt ExtendedVal = ExtKind == TTI::PR_SignExtend
1817 ? TruncatedVal.sext(WideSize)
1818 : TruncatedVal.zext(WideSize);
1819 return ExtendedVal == *C;
1820}
1821
1824 if (auto *IRV = dyn_cast<VPIRValue>(V))
1825 return TTI::getOperandInfo(IRV->getValue());
1826
1827 return {};
1828}
1829
1830#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1832 if (!PlanForSlotTracker)
1833 return nullptr;
1834 if (!SlotTracker)
1835 SlotTracker = std::make_unique<VPSlotTracker>(PlanForSlotTracker);
1836 return SlotTracker.get();
1837}
1838#endif
1839
1842 TTI::VectorInstrContext VIC, bool AlwaysIncludeReplicatingR) {
1843 if (VF.isScalar())
1844 return 0;
1845
1846 assert(!VF.isScalable() &&
1847 "Scalarization overhead not supported for scalable vectors");
1848
1849 InstructionCost ScalarizationCost = 0;
1850 // Compute the cost of scalarizing the result if needed.
1851 if (!ResultTy->isVoidTy()) {
1852 for (Type *VectorTy :
1853 to_vector(getContainedTypes(toVectorizedTy(ResultTy, VF)))) {
1854 ScalarizationCost += TTI.getScalarizationOverhead(
1856 /*Insert=*/true, /*Extract=*/false, CostKind,
1857 /*ForPoisonSrc=*/true, {}, VIC);
1858 }
1859 }
1860 // Compute the cost of scalarizing the operands, skipping ones that do not
1861 // require extraction/scalarization and do not incur any overhead.
1862 SmallPtrSet<const VPValue *, 4> UniqueOperands;
1864 for (auto *Op : Operands) {
1865 if (isa<VPIRValue>(Op) ||
1866 (!AlwaysIncludeReplicatingR &&
1869 cast<VPReplicateRecipe>(Op)->getOpcode() == Instruction::Load) ||
1870 !UniqueOperands.insert(Op).second)
1871 continue;
1872 Tys.push_back(toVectorizedTy(Op->getScalarType(), VF));
1873 }
1874 return ScalarizationCost +
1875 TTI.getOperandsScalarizationOverhead(Tys, CostKind, VIC);
1876}
1877
1879 ElementCount VF) {
1880 const Instruction *UI = R->getUnderlyingInstr();
1881 if (isa<LoadInst>(UI))
1882 return true;
1883 assert(isa<StoreInst>(UI) && "R must either be a load or store");
1884
1885 if (!NumPredStores) {
1886 // Count the number of predicated stores in the VPlan, caching the result.
1887 // Only stores where scatter is not legal are counted, matching the legacy
1888 // cost model behavior.
1889 const VPlan &Plan = *R->getParent()->getPlan();
1890 NumPredStores = 0;
1891 for (const VPRegionBlock *VPRB :
1894 assert(VPRB->isReplicator() && "must only contain replicate regions");
1895 for (const VPBasicBlock *VPBB :
1897 vp_depth_first_shallow(VPRB->getEntry()))) {
1898 for (const VPReplicateRecipe &RepR :
1900 if (!isa<StoreInst>(RepR.getUnderlyingInstr()))
1901 continue;
1902 // Check if scatter is legal for this store. If so, don't count it.
1903 Type *Ty = RepR.getOperand(0)->getScalarType();
1904 auto *VTy = VectorType::get(Ty, VF);
1905 const Align Alignment =
1906 getLoadStoreAlignment(RepR.getUnderlyingInstr());
1907 if (!TTI.isLegalMaskedScatter(VTy, Alignment))
1908 ++(*NumPredStores);
1909 }
1910 }
1911 }
1912 }
1914}
1915
1917 return is_contained({Intrinsic::assume, Intrinsic::lifetime_end,
1918 Intrinsic::lifetime_start, Intrinsic::sideeffect,
1919 Intrinsic::pseudoprobe,
1920 Intrinsic::experimental_noalias_scope_decl},
1921 ID);
1922}
1923
1924uint64_t
1925VPCostContext::getCostDivisor(std::optional<VPExecutionFrequency> Freq) const {
1926 if (CostKind == TTI::TCK_CodeSize || !Freq)
1927 return 1;
1928 // A recorded frequency is neither zero nor always-executing, so the
1929 // probability is non-zero and the division below is safe.
1930 return divideNearest(
1932 vputils::getExecutionProbability(Freq->Freq).getNumerator());
1933}
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:686
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:1657
static void printFinalVPlan(VPlan &)
To make RUN_VPLAN_PASS print final VPlan.
Definition VPlan.cpp:905
static T * getEnclosingLoopRegionForRegion(T *P)
Return the enclosing loop region for region P.
Definition VPlan.cpp:556
const char LLVMLoopVectorizeFollowupAll[]
Definition VPlan.cpp:64
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:1446
static bool hasConditionalTerminator(const VPBasicBlock *VPBB)
Definition VPlan.cpp:574
const char LLVMLoopVectorizeFollowupVectorized[]
Definition VPlan.cpp:65
static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry, DenseMap< VPValue *, VPValue * > &Old2NewVPValues)
Definition VPlan.cpp:1162
const char LLVMLoopVectorizeFollowupEpilogue[]
Definition VPlan.cpp:67
static cl::opt< bool > PrintVPlansInDotFormat("vplan-print-in-dot-format", cl::Hidden, cl::desc("Use dot format instead of plain text when dumping VPlans"))
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:446
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:467
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:758
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:794
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
constexpr bool isVector() const
One or more elements.
Definition TypeSize.h:320
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:316
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:68
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:1644
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:1695
static bool getDecisionAndClampRange(const std::function< bool(ElementCount)> &Predicate, VFRange &Range)
Test a Predicate on a Range of VF's.
Definition VPlan.cpp:1630
void printPlans(raw_ostream &O)
Definition VPlan.cpp:1799
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:615
void setLoopID(MDNode *LoopID) const
Set the llvm.loop loop id metadata for this loop.
Definition LoopInfo.cpp:583
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:597
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:320
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:4437
void appendRecipe(VPRecipeBase *Recipe)
Augment the existing recipes of a VPBasicBlock with an additional Recipe as the last recipe.
Definition VPlan.h:4512
RecipeListTy::iterator iterator
Instruction iterators...
Definition VPlan.h:4464
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPBasicBlock,...
Definition VPlan.cpp:478
iterator end()
Definition VPlan.h:4474
iterator begin()
Recipe iterator methods.
Definition VPlan.h:4472
VPBasicBlock * clone() override
Clone the current block and it's recipes, without updating the operands of the cloned recipes.
Definition VPlan.cpp:512
InstructionCost cost(ElementCount VF, VPCostContext &Ctx) override
Return the cost of this VPBasicBlock.
Definition VPlan.cpp:742
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:749
iterator getFirstNonPhi()
Return the position of the first non-phi node recipe in the block.
Definition VPlan.cpp:233
void connectToPredecessors(VPTransformState &State)
Connect the VPBBs predecessors' in the VPlan CFG to the IR basic block generated for this VPBB.
Definition VPlan.cpp:369
VPRegionBlock * getEnclosingLoopRegion()
Definition VPlan.cpp:566
VPBasicBlock * splitAt(iterator SplitAt)
Split current block at SplitAt by inserting a new block between the current block and its successors ...
Definition VPlan.cpp:533
RecipeListTy Recipes
The VPRecipes held in the order of output instructions to generate.
Definition VPlan.h:4452
void executeRecipes(VPTransformState *State, BasicBlock *BB)
Execute the recipes in the IR basic block BB.
Definition VPlan.cpp:519
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:646
bool isExiting() const
Returns true if the block is exiting it's parent region.
Definition VPlan.cpp:624
VPRecipeBase * getTerminator()
If the block has multiple successors, return the branch recipe terminating the block.
Definition VPlan.cpp:612
const VPRecipeBase & back() const
Definition VPlan.h:4486
bool empty() const
Definition VPlan.h:4483
size_t size() const
Definition VPlan.h:4482
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
Definition VPlan.h:97
void setSuccessors(ArrayRef< VPBlockBase * > NewSuccs)
Set each VPBasicBlock in NewSuccss as successor of this VPBlockBase.
Definition VPlan.h:307
VPRegionBlock * getParent()
Definition VPlan.h:195
const VPBasicBlock * getExitingBasicBlock() const
Definition VPlan.cpp:203
size_t getNumSuccessors() const
Definition VPlan.h:245
iterator_range< VPBlockBase ** > successors()
Definition VPlan.h:227
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:225
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:634
size_t getNumPredecessors() const
Definition VPlan.h:246
void setPredecessors(ArrayRef< VPBlockBase * > NewPreds)
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase.
Definition VPlan.h:298
VPBlockBase * getEnclosingBlockWithPredecessors()
Definition VPlan.cpp:225
bool hasSuccessors() const
Returns true if this block has any successors.
Definition VPlan.h:223
const VPBlocksTy & getPredecessors() const
Definition VPlan.h:230
VPlan * getPlan()
Definition VPlan.h:199
const std::string & getName() const
Definition VPlan.h:186
VPBlockBase * getSinglePredecessor() const
Definition VPlan.h:241
const VPBlocksTy & getHierarchicalSuccessors()
Definition VPlan.h:265
VPBlockBase * getEnclosingBlockWithSuccessors()
An Enclosing Block of a block B is any block containing B, including B itself.
Definition VPlan.cpp:217
const VPBasicBlock * getEntryBasicBlock() const
Definition VPlan.cpp:188
VPBlockBase * getSingleSuccessor() const
Definition VPlan.h:235
const VPBlocksTy & getSuccessors() const
Definition VPlan.h:219
VPBlockBase(VPBlockTy SC, const std::string &N)
Definition VPlan.h:392
static void insertBlockAfter(VPBlockBase *NewBlock, VPBlockBase *BlockPtr)
Insert disconnected VPBlockBase NewBlock after BlockPtr.
Definition VPlanUtils.h:302
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:347
static void disconnectBlocks(VPBlockBase *From, VPBlockBase *To)
Disconnect VPBlockBases From and To bi-directionally.
Definition VPlanUtils.h:365
static auto blocksOnly(T &&Range)
Return an iterator range over Range which only includes BlockTy blocks.
Definition VPlanUtils.h:413
static void transferSuccessors(VPBlockBase *Old, VPBlockBase *New)
Transfer successors from Old to New. New must have no successors.
Definition VPlanUtils.h:397
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:661
A recipe for generating conditional branches on the bits of a mask.
Definition VPlan.h:3529
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:509
A special type of VPBasicBlock that wraps an existing IR basic block.
Definition VPlan.h:4590
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPBasicBlock,...
Definition VPlan.cpp:446
BasicBlock * getIRBasicBlock() const
Definition VPlan.h:4614
VPIRBasicBlock * clone() override
Clone the current block and it's recipes, without updating the operands of the cloned recipes.
Definition VPlan.cpp:471
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:1282
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:86
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:177
~VPMultiDefValue() override
Definition VPlan.cpp:183
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:403
void dump() const
Dump the recipe to stderr (for debugging).
Definition VPlan.cpp:115
VPBasicBlock * getParent()
Definition VPlan.h:475
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:162
VPRecipeValue(unsigned char SC, Value *UV, Type *Ty=nullptr)
Definition VPlanValue.h:343
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
Definition VPlan.h:4662
VPRegionBlock * clone() override
Clone all blocks in the single-entry single-exit region of the block and their recipes without updati...
Definition VPlan.cpp:718
const VPBlockBase * getEntry() const
Definition VPlan.h:4706
void dissolveToCFGLoop()
Remove the current region from its VPlan, connecting its predecessor to its entry,...
Definition VPlan.cpp:827
bool isReplicator() const
An indicator whether this region is to generate multiple replicated instances of output IR correspond...
Definition VPlan.h:4738
VPRegionValue * createHeaderMask()
Create the header mask for the region and return it.
Definition VPlan.h:4809
VPRegionValue * getUsedHeaderMask() const
Return the header mask if it exists and is used, or null otherwise.
Definition VPlan.h:4802
VPInstruction * getOrCreateCanonicalIVIncrement()
Get the canonical IV increment instruction if it exists.
Definition VPlan.cpp:853
InstructionCost cost(ElementCount VF, VPCostContext &Ctx) override
Return the cost of the block.
Definition VPlan.cpp:768
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:804
Type * getCanonicalIVType() const
Return the type of the canonical IV for loop regions.
Definition VPlan.h:4790
const VPBranchOnMaskRecipe * getEntryBranchOnMask() const
Return the VPBranchOnMaskRecipe from the entry block of this replicating region.
Definition VPlan.cpp:711
bool hasCanonicalIVNUW() const
Indicates if NUW is set for the canonical IV increment, for loop regions.
Definition VPlan.h:4826
void execute(VPTransformState *State) override
The method which generates the output IR instructions that correspond to this VPRegionBlock,...
Definition VPlan.cpp:738
VPRegionValue * getCanonicalIV()
Return the canonical induction variable of the region, null for replicating regions.
Definition VPlan.h:4782
const VPBlockBase * getExiting() const
Definition VPlan.h:4718
VPRegionValue * getHeaderMask() const
Return the header mask of the region, or null if not set.
Definition VPlan.h:4795
friend class VPlan
Definition VPlan.h:4663
VPValues are defined by a VPRegionBlock, like the canonical IV.
Definition VPlanValue.h:248
DebugLoc getDebugLoc() const
Returns the debug location of the VPRegionValue.
Definition VPlanValue.h:263
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
Definition VPlan.h:3420
VPSingleDefRecipe is a base class for recipes that model a sequence of one or more output IR that def...
Definition VPlan.h:611
VPSingleDefValue(VPSingleDefRecipe *Def, Value *UV=nullptr, Type *Ty=nullptr)
Construct a VPSingleDefValue. Must only be used by VPSingleDefRecipe.
Definition VPlan.cpp:167
~VPSingleDefValue() override
Definition VPlan.cpp:173
friend class VPSingleDefRecipe
Definition VPlanValue.h:361
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:1606
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:1602
A symbolic live-in VPValue, used for values like vector trip count, VF, and VFxUF.
Definition VPlanValue.h:213
Type * getType() const
Returns the scalar type of this symbolic value.
Definition VPlanValue.h:228
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:397
void replaceUsesOfWith(VPValue *From, VPValue *To)
Replaces all uses of From in the VPUser with To.
Definition VPlan.cpp:1490
void printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const
Print the operands to O.
Definition VPlan.cpp:1502
operand_range operands()
Definition VPlanValue.h:473
void setOperand(unsigned I, VPValue *New)
Definition VPlanValue.h:446
unsigned getNumOperands() const
Definition VPlanValue.h:437
VPValue * getOperand(unsigned N) const
Definition VPlanValue.h:438
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:147
Value * getLiveInIRValue() const
Return the underlying IR value for a VPIRValue.
Definition VPlan.cpp:141
bool isDefinedOutsideLoopRegions() const
Returns true if the VPValue is defined outside any loop.
Definition VPlan.cpp:1454
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:128
void printAsOperand(raw_ostream &OS, VPSlotTracker &Tracker) const
Definition VPlan.cpp:1498
void assertNotMaterialized() const
Assert that this VPValue has not been materialized, if it is a VPSymbolicValue.
Definition VPlanValue.h:581
Value * getUnderlyingValue() const
Return the underlying Value attached to this VPValue.
Definition VPlanValue.h:75
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:107
void print(raw_ostream &OS, VPSlotTracker &Tracker) const
Definition VPlan.cpp:100
void replaceAllUsesWith(VPValue *New)
Definition VPlan.cpp:1457
unsigned getNumUsers() const
Definition VPlanValue.h:115
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:1463
LLVM_DUMP_METHOD void dump()
Definition VPlan.cpp:1316
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4849
LLVM_ABI_FOR_TEST void printDOT(raw_ostream &O) const
Print this VPlan in DOT format to O.
Definition VPlan.cpp:1153
friend class VPSlotTracker
Definition VPlan.h:4851
std::string getName() const
Return a string with the name of the plan and the applicable VFs and UFs.
Definition VPlan.cpp:1129
VPBasicBlock * getEntry()
Definition VPlan.h:4945
Type * getIndexType() const
The type of the canonical induction variable of the vector loop.
Definition VPlan.h:5298
void setName(const Twine &newName)
Definition VPlan.h:5131
LLVM_ABI_FOR_TEST ~VPlan()
Definition VPlan.cpp:881
bool isExitBlock(VPBlockBase *VPBB)
Returns true if VPBB is an exit block.
Definition VPlan.cpp:900
friend class VPlanPrinter
Definition VPlan.h:4850
VPSymbolicValue & getVFxUF()
Returns VF * UF of the vector loop region.
Definition VPlan.h:5057
VPIRBasicBlock * createEmptyVPIRBasicBlock(BasicBlock *IRBB)
Create a VPIRBasicBlock wrapping IRBB, but do not create VPIRInstructions wrapping the instructions i...
Definition VPlan.cpp:1293
auto getLiveIns() const
Return the list of live-in VPValues available in the VPlan.
Definition VPlan.h:5195
ArrayRef< VPIRBasicBlock * > getExitBlocks() const
Return an ArrayRef containing VPIRBasicBlocks wrapping the exit blocks of the original scalar loop.
Definition VPlan.h:5011
LLVM_ABI_FOR_TEST VPRegionBlock * getVectorLoopRegion()
Returns the VPRegionBlock of the vector loop.
Definition VPlan.cpp:1035
bool hasEarlyExit() const
Returns true if the VPlan is based on a loop with an early exit.
Definition VPlan.h:5268
InstructionCost cost(ElementCount VF, VPCostContext &Ctx)
Return the cost of this plan.
Definition VPlan.cpp:1017
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:1059
unsigned getConcreteUF() const
Returns the concrete UF of the plan, after unrolling.
Definition VPlan.h:5113
void setEntry(VPBasicBlock *VPBB)
Definition VPlan.h:4934
VPBasicBlock * createVPBasicBlock(const Twine &Name, VPRecipeBase *Recipe=nullptr)
Create a new VPBasicBlock with Name and containing Recipe if present.
Definition VPlan.h:5218
LLVM_ABI_FOR_TEST VPIRBasicBlock * createVPIRBasicBlock(BasicBlock *IRBB)
Create a VPIRBasicBlock from IRBB containing VPIRInstructions for all instructions in IRBB,...
Definition VPlan.cpp:1301
LLVM_DUMP_METHOD void dump() const
Dump the plan to stderr (for debugging).
Definition VPlan.cpp:1159
VPBasicBlock * getScalarPreheader() const
Return the VPBasicBlock for the preheader of the scalar loop.
Definition VPlan.h:5001
void execute(VPTransformState *State)
Generate the IR code for this VPlan.
Definition VPlan.cpp:910
LLVM_ABI_FOR_TEST void print(raw_ostream &O) const
Print this VPlan to O.
Definition VPlan.cpp:1112
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
Definition VPlan.h:5007
void printLiveIns(raw_ostream &O) const
Print the live-ins of this VPlan to O.
Definition VPlan.cpp:1068
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:1200
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:319
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:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
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)
VPInstruction_match< VPInstruction::BranchOnTwoConds > m_BranchOnTwoConds()
VPInstruction_match< VPInstruction::BranchOnCount > m_BranchOnCount()
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.
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:60
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:67
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
cl::opt< unsigned > ForceTargetInstructionCost("force-target-instruction-cost", cl::init(0), cl::Hidden, cl::desc("A flag that overrides the target's expected cost for " "an instruction to a single constant value. Mostly " "useful for getting consistent testing."))
Definition VPlan.cpp:58
bool isa_and_present(const Y &Val)
isa_and_present<X> - Functionally identical to isa, except that a null value is accepted.
Definition Casting.h:669
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:1812
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.
cl::opt< unsigned > NumberOfStoresToPredicate("vectorize-num-stores-pred", cl::init(1), cl::Hidden, cl::desc("Max number of stores to be predicated behind an if."))
The number of stores in a loop that are allowed to need predication.
Definition VPlan.cpp:59
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:78
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:1925
TargetTransformInfo::OperandValueInfo getOperandInfo(VPValue *V) const
Returns the OperandInfo for V, if it is a live-in.
Definition VPlan.cpp:1823
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:1916
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:1840
TargetTransformInfo::TargetCostKind CostKind
VPSlotTracker * getSlotTracker()
Return a VPSlotTracker to re-use for printing, lazily constructing it on first use.
Definition VPlan.cpp:1831
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:1878
A VPValue representing a live-in from the input IR or a constant.
Definition VPlanValue.h:275
Type * getType() const
Returns the type of the underlying IR value.
Definition VPlan.cpp:145
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:336
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:275
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:240
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:314
Loop * CurrentParentLoop
The parent loop object for the current scope, or nullptr.