[region-isolation] Make PartitionOpEvaluator use CRTP instead of std::function callbacks.

Just a fixup requested by reviewers of incoming code that I wanted to do in a
follow on commit.
This commit is contained in:
Michael Gottesman
2023-12-04 12:27:06 -06:00
parent df03cb40ef
commit 398fa8b10f
3 changed files with 276 additions and 191 deletions

View File

@@ -67,7 +67,7 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
Partition::TransferringOperandSetFactory factory(allocator);
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply({PartitionOp::AssignFresh(Element(0)),
PartitionOp::AssignFresh(Element(1)),
PartitionOp::AssignFresh(Element(2)),
@@ -75,7 +75,7 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
}
{
PartitionOpEvaluator eval(p2, factory);
PartitionOpEvaluatorBasic eval(p2, factory);
eval.apply({PartitionOp::AssignFresh(Element(5)),
PartitionOp::AssignFresh(Element(6)),
PartitionOp::AssignFresh(Element(7)),
@@ -83,7 +83,7 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
}
{
PartitionOpEvaluator eval(p3, factory);
PartitionOpEvaluatorBasic eval(p3, factory);
eval.apply({PartitionOp::AssignFresh(Element(2)),
PartitionOp::AssignFresh(Element(3)),
PartitionOp::AssignFresh(Element(4)),
@@ -95,7 +95,7 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
EXPECT_FALSE(Partition::equals(p1, p3));
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply({PartitionOp::AssignFresh(Element(4)),
PartitionOp::AssignFresh(Element(5)),
PartitionOp::AssignFresh(Element(6)),
@@ -104,7 +104,7 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
}
{
PartitionOpEvaluator eval(p2, factory);
PartitionOpEvaluatorBasic eval(p2, factory);
eval.apply({PartitionOp::AssignFresh(Element(1)),
PartitionOp::AssignFresh(Element(2)),
PartitionOp::AssignFresh(Element(3)),
@@ -113,7 +113,7 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
}
{
PartitionOpEvaluator eval(p3, factory);
PartitionOpEvaluatorBasic eval(p3, factory);
eval.apply({PartitionOp::AssignFresh(Element(6)),
PartitionOp::AssignFresh(Element(7)),
PartitionOp::AssignFresh(Element(0)),
@@ -132,12 +132,12 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
auto apply_to_p1_and_p3 = [&](PartitionOp op) {
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply(op);
}
{
PartitionOpEvaluator eval(p3, factory);
PartitionOpEvaluatorBasic eval(p3, factory);
eval.apply(op);
}
expect_join_eq();
@@ -145,12 +145,12 @@ TEST(PartitionUtilsTest, TestMergeAndJoin) {
auto apply_to_p2_and_p3 = [&](PartitionOp op) {
{
PartitionOpEvaluator eval(p2, factory);
PartitionOpEvaluatorBasic eval(p2, factory);
eval.apply(op);
}
{
PartitionOpEvaluator eval(p3, factory);
PartitionOpEvaluatorBasic eval(p3, factory);
eval.apply(op);
}
expect_join_eq();
@@ -183,7 +183,7 @@ TEST(PartitionUtilsTest, Join1) {
Partition p1 = Partition::separateRegions(llvm::makeArrayRef(data1));
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply({PartitionOp::Assign(Element(0), Element(0)),
PartitionOp::Assign(Element(1), Element(0)),
PartitionOp::Assign(Element(2), Element(2)),
@@ -194,7 +194,7 @@ TEST(PartitionUtilsTest, Join1) {
Partition p2 = Partition::separateRegions(llvm::makeArrayRef(data1));
{
PartitionOpEvaluator eval(p2, factory);
PartitionOpEvaluatorBasic eval(p2, factory);
eval.apply({PartitionOp::Assign(Element(0), Element(0)),
PartitionOp::Assign(Element(1), Element(0)),
PartitionOp::Assign(Element(2), Element(2)),
@@ -222,7 +222,7 @@ TEST(PartitionUtilsTest, Join2) {
Partition p1 = Partition::separateRegions(llvm::makeArrayRef(data1));
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply({PartitionOp::Assign(Element(0), Element(0)),
PartitionOp::Assign(Element(1), Element(0)),
PartitionOp::Assign(Element(2), Element(2)),
@@ -235,7 +235,7 @@ TEST(PartitionUtilsTest, Join2) {
Element(7), Element(8), Element(9)};
Partition p2 = Partition::separateRegions(llvm::makeArrayRef(data2));
{
PartitionOpEvaluator eval(p2, factory);
PartitionOpEvaluatorBasic eval(p2, factory);
eval.apply({PartitionOp::Assign(Element(4), Element(4)),
PartitionOp::Assign(Element(5), Element(5)),
PartitionOp::Assign(Element(6), Element(4)),
@@ -267,7 +267,7 @@ TEST(PartitionUtilsTest, Join2Reversed) {
Partition p1 = Partition::separateRegions(llvm::makeArrayRef(data1));
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply({PartitionOp::Assign(Element(0), Element(0)),
PartitionOp::Assign(Element(1), Element(0)),
PartitionOp::Assign(Element(2), Element(2)),
@@ -280,7 +280,7 @@ TEST(PartitionUtilsTest, Join2Reversed) {
Element(7), Element(8), Element(9)};
Partition p2 = Partition::separateRegions(llvm::makeArrayRef(data2));
{
PartitionOpEvaluator eval(p2, factory);
PartitionOpEvaluatorBasic eval(p2, factory);
eval.apply({PartitionOp::Assign(Element(4), Element(4)),
PartitionOp::Assign(Element(5), Element(5)),
PartitionOp::Assign(Element(6), Element(4)),
@@ -316,7 +316,7 @@ TEST(PartitionUtilsTest, JoinLarge) {
Element(25), Element(26), Element(27), Element(28), Element(29)};
Partition p1 = Partition::separateRegions(llvm::makeArrayRef(data1));
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply({PartitionOp::Assign(Element(0), Element(29)),
PartitionOp::Assign(Element(1), Element(17)),
PartitionOp::Assign(Element(2), Element(0)),
@@ -358,7 +358,7 @@ TEST(PartitionUtilsTest, JoinLarge) {
Element(40), Element(41), Element(42), Element(43), Element(44)};
Partition p2 = Partition::separateRegions(llvm::makeArrayRef(data2));
{
PartitionOpEvaluator eval(p2, factory);
PartitionOpEvaluatorBasic eval(p2, factory);
eval.apply({PartitionOp::Assign(Element(15), Element(31)),
PartitionOp::Assign(Element(16), Element(34)),
PartitionOp::Assign(Element(17), Element(35)),
@@ -448,19 +448,19 @@ TEST(PartitionUtilsTest, TestAssign) {
Partition p2;
Partition p3;
PartitionOpEvaluator evalP1(p1, factory);
PartitionOpEvaluatorBasic evalP1(p1, factory);
evalP1.apply({PartitionOp::AssignFresh(Element(0)),
PartitionOp::AssignFresh(Element(1)),
PartitionOp::AssignFresh(Element(2)),
PartitionOp::AssignFresh(Element(3))});
PartitionOpEvaluator evalP2(p2, factory);
PartitionOpEvaluatorBasic evalP2(p2, factory);
evalP2.apply({PartitionOp::AssignFresh(Element(0)),
PartitionOp::AssignFresh(Element(1)),
PartitionOp::AssignFresh(Element(2)),
PartitionOp::AssignFresh(Element(3))});
PartitionOpEvaluator evalP3(p3, factory);
PartitionOpEvaluatorBasic evalP3(p3, factory);
evalP3.apply({PartitionOp::AssignFresh(Element(0)),
PartitionOp::AssignFresh(Element(1)),
PartitionOp::AssignFresh(Element(2)),
@@ -528,6 +528,28 @@ TEST(PartitionUtilsTest, TestAssign) {
EXPECT_TRUE(Partition::equals(p1, p3));
}
namespace {
struct PartitionOpEvaluatorWithFailureCallback final
: PartitionOpEvaluatorBaseImpl<PartitionOpEvaluatorWithFailureCallback> {
using FailureCallbackTy =
std::function<void(const PartitionOp &, unsigned, TransferringOperand)>;
FailureCallbackTy failureCallback;
PartitionOpEvaluatorWithFailureCallback(
Partition &workingPartition, TransferringOperandSetFactory &ptrSetFactory,
FailureCallbackTy failureCallback)
: PartitionOpEvaluatorBaseImpl(workingPartition, ptrSetFactory),
failureCallback(failureCallback) {}
void handleFailure(const PartitionOp &op, Element elt,
TransferringOperand transferringOp) const {
failureCallback(op, elt, transferringOp);
}
};
} // namespace
// This test tests that consumption consumes entire regions as expected
TEST(PartitionUtilsTest, TestConsumeAndRequire) {
llvm::BumpPtrAllocator allocator;
@@ -536,7 +558,7 @@ TEST(PartitionUtilsTest, TestConsumeAndRequire) {
Partition p;
{
PartitionOpEvaluator eval(p, factory);
PartitionOpEvaluatorBasic eval(p, factory);
eval.apply({PartitionOp::AssignFresh(Element(0)),
PartitionOp::AssignFresh(Element(1)),
PartitionOp::AssignFresh(Element(2)),
@@ -578,48 +600,46 @@ TEST(PartitionUtilsTest, TestConsumeAndRequire) {
TransferringOperand) { times_called++; };
{
PartitionOpEvaluator eval(p, factory);
eval.failureCallback = increment_times_called;
PartitionOpEvaluatorWithFailureCallback eval(p, factory,
increment_times_called);
eval.apply({PartitionOp::Require(Element(0)),
PartitionOp::Require(Element(1)),
PartitionOp::Require(Element(2))});
}
EXPECT_EQ(times_called, 3);
{
PartitionOpEvaluator eval(p, factory);
eval.failureCallback = never_called;
PartitionOpEvaluatorWithFailureCallback eval(p, factory, never_called);
eval.apply({PartitionOp::Require(Element(3)),
PartitionOp::Require(Element(4)),
PartitionOp::Require(Element(5))});
}
{
PartitionOpEvaluator eval(p, factory);
eval.failureCallback = increment_times_called;
PartitionOpEvaluatorWithFailureCallback eval(p, factory,
increment_times_called);
eval.apply(
{PartitionOp::Require(Element(6)), PartitionOp::Require(Element(7))});
}
{
PartitionOpEvaluator eval(p, factory);
eval.failureCallback = never_called;
PartitionOpEvaluatorWithFailureCallback eval(p, factory, never_called);
eval.apply(
{PartitionOp::Require(Element(8)), PartitionOp::Require(Element(9))});
}
{
PartitionOpEvaluator eval(p, factory);
eval.failureCallback = increment_times_called;
PartitionOpEvaluatorWithFailureCallback eval(p, factory,
increment_times_called);
eval.apply(PartitionOp::Require(Element(10)));
}
{
PartitionOpEvaluator eval(p, factory);
eval.failureCallback = never_called;
PartitionOpEvaluatorWithFailureCallback eval(p, factory, never_called);
eval.apply(PartitionOp::Require(Element(11)));
}
EXPECT_TRUE(times_called == 6);
EXPECT_EQ(times_called, 6);
}
// This test tests that the copy constructor is usable to create fresh
@@ -630,7 +650,7 @@ TEST(PartitionUtilsTest, TestCopyConstructor) {
Partition p1;
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply(PartitionOp::AssignFresh(Element(0)));
}
@@ -639,23 +659,25 @@ TEST(PartitionUtilsTest, TestCopyConstructor) {
// Change p1 again.
{
PartitionOpEvaluator eval(p1, factory);
PartitionOpEvaluatorBasic eval(p1, factory);
eval.apply(PartitionOp::Transfer(Element(0), transferSingletons[0]));
}
{
bool failure = false;
PartitionOpEvaluator eval(p1, factory);
eval.failureCallback = [&](const PartitionOp &, unsigned,
TransferringOperand) { failure = true; };
PartitionOpEvaluatorWithFailureCallback eval(
p1, factory, [&](const PartitionOp &, unsigned, TransferringOperand) {
failure = true;
});
eval.apply(PartitionOp::Require(Element(0)));
EXPECT_TRUE(failure);
}
{
PartitionOpEvaluator eval(p2, factory);
eval.failureCallback = [](const PartitionOp &, unsigned,
TransferringOperand) { EXPECT_TRUE(false); };
PartitionOpEvaluatorWithFailureCallback eval(
p2, factory, [](const PartitionOp &, unsigned, TransferringOperand) {
EXPECT_TRUE(false);
});
eval.apply(PartitionOp::Require(Element(0)));
}
}
@@ -665,9 +687,10 @@ TEST(PartitionUtilsTest, TestUndoTransfer) {
Partition::TransferringOperandSetFactory factory(allocator);
Partition p;
PartitionOpEvaluator eval(p, factory);
eval.failureCallback = [&](const PartitionOp &, unsigned,
TransferringOperand) { EXPECT_TRUE(false); };
PartitionOpEvaluatorWithFailureCallback eval(
p, factory, [&](const PartitionOp &, unsigned, TransferringOperand) {
EXPECT_TRUE(false);
});
// Shouldn't error on this.
eval.apply({PartitionOp::AssignFresh(Element(0)),