if (auto *E = dyn_cast<SCEVUnknown>(Expr))
return Plan.getVPValueOrAddLiveIn(E->getValue());
- VPBasicBlock *Preheader = Plan.getEntry()->getEntryBasicBlock();
+ VPBasicBlock *Preheader = Plan.getEntry();
VPExpandSCEVRecipe *Step = new VPExpandSCEVRecipe(Expr, SE);
Preheader->appendRecipe(Step);
return Step;
/// to produce efficient output IR, including which branches, basic-blocks and
/// output IR instructions to generate, and their cost. VPlan holds a
/// Hierarchical-CFG of VPBasicBlocks and VPRegionBlocks rooted at an Entry
-/// VPBlock.
+/// VPBasicBlock.
class VPlan {
friend class VPlanPrinter;
friend class VPSlotTracker;
- /// Hold the single entry to the Hierarchical CFG of the VPlan.
- VPBlockBase *Entry;
+ /// Hold the single entry to the Hierarchical CFG of the VPlan, i.e. the
+ /// preheader of the vector loop.
+ VPBasicBlock *Entry;
/// Holds the VFs applicable to this VPlan.
SmallSetVector<ElementCount, 2> VFs;
MapVector<PHINode *, VPLiveOut *> LiveOuts;
public:
- VPlan(VPBlockBase *Entry = nullptr) : Entry(Entry) {
+ VPlan(VPBasicBlock *Entry = nullptr) : Entry(Entry) {
if (Entry)
Entry->setPlan(this);
}
/// Generate the IR code for this VPlan.
void execute(VPTransformState *State);
- VPBlockBase *getEntry() { return Entry; }
- const VPBlockBase *getEntry() const { return Entry; }
+ VPBasicBlock *getEntry() { return Entry; }
+ const VPBasicBlock *getEntry() const { return Entry; }
- VPBlockBase *setEntry(VPBlockBase *Block) {
+ VPBasicBlock *setEntry(VPBasicBlock *Block) {
Entry = Block;
Block->setPlan(this);
return Entry;
namespace {
TEST(VPDominatorTreeTest, DominanceNoRegionsTest) {
+ // VPBB0
+ // |
// R1 {
// VPBB1
// / \
// \ /
// VPBB4
// }
+ VPBasicBlock *VPBB0 = new VPBasicBlock("VPBB0");
VPBasicBlock *VPBB1 = new VPBasicBlock("VPBB1");
VPBasicBlock *VPBB2 = new VPBasicBlock("VPBB2");
VPBasicBlock *VPBB3 = new VPBasicBlock("VPBB3");
VPBB2->setParent(R1);
VPBB3->setParent(R1);
+ VPBlockUtils::connectBlocks(VPBB0, R1);
VPBlockUtils::connectBlocks(VPBB1, VPBB2);
VPBlockUtils::connectBlocks(VPBB1, VPBB3);
VPBlockUtils::connectBlocks(VPBB2, VPBB4);
VPBlockUtils::connectBlocks(VPBB3, VPBB4);
VPlan Plan;
- Plan.setEntry(R1);
+ Plan.setEntry(VPBB0);
VPDominatorTree VPDT;
VPDT.recalculate(Plan);
TEST(VPDominatorTreeTest, DominanceRegionsTest) {
{
// 2 consecutive regions.
+ // VPBB0
+ // |
// R1 {
// \
// R1BB1 _
// R2BB2
// }
//
+ VPBasicBlock *VPBB0 = new VPBasicBlock("VPBB0");
VPBasicBlock *R1BB1 = new VPBasicBlock();
VPBasicBlock *R1BB2 = new VPBasicBlock();
VPBasicBlock *R1BB3 = new VPBasicBlock();
VPRegionBlock *R1 = new VPRegionBlock(R1BB1, R1BB4, "R1");
R1BB2->setParent(R1);
R1BB3->setParent(R1);
+ VPBlockUtils::connectBlocks(VPBB0, R1);
VPBlockUtils::connectBlocks(R1BB1, R1BB2);
VPBlockUtils::connectBlocks(R1BB1, R1BB3);
VPBlockUtils::connectBlocks(R1BB2, R1BB4);
VPBlockUtils::connectBlocks(R1, R2);
VPlan Plan;
- Plan.setEntry(R1);
+ Plan.setEntry(VPBB0);
VPDominatorTree VPDT;
VPDT.recalculate(Plan);
}
{
- // Region block is entry into VPlan.
- VPBasicBlock *R1BB1 = new VPBasicBlock();
- VPBasicBlock *R1BB2 = new VPBasicBlock();
- VPRegionBlock *R1 = new VPRegionBlock(R1BB1, R1BB2, "R1");
- VPBlockUtils::connectBlocks(R1BB1, R1BB2);
-
- VPlan Plan;
- Plan.setEntry(R1);
- EXPECT_EQ(&Plan, R1->getPlan());
- EXPECT_EQ(&Plan, R1BB1->getPlan());
- EXPECT_EQ(&Plan, R1BB2->getPlan());
- }
-
- {
// VPBasicBlock is the entry into the VPlan, followed by a region.
VPBasicBlock *R1BB1 = new VPBasicBlock();
VPBasicBlock *R1BB2 = new VPBasicBlock();
{
// 2 consecutive regions.
+ // VPBB0
+ // |
// R1 {
// \
// R1BB1
// |
// R2BB2
//
+ VPBasicBlock *VPBB0 = new VPBasicBlock("VPBB0");
VPBasicBlock *R1BB1 = new VPBasicBlock();
VPBasicBlock *R1BB2 = new VPBasicBlock();
VPBasicBlock *R1BB3 = new VPBasicBlock();
VPRegionBlock *R1 = new VPRegionBlock(R1BB1, R1BB4, "R1");
R1BB2->setParent(R1);
R1BB3->setParent(R1);
+ VPBlockUtils::connectBlocks(VPBB0, R1);
VPBlockUtils::connectBlocks(R1BB1, R1BB2);
VPBlockUtils::connectBlocks(R1BB1, R1BB3);
VPBlockUtils::connectBlocks(R1BB2, R1BB4);
// Use Plan to properly clean up created blocks.
VPlan Plan;
- Plan.setEntry(R1);
+ Plan.setEntry(VPBB0);
}
{