mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[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:
@@ -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)),
|
||||
|
||||
Reference in New Issue
Block a user