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