• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright 2012 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_DATAFLOW_H_
6  #define V8_DATAFLOW_H_
7  
8  #include "src/v8.h"
9  
10  #include "src/allocation.h"
11  #include "src/ast.h"
12  #include "src/compiler.h"
13  #include "src/zone-inl.h"
14  
15  namespace v8 {
16  namespace internal {
17  
18  class BitVector: public ZoneObject {
19   public:
20    // Iterator for the elements of this BitVector.
21    class Iterator BASE_EMBEDDED {
22     public:
Iterator(BitVector * target)23      explicit Iterator(BitVector* target)
24          : target_(target),
25            current_index_(0),
26            current_value_(target->data_[0]),
27            current_(-1) {
28        DCHECK(target->data_length_ > 0);
29        Advance();
30      }
~Iterator()31      ~Iterator() { }
32  
Done()33      bool Done() const { return current_index_ >= target_->data_length_; }
34      void Advance();
35  
Current()36      int Current() const {
37        DCHECK(!Done());
38        return current_;
39      }
40  
41     private:
SkipZeroBytes(uint32_t val)42      uint32_t SkipZeroBytes(uint32_t val) {
43        while ((val & 0xFF) == 0) {
44          val >>= 8;
45          current_ += 8;
46        }
47        return val;
48      }
SkipZeroBits(uint32_t val)49      uint32_t SkipZeroBits(uint32_t val) {
50        while ((val & 0x1) == 0) {
51          val >>= 1;
52          current_++;
53        }
54        return val;
55      }
56  
57      BitVector* target_;
58      int current_index_;
59      uint32_t current_value_;
60      int current_;
61  
62      friend class BitVector;
63    };
64  
BitVector(int length,Zone * zone)65    BitVector(int length, Zone* zone)
66        : length_(length),
67          data_length_(SizeFor(length)),
68          data_(zone->NewArray<uint32_t>(data_length_)) {
69      DCHECK(length > 0);
70      Clear();
71    }
72  
BitVector(const BitVector & other,Zone * zone)73    BitVector(const BitVector& other, Zone* zone)
74        : length_(other.length()),
75          data_length_(SizeFor(length_)),
76          data_(zone->NewArray<uint32_t>(data_length_)) {
77      CopyFrom(other);
78    }
79  
SizeFor(int length)80    static int SizeFor(int length) {
81      return 1 + ((length - 1) / 32);
82    }
83  
84    BitVector& operator=(const BitVector& rhs) {
85      if (this != &rhs) CopyFrom(rhs);
86      return *this;
87    }
88  
CopyFrom(const BitVector & other)89    void CopyFrom(const BitVector& other) {
90      DCHECK(other.length() <= length());
91      for (int i = 0; i < other.data_length_; i++) {
92        data_[i] = other.data_[i];
93      }
94      for (int i = other.data_length_; i < data_length_; i++) {
95        data_[i] = 0;
96      }
97    }
98  
Contains(int i)99    bool Contains(int i) const {
100      DCHECK(i >= 0 && i < length());
101      uint32_t block = data_[i / 32];
102      return (block & (1U << (i % 32))) != 0;
103    }
104  
Add(int i)105    void Add(int i) {
106      DCHECK(i >= 0 && i < length());
107      data_[i / 32] |= (1U << (i % 32));
108    }
109  
Remove(int i)110    void Remove(int i) {
111      DCHECK(i >= 0 && i < length());
112      data_[i / 32] &= ~(1U << (i % 32));
113    }
114  
Union(const BitVector & other)115    void Union(const BitVector& other) {
116      DCHECK(other.length() == length());
117      for (int i = 0; i < data_length_; i++) {
118        data_[i] |= other.data_[i];
119      }
120    }
121  
UnionIsChanged(const BitVector & other)122    bool UnionIsChanged(const BitVector& other) {
123      DCHECK(other.length() == length());
124      bool changed = false;
125      for (int i = 0; i < data_length_; i++) {
126        uint32_t old_data = data_[i];
127        data_[i] |= other.data_[i];
128        if (data_[i] != old_data) changed = true;
129      }
130      return changed;
131    }
132  
Intersect(const BitVector & other)133    void Intersect(const BitVector& other) {
134      DCHECK(other.length() == length());
135      for (int i = 0; i < data_length_; i++) {
136        data_[i] &= other.data_[i];
137      }
138    }
139  
IntersectIsChanged(const BitVector & other)140    bool IntersectIsChanged(const BitVector& other) {
141      DCHECK(other.length() == length());
142      bool changed = false;
143      for (int i = 0; i < data_length_; i++) {
144        uint32_t old_data = data_[i];
145        data_[i] &= other.data_[i];
146        if (data_[i] != old_data) changed = true;
147      }
148      return changed;
149    }
150  
Subtract(const BitVector & other)151    void Subtract(const BitVector& other) {
152      DCHECK(other.length() == length());
153      for (int i = 0; i < data_length_; i++) {
154        data_[i] &= ~other.data_[i];
155      }
156    }
157  
Clear()158    void Clear() {
159      for (int i = 0; i < data_length_; i++) {
160        data_[i] = 0;
161      }
162    }
163  
IsEmpty()164    bool IsEmpty() const {
165      for (int i = 0; i < data_length_; i++) {
166        if (data_[i] != 0) return false;
167      }
168      return true;
169    }
170  
Equals(const BitVector & other)171    bool Equals(const BitVector& other) {
172      for (int i = 0; i < data_length_; i++) {
173        if (data_[i] != other.data_[i]) return false;
174      }
175      return true;
176    }
177  
178    int Count() const;
179  
length()180    int length() const { return length_; }
181  
182  #ifdef DEBUG
183    void Print();
184  #endif
185  
186   private:
187    int length_;
188    int data_length_;
189    uint32_t* data_;
190  };
191  
192  
193  class GrowableBitVector BASE_EMBEDDED {
194   public:
195    class Iterator BASE_EMBEDDED {
196     public:
Iterator(const GrowableBitVector * target,Zone * zone)197      Iterator(const GrowableBitVector* target, Zone* zone)
198          : it_(target->bits_ == NULL
199                ? new(zone) BitVector(1, zone)
200                : target->bits_) { }
Done()201      bool Done() const { return it_.Done(); }
Advance()202      void Advance() { it_.Advance(); }
Current()203      int Current() const { return it_.Current(); }
204     private:
205      BitVector::Iterator it_;
206    };
207  
GrowableBitVector()208    GrowableBitVector() : bits_(NULL) { }
GrowableBitVector(int length,Zone * zone)209    GrowableBitVector(int length, Zone* zone)
210        : bits_(new(zone) BitVector(length, zone)) { }
211  
Contains(int value)212    bool Contains(int value) const {
213      if (!InBitsRange(value)) return false;
214      return bits_->Contains(value);
215    }
216  
Add(int value,Zone * zone)217    void Add(int value, Zone* zone) {
218      EnsureCapacity(value, zone);
219      bits_->Add(value);
220    }
221  
Union(const GrowableBitVector & other,Zone * zone)222    void Union(const GrowableBitVector& other, Zone* zone) {
223      for (Iterator it(&other, zone); !it.Done(); it.Advance()) {
224        Add(it.Current(), zone);
225      }
226    }
227  
Clear()228    void Clear() { if (bits_ != NULL) bits_->Clear(); }
229  
230   private:
231    static const int kInitialLength = 1024;
232  
InBitsRange(int value)233    bool InBitsRange(int value) const {
234      return bits_ != NULL && bits_->length() > value;
235    }
236  
EnsureCapacity(int value,Zone * zone)237    void EnsureCapacity(int value, Zone* zone) {
238      if (InBitsRange(value)) return;
239      int new_length = bits_ == NULL ? kInitialLength : bits_->length();
240      while (new_length <= value) new_length *= 2;
241      BitVector* new_bits = new(zone) BitVector(new_length, zone);
242      if (bits_ != NULL) new_bits->CopyFrom(*bits_);
243      bits_ = new_bits;
244    }
245  
246    BitVector* bits_;
247  };
248  
249  }  // namespace internal
250  }  // namespace v8
251  
252  #endif  // V8_DATAFLOW_H_
253