• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
11 namespace v8 {
12 namespace internal {
13 
14 class BytecodeArray;
15 
16 namespace 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.
25 class 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|.
forward_branches_target(int 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|.
backward_branches_target(int 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 
zone()49   Zone* zone() const { return zone_; }
bytecode_array()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