1919#include " VPlan.h"
2020#include " LoopVectorizationPlanner.h"
2121#include " VPlanCFG.h"
22+ #include " VPlanHelpers.h"
2223#include " VPlanPatternMatch.h"
2324#include " VPlanTransforms.h"
2425#include " VPlanUtils.h"
@@ -400,8 +401,8 @@ void VPTransformState::packScalarIntoVectorValue(VPValue *Def,
400401 set (Def, VectorValue);
401402}
402403
403- BasicBlock *
404- VPBasicBlock::createEmptyBasicBlock (VPTransformState::CFGState &CFG) {
404+ BasicBlock *VPBasicBlock::createEmptyBasicBlock (VPTransformState &State) {
405+ auto &CFG = State. CFG ;
405406 // BB stands for IR BasicBlocks. VPBB stands for VPlan VPBasicBlocks.
406407 // Pred stands for Predessor. Prev stands for Previous - last visited/created.
407408 BasicBlock *PrevBB = CFG.PrevBB ;
@@ -412,7 +413,8 @@ VPBasicBlock::createEmptyBasicBlock(VPTransformState::CFGState &CFG) {
412413 return NewBB;
413414}
414415
415- void VPBasicBlock::connectToPredecessors (VPTransformState::CFGState &CFG) {
416+ void VPBasicBlock::connectToPredecessors (VPTransformState &State) {
417+ auto &CFG = State.CFG ;
416418 BasicBlock *NewBB = CFG.VPBB2IRBB [this ];
417419 // Hook up the new basic block to its predecessors.
418420 for (VPBlockBase *PredVPBlock : getHierarchicalPredecessors ()) {
@@ -467,7 +469,7 @@ void VPIRBasicBlock::execute(VPTransformState *State) {
467469 " other blocks must be terminated by a branch" );
468470 }
469471
470- connectToPredecessors (State-> CFG );
472+ connectToPredecessors (* State);
471473}
472474
473475VPIRBasicBlock *VPIRBasicBlock::clone () {
@@ -494,7 +496,7 @@ void VPBasicBlock::execute(VPTransformState *State) {
494496 // * the exit of a replicate region.
495497 State->CFG .VPBB2IRBB [this ] = NewBB;
496498 } else {
497- NewBB = createEmptyBasicBlock (State-> CFG );
499+ NewBB = createEmptyBasicBlock (* State);
498500
499501 State->Builder .SetInsertPoint (NewBB);
500502 // Temporarily terminate with unreachable until CFG is rewired.
@@ -514,7 +516,7 @@ void VPBasicBlock::execute(VPTransformState *State) {
514516
515517 State->CFG .PrevBB = NewBB;
516518 State->CFG .VPBB2IRBB [this ] = NewBB;
517- connectToPredecessors (State-> CFG );
519+ connectToPredecessors (* State);
518520 }
519521
520522 // 2. Fill the IR basic block with IR instructions.
@@ -623,6 +625,11 @@ bool VPBasicBlock::isExiting() const {
623625}
624626
625627#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
628+ void VPBlockBase::print (raw_ostream &O) const {
629+ VPSlotTracker SlotTracker (getPlan ());
630+ print (O, " " , SlotTracker);
631+ }
632+
626633void VPBlockBase::printSuccessors (raw_ostream &O, const Twine &Indent) const {
627634 if (getSuccessors ().empty ()) {
628635 O << Indent << " No successors\n " ;
@@ -1471,58 +1478,6 @@ void VPUser::printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const {
14711478}
14721479#endif
14731480
1474- void VPInterleavedAccessInfo::visitRegion (VPRegionBlock *Region,
1475- Old2NewTy &Old2New,
1476- InterleavedAccessInfo &IAI) {
1477- ReversePostOrderTraversal<VPBlockShallowTraversalWrapper<VPBlockBase *>>
1478- RPOT (Region->getEntry ());
1479- for (VPBlockBase *Base : RPOT) {
1480- visitBlock (Base, Old2New, IAI);
1481- }
1482- }
1483-
1484- void VPInterleavedAccessInfo::visitBlock (VPBlockBase *Block, Old2NewTy &Old2New,
1485- InterleavedAccessInfo &IAI) {
1486- if (VPBasicBlock *VPBB = dyn_cast<VPBasicBlock>(Block)) {
1487- for (VPRecipeBase &VPI : *VPBB) {
1488- if (isa<VPWidenPHIRecipe>(&VPI))
1489- continue ;
1490- assert (isa<VPInstruction>(&VPI) && " Can only handle VPInstructions" );
1491- auto *VPInst = cast<VPInstruction>(&VPI);
1492-
1493- auto *Inst = dyn_cast_or_null<Instruction>(VPInst->getUnderlyingValue ());
1494- if (!Inst)
1495- continue ;
1496- auto *IG = IAI.getInterleaveGroup (Inst);
1497- if (!IG)
1498- continue ;
1499-
1500- auto NewIGIter = Old2New.find (IG);
1501- if (NewIGIter == Old2New.end ())
1502- Old2New[IG] = new InterleaveGroup<VPInstruction>(
1503- IG->getFactor (), IG->isReverse (), IG->getAlign ());
1504-
1505- if (Inst == IG->getInsertPos ())
1506- Old2New[IG]->setInsertPos (VPInst);
1507-
1508- InterleaveGroupMap[VPInst] = Old2New[IG];
1509- InterleaveGroupMap[VPInst]->insertMember (
1510- VPInst, IG->getIndex (Inst),
1511- Align (IG->isReverse () ? (-1 ) * int (IG->getFactor ())
1512- : IG->getFactor ()));
1513- }
1514- } else if (VPRegionBlock *Region = dyn_cast<VPRegionBlock>(Block))
1515- visitRegion (Region, Old2New, IAI);
1516- else
1517- llvm_unreachable (" Unsupported kind of VPBlock." );
1518- }
1519-
1520- VPInterleavedAccessInfo::VPInterleavedAccessInfo (VPlan &Plan,
1521- InterleavedAccessInfo &IAI) {
1522- Old2NewTy Old2New;
1523- visitRegion (Plan.getVectorLoopRegion (), Old2New, IAI);
1524- }
1525-
15261481void VPSlotTracker::assignName (const VPValue *V) {
15271482 assert (!VPValue2Name.contains (V) && " VPValue already has a name!" );
15281483 auto *UV = V->getUnderlyingValue ();
0 commit comments