113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// Use of this source code is governed by a BSD-style license that can be
313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// found in the LICENSE file.
413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/interpreter/bytecode-dead-code-optimizer.h"
613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochnamespace v8 {
813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochnamespace internal {
913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochnamespace interpreter {
1013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochBytecodeDeadCodeOptimizer::BytecodeDeadCodeOptimizer(
1213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    BytecodePipelineStage* next_stage)
1313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    : next_stage_(next_stage), exit_seen_in_block_(false) {}
1413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// override
1613e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochHandle<BytecodeArray> BytecodeDeadCodeOptimizer::ToBytecodeArray(
17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Isolate* isolate, int register_count, int parameter_count,
1813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<FixedArray> handler_table) {
19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return next_stage_->ToBytecodeArray(isolate, register_count, parameter_count,
20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                      handler_table);
2113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
2213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
2313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// override
2413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid BytecodeDeadCodeOptimizer::Write(BytecodeNode* node) {
2513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Don't emit dead code.
2613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (exit_seen_in_block_) return;
2713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
2813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (node->bytecode()) {
2913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case Bytecode::kReturn:
3013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case Bytecode::kThrow:
3113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case Bytecode::kReThrow:
3213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      exit_seen_in_block_ = true;
3313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      break;
3413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    default:
3513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      break;
3613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
3713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
3813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  next_stage_->Write(node);
3913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
4013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
4113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// override
4213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid BytecodeDeadCodeOptimizer::WriteJump(BytecodeNode* node,
4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                          BytecodeLabel* label) {
4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Don't emit dead code.
4513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // TODO(rmcilroy): For forward jumps we could mark the label as dead, thereby
4613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // avoiding emitting dead code when we bind the label.
4713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (exit_seen_in_block_) return;
4813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
4913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (node->bytecode()) {
5013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case Bytecode::kJump:
5113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case Bytecode::kJumpConstant:
5213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      exit_seen_in_block_ = true;
5313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      break;
5413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    default:
5513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      break;
5613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
5713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
5813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  next_stage_->WriteJump(node, label);
5913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
6013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
6113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// override
6213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid BytecodeDeadCodeOptimizer::BindLabel(BytecodeLabel* label) {
6313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  next_stage_->BindLabel(label);
6413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  exit_seen_in_block_ = false;
6513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
6613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
6713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// override
6813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid BytecodeDeadCodeOptimizer::BindLabel(const BytecodeLabel& target,
6913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                          BytecodeLabel* label) {
7013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  next_stage_->BindLabel(target, label);
7113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // exit_seen_in_block_ was reset when target was bound, so shouldn't be
7213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // changed here.
7313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
7413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
7513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}  // namespace interpreter
7613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}  // namespace internal
7713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}  // namespace v8
78