| Index: test/unittests/interpreter/bytecode-register-allocator-unittest.cc
|
| diff --git a/test/unittests/interpreter/bytecode-register-allocator-unittest.cc b/test/unittests/interpreter/bytecode-register-allocator-unittest.cc
|
| index d4dc111d69fb301a6b96d91cfef2194f870ec47f..f06e454cc943b233fffdfd95e31c61a9ea7f1320 100644
|
| --- a/test/unittests/interpreter/bytecode-register-allocator-unittest.cc
|
| +++ b/test/unittests/interpreter/bytecode-register-allocator-unittest.cc
|
| @@ -12,199 +12,83 @@ namespace v8 {
|
| namespace internal {
|
| namespace interpreter {
|
|
|
| -class TemporaryRegisterAllocatorTest : public TestWithIsolateAndZone {
|
| - public:
|
| - TemporaryRegisterAllocatorTest() : allocator_(zone(), 0) {}
|
| - ~TemporaryRegisterAllocatorTest() override {}
|
| - TemporaryRegisterAllocator* allocator() { return &allocator_; }
|
| -
|
| - private:
|
| - TemporaryRegisterAllocator allocator_;
|
| -};
|
| -
|
| -TEST_F(TemporaryRegisterAllocatorTest, FirstAllocation) {
|
| - CHECK_EQ(allocator()->allocation_count(), 0);
|
| - int reg0_index = allocator()->BorrowTemporaryRegister();
|
| - CHECK_EQ(reg0_index, 0);
|
| - CHECK_EQ(allocator()->allocation_count(), 1);
|
| - CHECK(allocator()->RegisterIsLive(Register(reg0_index)));
|
| - allocator()->ReturnTemporaryRegister(reg0_index);
|
| - CHECK(!allocator()->RegisterIsLive(Register(reg0_index)));
|
| - CHECK_EQ(allocator()->allocation_count(), 1);
|
| - CHECK(allocator()->first_temporary_register() == Register(0));
|
| - CHECK(allocator()->last_temporary_register() == Register(0));
|
| -}
|
| -
|
| -TEST_F(TemporaryRegisterAllocatorTest, SimpleAllocations) {
|
| - for (int i = 0; i < 13; i++) {
|
| - int reg_index = allocator()->BorrowTemporaryRegister();
|
| - CHECK_EQ(reg_index, i);
|
| - CHECK_EQ(allocator()->allocation_count(), i + 1);
|
| - }
|
| - for (int i = 0; i < 13; i++) {
|
| - CHECK(allocator()->RegisterIsLive(Register(i)));
|
| - allocator()->ReturnTemporaryRegister(i);
|
| - CHECK(!allocator()->RegisterIsLive(Register(i)));
|
| - int reg_index = allocator()->BorrowTemporaryRegister();
|
| - CHECK_EQ(reg_index, i);
|
| - CHECK_EQ(allocator()->allocation_count(), 13);
|
| - }
|
| - for (int i = 0; i < 13; i++) {
|
| - CHECK(allocator()->RegisterIsLive(Register(i)));
|
| - allocator()->ReturnTemporaryRegister(i);
|
| - CHECK(!allocator()->RegisterIsLive(Register(i)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(TemporaryRegisterAllocatorTest, SimpleRangeAllocation) {
|
| - static const int kRunLength = 7;
|
| - int start = allocator()->PrepareForConsecutiveTemporaryRegisters(kRunLength);
|
| - CHECK(!allocator()->RegisterIsLive(Register(start)));
|
| - for (int i = 0; i < kRunLength; i++) {
|
| - CHECK(!allocator()->RegisterIsLive(Register(start + i)));
|
| - allocator()->BorrowConsecutiveTemporaryRegister(start + i);
|
| - CHECK(allocator()->RegisterIsLive(Register(start + i)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(TemporaryRegisterAllocatorTest, RangeAllocationAbuttingFree) {
|
| - static const int kFreeCount = 3;
|
| - static const int kRunLength = 6;
|
| -
|
| - for (int i = 0; i < kFreeCount; i++) {
|
| - int to_free = allocator()->BorrowTemporaryRegister();
|
| - CHECK_EQ(to_free, i);
|
| - }
|
| - for (int i = 0; i < kFreeCount; i++) {
|
| - allocator()->ReturnTemporaryRegister(i);
|
| - }
|
| -
|
| - int start = allocator()->PrepareForConsecutiveTemporaryRegisters(kRunLength);
|
| - CHECK(!allocator()->RegisterIsLive(Register(start)));
|
| - for (int i = 0; i < kRunLength; i++) {
|
| - CHECK(!allocator()->RegisterIsLive(Register(start + i)));
|
| - allocator()->BorrowConsecutiveTemporaryRegister(start + i);
|
| - CHECK(allocator()->RegisterIsLive(Register(start + i)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(TemporaryRegisterAllocatorTest, RangeAllocationAbuttingHole) {
|
| - static const int kPreAllocatedCount = 7;
|
| - static const int kPreAllocatedFreeCount = 6;
|
| - static const int kRunLength = 8;
|
| -
|
| - for (int i = 0; i < kPreAllocatedCount; i++) {
|
| - int to_free = allocator()->BorrowTemporaryRegister();
|
| - CHECK_EQ(to_free, i);
|
| - }
|
| - for (int i = 0; i < kPreAllocatedFreeCount; i++) {
|
| - allocator()->ReturnTemporaryRegister(i);
|
| - }
|
| - int start = allocator()->PrepareForConsecutiveTemporaryRegisters(kRunLength);
|
| - CHECK(!allocator()->RegisterIsLive(Register(start)));
|
| - CHECK_EQ(start, kPreAllocatedCount);
|
| - for (int i = 0; i < kRunLength; i++) {
|
| - CHECK(!allocator()->RegisterIsLive(Register(start + i)));
|
| - allocator()->BorrowConsecutiveTemporaryRegister(start + i);
|
| - CHECK(allocator()->RegisterIsLive(Register(start + i)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(TemporaryRegisterAllocatorTest, RangeAllocationAvailableInTemporaries) {
|
| - static const int kNotRunLength = 13;
|
| - static const int kRunLength = 8;
|
| -
|
| - // Allocate big batch
|
| - for (int i = 0; i < kNotRunLength * 2 + kRunLength; i++) {
|
| - int allocated = allocator()->BorrowTemporaryRegister();
|
| - CHECK_EQ(allocated, i);
|
| - }
|
| - // Free every other register either side of target.
|
| - for (int i = 0; i < kNotRunLength; i++) {
|
| - if ((i & 2) == 1) {
|
| - allocator()->ReturnTemporaryRegister(i);
|
| - allocator()->ReturnTemporaryRegister(kNotRunLength + kRunLength + i);
|
| - }
|
| - }
|
| - // Free all registers for target.
|
| - for (int i = kNotRunLength; i < kNotRunLength + kRunLength; i++) {
|
| - allocator()->ReturnTemporaryRegister(i);
|
| - }
|
| -
|
| - int start = allocator()->PrepareForConsecutiveTemporaryRegisters(kRunLength);
|
| - CHECK_EQ(start, kNotRunLength);
|
| - for (int i = 0; i < kRunLength; i++) {
|
| - CHECK(!allocator()->RegisterIsLive(Register(start + i)));
|
| - allocator()->BorrowConsecutiveTemporaryRegister(start + i);
|
| - CHECK(allocator()->RegisterIsLive(Register(start + i)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(TemporaryRegisterAllocatorTest, NotInRange) {
|
| - for (int i = 0; i < 10; i++) {
|
| - int reg = allocator()->BorrowTemporaryRegisterNotInRange(2, 5);
|
| - CHECK(reg == i || (reg > 2 && reg == i + 4));
|
| - }
|
| - for (int i = 0; i < 10; i++) {
|
| - if (i < 2) {
|
| - allocator()->ReturnTemporaryRegister(i);
|
| - } else {
|
| - allocator()->ReturnTemporaryRegister(i + 4);
|
| - }
|
| - }
|
| - int reg0 = allocator()->BorrowTemporaryRegisterNotInRange(0, 3);
|
| - CHECK_EQ(reg0, 4);
|
| - int reg1 = allocator()->BorrowTemporaryRegisterNotInRange(3, 10);
|
| - CHECK_EQ(reg1, 2);
|
| - int reg2 = allocator()->BorrowTemporaryRegisterNotInRange(2, 6);
|
| - CHECK_EQ(reg2, 1);
|
| - allocator()->ReturnTemporaryRegister(reg0);
|
| - allocator()->ReturnTemporaryRegister(reg1);
|
| - allocator()->ReturnTemporaryRegister(reg2);
|
| -}
|
| -
|
| class BytecodeRegisterAllocatorTest : public TestWithIsolateAndZone {
|
| public:
|
| - BytecodeRegisterAllocatorTest() {}
|
| + BytecodeRegisterAllocatorTest() : allocator_(0) {}
|
| ~BytecodeRegisterAllocatorTest() override {}
|
| -};
|
| -
|
| -TEST_F(BytecodeRegisterAllocatorTest, TemporariesRecycled) {
|
| - BytecodeArrayBuilder builder(isolate(), zone(), 0, 0, 0);
|
|
|
| - int first;
|
| - {
|
| - BytecodeRegisterAllocator allocator(zone(),
|
| - builder.temporary_register_allocator());
|
| - first = allocator.NewRegister().index();
|
| - allocator.NewRegister();
|
| - allocator.NewRegister();
|
| - allocator.NewRegister();
|
| - }
|
| + BytecodeRegisterAllocator* allocator() { return &allocator_; }
|
|
|
| - int second;
|
| - {
|
| - BytecodeRegisterAllocator allocator(zone(),
|
| - builder.temporary_register_allocator());
|
| - second = allocator.NewRegister().index();
|
| - }
|
| + private:
|
| + BytecodeRegisterAllocator allocator_;
|
| +};
|
|
|
| - CHECK_EQ(first, second);
|
| +TEST_F(BytecodeRegisterAllocatorTest, SimpleAllocations) {
|
| + CHECK_EQ(allocator()->maximum_register_count(), 0);
|
| + Register reg0 = allocator()->NewRegister();
|
| + CHECK_EQ(reg0.index(), 0);
|
| + CHECK_EQ(allocator()->maximum_register_count(), 1);
|
| + CHECK_EQ(allocator()->next_register_index(), 1);
|
| + CHECK(allocator()->RegisterIsLive(reg0));
|
| +
|
| + allocator()->ReleaseRegisters(0);
|
| + CHECK(!allocator()->RegisterIsLive(reg0));
|
| + CHECK_EQ(allocator()->maximum_register_count(), 1);
|
| + CHECK_EQ(allocator()->next_register_index(), 0);
|
| +
|
| + reg0 = allocator()->NewRegister();
|
| + Register reg1 = allocator()->NewRegister();
|
| + CHECK_EQ(reg0.index(), 0);
|
| + CHECK_EQ(reg1.index(), 1);
|
| + CHECK(allocator()->RegisterIsLive(reg0));
|
| + CHECK(allocator()->RegisterIsLive(reg1));
|
| + CHECK_EQ(allocator()->maximum_register_count(), 2);
|
| + CHECK_EQ(allocator()->next_register_index(), 2);
|
| +
|
| + allocator()->ReleaseRegisters(1);
|
| + CHECK(allocator()->RegisterIsLive(reg0));
|
| + CHECK(!allocator()->RegisterIsLive(reg1));
|
| + CHECK_EQ(allocator()->maximum_register_count(), 2);
|
| + CHECK_EQ(allocator()->next_register_index(), 1);
|
| }
|
|
|
| -TEST_F(BytecodeRegisterAllocatorTest, ConsecutiveRegisters) {
|
| - BytecodeArrayBuilder builder(isolate(), zone(), 0, 0, 0);
|
| - BytecodeRegisterAllocator allocator(zone(),
|
| - builder.temporary_register_allocator());
|
| - allocator.PrepareForConsecutiveAllocations(4);
|
| - Register reg0 = allocator.NextConsecutiveRegister();
|
| - Register other = allocator.NewRegister();
|
| - Register reg1 = allocator.NextConsecutiveRegister();
|
| - Register reg2 = allocator.NextConsecutiveRegister();
|
| - Register reg3 = allocator.NextConsecutiveRegister();
|
| - USE(other);
|
| -
|
| - CHECK(Register::AreContiguous(reg0, reg1, reg2, reg3));
|
| +TEST_F(BytecodeRegisterAllocatorTest, RegisterListAllocations) {
|
| + CHECK_EQ(allocator()->maximum_register_count(), 0);
|
| + RegisterList reg_list = allocator()->NewRegisterList(3);
|
| + CHECK_EQ(reg_list.first_register().index(), 0);
|
| + CHECK_EQ(reg_list.register_count(), 3);
|
| + CHECK_EQ(reg_list[0].index(), 0);
|
| + CHECK_EQ(reg_list[1].index(), 1);
|
| + CHECK_EQ(reg_list[2].index(), 2);
|
| + CHECK_EQ(allocator()->maximum_register_count(), 3);
|
| + CHECK_EQ(allocator()->next_register_index(), 3);
|
| + CHECK(allocator()->RegisterIsLive(reg_list[2]));
|
| +
|
| + Register reg = allocator()->NewRegister();
|
| + RegisterList reg_list_2 = allocator()->NewRegisterList(2);
|
| + CHECK_EQ(reg.index(), 3);
|
| + CHECK_EQ(reg_list_2.first_register().index(), 4);
|
| + CHECK_EQ(reg_list_2.register_count(), 2);
|
| + CHECK_EQ(reg_list_2[0].index(), 4);
|
| + CHECK_EQ(reg_list_2[1].index(), 5);
|
| + CHECK_EQ(allocator()->maximum_register_count(), 6);
|
| + CHECK_EQ(allocator()->next_register_index(), 6);
|
| + CHECK(allocator()->RegisterIsLive(reg));
|
| + CHECK(allocator()->RegisterIsLive(reg_list_2[1]));
|
| +
|
| + allocator()->ReleaseRegisters(reg.index());
|
| + CHECK(!allocator()->RegisterIsLive(reg));
|
| + CHECK(!allocator()->RegisterIsLive(reg_list_2[0]));
|
| + CHECK(!allocator()->RegisterIsLive(reg_list_2[1]));
|
| + CHECK(allocator()->RegisterIsLive(reg_list[2]));
|
| + CHECK_EQ(allocator()->maximum_register_count(), 6);
|
| + CHECK_EQ(allocator()->next_register_index(), 3);
|
| +
|
| + RegisterList empty_reg_list = allocator()->NewRegisterList(0);
|
| + CHECK_EQ(empty_reg_list.first_register().index(), 0);
|
| + CHECK_EQ(empty_reg_list.register_count(), 0);
|
| + CHECK_EQ(allocator()->maximum_register_count(), 6);
|
| + CHECK_EQ(allocator()->next_register_index(), 3);
|
| }
|
|
|
| } // namespace interpreter
|
|
|