From 8caeb2e0c2fb8a5f1689c11775b81ceee76de958 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Fri, 27 Dec 2024 17:43:07 +0000 Subject: [PATCH] [VPlan] Always create initial blocks in constructor (NFC). Update C++ unit tests to use VPlanTestBase to construct initial VPlan, using a constructor that creates the VP blocks directly in the constructor. Split off from and in preparation for https://github.com/llvm/llvm-project/pull/120918. --- llvm/lib/Transforms/Vectorize/VPlan.h | 17 +- .../Transforms/Vectorize/VPlanHCFGBuilder.h | 4 +- .../Transforms/Vectorize/VPDomTreeTest.cpp | 42 ++-- .../Transforms/Vectorize/VPlanHCFGTest.cpp | 2 +- .../Transforms/Vectorize/VPlanSlpTest.cpp | 2 +- .../Transforms/Vectorize/VPlanTest.cpp | 210 ++++++------------ .../Transforms/Vectorize/VPlanTestBase.h | 20 +- .../Vectorize/VPlanVerifierTest.cpp | 89 +++----- 8 files changed, 141 insertions(+), 245 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h index e2c0ff795467..e62ace1980aa 100644 --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -3863,7 +3863,6 @@ class VPlan { /// been modeled in VPlan directly. DenseMap SCEVToExpansion; -public: /// Construct a VPlan with \p Entry to the plan and with \p ScalarHeader /// wrapping the original header of the scalar loop. VPlan(VPBasicBlock *Entry, VPIRBasicBlock *ScalarHeader) @@ -3873,18 +3872,20 @@ public: "scalar header must be a leaf node"); } - /// Construct a VPlan with \p Entry entering the plan, trip count \p TC and - /// with \p ScalarHeader wrapping the original header of the scalar loop. - VPlan(VPBasicBlock *Entry, VPValue *TC, VPIRBasicBlock *ScalarHeader) - : VPlan(Entry, ScalarHeader) { - TripCount = TC; - } - +public: /// Construct a VPlan for \p L. This will create VPIRBasicBlocks wrapping the /// original preheader and scalar header of \p L, to be used as entry and /// scalar header blocks of the new VPlan. VPlan(Loop *L); + /// Construct a VPlan with a new VPBasicBlock as entry, a VPIRBasicBlock + /// wrapping \p ScalarHeaderBB and a trip count of \p TC. + VPlan(BasicBlock *ScalarHeaderBB, VPValue *TC) { + setEntry(new VPBasicBlock("preheader")); + ScalarHeader = VPIRBasicBlock::fromBasicBlock(ScalarHeaderBB); + TripCount = TC; + } + ~VPlan(); void setEntry(VPBasicBlock *VPBB) { diff --git a/llvm/lib/Transforms/Vectorize/VPlanHCFGBuilder.h b/llvm/lib/Transforms/Vectorize/VPlanHCFGBuilder.h index 9e8f9f3f4002..ad6e2ad90a96 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanHCFGBuilder.h +++ b/llvm/lib/Transforms/Vectorize/VPlanHCFGBuilder.h @@ -32,11 +32,11 @@ class Loop; class LoopInfo; class VPRegionBlock; class VPlan; -class VPlanTestBase; +class VPlanTestIRBase; /// Main class to build the VPlan H-CFG for an incoming IR. class VPlanHCFGBuilder { - friend VPlanTestBase; + friend VPlanTestIRBase; private: // The outermost loop of the input loop nest considered for vectorization. diff --git a/llvm/unittests/Transforms/Vectorize/VPDomTreeTest.cpp b/llvm/unittests/Transforms/Vectorize/VPDomTreeTest.cpp index 847cca7714ef..6aa34a5fa431 100644 --- a/llvm/unittests/Transforms/Vectorize/VPDomTreeTest.cpp +++ b/llvm/unittests/Transforms/Vectorize/VPDomTreeTest.cpp @@ -9,12 +9,15 @@ #include "../lib/Transforms/Vectorize/VPlan.h" #include "../lib/Transforms/Vectorize/VPlanDominatorTree.h" +#include "VPlanTestBase.h" #include "gtest/gtest.h" namespace llvm { namespace { -TEST(VPDominatorTreeTest, DominanceNoRegionsTest) { +using VPDominatorTreeTest = VPlanTestBase; + +TEST_F(VPDominatorTreeTest, DominanceNoRegionsTest) { // VPBB0 // | // R1 { @@ -24,8 +27,8 @@ TEST(VPDominatorTreeTest, DominanceNoRegionsTest) { // \ / // VPBB4 // } - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB0 = new VPBasicBlock("VPBB0"); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB0 = Plan.getEntry(); VPBasicBlock *VPBB1 = new VPBasicBlock("VPBB1"); VPBasicBlock *VPBB2 = new VPBasicBlock("VPBB2"); VPBasicBlock *VPBB3 = new VPBasicBlock("VPBB3"); @@ -40,12 +43,7 @@ TEST(VPDominatorTreeTest, DominanceNoRegionsTest) { VPBlockUtils::connectBlocks(VPBB2, VPBB4); VPBlockUtils::connectBlocks(VPBB3, VPBB4); - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB0); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); VPDominatorTree VPDT; VPDT.recalculate(Plan); @@ -62,7 +60,6 @@ TEST(VPDominatorTreeTest, DominanceNoRegionsTest) { EXPECT_EQ(VPDT.findNearestCommonDominator(VPBB2, VPBB3), VPBB1); EXPECT_EQ(VPDT.findNearestCommonDominator(VPBB2, VPBB4), VPBB1); EXPECT_EQ(VPDT.findNearestCommonDominator(VPBB4, VPBB4), VPBB4); - delete ScalarHeader; } static void @@ -76,9 +73,7 @@ checkDomChildren(VPDominatorTree &VPDT, VPBlockBase *Src, EXPECT_EQ(Children, ExpectedNodes); } -TEST(VPDominatorTreeTest, DominanceRegionsTest) { - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); +TEST_F(VPDominatorTreeTest, DominanceRegionsTest) { { // 2 consecutive regions. // VPBB0 @@ -99,8 +94,8 @@ TEST(VPDominatorTreeTest, DominanceRegionsTest) { // R2BB2 // } // - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB0 = new VPBasicBlock("VPBB0"); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB0 = Plan.getEntry(); VPBasicBlock *R1BB1 = new VPBasicBlock(); VPBasicBlock *R1BB2 = new VPBasicBlock(); VPBasicBlock *R1BB3 = new VPBasicBlock(); @@ -122,10 +117,7 @@ TEST(VPDominatorTreeTest, DominanceRegionsTest) { VPBlockUtils::connectBlocks(R2BB1, R2BB2); VPBlockUtils::connectBlocks(R1, R2); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R2, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB0); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R2, Plan.getScalarHeader()); VPDominatorTree VPDT; VPDT.recalculate(Plan); @@ -177,7 +169,7 @@ TEST(VPDominatorTreeTest, DominanceRegionsTest) { // | // VPBB2 // - VPBasicBlock *VPPH = new VPBasicBlock("ph"); + VPlan &Plan = getPlan(); VPBasicBlock *R1BB1 = new VPBasicBlock("R1BB1"); VPBasicBlock *R1BB2 = new VPBasicBlock("R1BB2"); VPBasicBlock *R1BB3 = new VPBasicBlock("R1BB3"); @@ -199,15 +191,12 @@ TEST(VPDominatorTreeTest, DominanceRegionsTest) { VPBlockUtils::connectBlocks(R1BB2, R1BB3); VPBlockUtils::connectBlocks(R2, R1BB3); - VPBasicBlock *VPBB1 = new VPBasicBlock("VPBB1"); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBlockUtils::connectBlocks(VPBB1, R1); VPBasicBlock *VPBB2 = new VPBasicBlock("VPBB2"); VPBlockUtils::connectBlocks(R1, VPBB2); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB2, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB2, Plan.getScalarHeader()); VPDominatorTree VPDT; VPDT.recalculate(Plan); @@ -220,9 +209,8 @@ TEST(VPDominatorTreeTest, DominanceRegionsTest) { checkDomChildren(VPDT, R2BB2, {R2BB3}); checkDomChildren(VPDT, R2BB3, {}); checkDomChildren(VPDT, R1BB3, {VPBB2}); - checkDomChildren(VPDT, VPBB2, {ScalarHeaderVPBB}); + checkDomChildren(VPDT, VPBB2, {Plan.getScalarHeader()}); } - delete ScalarHeader; } } // namespace diff --git a/llvm/unittests/Transforms/Vectorize/VPlanHCFGTest.cpp b/llvm/unittests/Transforms/Vectorize/VPlanHCFGTest.cpp index 1b362d1d26bd..19c2483d34ed 100644 --- a/llvm/unittests/Transforms/Vectorize/VPlanHCFGTest.cpp +++ b/llvm/unittests/Transforms/Vectorize/VPlanHCFGTest.cpp @@ -17,7 +17,7 @@ namespace llvm { namespace { -class VPlanHCFGTest : public VPlanTestBase {}; +class VPlanHCFGTest : public VPlanTestIRBase {}; TEST_F(VPlanHCFGTest, testBuildHCFGInnerLoop) { const char *ModuleString = diff --git a/llvm/unittests/Transforms/Vectorize/VPlanSlpTest.cpp b/llvm/unittests/Transforms/Vectorize/VPlanSlpTest.cpp index 1b993b63898c..e3c542ec5cac 100644 --- a/llvm/unittests/Transforms/Vectorize/VPlanSlpTest.cpp +++ b/llvm/unittests/Transforms/Vectorize/VPlanSlpTest.cpp @@ -16,7 +16,7 @@ namespace llvm { namespace { -class VPlanSlpTest : public VPlanTestBase { +class VPlanSlpTest : public VPlanTestIRBase { protected: TargetLibraryInfoImpl TLII; TargetLibraryInfo TLI; diff --git a/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp b/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp index f3a1bba518c8..2ab55f64a207 100644 --- a/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp +++ b/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp @@ -9,6 +9,7 @@ #include "../lib/Transforms/Vectorize/VPlan.h" #include "../lib/Transforms/Vectorize/VPlanCFG.h" +#include "VPlanTestBase.h" #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/Analysis/VectorUtils.h" @@ -237,12 +238,13 @@ TEST(VPInstructionTest, releaseOperandsAtDeletion) { delete VPV1; delete VPV2; } -TEST(VPBasicBlockTest, getPlan) { - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); + +using VPBasicBlockTest = VPlanTestBase; + +TEST_F(VPBasicBlockTest, getPlan) { { - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPBasicBlock *VPBB3 = new VPBasicBlock(); VPBasicBlock *VPBB4 = new VPBasicBlock(); @@ -256,11 +258,7 @@ TEST(VPBasicBlockTest, getPlan) { VPBlockUtils::connectBlocks(VPBB1, VPBB3); VPBlockUtils::connectBlocks(VPBB2, VPBB4); VPBlockUtils::connectBlocks(VPBB3, VPBB4); - - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB4, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB4, Plan.getScalarHeader()); EXPECT_EQ(&Plan, VPBB1->getPlan()); EXPECT_EQ(&Plan, VPBB2->getPlan()); @@ -269,20 +267,17 @@ TEST(VPBasicBlockTest, getPlan) { } { - VPBasicBlock *VPPH = new VPBasicBlock("ph"); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB1 = Plan.getEntry(); // VPBasicBlock is the entry into the VPlan, followed by a region. VPBasicBlock *R1BB1 = new VPBasicBlock(); VPBasicBlock *R1BB2 = new VPBasicBlock(); VPRegionBlock *R1 = new VPRegionBlock(R1BB1, R1BB2, "R1"); VPBlockUtils::connectBlocks(R1BB1, R1BB2); - VPBasicBlock *VPBB1 = new VPBasicBlock(); VPBlockUtils::connectBlocks(VPBB1, R1); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); EXPECT_EQ(&Plan, VPBB1->getPlan()); EXPECT_EQ(&Plan, R1->getPlan()); @@ -291,8 +286,7 @@ TEST(VPBasicBlockTest, getPlan) { } { - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - + VPlan &Plan = getPlan(); VPBasicBlock *R1BB1 = new VPBasicBlock(); VPBasicBlock *R1BB2 = new VPBasicBlock(); VPRegionBlock *R1 = new VPRegionBlock(R1BB1, R1BB2, "R1"); @@ -303,7 +297,7 @@ TEST(VPBasicBlockTest, getPlan) { VPRegionBlock *R2 = new VPRegionBlock(R2BB1, R2BB2, "R2"); VPBlockUtils::connectBlocks(R2BB1, R2BB2); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBlockUtils::connectBlocks(VPBB1, R1); VPBlockUtils::connectBlocks(VPBB1, R2); @@ -311,10 +305,7 @@ TEST(VPBasicBlockTest, getPlan) { VPBlockUtils::connectBlocks(R1, VPBB2); VPBlockUtils::connectBlocks(R2, VPBB2); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R2, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R2, Plan.getScalarHeader()); EXPECT_EQ(&Plan, VPBB1->getPlan()); EXPECT_EQ(&Plan, R1->getPlan()); @@ -325,12 +316,9 @@ TEST(VPBasicBlockTest, getPlan) { EXPECT_EQ(&Plan, R2BB2->getPlan()); EXPECT_EQ(&Plan, VPBB2->getPlan()); } - delete ScalarHeader; } -TEST(VPBasicBlockTest, TraversingIteratorTest) { - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); +TEST_F(VPBasicBlockTest, TraversingIteratorTest) { { // VPBasicBlocks only // VPBB1 @@ -339,8 +327,8 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { // \ / // VPBB4 // - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPBasicBlock *VPBB3 = new VPBasicBlock(); VPBasicBlock *VPBB4 = new VPBasicBlock(); @@ -356,11 +344,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { EXPECT_EQ(VPBB1, FromIterator[0]); EXPECT_EQ(VPBB2, FromIterator[1]); - // Use Plan to properly clean up created blocks. - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB4, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB4, Plan.getScalarHeader()); } { @@ -382,8 +366,8 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { // | // R2BB2 // - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB0 = new VPBasicBlock("VPBB0"); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB0 = Plan.getEntry(); VPBasicBlock *R1BB1 = new VPBasicBlock(); VPBasicBlock *R1BB2 = new VPBasicBlock(); VPBasicBlock *R1BB3 = new VPBasicBlock(); @@ -458,11 +442,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { EXPECT_EQ(R1BB1, FromIterator[6]); EXPECT_EQ(R1, FromIterator[7]); - // Use Plan to properly clean up created blocks. - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R2, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB0); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R2, Plan.getScalarHeader()); } { @@ -486,7 +466,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { // | // VPBB2 // - VPBasicBlock *VPPH = new VPBasicBlock("ph"); + VPlan &Plan = getPlan(); VPBasicBlock *R1BB1 = new VPBasicBlock("R1BB1"); VPBasicBlock *R1BB2 = new VPBasicBlock("R1BB2"); VPBasicBlock *R1BB3 = new VPBasicBlock("R1BB3"); @@ -508,7 +488,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { VPBlockUtils::connectBlocks(R1BB2, R1BB3); VPBlockUtils::connectBlocks(R2, R1BB3); - VPBasicBlock *VPBB1 = new VPBasicBlock("VPBB1"); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBlockUtils::connectBlocks(VPBB1, R1); VPBasicBlock *VPBB2 = new VPBasicBlock("VPBB2"); VPBlockUtils::connectBlocks(R1, VPBB2); @@ -543,11 +523,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { EXPECT_EQ(R1, FromIterator[8]); EXPECT_EQ(VPBB1, FromIterator[9]); - // Use Plan to properly clean up created blocks. - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB2, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB2, Plan.getScalarHeader()); } { @@ -561,7 +537,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { // R2BB2 // } // - VPBasicBlock *VPPH = new VPBasicBlock("ph"); + VPlan &Plan = getPlan(); VPBasicBlock *R2BB1 = new VPBasicBlock("R2BB1"); VPBasicBlock *R2BB2 = new VPBasicBlock("R2BB2"); VPRegionBlock *R2 = new VPRegionBlock(R2BB1, R2BB2, "R2"); @@ -570,7 +546,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { VPRegionBlock *R1 = new VPRegionBlock(R2, R2, "R1"); R2->setParent(R1); - VPBasicBlock *VPBB1 = new VPBasicBlock("VPBB1"); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBlockUtils::connectBlocks(VPBB1, R1); // Depth-first. @@ -593,11 +569,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { EXPECT_EQ(R1, FromIterator[3]); EXPECT_EQ(VPBB1, FromIterator[4]); - // Use Plan to properly clean up created blocks. - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); } { @@ -619,7 +591,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { // | // VPBB2 // - VPBasicBlock *VPPH = new VPBasicBlock("ph"); + VPlan &Plan = getPlan(); VPBasicBlock *R3BB1 = new VPBasicBlock("R3BB1"); VPRegionBlock *R3 = new VPRegionBlock(R3BB1, R3BB1, "R3"); @@ -631,7 +603,7 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { VPRegionBlock *R1 = new VPRegionBlock(R2, R2, "R1"); R2->setParent(R1); - VPBasicBlock *VPBB1 = new VPBasicBlock("VPBB1"); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock("VPBB2"); VPBlockUtils::connectBlocks(VPBB1, R1); VPBlockUtils::connectBlocks(R1, VPBB2); @@ -687,19 +659,15 @@ TEST(VPBasicBlockTest, TraversingIteratorTest) { EXPECT_EQ(R2BB1, FromIterator[2]); EXPECT_EQ(VPBB1, FromIterator[3]); - // Use Plan to properly clean up created blocks. - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB2, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB2, Plan.getScalarHeader()); } - delete ScalarHeader; } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) -TEST(VPBasicBlockTest, print) { +TEST_F(VPBasicBlockTest, print) { VPInstruction *TC = new VPInstruction(Instruction::Add, {}); - VPBasicBlock *VPBB0 = new VPBasicBlock("preheader"); + VPlan &Plan = getPlan(TC); + VPBasicBlock *VPBB0 = Plan.getEntry(); VPBB0->appendRecipe(TC); VPInstruction *I1 = new VPInstruction(Instruction::Add, {}); @@ -730,12 +698,8 @@ TEST(VPBasicBlockTest, print) { EXPECT_EQ("EMIT br , ", I3Dump); } - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, "scalar.header"); - auto * ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB2, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB2, Plan.getScalarHeader()); VPBlockUtils::connectBlocks(VPBB0, VPBB1); - VPlan Plan(VPBB0, TC, ScalarHeaderVPBB); std::string FullDump; raw_string_ostream OS(FullDump); Plan.printDOT(OS); @@ -810,13 +774,12 @@ Successor(s): ir-bb OS << *I4; EXPECT_EQ("EMIT vp<%5> = mul vp<%3>, vp<%2>", I4Dump); } - delete ScalarHeader; } -TEST(VPBasicBlockTest, printPlanWithVFsAndUFs) { - +TEST_F(VPBasicBlockTest, printPlanWithVFsAndUFs) { VPInstruction *TC = new VPInstruction(Instruction::Sub, {}); - VPBasicBlock *VPBB0 = new VPBasicBlock("preheader"); + VPlan &Plan = getPlan(TC); + VPBasicBlock *VPBB0 = Plan.getEntry(); VPBB0->appendRecipe(TC); VPInstruction *I1 = new VPInstruction(Instruction::Add, {}); @@ -824,12 +787,8 @@ TEST(VPBasicBlockTest, printPlanWithVFsAndUFs) { VPBB1->appendRecipe(I1); VPBB1->setName("bb1"); - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB1, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB1, Plan.getScalarHeader()); VPBlockUtils::connectBlocks(VPBB0, VPBB1); - VPlan Plan(VPBB0, TC, ScalarHeaderVPBB); Plan.setName("TestPlan"); Plan.addVF(ElementCount::getFixed(4)); @@ -847,9 +806,9 @@ Successor(s): bb1 bb1: EMIT vp<%2> = add -Successor(s): ir-bb<> +Successor(s): ir-bb -ir-bb<>: +ir-bb: No successors } )"; @@ -871,9 +830,9 @@ Successor(s): bb1 bb1: EMIT vp<%2> = add -Successor(s): ir-bb<> +Successor(s): ir-bb -ir-bb<>: +ir-bb: No successors } )"; @@ -895,19 +854,19 @@ Successor(s): bb1 bb1: EMIT vp<%2> = add -Successor(s): ir-bb<> +Successor(s): ir-bb -ir-bb<>: +ir-bb: No successors } )"; EXPECT_EQ(ExpectedStr, FullDump); } - delete ScalarHeader; } #endif -TEST(VPRecipeTest, CastVPInstructionToVPUser) { +using VPRecipeTest = VPlanTestBase; +TEST_F(VPRecipeTest, CastVPInstructionToVPUser) { VPValue Op1; VPValue Op2; VPInstruction Recipe(Instruction::Add, {&Op1, &Op2}); @@ -917,9 +876,7 @@ TEST(VPRecipeTest, CastVPInstructionToVPUser) { EXPECT_EQ(&Recipe, BaseR); } -TEST(VPRecipeTest, CastVPWidenRecipeToVPUser) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPWidenRecipeToVPUser) { IntegerType *Int32 = IntegerType::get(C, 32); auto *AI = BinaryOperator::CreateAdd(PoisonValue::get(Int32), PoisonValue::get(Int32)); @@ -936,9 +893,7 @@ TEST(VPRecipeTest, CastVPWidenRecipeToVPUser) { delete AI; } -TEST(VPRecipeTest, CastVPWidenCallRecipeToVPUserAndVPDef) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPWidenCallRecipeToVPUserAndVPDef) { IntegerType *Int32 = IntegerType::get(C, 32); FunctionType *FTy = FunctionType::get(Int32, false); Function *Fn = Function::Create(FTy, GlobalValue::ExternalLinkage, 0); @@ -964,9 +919,7 @@ TEST(VPRecipeTest, CastVPWidenCallRecipeToVPUserAndVPDef) { delete Fn; } -TEST(VPRecipeTest, CastVPWidenSelectRecipeToVPUserAndVPDef) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPWidenSelectRecipeToVPUserAndVPDef) { IntegerType *Int1 = IntegerType::get(C, 1); IntegerType *Int32 = IntegerType::get(C, 32); auto *SelectI = SelectInst::Create( @@ -992,9 +945,7 @@ TEST(VPRecipeTest, CastVPWidenSelectRecipeToVPUserAndVPDef) { delete SelectI; } -TEST(VPRecipeTest, CastVPWidenGEPRecipeToVPUserAndVPDef) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPWidenGEPRecipeToVPUserAndVPDef) { IntegerType *Int32 = IntegerType::get(C, 32); PointerType *Int32Ptr = PointerType::get(Int32, 0); auto *GEP = GetElementPtrInst::Create(Int32, PoisonValue::get(Int32Ptr), @@ -1017,9 +968,7 @@ TEST(VPRecipeTest, CastVPWidenGEPRecipeToVPUserAndVPDef) { delete GEP; } -TEST(VPRecipeTest, CastVPBlendRecipeToVPUser) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPBlendRecipeToVPUser) { IntegerType *Int32 = IntegerType::get(C, 32); auto *Phi = PHINode::Create(Int32, 1); VPValue I1; @@ -1036,9 +985,7 @@ TEST(VPRecipeTest, CastVPBlendRecipeToVPUser) { delete Phi; } -TEST(VPRecipeTest, CastVPInterleaveRecipeToVPUser) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPInterleaveRecipeToVPUser) { VPValue Addr; VPValue Mask; InterleaveGroup IG(4, false, Align(4)); @@ -1049,9 +996,7 @@ TEST(VPRecipeTest, CastVPInterleaveRecipeToVPUser) { EXPECT_EQ(&Recipe, BaseR); } -TEST(VPRecipeTest, CastVPReplicateRecipeToVPUser) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPReplicateRecipeToVPUser) { VPValue Op1; VPValue Op2; SmallVector Args; @@ -1068,9 +1013,7 @@ TEST(VPRecipeTest, CastVPReplicateRecipeToVPUser) { delete Call; } -TEST(VPRecipeTest, CastVPBranchOnMaskRecipeToVPUser) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPBranchOnMaskRecipeToVPUser) { VPValue Mask; VPBranchOnMaskRecipe Recipe(&Mask); EXPECT_TRUE(isa(&Recipe)); @@ -1079,9 +1022,7 @@ TEST(VPRecipeTest, CastVPBranchOnMaskRecipeToVPUser) { EXPECT_EQ(&Recipe, BaseR); } -TEST(VPRecipeTest, CastVPWidenMemoryRecipeToVPUserAndVPDef) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPWidenMemoryRecipeToVPUserAndVPDef) { IntegerType *Int32 = IntegerType::get(C, 32); PointerType *Int32Ptr = PointerType::get(Int32, 0); auto *Load = @@ -1101,8 +1042,7 @@ TEST(VPRecipeTest, CastVPWidenMemoryRecipeToVPUserAndVPDef) { delete Load; } -TEST(VPRecipeTest, MayHaveSideEffectsAndMayReadWriteMemory) { - LLVMContext C; +TEST_F(VPRecipeTest, MayHaveSideEffectsAndMayReadWriteMemory) { IntegerType *Int1 = IntegerType::get(C, 1); IntegerType *Int32 = IntegerType::get(C, 32); PointerType *Int32Ptr = PointerType::get(Int32, 0); @@ -1242,7 +1182,6 @@ TEST(VPRecipeTest, MayHaveSideEffectsAndMayReadWriteMemory) { { // Test for a call to a function without side-effects. - LLVMContext C; Module M("", C); Function *TheFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::thread_pointer); @@ -1296,15 +1235,12 @@ TEST(VPRecipeTest, MayHaveSideEffectsAndMayReadWriteMemory) { } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) -TEST(VPRecipeTest, dumpRecipeInPlan) { - VPBasicBlock *VPBB0 = new VPBasicBlock("preheader"); +TEST_F(VPRecipeTest, dumpRecipeInPlan) { + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB0 = Plan.getEntry(); VPBasicBlock *VPBB1 = new VPBasicBlock(); - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB1, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB1, Plan.getScalarHeader()); VPBlockUtils::connectBlocks(VPBB0, VPBB1); - VPlan Plan(VPBB0, ScalarHeaderVPBB); IntegerType *Int32 = IntegerType::get(C, 32); auto *AI = BinaryOperator::CreateAdd(PoisonValue::get(Int32), @@ -1366,18 +1302,14 @@ TEST(VPRecipeTest, dumpRecipeInPlan) { } delete AI; - delete ScalarHeader; } -TEST(VPRecipeTest, dumpRecipeUnnamedVPValuesInPlan) { - VPBasicBlock *VPBB0 = new VPBasicBlock("preheader"); +TEST_F(VPRecipeTest, dumpRecipeUnnamedVPValuesInPlan) { + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB0 = Plan.getEntry(); VPBasicBlock *VPBB1 = new VPBasicBlock(); - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(VPBB1, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(VPBB1, Plan.getScalarHeader()); VPBlockUtils::connectBlocks(VPBB0, VPBB1); - VPlan Plan(VPBB0, ScalarHeaderVPBB); IntegerType *Int32 = IntegerType::get(C, 32); auto *AI = BinaryOperator::CreateAdd(PoisonValue::get(Int32), @@ -1456,11 +1388,9 @@ TEST(VPRecipeTest, dumpRecipeUnnamedVPValuesInPlan) { testing::ExitedWithCode(0), "EMIT vp<%2> = mul vp<%1>, vp<%1>"); } delete AI; - delete ScalarHeader; } -TEST(VPRecipeTest, dumpRecipeUnnamedVPValuesNotInPlanOrBlock) { - LLVMContext C; +TEST_F(VPRecipeTest, dumpRecipeUnnamedVPValuesNotInPlanOrBlock) { IntegerType *Int32 = IntegerType::get(C, 32); auto *AI = BinaryOperator::CreateAdd(PoisonValue::get(Int32), PoisonValue::get(Int32)); @@ -1543,9 +1473,7 @@ TEST(VPRecipeTest, dumpRecipeUnnamedVPValuesNotInPlanOrBlock) { #endif -TEST(VPRecipeTest, CastVPReductionRecipeToVPUser) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPReductionRecipeToVPUser) { VPValue ChainOp; VPValue VecOp; VPValue CondOp; @@ -1556,9 +1484,7 @@ TEST(VPRecipeTest, CastVPReductionRecipeToVPUser) { EXPECT_TRUE(isa(BaseR)); } -TEST(VPRecipeTest, CastVPReductionEVLRecipeToVPUser) { - LLVMContext C; - +TEST_F(VPRecipeTest, CastVPReductionEVLRecipeToVPUser) { VPValue ChainOp; VPValue VecOp; VPValue CondOp; @@ -1630,7 +1556,7 @@ TEST(VPDoubleValueDefTest, traverseUseLists) { EXPECT_EQ(&DoubleValueDef, I3.getOperand(0)->getDefiningRecipe()); } -TEST(VPRecipeTest, CastToVPSingleDefRecipe) { +TEST_F(VPRecipeTest, CastToVPSingleDefRecipe) { VPValue Start; VPEVLBasedIVPHIRecipe R(&Start, {}); VPRecipeBase *B = &R; diff --git a/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h b/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h index 06e091da9054..1836a5e39a29 100644 --- a/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h +++ b/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h @@ -28,7 +28,7 @@ namespace llvm { /// Helper class to create a module from an assembly string and VPlans for a /// given loop entry block. -class VPlanTestBase : public testing::Test { +class VPlanTestIRBase : public testing::Test { protected: TargetLibraryInfoImpl TLII; TargetLibraryInfo TLI; @@ -41,7 +41,7 @@ protected: std::unique_ptr AC; std::unique_ptr SE; - VPlanTestBase() + VPlanTestIRBase() : TLII(), TLI(TLII), DL("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-" "f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:" @@ -92,6 +92,22 @@ protected: } }; +class VPlanTestBase : public testing::Test { +protected: + LLVMContext C; + std::unique_ptr ScalarHeader; + SmallVector> Plans; + + VPlanTestBase() : ScalarHeader(BasicBlock::Create(C, "scalar.header")) { + BranchInst::Create(&*ScalarHeader, &*ScalarHeader); + } + + VPlan &getPlan(VPValue *TC = nullptr) { + Plans.push_back(std::make_unique(&*ScalarHeader, TC)); + return *Plans.back(); + } +}; + } // namespace llvm #endif // LLVM_UNITTESTS_TRANSFORMS_VECTORIZE_VPLANTESTBASE_H diff --git a/llvm/unittests/Transforms/Vectorize/VPlanVerifierTest.cpp b/llvm/unittests/Transforms/Vectorize/VPlanVerifierTest.cpp index 6448153de782..174249a7e85e 100644 --- a/llvm/unittests/Transforms/Vectorize/VPlanVerifierTest.cpp +++ b/llvm/unittests/Transforms/Vectorize/VPlanVerifierTest.cpp @@ -8,32 +8,29 @@ #include "../lib/Transforms/Vectorize/VPlanVerifier.h" #include "../lib/Transforms/Vectorize/VPlan.h" +#include "VPlanTestBase.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Instructions.h" #include "gtest/gtest.h" using namespace llvm; +using VPVerifierTest = VPlanTestBase; + namespace { -TEST(VPVerifierTest, VPInstructionUseBeforeDefSameBB) { +TEST_F(VPVerifierTest, VPInstructionUseBeforeDefSameBB) { + VPlan &Plan = getPlan(); VPInstruction *DefI = new VPInstruction(Instruction::Add, {}); VPInstruction *UseI = new VPInstruction(Instruction::Sub, {DefI}); - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBB1->appendRecipe(UseI); VPBB1->appendRecipe(DefI); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPRegionBlock *R1 = new VPRegionBlock(VPBB2, VPBB2, "R1"); VPBlockUtils::connectBlocks(VPBB1, R1); - - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); #if GTEST_HAS_STREAM_REDIRECTION ::testing::internal::CaptureStderr(); @@ -43,18 +40,17 @@ TEST(VPVerifierTest, VPInstructionUseBeforeDefSameBB) { EXPECT_STREQ("Use before def!\n", ::testing::internal::GetCapturedStderr().c_str()); #endif - delete ScalarHeader; } -TEST(VPVerifierTest, VPInstructionUseBeforeDefDifferentBB) { +TEST_F(VPVerifierTest, VPInstructionUseBeforeDefDifferentBB) { + VPlan &Plan = getPlan(); VPInstruction *DefI = new VPInstruction(Instruction::Add, {}); VPInstruction *UseI = new VPInstruction(Instruction::Sub, {DefI}); auto *CanIV = new VPCanonicalIVPHIRecipe(UseI, {}); VPInstruction *BranchOnCond = new VPInstruction(VPInstruction::BranchOnCond, {CanIV}); - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPBB1->appendRecipe(UseI); @@ -64,13 +60,7 @@ TEST(VPVerifierTest, VPInstructionUseBeforeDefDifferentBB) { VPRegionBlock *R1 = new VPRegionBlock(VPBB2, VPBB2, "R1"); VPBlockUtils::connectBlocks(VPBB1, R1); - - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); #if GTEST_HAS_STREAM_REDIRECTION ::testing::internal::CaptureStderr(); @@ -80,11 +70,9 @@ TEST(VPVerifierTest, VPInstructionUseBeforeDefDifferentBB) { EXPECT_STREQ("Use before def!\n", ::testing::internal::GetCapturedStderr().c_str()); #endif - delete ScalarHeader; } -TEST(VPVerifierTest, VPBlendUseBeforeDefDifferentBB) { - LLVMContext C; +TEST_F(VPVerifierTest, VPBlendUseBeforeDefDifferentBB) { IntegerType *Int32 = IntegerType::get(C, 32); auto *Phi = PHINode::Create(Int32, 1); @@ -95,8 +83,8 @@ TEST(VPVerifierTest, VPBlendUseBeforeDefDifferentBB) { new VPInstruction(VPInstruction::BranchOnCond, {CanIV}); auto *Blend = new VPBlendRecipe(Phi, {DefI}); - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPBasicBlock *VPBB3 = new VPBasicBlock(); VPBasicBlock *VPBB4 = new VPBasicBlock(); @@ -113,11 +101,7 @@ TEST(VPVerifierTest, VPBlendUseBeforeDefDifferentBB) { VPBlockUtils::connectBlocks(VPBB1, R1); VPBB3->setParent(R1); - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); #if GTEST_HAS_STREAM_REDIRECTION ::testing::internal::CaptureStderr(); @@ -129,10 +113,9 @@ TEST(VPVerifierTest, VPBlendUseBeforeDefDifferentBB) { #endif delete Phi; - delete ScalarHeader; } -TEST(VPVerifierTest, DuplicateSuccessorsOutsideRegion) { +TEST_F(VPVerifierTest, DuplicateSuccessorsOutsideRegion) { VPInstruction *I1 = new VPInstruction(Instruction::Add, {}); auto *CanIV = new VPCanonicalIVPHIRecipe(I1, {}); VPInstruction *BranchOnCond = @@ -140,8 +123,8 @@ TEST(VPVerifierTest, DuplicateSuccessorsOutsideRegion) { VPInstruction *BranchOnCond2 = new VPInstruction(VPInstruction::BranchOnCond, {I1}); - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPBB1->appendRecipe(I1); @@ -153,12 +136,7 @@ TEST(VPVerifierTest, DuplicateSuccessorsOutsideRegion) { VPBlockUtils::connectBlocks(VPBB1, R1); VPBlockUtils::connectBlocks(VPBB1, R1); - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); #if GTEST_HAS_STREAM_REDIRECTION ::testing::internal::CaptureStderr(); @@ -168,10 +146,9 @@ TEST(VPVerifierTest, DuplicateSuccessorsOutsideRegion) { EXPECT_STREQ("Multiple instances of the same successor.\n", ::testing::internal::GetCapturedStderr().c_str()); #endif - delete ScalarHeader; } -TEST(VPVerifierTest, DuplicateSuccessorsInsideRegion) { +TEST_F(VPVerifierTest, DuplicateSuccessorsInsideRegion) { VPInstruction *I1 = new VPInstruction(Instruction::Add, {}); auto *CanIV = new VPCanonicalIVPHIRecipe(I1, {}); VPInstruction *BranchOnCond = @@ -179,8 +156,8 @@ TEST(VPVerifierTest, DuplicateSuccessorsInsideRegion) { VPInstruction *BranchOnCond2 = new VPInstruction(VPInstruction::BranchOnCond, {I1}); - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPBasicBlock *VPBB3 = new VPBasicBlock(); @@ -195,12 +172,7 @@ TEST(VPVerifierTest, DuplicateSuccessorsInsideRegion) { VPBlockUtils::connectBlocks(VPBB1, R1); VPBB3->setParent(R1); - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); #if GTEST_HAS_STREAM_REDIRECTION ::testing::internal::CaptureStderr(); @@ -210,12 +182,11 @@ TEST(VPVerifierTest, DuplicateSuccessorsInsideRegion) { EXPECT_STREQ("Multiple instances of the same successor.\n", ::testing::internal::GetCapturedStderr().c_str()); #endif - delete ScalarHeader; } -TEST(VPVerifierTest, BlockOutsideRegionWithParent) { - VPBasicBlock *VPPH = new VPBasicBlock("ph"); - VPBasicBlock *VPBB1 = new VPBasicBlock(); +TEST_F(VPVerifierTest, BlockOutsideRegionWithParent) { + VPlan &Plan = getPlan(); + VPBasicBlock *VPBB1 = Plan.getEntry(); VPBasicBlock *VPBB2 = new VPBasicBlock(); VPInstruction *DefI = new VPInstruction(Instruction::Add, {}); @@ -228,12 +199,7 @@ TEST(VPVerifierTest, BlockOutsideRegionWithParent) { VPRegionBlock *R1 = new VPRegionBlock(VPBB2, VPBB2, "R1"); VPBlockUtils::connectBlocks(VPBB1, R1); - LLVMContext C; - auto *ScalarHeader = BasicBlock::Create(C, ""); - VPIRBasicBlock *ScalarHeaderVPBB = new VPIRBasicBlock(ScalarHeader); - VPBlockUtils::connectBlocks(R1, ScalarHeaderVPBB); - VPBlockUtils::connectBlocks(VPPH, VPBB1); - VPlan Plan(VPPH, ScalarHeaderVPBB); + VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); VPBB1->setParent(R1); #if GTEST_HAS_STREAM_REDIRECTION @@ -244,7 +210,6 @@ TEST(VPVerifierTest, BlockOutsideRegionWithParent) { EXPECT_STREQ("Predecessor is not in the same region.\n", ::testing::internal::GetCapturedStderr().c_str()); #endif - delete ScalarHeader; } } // namespace