• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_
6 #define V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_
7 
8 #include "src/interpreter/bytecode-pipeline.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace interpreter {
13 
14 class ConstantArrayBuilder;
15 
16 // An optimization stage for performing peephole optimizations on
17 // generated bytecode. The optimizer may buffer one bytecode
18 // internally.
19 class BytecodePeepholeOptimizer final : public BytecodePipelineStage,
20                                         public ZoneObject {
21  public:
22   BytecodePeepholeOptimizer(ConstantArrayBuilder* constant_array_builder,
23                             BytecodePipelineStage* next_stage);
24 
25   // BytecodePipelineStage interface.
26   void Write(BytecodeNode* node) override;
27   void WriteJump(BytecodeNode* node, BytecodeLabel* label) override;
28   void BindLabel(BytecodeLabel* label) override;
29   void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override;
30   Handle<BytecodeArray> ToBytecodeArray(
31       int fixed_register_count, int parameter_count,
32       Handle<FixedArray> handler_table) override;
33 
34  private:
35   BytecodeNode* OptimizeAndEmitLast(BytecodeNode* current);
36   BytecodeNode* Optimize(BytecodeNode* current);
37   void Flush();
38 
39   void TryToRemoveLastExpressionPosition(const BytecodeNode* const current);
40   bool TransformCurrentBytecode(BytecodeNode* const current);
41   bool TransformLastAndCurrentBytecodes(BytecodeNode* const current);
42   bool CanElideCurrent(const BytecodeNode* const current) const;
43   bool CanElideLast(const BytecodeNode* const current) const;
44   bool CanElideLastBasedOnSourcePosition(
45       const BytecodeNode* const current) const;
46 
47   // Simple substitution methods.
48   bool RemoveToBooleanFromJump(BytecodeNode* const current);
49   bool RemoveToBooleanFromLogicalNot(BytecodeNode* const current);
50 
51   void InvalidateLast();
52   bool LastIsValid() const;
53   void SetLast(const BytecodeNode* const node);
54 
55   bool LastBytecodePutsNameInAccumulator() const;
56 
57   Handle<Object> GetConstantForIndexOperand(const BytecodeNode* const node,
58                                             int index) const;
59 
60   ConstantArrayBuilder* constant_array_builder_;
61   BytecodePipelineStage* next_stage_;
62   BytecodeNode last_;
63 
64   DISALLOW_COPY_AND_ASSIGN(BytecodePeepholeOptimizer);
65 };
66 
67 }  // namespace interpreter
68 }  // namespace internal
69 }  // namespace v8
70 
71 #endif  // V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_
72