| 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 793bff2356e2d6a72a245ffdab1bcf72f84094f9..f9fcfea09b00df72117038b1d743f84e2aded88c 100644
|
| --- a/test/unittests/interpreter/bytecode-register-optimizer-unittest.cc
|
| +++ b/test/unittests/interpreter/bytecode-register-optimizer-unittest.cc
|
| @@ -5,6 +5,7 @@
|
| #include "src/v8.h"
|
|
|
| #include "src/factory.h"
|
| +#include "src/interpreter/bytecode-label.h"
|
| #include "src/interpreter/bytecode-register-optimizer.h"
|
| #include "src/objects-inl.h"
|
| #include "src/objects.h"
|
| @@ -27,14 +28,17 @@ class BytecodeRegisterOptimizerTest : public BytecodePipelineStage,
|
| zone(), register_allocator_, number_of_parameters, this);
|
| }
|
|
|
| - size_t FlushForOffset() override {
|
| - flush_for_offset_count_++;
|
| - return 0;
|
| - };
|
| -
|
| - void FlushBasicBlock() override { flush_basic_block_count_++; }
|
| -
|
| void Write(BytecodeNode* node) override { output_.push_back(*node); }
|
| + void WriteJump(BytecodeNode* node, BytecodeLabel* label) override {
|
| + output_.push_back(*node);
|
| + }
|
| + void BindLabel(BytecodeLabel* label) override {}
|
| + void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override {}
|
| + Handle<BytecodeArray> ToBytecodeArray(
|
| + int fixed_register_count, int parameter_count,
|
| + Handle<FixedArray> handle_table) override {
|
| + return Handle<BytecodeArray>();
|
| + }
|
|
|
| TemporaryRegisterAllocator* allocator() { return register_allocator_; }
|
| BytecodeRegisterOptimizer* optimizer() { return register_optimizer_; }
|
| @@ -47,8 +51,6 @@ class BytecodeRegisterOptimizerTest : public BytecodePipelineStage,
|
| allocator()->ReturnTemporaryRegister(reg.index());
|
| }
|
|
|
| - int flush_for_offset_count() const { return flush_for_offset_count_; }
|
| - int flush_basic_block_count() const { return flush_basic_block_count_; }
|
| size_t write_count() const { return output_.size(); }
|
| const BytecodeNode& last_written() const { return output_.back(); }
|
| const std::vector<BytecodeNode>* output() { return &output_; }
|
| @@ -57,76 +59,65 @@ class BytecodeRegisterOptimizerTest : public BytecodePipelineStage,
|
| TemporaryRegisterAllocator* register_allocator_;
|
| BytecodeRegisterOptimizer* register_optimizer_;
|
|
|
| - int flush_for_offset_count_ = 0;
|
| - int flush_basic_block_count_ = 0;
|
| std::vector<BytecodeNode> output_;
|
| };
|
|
|
| // Sanity tests.
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, FlushForOffsetPassThrough) {
|
| - Initialize(1, 1);
|
| - CHECK_EQ(flush_for_offset_count(), 0);
|
| - CHECK_EQ(optimizer()->FlushForOffset(), 0);
|
| - CHECK_EQ(flush_for_offset_count(), 1);
|
| -}
|
| -
|
| -TEST_F(BytecodeRegisterOptimizerTest, FlushForOffsetRightSize) {
|
| - Initialize(1, 1);
|
| - BytecodeNode node(Bytecode::kAdd, Register(0).ToOperand(),
|
| - OperandScale::kQuadruple);
|
| - optimizer()->Write(&node);
|
| - CHECK_EQ(optimizer()->FlushForOffset(), 0);
|
| - CHECK_EQ(flush_for_offset_count(), 1);
|
| - CHECK_EQ(write_count(), 1);
|
| -}
|
| -
|
| -TEST_F(BytecodeRegisterOptimizerTest, FlushForOffsetNop) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, WriteNop) {
|
| Initialize(1, 1);
|
| BytecodeNode node(Bytecode::kNop);
|
| optimizer()->Write(&node);
|
| - CHECK_EQ(optimizer()->FlushForOffset(), 0);
|
| - CHECK_EQ(flush_for_offset_count(), 1);
|
| CHECK_EQ(write_count(), 1);
|
| + CHECK_EQ(node, last_written());
|
| }
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, FlushForOffsetNopExpression) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, WriteNopExpression) {
|
| Initialize(1, 1);
|
| BytecodeNode node(Bytecode::kNop);
|
| node.source_info().Update({3, false});
|
| optimizer()->Write(&node);
|
| - CHECK_EQ(optimizer()->FlushForOffset(), 0);
|
| - CHECK_EQ(flush_for_offset_count(), 1);
|
| CHECK_EQ(write_count(), 1);
|
| + CHECK_EQ(node, last_written());
|
| }
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, FlushForOffsetNopStatement) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, WriteNopStatement) {
|
| Initialize(1, 1);
|
| BytecodeNode node(Bytecode::kNop);
|
| node.source_info().Update({3, true});
|
| optimizer()->Write(&node);
|
| - CHECK_EQ(optimizer()->FlushForOffset(), 0);
|
| - CHECK_EQ(flush_for_offset_count(), 1);
|
| CHECK_EQ(write_count(), 1);
|
| + CHECK_EQ(node, last_written());
|
| }
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, FlushBasicBlockPassThrough) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, TemporaryMaterializedForJump) {
|
| Initialize(1, 1);
|
| - CHECK_EQ(flush_basic_block_count(), 0);
|
| - optimizer()->FlushBasicBlock();
|
| - CHECK_EQ(flush_basic_block_count(), 1);
|
| + Register temp = NewTemporary();
|
| + BytecodeNode node(Bytecode::kStar, temp.ToOperand(), OperandScale::kSingle);
|
| + optimizer()->Write(&node);
|
| CHECK_EQ(write_count(), 0);
|
| + BytecodeLabel label;
|
| + BytecodeNode jump(Bytecode::kJump, 0, OperandScale::kSingle);
|
| + optimizer()->WriteJump(&jump, &label);
|
| + CHECK_EQ(write_count(), 2);
|
| + CHECK_EQ(output()->at(0).bytecode(), Bytecode::kStar);
|
| + CHECK_EQ(output()->at(0).operand(0), temp.ToOperand());
|
| + CHECK_EQ(output()->at(0).operand_scale(), OperandScale::kSingle);
|
| + CHECK_EQ(output()->at(1).bytecode(), Bytecode::kJump);
|
| }
|
|
|
| -TEST_F(BytecodeRegisterOptimizerTest, WriteOneFlushBasicBlock) {
|
| +TEST_F(BytecodeRegisterOptimizerTest, TemporaryMaterializedForBind) {
|
| Initialize(1, 1);
|
| - BytecodeNode node(Bytecode::kAdd, Register(0).ToOperand(),
|
| - OperandScale::kQuadruple);
|
| + Register temp = NewTemporary();
|
| + BytecodeNode node(Bytecode::kStar, temp.ToOperand(), OperandScale::kSingle);
|
| optimizer()->Write(&node);
|
| + CHECK_EQ(write_count(), 0);
|
| + BytecodeLabel label;
|
| + optimizer()->BindLabel(&label);
|
| CHECK_EQ(write_count(), 1);
|
| - optimizer()->FlushBasicBlock();
|
| - CHECK_EQ(write_count(), 1);
|
| - CHECK_EQ(node, last_written());
|
| + CHECK_EQ(output()->at(0).bytecode(), Bytecode::kStar);
|
| + CHECK_EQ(output()->at(0).operand(0), temp.ToOperand());
|
| + CHECK_EQ(output()->at(0).operand_scale(), OperandScale::kSingle);
|
| }
|
|
|
| // Basic Register Optimizations
|
|
|