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