Home | History | Annotate | Download | only in compiler
      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 #include "src/zone-containers.h"
     11 
     12 namespace v8 {
     13 namespace internal {
     14 
     15 class BytecodeArray;
     16 
     17 namespace compiler {
     18 
     19 class BytecodeBranchInfo;
     20 
     21 // A class for identifying the branch targets and their branch sites
     22 // within a bytecode array and also identifying which bytecodes are
     23 // reachable. This information can be used to construct the local
     24 // control flow logic for high-level IR graphs built from bytecode.
     25 //
     26 // NB This class relies on the only backwards branches in bytecode
     27 // being jumps back to loop headers.
     28 class BytecodeBranchAnalysis BASE_EMBEDDED {
     29  public:
     30   BytecodeBranchAnalysis(Handle<BytecodeArray> bytecode_array, Zone* zone);
     31 
     32   // Analyze the bytecodes to find the branch sites and their
     33   // targets. No other methods in this class return valid information
     34   // until this has been called.
     35   void Analyze();
     36 
     37   // Offsets of bytecodes having a backward branch to the bytecode at |offset|.
     38   const ZoneVector<int>* BackwardBranchesTargetting(int offset) const;
     39 
     40   // Offsets of bytecodes having a forward branch to the bytecode at |offset|.
     41   const ZoneVector<int>* ForwardBranchesTargetting(int offset) const;
     42 
     43   // Returns true if the bytecode at |offset| is reachable.
     44   bool is_reachable(int offset) const { return reachable_.Contains(offset); }
     45 
     46   // Returns true if there are any forward branches to the bytecode at
     47   // |offset|.
     48   bool forward_branches_target(int offset) const {
     49     const ZoneVector<int>* sites = ForwardBranchesTargetting(offset);
     50     return sites != nullptr && sites->size() > 0;
     51   }
     52 
     53   // Returns true if there are any backward branches to the bytecode
     54   // at |offset|.
     55   bool backward_branches_target(int offset) const {
     56     const ZoneVector<int>* sites = BackwardBranchesTargetting(offset);
     57     return sites != nullptr && sites->size() > 0;
     58   }
     59 
     60  private:
     61   void AddBranch(int origin_offset, int target_offset);
     62 
     63   Zone* zone() const { return zone_; }
     64   Handle<BytecodeArray> bytecode_array() const { return bytecode_array_; }
     65 
     66   ZoneMap<int, BytecodeBranchInfo*> branch_infos_;
     67   Handle<BytecodeArray> bytecode_array_;
     68   BitVector reachable_;
     69   Zone* zone_;
     70 
     71   DISALLOW_COPY_AND_ASSIGN(BytecodeBranchAnalysis);
     72 };
     73 
     74 
     75 }  // namespace compiler
     76 }  // namespace internal
     77 }  // namespace v8
     78 
     79 #endif  // V8_COMPILER_BYTECODE_BRANCH_ANALYSIS_H_
     80