19
19
#include " VPlan.h"
20
20
#include " LoopVectorizationPlanner.h"
21
21
#include " VPlanCFG.h"
22
+ #include " VPlanHelpers.h"
22
23
#include " VPlanPatternMatch.h"
23
24
#include " VPlanTransforms.h"
24
25
#include " VPlanUtils.h"
@@ -400,8 +401,8 @@ void VPTransformState::packScalarIntoVectorValue(VPValue *Def,
400
401
set (Def, VectorValue);
401
402
}
402
403
403
- BasicBlock *
404
- VPBasicBlock::createEmptyBasicBlock (VPTransformState::CFGState &CFG) {
404
+ BasicBlock *VPBasicBlock::createEmptyBasicBlock (VPTransformState &State) {
405
+ auto &CFG = State. CFG ;
405
406
// BB stands for IR BasicBlocks. VPBB stands for VPlan VPBasicBlocks.
406
407
// Pred stands for Predessor. Prev stands for Previous - last visited/created.
407
408
BasicBlock *PrevBB = CFG.PrevBB ;
@@ -412,7 +413,8 @@ VPBasicBlock::createEmptyBasicBlock(VPTransformState::CFGState &CFG) {
412
413
return NewBB;
413
414
}
414
415
415
- void VPBasicBlock::connectToPredecessors (VPTransformState::CFGState &CFG) {
416
+ void VPBasicBlock::connectToPredecessors (VPTransformState &State) {
417
+ auto &CFG = State.CFG ;
416
418
BasicBlock *NewBB = CFG.VPBB2IRBB [this ];
417
419
// Hook up the new basic block to its predecessors.
418
420
for (VPBlockBase *PredVPBlock : getHierarchicalPredecessors ()) {
@@ -467,7 +469,7 @@ void VPIRBasicBlock::execute(VPTransformState *State) {
467
469
" other blocks must be terminated by a branch" );
468
470
}
469
471
470
- connectToPredecessors (State-> CFG );
472
+ connectToPredecessors (* State);
471
473
}
472
474
473
475
VPIRBasicBlock *VPIRBasicBlock::clone () {
@@ -494,7 +496,7 @@ void VPBasicBlock::execute(VPTransformState *State) {
494
496
// * the exit of a replicate region.
495
497
State->CFG .VPBB2IRBB [this ] = NewBB;
496
498
} else {
497
- NewBB = createEmptyBasicBlock (State-> CFG );
499
+ NewBB = createEmptyBasicBlock (* State);
498
500
499
501
State->Builder .SetInsertPoint (NewBB);
500
502
// Temporarily terminate with unreachable until CFG is rewired.
@@ -507,7 +509,7 @@ void VPBasicBlock::execute(VPTransformState *State) {
507
509
508
510
State->CFG .PrevBB = NewBB;
509
511
State->CFG .VPBB2IRBB [this ] = NewBB;
510
- connectToPredecessors (State-> CFG );
512
+ connectToPredecessors (* State);
511
513
}
512
514
513
515
// 2. Fill the IR basic block with IR instructions.
@@ -616,6 +618,11 @@ bool VPBasicBlock::isExiting() const {
616
618
}
617
619
618
620
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
621
+ void VPBlockBase::print (raw_ostream &O) const {
622
+ VPSlotTracker SlotTracker (getPlan ());
623
+ print (O, " " , SlotTracker);
624
+ }
625
+
619
626
void VPBlockBase::printSuccessors (raw_ostream &O, const Twine &Indent) const {
620
627
if (getSuccessors ().empty ()) {
621
628
O << Indent << " No successors\n " ;
@@ -1460,58 +1467,6 @@ void VPUser::printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const {
1460
1467
}
1461
1468
#endif
1462
1469
1463
- void VPInterleavedAccessInfo::visitRegion (VPRegionBlock *Region,
1464
- Old2NewTy &Old2New,
1465
- InterleavedAccessInfo &IAI) {
1466
- ReversePostOrderTraversal<VPBlockShallowTraversalWrapper<VPBlockBase *>>
1467
- RPOT (Region->getEntry ());
1468
- for (VPBlockBase *Base : RPOT) {
1469
- visitBlock (Base, Old2New, IAI);
1470
- }
1471
- }
1472
-
1473
- void VPInterleavedAccessInfo::visitBlock (VPBlockBase *Block, Old2NewTy &Old2New,
1474
- InterleavedAccessInfo &IAI) {
1475
- if (VPBasicBlock *VPBB = dyn_cast<VPBasicBlock>(Block)) {
1476
- for (VPRecipeBase &VPI : *VPBB) {
1477
- if (isa<VPWidenPHIRecipe>(&VPI))
1478
- continue ;
1479
- assert (isa<VPInstruction>(&VPI) && " Can only handle VPInstructions" );
1480
- auto *VPInst = cast<VPInstruction>(&VPI);
1481
-
1482
- auto *Inst = dyn_cast_or_null<Instruction>(VPInst->getUnderlyingValue ());
1483
- if (!Inst)
1484
- continue ;
1485
- auto *IG = IAI.getInterleaveGroup (Inst);
1486
- if (!IG)
1487
- continue ;
1488
-
1489
- auto NewIGIter = Old2New.find (IG);
1490
- if (NewIGIter == Old2New.end ())
1491
- Old2New[IG] = new InterleaveGroup<VPInstruction>(
1492
- IG->getFactor (), IG->isReverse (), IG->getAlign ());
1493
-
1494
- if (Inst == IG->getInsertPos ())
1495
- Old2New[IG]->setInsertPos (VPInst);
1496
-
1497
- InterleaveGroupMap[VPInst] = Old2New[IG];
1498
- InterleaveGroupMap[VPInst]->insertMember (
1499
- VPInst, IG->getIndex (Inst),
1500
- Align (IG->isReverse () ? (-1 ) * int (IG->getFactor ())
1501
- : IG->getFactor ()));
1502
- }
1503
- } else if (VPRegionBlock *Region = dyn_cast<VPRegionBlock>(Block))
1504
- visitRegion (Region, Old2New, IAI);
1505
- else
1506
- llvm_unreachable (" Unsupported kind of VPBlock." );
1507
- }
1508
-
1509
- VPInterleavedAccessInfo::VPInterleavedAccessInfo (VPlan &Plan,
1510
- InterleavedAccessInfo &IAI) {
1511
- Old2NewTy Old2New;
1512
- visitRegion (Plan.getVectorLoopRegion (), Old2New, IAI);
1513
- }
1514
-
1515
1470
void VPSlotTracker::assignName (const VPValue *V) {
1516
1471
assert (!VPValue2Name.contains (V) && " VPValue already has a name!" );
1517
1472
auto *UV = V->getUnderlyingValue ();
0 commit comments