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_COMPILER_BYTECODE_BRANCH_ANALYSIS_H_ 6#define V8_COMPILER_BYTECODE_BRANCH_ANALYSIS_H_ 7 8#include "src/bit-vector.h" 9#include "src/handles.h" 10 11namespace v8 { 12namespace internal { 13 14class BytecodeArray; 15 16namespace compiler { 17 18// A class for identifying branch targets within a bytecode array. 19// This information can be used to construct the local control flow 20// logic for high-level IR graphs built from bytecode. 21// 22// N.B. If this class is used to determine loop headers, then such a 23// usage relies on the only backwards branches in bytecode being jumps 24// back to loop headers. 25class BytecodeBranchAnalysis BASE_EMBEDDED { 26 public: 27 BytecodeBranchAnalysis(Handle<BytecodeArray> bytecode_array, Zone* zone); 28 29 // Analyze the bytecodes to find the branch sites and their 30 // targets. No other methods in this class return valid information 31 // until this has been called. 32 void Analyze(); 33 34 // Returns true if there are any forward branches to the bytecode at 35 // |offset|. 36 bool forward_branches_target(int offset) const { 37 return is_forward_target_.Contains(offset); 38 } 39 40 // Returns true if there are any backward branches to the bytecode 41 // at |offset|. 42 bool backward_branches_target(int offset) const { 43 return is_backward_target_.Contains(offset); 44 } 45 46 private: 47 void AddBranch(int origin_offset, int target_offset); 48 49 Zone* zone() const { return zone_; } 50 Handle<BytecodeArray> bytecode_array() const { return bytecode_array_; } 51 52 Handle<BytecodeArray> bytecode_array_; 53 BitVector is_backward_target_; 54 BitVector is_forward_target_; 55 Zone* zone_; 56 57 DISALLOW_COPY_AND_ASSIGN(BytecodeBranchAnalysis); 58}; 59 60 61} // namespace compiler 62} // namespace internal 63} // namespace v8 64 65#endif // V8_COMPILER_BYTECODE_BRANCH_ANALYSIS_H_ 66