[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.
This commit is contained in:
@@ -3863,7 +3863,6 @@ class VPlan {
|
||||
/// been modeled in VPlan directly.
|
||||
DenseMap<const SCEV *, VPValue *> 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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
namespace llvm {
|
||||
namespace {
|
||||
|
||||
class VPlanHCFGTest : public VPlanTestBase {};
|
||||
class VPlanHCFGTest : public VPlanTestIRBase {};
|
||||
|
||||
TEST_F(VPlanHCFGTest, testBuildHCFGInnerLoop) {
|
||||
const char *ModuleString =
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
namespace llvm {
|
||||
namespace {
|
||||
|
||||
class VPlanSlpTest : public VPlanTestBase {
|
||||
class VPlanSlpTest : public VPlanTestIRBase {
|
||||
protected:
|
||||
TargetLibraryInfoImpl TLII;
|
||||
TargetLibraryInfo TLI;
|
||||
|
||||
@@ -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 <badref>, <badref>", 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<scalar.header>
|
||||
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<scalar.header>
|
||||
|
||||
ir-bb<>:
|
||||
ir-bb<scalar.header>:
|
||||
No successors
|
||||
}
|
||||
)";
|
||||
@@ -871,9 +830,9 @@ Successor(s): bb1
|
||||
|
||||
bb1:
|
||||
EMIT vp<%2> = add
|
||||
Successor(s): ir-bb<>
|
||||
Successor(s): ir-bb<scalar.header>
|
||||
|
||||
ir-bb<>:
|
||||
ir-bb<scalar.header>:
|
||||
No successors
|
||||
}
|
||||
)";
|
||||
@@ -895,19 +854,19 @@ Successor(s): bb1
|
||||
|
||||
bb1:
|
||||
EMIT vp<%2> = add
|
||||
Successor(s): ir-bb<>
|
||||
Successor(s): ir-bb<scalar.header>
|
||||
|
||||
ir-bb<>:
|
||||
ir-bb<scalar.header>:
|
||||
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<Instruction> 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<VPValue *, 4> 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<VPUser>(&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<VPUser>(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;
|
||||
|
||||
@@ -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<AssumptionCache> AC;
|
||||
std::unique_ptr<ScalarEvolution> 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<BasicBlock> ScalarHeader;
|
||||
SmallVector<std::unique_ptr<VPlan>> Plans;
|
||||
|
||||
VPlanTestBase() : ScalarHeader(BasicBlock::Create(C, "scalar.header")) {
|
||||
BranchInst::Create(&*ScalarHeader, &*ScalarHeader);
|
||||
}
|
||||
|
||||
VPlan &getPlan(VPValue *TC = nullptr) {
|
||||
Plans.push_back(std::make_unique<VPlan>(&*ScalarHeader, TC));
|
||||
return *Plans.back();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
#endif // LLVM_UNITTESTS_TRANSFORMS_VECTORIZE_VPLANTESTBASE_H
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user