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
10namespace v8 {
11namespace internal {
12namespace interpreter {
13
14class ConstantArrayBuilder;
15
16// An optimization stage for performing peephole optimizations on
17// generated bytecode. The optimizer may buffer one bytecode
18// internally.
19class 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