| Index: test/unittests/interpreter/bytecode-register-optimizer-unittest.cc
|
| diff --git a/test/unittests/interpreter/bytecode-register-optimizer-unittest.cc b/test/unittests/interpreter/bytecode-register-optimizer-unittest.cc
|
| index ae7c159563cd9eb9fdc3845aee65a2219d7326ae..17ab8e190c840958d52abf340033d095c20360fa 100644
|
| --- a/test/unittests/interpreter/bytecode-register-optimizer-unittest.cc
|
| +++ b/test/unittests/interpreter/bytecode-register-optimizer-unittest.cc
|
| @@ -62,55 +62,23 @@ class BytecodeRegisterOptimizerTest : public BytecodePipelineStage,
|
|
|
| // Sanity tests.
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, WriteNop) {
|
| - Initialize(1, 1);
|
| - BytecodeNode node(Bytecode::kNop);
|
| - optimizer()->Write(&node);
|
| - CHECK_EQ(write_count(), 1);
|
| - CHECK_EQ(node, last_written());
|
| -}
|
| -
|
| -TEST_F(BytecodeRegisterOptimizerTest, WriteNopExpression) {
|
| - Initialize(1, 1);
|
| - BytecodeSourceInfo source_info(3, false);
|
| - BytecodeNode node(Bytecode::kNop, &source_info);
|
| - optimizer()->Write(&node);
|
| - CHECK_EQ(write_count(), 1);
|
| - CHECK_EQ(node, last_written());
|
| -}
|
| -
|
| -TEST_F(BytecodeRegisterOptimizerTest, WriteNopStatement) {
|
| - Initialize(1, 1);
|
| - BytecodeSourceInfo source_info(3, true);
|
| - BytecodeNode node(Bytecode::kNop);
|
| - optimizer()->Write(&node);
|
| - CHECK_EQ(write_count(), 1);
|
| - CHECK_EQ(node, last_written());
|
| -}
|
| -
|
| -TEST_F(BytecodeRegisterOptimizerTest, TemporaryMaterializedForJump) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, TemporaryMaterializedForFlush) {
|
| Initialize(1, 1);
|
| Register temp = NewTemporary();
|
| - BytecodeNode node(Bytecode::kStar, temp.ToOperand());
|
| - optimizer()->Write(&node);
|
| + optimizer()->DoStar(temp, BytecodeSourceInfo());
|
| CHECK_EQ(write_count(), 0);
|
| - BytecodeLabel label;
|
| - BytecodeNode jump(Bytecode::kJump, 0, nullptr);
|
| - optimizer()->WriteJump(&jump, &label);
|
| - CHECK_EQ(write_count(), 2);
|
| + optimizer()->Flush();
|
| + CHECK_EQ(write_count(), 1);
|
| CHECK_EQ(output()->at(0).bytecode(), Bytecode::kStar);
|
| CHECK_EQ(output()->at(0).operand(0), temp.ToOperand());
|
| - CHECK_EQ(output()->at(1).bytecode(), Bytecode::kJump);
|
| }
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, TemporaryMaterializedForBind) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, TemporaryMaterializedForJump) {
|
| Initialize(1, 1);
|
| Register temp = NewTemporary();
|
| - BytecodeNode node(Bytecode::kStar, temp.ToOperand());
|
| - optimizer()->Write(&node);
|
| + optimizer()->DoStar(temp, BytecodeSourceInfo());
|
| CHECK_EQ(write_count(), 0);
|
| - BytecodeLabel label;
|
| - optimizer()->BindLabel(&label);
|
| + optimizer()->PrepareForBytecode(Bytecode::kJump);
|
| CHECK_EQ(write_count(), 1);
|
| CHECK_EQ(output()->at(0).bytecode(), Bytecode::kStar);
|
| CHECK_EQ(output()->at(0).operand(0), temp.ToOperand());
|
| @@ -121,117 +89,91 @@ TEST_F(BytecodeRegisterOptimizerTest, TemporaryMaterializedForBind) {
|
| TEST_F(BytecodeRegisterOptimizerTest, TemporaryNotEmitted) {
|
| Initialize(3, 1);
|
| Register parameter = Register::FromParameterIndex(1, 3);
|
| - BytecodeNode node0(Bytecode::kLdar, parameter.ToOperand());
|
| - optimizer()->Write(&node0);
|
| + optimizer()->DoLdar(parameter, BytecodeSourceInfo());
|
| CHECK_EQ(write_count(), 0);
|
| Register temp = NewTemporary();
|
| + optimizer()->DoStar(temp, BytecodeSourceInfo());
|
| BytecodeNode node1(Bytecode::kStar, NewTemporary().ToOperand());
|
| - optimizer()->Write(&node1);
|
| - CHECK_EQ(write_count(), 0);
|
| ReleaseTemporaries(temp);
|
| CHECK_EQ(write_count(), 0);
|
| - BytecodeNode node2(Bytecode::kReturn);
|
| - optimizer()->Write(&node2);
|
| - CHECK_EQ(write_count(), 2);
|
| + optimizer()->PrepareForBytecode(Bytecode::kReturn);
|
| CHECK_EQ(output()->at(0).bytecode(), Bytecode::kLdar);
|
| CHECK_EQ(output()->at(0).operand(0), parameter.ToOperand());
|
| - CHECK_EQ(output()->at(1).bytecode(), Bytecode::kReturn);
|
| }
|
|
|
| TEST_F(BytecodeRegisterOptimizerTest, ReleasedRegisterUsed) {
|
| Initialize(3, 1);
|
| - BytecodeNode node0(Bytecode::kLdaSmi, 3);
|
| - optimizer()->Write(&node0);
|
| - CHECK_EQ(write_count(), 1);
|
| + optimizer()->PrepareForBytecode(Bytecode::kLdaSmi);
|
| Register temp0 = NewTemporary();
|
| Register temp1 = NewTemporary();
|
| - BytecodeNode node1(Bytecode::kStar, temp1.ToOperand());
|
| - optimizer()->Write(&node1);
|
| + optimizer()->DoStar(temp1, BytecodeSourceInfo());
|
| + CHECK_EQ(write_count(), 0);
|
| + optimizer()->PrepareForBytecode(Bytecode::kLdaSmi);
|
| + CHECK_EQ(write_count(), 1);
|
| + CHECK_EQ(output()->at(0).bytecode(), Bytecode::kStar);
|
| + CHECK_EQ(output()->at(0).operand(0), temp1.ToOperand());
|
| + optimizer()->DoMov(temp1, temp0, BytecodeSourceInfo());
|
| CHECK_EQ(write_count(), 1);
|
| - BytecodeNode node2(Bytecode::kLdaSmi, 1);
|
| - optimizer()->Write(&node2);
|
| - CHECK_EQ(write_count(), 3);
|
| - BytecodeNode node3(Bytecode::kMov, temp1.ToOperand(), temp0.ToOperand());
|
| - optimizer()->Write(&node3);
|
| - CHECK_EQ(write_count(), 3);
|
| ReleaseTemporaries(temp1);
|
| - CHECK_EQ(write_count(), 3);
|
| - BytecodeNode node4(Bytecode::kLdar, temp0.ToOperand());
|
| - optimizer()->Write(&node4);
|
| - CHECK_EQ(write_count(), 3);
|
| - BytecodeNode node5(Bytecode::kReturn);
|
| - optimizer()->Write(&node5);
|
| - CHECK_EQ(write_count(), 5);
|
| - CHECK_EQ(output()->at(3).bytecode(), Bytecode::kLdar);
|
| - CHECK_EQ(output()->at(3).operand(0), temp1.ToOperand());
|
| - CHECK_EQ(output()->at(4).bytecode(), Bytecode::kReturn);
|
| + CHECK_EQ(write_count(), 1);
|
| + optimizer()->DoLdar(temp0, BytecodeSourceInfo());
|
| + CHECK_EQ(write_count(), 1);
|
| + optimizer()->PrepareForBytecode(Bytecode::kReturn);
|
| + CHECK_EQ(write_count(), 2);
|
| + CHECK_EQ(output()->at(1).bytecode(), Bytecode::kLdar);
|
| + CHECK_EQ(output()->at(1).operand(0), temp1.ToOperand());
|
| }
|
|
|
| TEST_F(BytecodeRegisterOptimizerTest, ReleasedRegisterNotFlushed) {
|
| Initialize(3, 1);
|
| - BytecodeNode node0(Bytecode::kLdaSmi, 3);
|
| - optimizer()->Write(&node0);
|
| - CHECK_EQ(write_count(), 1);
|
| + optimizer()->PrepareForBytecode(Bytecode::kLdaSmi);
|
| Register temp0 = NewTemporary();
|
| Register temp1 = NewTemporary();
|
| - BytecodeNode node1(Bytecode::kStar, temp0.ToOperand());
|
| - optimizer()->Write(&node1);
|
| - CHECK_EQ(write_count(), 1);
|
| - BytecodeNode node2(Bytecode::kStar, temp1.ToOperand());
|
| - optimizer()->Write(&node2);
|
| - CHECK_EQ(write_count(), 1);
|
| + optimizer()->DoStar(temp0, BytecodeSourceInfo());
|
| + CHECK_EQ(write_count(), 0);
|
| + optimizer()->DoStar(temp1, BytecodeSourceInfo());
|
| + CHECK_EQ(write_count(), 0);
|
| ReleaseTemporaries(temp1);
|
| - BytecodeLabel label;
|
| - BytecodeNode jump(Bytecode::kJump, 0, nullptr);
|
| - optimizer()->WriteJump(&jump, &label);
|
| - BytecodeNode node3(Bytecode::kReturn);
|
| - optimizer()->Write(&node3);
|
| - CHECK_EQ(write_count(), 4);
|
| - CHECK_EQ(output()->at(1).bytecode(), Bytecode::kStar);
|
| - CHECK_EQ(output()->at(1).operand(0), temp0.ToOperand());
|
| - CHECK_EQ(output()->at(2).bytecode(), Bytecode::kJump);
|
| - CHECK_EQ(output()->at(3).bytecode(), Bytecode::kReturn);
|
| + optimizer()->Flush();
|
| + CHECK_EQ(write_count(), 1);
|
| + CHECK_EQ(output()->at(0).bytecode(), Bytecode::kStar);
|
| + CHECK_EQ(output()->at(0).operand(0), temp0.ToOperand());
|
| }
|
|
|
| TEST_F(BytecodeRegisterOptimizerTest, StoresToLocalsImmediate) {
|
| Initialize(3, 1);
|
| Register parameter = Register::FromParameterIndex(1, 3);
|
| - BytecodeNode node0(Bytecode::kLdar, parameter.ToOperand());
|
| - optimizer()->Write(&node0);
|
| + optimizer()->DoLdar(parameter, BytecodeSourceInfo());
|
| CHECK_EQ(write_count(), 0);
|
| Register local = Register(0);
|
| - BytecodeNode node1(Bytecode::kStar, local.ToOperand());
|
| - optimizer()->Write(&node1);
|
| + optimizer()->DoStar(local, BytecodeSourceInfo());
|
| CHECK_EQ(write_count(), 1);
|
| CHECK_EQ(output()->at(0).bytecode(), Bytecode::kMov);
|
| CHECK_EQ(output()->at(0).operand(0), parameter.ToOperand());
|
| CHECK_EQ(output()->at(0).operand(1), local.ToOperand());
|
|
|
| - BytecodeNode node2(Bytecode::kReturn);
|
| - optimizer()->Write(&node2);
|
| - CHECK_EQ(write_count(), 3);
|
| + optimizer()->PrepareForBytecode(Bytecode::kReturn);
|
| + CHECK_EQ(write_count(), 2);
|
| CHECK_EQ(output()->at(1).bytecode(), Bytecode::kLdar);
|
| CHECK_EQ(output()->at(1).operand(0), local.ToOperand());
|
| - CHECK_EQ(output()->at(2).bytecode(), Bytecode::kReturn);
|
| }
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, TemporaryNotMaterializedForInput) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, SingleTemporaryNotMaterializedForInput) {
|
| Initialize(3, 1);
|
| Register parameter = Register::FromParameterIndex(1, 3);
|
| Register temp0 = NewTemporary();
|
| Register temp1 = NewTemporary();
|
| - BytecodeNode node0(Bytecode::kMov, parameter.ToOperand(), temp0.ToOperand());
|
| - optimizer()->Write(&node0);
|
| - BytecodeNode node1(Bytecode::kMov, parameter.ToOperand(), temp1.ToOperand());
|
| - optimizer()->Write(&node1);
|
| + optimizer()->DoMov(parameter, temp0, BytecodeSourceInfo());
|
| + optimizer()->DoMov(parameter, temp1, BytecodeSourceInfo());
|
| CHECK_EQ(write_count(), 0);
|
| - BytecodeNode node2(Bytecode::kCallJSRuntime, 0, temp0.ToOperand(), 1);
|
| - optimizer()->Write(&node2);
|
| - CHECK_EQ(write_count(), 1);
|
| - CHECK_EQ(output()->at(0).bytecode(), Bytecode::kCallJSRuntime);
|
| - CHECK_EQ(output()->at(0).operand(0), 0);
|
| - CHECK_EQ(output()->at(0).operand(1), parameter.ToOperand());
|
| - CHECK_EQ(output()->at(0).operand(2), 1);
|
| +
|
| + Register reg = optimizer()->GetInputRegister(temp0);
|
| + RegisterList reg_list =
|
| + optimizer()->GetInputRegisterList(RegisterList(temp0.index(), 1));
|
| + CHECK_EQ(write_count(), 0);
|
| + CHECK_EQ(parameter.index(), reg.index());
|
| + CHECK_EQ(parameter.index(), reg_list.first_register().index());
|
| + CHECK_EQ(1, reg_list.register_count());
|
| }
|
|
|
| TEST_F(BytecodeRegisterOptimizerTest, RangeOfTemporariesMaterializedForInput) {
|
| @@ -239,32 +181,22 @@ TEST_F(BytecodeRegisterOptimizerTest, RangeOfTemporariesMaterializedForInput) {
|
| Register parameter = Register::FromParameterIndex(1, 3);
|
| Register temp0 = NewTemporary();
|
| Register temp1 = NewTemporary();
|
| - BytecodeNode node0(Bytecode::kLdaSmi, 3);
|
| - optimizer()->Write(&node0);
|
| - CHECK_EQ(write_count(), 1);
|
| - BytecodeNode node1(Bytecode::kStar, temp0.ToOperand());
|
| - optimizer()->Write(&node1);
|
| - BytecodeNode node2(Bytecode::kMov, parameter.ToOperand(), temp1.ToOperand());
|
| - optimizer()->Write(&node2);
|
| - CHECK_EQ(write_count(), 1);
|
| - BytecodeNode node3(Bytecode::kCallJSRuntime, 0, temp0.ToOperand(), 2);
|
| - optimizer()->Write(&node3);
|
| - CHECK_EQ(write_count(), 4);
|
| -
|
| - CHECK_EQ(output()->at(0).bytecode(), Bytecode::kLdaSmi);
|
| - CHECK_EQ(output()->at(0).operand(0), 3);
|
| -
|
| - CHECK_EQ(output()->at(1).bytecode(), Bytecode::kStar);
|
| - CHECK_EQ(output()->at(1).operand(0), temp0.ToOperand());
|
| -
|
| - CHECK_EQ(output()->at(2).bytecode(), Bytecode::kMov);
|
| - CHECK_EQ(output()->at(2).operand(0), parameter.ToOperand());
|
| - CHECK_EQ(output()->at(2).operand(1), temp1.ToOperand());
|
| + optimizer()->PrepareForBytecode(Bytecode::kLdaSmi);
|
| + optimizer()->DoStar(temp0, BytecodeSourceInfo());
|
| + optimizer()->DoMov(parameter, temp1, BytecodeSourceInfo());
|
| + CHECK_EQ(write_count(), 0);
|
|
|
| - CHECK_EQ(output()->at(3).bytecode(), Bytecode::kCallJSRuntime);
|
| - CHECK_EQ(output()->at(3).operand(0), 0);
|
| - CHECK_EQ(output()->at(3).operand(1), temp0.ToOperand());
|
| - CHECK_EQ(output()->at(3).operand(2), 2);
|
| + optimizer()->PrepareForBytecode(Bytecode::kCallJSRuntime);
|
| + RegisterList reg_list =
|
| + optimizer()->GetInputRegisterList(RegisterList(temp0.index(), 2));
|
| + CHECK_EQ(temp0.index(), reg_list.first_register().index());
|
| + CHECK_EQ(2, reg_list.register_count());
|
| + CHECK_EQ(write_count(), 2);
|
| + CHECK_EQ(output()->at(0).bytecode(), Bytecode::kStar);
|
| + CHECK_EQ(output()->at(0).operand(0), temp0.ToOperand());
|
| + CHECK_EQ(output()->at(1).bytecode(), Bytecode::kMov);
|
| + CHECK_EQ(output()->at(1).operand(0), parameter.ToOperand());
|
| + CHECK_EQ(output()->at(1).operand(1), temp1.ToOperand());
|
| }
|
|
|
| } // namespace interpreter
|
|
|