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.
@@ -514,7 +516,7 @@ void VPBasicBlock::execute(VPTransformState *State) {
514
516
515
517
State->CFG .PrevBB = NewBB;
516
518
State->CFG .VPBB2IRBB [this ] = NewBB;
517
- connectToPredecessors (State-> CFG );
519
+ connectToPredecessors (* State);
518
520
}
519
521
520
522
// 2. Fill the IR basic block with IR instructions.
@@ -623,6 +625,11 @@ bool VPBasicBlock::isExiting() const {
623
625
}
624
626
625
627
#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
+
626
633
void VPBlockBase::printSuccessors (raw_ostream &O, const Twine &Indent) const {
627
634
if (getSuccessors ().empty ()) {
628
635
O << Indent << " No successors\n " ;
@@ -1471,58 +1478,6 @@ void VPUser::printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const {
1471
1478
}
1472
1479
#endif
1473
1480
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
-
1526
1481
void VPSlotTracker::assignName (const VPValue *V) {
1527
1482
assert (!VPValue2Name.contains (V) && " VPValue already has a name!" );
1528
1483
auto *UV = V->getUnderlyingValue ();
0 commit comments