• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
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/base/compiler-specific.h"
9 #include "src/globals.h"
10 #include "src/interpreter/bytecode-peephole-table.h"
11 #include "src/interpreter/bytecode-pipeline.h"
12 
13 namespace v8 {
14 namespace internal {
15 namespace interpreter {
16 
17 class BytecodePeepholeActionAndData;
18 
19 // An optimization stage for performing peephole optimizations on
20 // generated bytecode. The optimizer may buffer one bytecode
21 // internally.
22 class V8_EXPORT_PRIVATE BytecodePeepholeOptimizer final
NON_EXPORTED_BASE(BytecodePipelineStage)23     : public NON_EXPORTED_BASE(BytecodePipelineStage),
24       public NON_EXPORTED_BASE(ZoneObject) {
25  public:
26   explicit BytecodePeepholeOptimizer(BytecodePipelineStage* next_stage);
27 
28   // BytecodePipelineStage interface.
29   void Write(BytecodeNode* node) override;
30   void WriteJump(BytecodeNode* node, BytecodeLabel* label) override;
31   void BindLabel(BytecodeLabel* label) override;
32   void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override;
33   Handle<BytecodeArray> ToBytecodeArray(
34       Isolate* isolate, int register_count, int parameter_count,
35       Handle<FixedArray> handler_table) override;
36 
37  private:
38 #define DECLARE_ACTION(Action)          \
39   void Action(BytecodeNode* const node, \
40               const PeepholeActionAndData* const action_data = nullptr);
41   PEEPHOLE_ACTION_LIST(DECLARE_ACTION)
42 #undef DECLARE_ACTION
43 
44   void ApplyPeepholeAction(BytecodeNode* const node);
45   void Flush();
46   bool CanElideLastBasedOnSourcePosition(
47       const BytecodeNode* const current) const;
48   void InvalidateLast();
49   bool LastIsValid() const;
50   void SetLast(const BytecodeNode* const node);
51 
52   BytecodePipelineStage* next_stage() const { return next_stage_; }
53   BytecodeNode* last() { return &last_; }
54 
55   BytecodePipelineStage* next_stage_;
56   BytecodeNode last_;
57 
58   DISALLOW_COPY_AND_ASSIGN(BytecodePeepholeOptimizer);
59 };
60 
61 }  // namespace interpreter
62 }  // namespace internal
63 }  // namespace v8
64 
65 #endif  // V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_
66