Home | History | Annotate | Download | only in compiler
      1 // Copyright 2016 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_LIVENESS_MAP_H_
      6 #define V8_COMPILER_BYTECODE_LIVENESS_MAP_H_
      7 
      8 #include "src/base/hashmap.h"
      9 #include "src/bit-vector.h"
     10 #include "src/zone/zone.h"
     11 
     12 namespace v8 {
     13 namespace internal {
     14 
     15 class Zone;
     16 
     17 namespace compiler {
     18 
     19 class BytecodeLivenessState : public ZoneObject {
     20  public:
     21   BytecodeLivenessState(int register_count, Zone* zone)
     22       : bit_vector_(register_count + 1, zone) {}
     23 
     24   const BitVector& bit_vector() const { return bit_vector_; }
     25 
     26   BitVector& bit_vector() { return bit_vector_; }
     27 
     28   bool RegisterIsLive(int index) const {
     29     DCHECK_GE(index, 0);
     30     DCHECK_LT(index, bit_vector_.length() - 1);
     31     return bit_vector_.Contains(index);
     32   }
     33 
     34   bool AccumulatorIsLive() const {
     35     return bit_vector_.Contains(bit_vector_.length() - 1);
     36   }
     37 
     38   bool Equals(const BytecodeLivenessState& other) const {
     39     return bit_vector_.Equals(other.bit_vector_);
     40   }
     41 
     42   void MarkRegisterLive(int index) {
     43     DCHECK_GE(index, 0);
     44     DCHECK_LT(index, bit_vector_.length() - 1);
     45     bit_vector_.Add(index);
     46   }
     47 
     48   void MarkRegisterDead(int index) {
     49     DCHECK_GE(index, 0);
     50     DCHECK_LT(index, bit_vector_.length() - 1);
     51     bit_vector_.Remove(index);
     52   }
     53 
     54   void MarkAccumulatorLive() { bit_vector_.Add(bit_vector_.length() - 1); }
     55 
     56   void MarkAccumulatorDead() { bit_vector_.Remove(bit_vector_.length() - 1); }
     57 
     58   void MarkAllLive() { bit_vector_.AddAll(); }
     59 
     60   void Union(const BytecodeLivenessState& other) {
     61     bit_vector_.Union(other.bit_vector_);
     62   }
     63 
     64   bool UnionIsChanged(const BytecodeLivenessState& other) {
     65     return bit_vector_.UnionIsChanged(other.bit_vector_);
     66   }
     67 
     68   void CopyFrom(const BytecodeLivenessState& other) {
     69     bit_vector_.CopyFrom(other.bit_vector_);
     70   }
     71 
     72  private:
     73   BitVector bit_vector_;
     74 
     75   DISALLOW_COPY_AND_ASSIGN(BytecodeLivenessState);
     76 };
     77 
     78 struct BytecodeLiveness {
     79   BytecodeLivenessState* in;
     80   BytecodeLivenessState* out;
     81 
     82   BytecodeLiveness(int register_count, Zone* zone);
     83 };
     84 
     85 class V8_EXPORT_PRIVATE BytecodeLivenessMap {
     86  public:
     87   BytecodeLivenessMap(int size, Zone* zone);
     88 
     89   BytecodeLiveness& InitializeLiveness(int offset, int register_count,
     90                                        Zone* zone);
     91 
     92   BytecodeLiveness& GetLiveness(int offset);
     93   const BytecodeLiveness& GetLiveness(int offset) const;
     94 
     95   BytecodeLivenessState* GetInLiveness(int offset) {
     96     return GetLiveness(offset).in;
     97   }
     98   const BytecodeLivenessState* GetInLiveness(int offset) const {
     99     return GetLiveness(offset).in;
    100   }
    101 
    102   BytecodeLivenessState* GetOutLiveness(int offset) {
    103     return GetLiveness(offset).out;
    104   }
    105   const BytecodeLivenessState* GetOutLiveness(int offset) const {
    106     return GetLiveness(offset).out;
    107   }
    108 
    109  private:
    110   base::TemplateHashMapImpl<int, BytecodeLiveness,
    111                             base::KeyEqualityMatcher<int>, ZoneAllocationPolicy>
    112       liveness_map_;
    113 };
    114 
    115 }  // namespace compiler
    116 }  // namespace internal
    117 }  // namespace v8
    118 
    119 #endif  // V8_COMPILER_BYTECODE_LIVENESS_MAP_H_
    120