1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
2bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// found in the LICENSE file.
4bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
5bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifndef V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_
6bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_
7bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
8c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/base/compiler-specific.h"
9c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/globals.h"
10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/interpreter/bytecode-peephole-table.h"
11bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/interpreter/bytecode-pipeline.h"
12bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
13bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochnamespace v8 {
14bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochnamespace internal {
15bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochnamespace interpreter {
16bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass BytecodePeepholeActionAndData;
18bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
19bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// An optimization stage for performing peephole optimizations on
20bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// generated bytecode. The optimizer may buffer one bytecode
21bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// internally.
22c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE BytecodePeepholeOptimizer final
23c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    : public NON_EXPORTED_BASE(BytecodePipelineStage),
24c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      public NON_EXPORTED_BASE(ZoneObject) {
25bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public:
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  explicit BytecodePeepholeOptimizer(BytecodePipelineStage* next_stage);
27bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // BytecodePipelineStage interface.
29bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Write(BytecodeNode* node) override;
3013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void WriteJump(BytecodeNode* node, BytecodeLabel* label) override;
3113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void BindLabel(BytecodeLabel* label) override;
3213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override;
3313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<BytecodeArray> ToBytecodeArray(
34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Isolate* isolate, int register_count, int parameter_count,
3513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Handle<FixedArray> handler_table) override;
36bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
37bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch private:
38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define DECLARE_ACTION(Action)          \
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Action(BytecodeNode* const node, \
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              const PeepholeActionAndData* const action_data = nullptr);
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PEEPHOLE_ACTION_LIST(DECLARE_ACTION)
42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef DECLARE_ACTION
43bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void ApplyPeepholeAction(BytecodeNode* const node);
45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Flush();
4613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool CanElideLastBasedOnSourcePosition(
4713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      const BytecodeNode* const current) const;
48bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void InvalidateLast();
49bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool LastIsValid() const;
50bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void SetLast(const BytecodeNode* const node);
51bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodePipelineStage* next_stage() const { return next_stage_; }
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeNode* last() { return &last_; }
54bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
55bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodePipelineStage* next_stage_;
56bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeNode last_;
57bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
58bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BytecodePeepholeOptimizer);
59bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
60bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
61bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}  // namespace interpreter
62bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}  // namespace internal
63bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}  // namespace v8
64bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
65bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif  // V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_
66