aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/interpreter/bytecode-dead-code-optimizer.cc
blob: 848036c01e811b458fa2de3d5d648b9b9cf3990c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/interpreter/bytecode-dead-code-optimizer.h"

namespace v8 {
namespace internal {
namespace interpreter {

BytecodeDeadCodeOptimizer::BytecodeDeadCodeOptimizer(
    BytecodePipelineStage* next_stage)
    : next_stage_(next_stage), exit_seen_in_block_(false) {}

// override
Handle<BytecodeArray> BytecodeDeadCodeOptimizer::ToBytecodeArray(
    Isolate* isolate, int register_count, int parameter_count,
    Handle<FixedArray> handler_table) {
  return next_stage_->ToBytecodeArray(isolate, register_count, parameter_count,
                                      handler_table);
}

// override
void BytecodeDeadCodeOptimizer::Write(BytecodeNode* node) {
  // Don't emit dead code.
  if (exit_seen_in_block_) return;

  switch (node->bytecode()) {
    case Bytecode::kReturn:
    case Bytecode::kThrow:
    case Bytecode::kReThrow:
      exit_seen_in_block_ = true;
      break;
    default:
      break;
  }

  next_stage_->Write(node);
}

// override
void BytecodeDeadCodeOptimizer::WriteJump(BytecodeNode* node,
                                          BytecodeLabel* label) {
  // Don't emit dead code.
  // TODO(rmcilroy): For forward jumps we could mark the label as dead, thereby
  // avoiding emitting dead code when we bind the label.
  if (exit_seen_in_block_) return;

  switch (node->bytecode()) {
    case Bytecode::kJump:
    case Bytecode::kJumpConstant:
      exit_seen_in_block_ = true;
      break;
    default:
      break;
  }

  next_stage_->WriteJump(node, label);
}

// override
void BytecodeDeadCodeOptimizer::BindLabel(BytecodeLabel* label) {
  next_stage_->BindLabel(label);
  exit_seen_in_block_ = false;
}

// override
void BytecodeDeadCodeOptimizer::BindLabel(const BytecodeLabel& target,
                                          BytecodeLabel* label) {
  next_stage_->BindLabel(target, label);
  // exit_seen_in_block_ was reset when target was bound, so shouldn't be
  // changed here.
}

}  // namespace interpreter
}  // namespace internal
}  // namespace v8