Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/factory.h" | 7 #include "src/factory.h" |
| 8 #include "src/interpreter/bytecode-label.h" | 8 #include "src/interpreter/bytecode-label.h" |
| 9 #include "src/interpreter/bytecode-peephole-optimizer.h" | 9 #include "src/interpreter/bytecode-peephole-optimizer.h" |
| 10 #include "src/interpreter/constant-array-builder.h" | 10 #include "src/interpreter/constant-array-builder.h" |
|
Michael Starzinger
2016/08/11 13:19:15
nit: Header file inclusion is obsolete. Lets drop
rmcilroy
2016/08/11 14:46:17
Done.
| |
| 11 #include "src/objects-inl.h" | 11 #include "src/objects-inl.h" |
| 12 #include "src/objects.h" | 12 #include "src/objects.h" |
| 13 #include "test/unittests/test-utils.h" | 13 #include "test/unittests/test-utils.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 namespace interpreter { | 17 namespace interpreter { |
| 18 | 18 |
| 19 class BytecodePeepholeOptimizerTest : public BytecodePipelineStage, | 19 class BytecodePeepholeOptimizerTest : public BytecodePipelineStage, |
| 20 public TestWithIsolateAndZone { | 20 public TestWithIsolateAndZone { |
| 21 public: | 21 public: |
| 22 BytecodePeepholeOptimizerTest() | 22 BytecodePeepholeOptimizerTest() : peephole_optimizer_(this) {} |
| 23 : constant_array_builder_(isolate(), zone()), | |
| 24 peephole_optimizer_(&constant_array_builder_, this) {} | |
| 25 ~BytecodePeepholeOptimizerTest() override {} | 23 ~BytecodePeepholeOptimizerTest() override {} |
| 26 | 24 |
| 27 void Reset() { | 25 void Reset() { |
| 28 last_written_.set_bytecode(Bytecode::kIllegal); | 26 last_written_.set_bytecode(Bytecode::kIllegal); |
| 29 write_count_ = 0; | 27 write_count_ = 0; |
| 30 } | 28 } |
| 31 | 29 |
| 32 void Write(BytecodeNode* node) override { | 30 void Write(BytecodeNode* node) override { |
| 33 write_count_++; | 31 write_count_++; |
| 34 last_written_.Clone(node); | 32 last_written_.Clone(node); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 45 int fixed_register_count, int parameter_count, | 43 int fixed_register_count, int parameter_count, |
| 46 Handle<FixedArray> handle_table) override { | 44 Handle<FixedArray> handle_table) override { |
| 47 return Handle<BytecodeArray>(); | 45 return Handle<BytecodeArray>(); |
| 48 } | 46 } |
| 49 | 47 |
| 50 void Flush() { | 48 void Flush() { |
| 51 optimizer()->ToBytecodeArray(0, 0, factory()->empty_fixed_array()); | 49 optimizer()->ToBytecodeArray(0, 0, factory()->empty_fixed_array()); |
| 52 } | 50 } |
| 53 | 51 |
| 54 BytecodePeepholeOptimizer* optimizer() { return &peephole_optimizer_; } | 52 BytecodePeepholeOptimizer* optimizer() { return &peephole_optimizer_; } |
| 55 ConstantArrayBuilder* constant_array() { return &constant_array_builder_; } | |
| 56 | 53 |
| 57 int write_count() const { return write_count_; } | 54 int write_count() const { return write_count_; } |
| 58 const BytecodeNode& last_written() const { return last_written_; } | 55 const BytecodeNode& last_written() const { return last_written_; } |
| 59 | 56 |
| 60 private: | 57 private: |
| 61 ConstantArrayBuilder constant_array_builder_; | |
| 62 BytecodePeepholeOptimizer peephole_optimizer_; | 58 BytecodePeepholeOptimizer peephole_optimizer_; |
| 63 | 59 |
| 64 int write_count_ = 0; | 60 int write_count_ = 0; |
| 65 BytecodeNode last_written_; | 61 BytecodeNode last_written_; |
| 66 }; | 62 }; |
| 67 | 63 |
| 68 // Sanity tests. | 64 // Sanity tests. |
| 69 | 65 |
| 70 TEST_F(BytecodePeepholeOptimizerTest, FlushOnJump) { | 66 TEST_F(BytecodePeepholeOptimizerTest, FlushOnJump) { |
| 71 CHECK_EQ(write_count(), 0); | 67 CHECK_EQ(write_count(), 0); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 259 CHECK_EQ(write_count(), 0); | 255 CHECK_EQ(write_count(), 0); |
| 260 optimizer()->Write(&second); | 256 optimizer()->Write(&second); |
| 261 CHECK_EQ(write_count(), 1); | 257 CHECK_EQ(write_count(), 1); |
| 262 CHECK_EQ(last_written(), first); | 258 CHECK_EQ(last_written(), first); |
| 263 Flush(); | 259 Flush(); |
| 264 CHECK_EQ(write_count(), 2); | 260 CHECK_EQ(write_count(), 2); |
| 265 CHECK_EQ(last_written(), second); | 261 CHECK_EQ(last_written(), second); |
| 266 CHECK_EQ(last_written().bytecode(), Bytecode::kStar); | 262 CHECK_EQ(last_written().bytecode(), Bytecode::kStar); |
| 267 } | 263 } |
| 268 | 264 |
| 269 TEST_F(BytecodePeepholeOptimizerTest, LdaConstantStringToName) { | |
| 270 Handle<Object> word = | |
| 271 isolate()->factory()->NewStringFromStaticChars("optimizing"); | |
| 272 size_t index = constant_array()->Insert(word); | |
| 273 BytecodeNode first(Bytecode::kLdaConstant, static_cast<uint32_t>(index)); | |
| 274 BytecodeNode second(Bytecode::kToName, Register(0).ToOperand()); | |
| 275 optimizer()->Write(&first); | |
| 276 CHECK_EQ(write_count(), 0); | |
| 277 optimizer()->Write(&second); | |
| 278 CHECK_EQ(write_count(), 1); | |
| 279 CHECK_EQ(last_written(), first); | |
| 280 Flush(); | |
| 281 CHECK_EQ(write_count(), 2); | |
| 282 CHECK_EQ(last_written(), second); | |
| 283 CHECK_EQ(last_written().bytecode(), Bytecode::kStar); | |
| 284 } | |
| 285 | |
| 286 TEST_F(BytecodePeepholeOptimizerTest, LdaConstantNumberToName) { | |
| 287 Handle<Object> word = isolate()->factory()->NewNumber(0.380); | |
| 288 size_t index = constant_array()->Insert(word); | |
| 289 BytecodeNode first(Bytecode::kLdaConstant, static_cast<uint32_t>(index)); | |
| 290 BytecodeNode second(Bytecode::kToName, Register(0).ToOperand()); | |
| 291 optimizer()->Write(&first); | |
| 292 CHECK_EQ(write_count(), 0); | |
| 293 optimizer()->Write(&second); | |
| 294 CHECK_EQ(write_count(), 1); | |
| 295 CHECK_EQ(last_written(), first); | |
| 296 Flush(); | |
| 297 CHECK_EQ(write_count(), 2); | |
| 298 CHECK_EQ(last_written(), second); | |
| 299 } | |
| 300 | |
| 301 // Tests covering BytecodePeepholeOptimizer::CanElideLast(). | 265 // Tests covering BytecodePeepholeOptimizer::CanElideLast(). |
| 302 | 266 |
| 303 TEST_F(BytecodePeepholeOptimizerTest, LdaTrueLdaFalse) { | 267 TEST_F(BytecodePeepholeOptimizerTest, LdaTrueLdaFalse) { |
| 304 BytecodeNode first(Bytecode::kLdaTrue); | 268 BytecodeNode first(Bytecode::kLdaTrue); |
| 305 BytecodeNode second(Bytecode::kLdaFalse); | 269 BytecodeNode second(Bytecode::kLdaFalse); |
| 306 optimizer()->Write(&first); | 270 optimizer()->Write(&first); |
| 307 CHECK_EQ(write_count(), 0); | 271 CHECK_EQ(write_count(), 0); |
| 308 optimizer()->Write(&second); | 272 optimizer()->Write(&second); |
| 309 CHECK_EQ(write_count(), 0); | 273 CHECK_EQ(write_count(), 0); |
| 310 Flush(); | 274 Flush(); |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 554 CHECK_EQ(last_written().operand_count(), 2); | 518 CHECK_EQ(last_written().operand_count(), 2); |
| 555 CHECK_EQ(last_written().operand(0), 0); | 519 CHECK_EQ(last_written().operand(0), 0); |
| 556 CHECK_EQ(last_written().operand(1), reg_operand); | 520 CHECK_EQ(last_written().operand(1), reg_operand); |
| 557 Reset(); | 521 Reset(); |
| 558 } | 522 } |
| 559 } | 523 } |
| 560 | 524 |
| 561 } // namespace interpreter | 525 } // namespace interpreter |
| 562 } // namespace internal | 526 } // namespace internal |
| 563 } // namespace v8 | 527 } // namespace v8 |
| OLD | NEW |