OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/escape-analysis.h" | 5 #include "src/compiler/escape-analysis.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/flags.h" | 9 #include "src/base/flags.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 changed = true; | 246 changed = true; |
247 fields_[i] = other.fields_[i]; | 247 fields_[i] = other.fields_[i]; |
248 } | 248 } |
249 } | 249 } |
250 return changed; | 250 return changed; |
251 } | 251 } |
252 | 252 |
253 class VirtualState : public ZoneObject { | 253 class VirtualState : public ZoneObject { |
254 public: | 254 public: |
255 VirtualState(Node* owner, Zone* zone, size_t size) | 255 VirtualState(Node* owner, Zone* zone, size_t size) |
256 : info_(size, nullptr, zone), owner_(owner) {} | 256 : info_(size, nullptr, zone), |
| 257 initialized_(static_cast<int>(size), zone), |
| 258 owner_(owner) {} |
257 | 259 |
258 VirtualState(Node* owner, const VirtualState& state) | 260 VirtualState(Node* owner, const VirtualState& state) |
259 : info_(state.info_.size(), nullptr, state.info_.get_allocator().zone()), | 261 : info_(state.info_.size(), nullptr, state.info_.get_allocator().zone()), |
| 262 initialized_(state.initialized_.length(), |
| 263 state.info_.get_allocator().zone()), |
260 owner_(owner) { | 264 owner_(owner) { |
261 for (size_t i = 0; i < info_.size(); ++i) { | 265 for (size_t i = 0; i < info_.size(); ++i) { |
262 if (state.info_[i]) { | 266 if (state.info_[i]) { |
263 info_[i] = state.info_[i]; | 267 info_[i] = state.info_[i]; |
264 } | 268 } |
265 } | 269 } |
266 } | 270 } |
267 | 271 |
268 VirtualObject* VirtualObjectFromAlias(size_t alias); | 272 VirtualObject* VirtualObjectFromAlias(size_t alias); |
269 void SetVirtualObject(Alias alias, VirtualObject* state); | 273 void SetVirtualObject(Alias alias, VirtualObject* state); |
270 bool UpdateFrom(VirtualState* state, Zone* zone); | 274 bool UpdateFrom(VirtualState* state, Zone* zone); |
271 bool MergeFrom(MergeCache* cache, Zone* zone, Graph* graph, | 275 bool MergeFrom(MergeCache* cache, Zone* zone, Graph* graph, |
272 CommonOperatorBuilder* common, Node* at); | 276 CommonOperatorBuilder* common, Node* at); |
273 size_t size() const { return info_.size(); } | 277 size_t size() const { return info_.size(); } |
274 Node* owner() const { return owner_; } | 278 Node* owner() const { return owner_; } |
275 VirtualObject* Copy(VirtualObject* obj, Alias alias); | 279 VirtualObject* Copy(VirtualObject* obj, Alias alias); |
276 void SetCopyRequired() { | 280 void SetCopyRequired() { |
277 for (VirtualObject* obj : info_) { | 281 for (VirtualObject* obj : info_) { |
278 if (obj) obj->SetCopyRequired(); | 282 if (obj) obj->SetCopyRequired(); |
279 } | 283 } |
280 } | 284 } |
281 | 285 |
282 private: | 286 private: |
283 ZoneVector<VirtualObject*> info_; | 287 ZoneVector<VirtualObject*> info_; |
| 288 BitVector initialized_; |
284 Node* owner_; | 289 Node* owner_; |
285 | 290 |
286 DISALLOW_COPY_AND_ASSIGN(VirtualState); | 291 DISALLOW_COPY_AND_ASSIGN(VirtualState); |
287 }; | 292 }; |
288 | 293 |
289 class MergeCache : public ZoneObject { | 294 class MergeCache : public ZoneObject { |
290 public: | 295 public: |
291 explicit MergeCache(Zone* zone) | 296 explicit MergeCache(Zone* zone) |
292 : states_(zone), objects_(zone), fields_(zone) { | 297 : states_(zone), objects_(zone), fields_(zone) { |
293 states_.reserve(5); | 298 states_.reserve(5); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 info_[alias] = new_obj; | 374 info_[alias] = new_obj; |
370 return new_obj; | 375 return new_obj; |
371 } | 376 } |
372 | 377 |
373 VirtualObject* VirtualState::VirtualObjectFromAlias(size_t alias) { | 378 VirtualObject* VirtualState::VirtualObjectFromAlias(size_t alias) { |
374 return info_[alias]; | 379 return info_[alias]; |
375 } | 380 } |
376 | 381 |
377 void VirtualState::SetVirtualObject(Alias alias, VirtualObject* obj) { | 382 void VirtualState::SetVirtualObject(Alias alias, VirtualObject* obj) { |
378 info_[alias] = obj; | 383 info_[alias] = obj; |
| 384 if (obj) initialized_.Add(alias); |
379 } | 385 } |
380 | 386 |
381 bool VirtualState::UpdateFrom(VirtualState* from, Zone* zone) { | 387 bool VirtualState::UpdateFrom(VirtualState* from, Zone* zone) { |
382 if (from == this) return false; | 388 if (from == this) return false; |
383 bool changed = false; | 389 bool changed = false; |
384 for (Alias alias = 0; alias < size(); ++alias) { | 390 for (Alias alias = 0; alias < size(); ++alias) { |
385 VirtualObject* ls = VirtualObjectFromAlias(alias); | 391 VirtualObject* ls = VirtualObjectFromAlias(alias); |
386 VirtualObject* rs = from->VirtualObjectFromAlias(alias); | 392 VirtualObject* rs = from->VirtualObjectFromAlias(alias); |
387 | 393 |
388 if (ls == rs || rs == nullptr) continue; | 394 if (ls == rs || rs == nullptr) continue; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 size_t fields = std::numeric_limits<size_t>::max(); | 527 size_t fields = std::numeric_limits<size_t>::max(); |
522 for (VirtualState* state : cache->states()) { | 528 for (VirtualState* state : cache->states()) { |
523 if (VirtualObject* obj = state->VirtualObjectFromAlias(alias)) { | 529 if (VirtualObject* obj = state->VirtualObjectFromAlias(alias)) { |
524 cache->objects().push_back(obj); | 530 cache->objects().push_back(obj); |
525 if (mergeObject == obj) { | 531 if (mergeObject == obj) { |
526 copy_merge_object = true; | 532 copy_merge_object = true; |
527 } | 533 } |
528 fields = std::min(obj->field_count(), fields); | 534 fields = std::min(obj->field_count(), fields); |
529 } | 535 } |
530 } | 536 } |
531 if (cache->objects().size() == cache->states().size()) { | 537 if (cache->objects().size() == cache->states().size() && |
| 538 (mergeObject || !initialized_.Contains(alias))) { |
532 bool initialMerge = false; | 539 bool initialMerge = false; |
533 if (!mergeObject) { | 540 if (!mergeObject) { |
534 initialMerge = true; | 541 initialMerge = true; |
535 VirtualObject* obj = new (zone) | 542 VirtualObject* obj = new (zone) |
536 VirtualObject(cache->objects().front()->id(), this, zone, fields, | 543 VirtualObject(cache->objects().front()->id(), this, zone, fields, |
537 cache->objects().front()->IsInitialized()); | 544 cache->objects().front()->IsInitialized()); |
538 SetVirtualObject(alias, obj); | 545 SetVirtualObject(alias, obj); |
539 mergeObject = obj; | 546 mergeObject = obj; |
540 changed = true; | 547 changed = true; |
541 } else if (copy_merge_object) { | 548 } else if (copy_merge_object) { |
(...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1729 } | 1736 } |
1730 } | 1737 } |
1731 return false; | 1738 return false; |
1732 } | 1739 } |
1733 | 1740 |
1734 Graph* EscapeAnalysis::graph() const { return status_analysis_->graph(); } | 1741 Graph* EscapeAnalysis::graph() const { return status_analysis_->graph(); } |
1735 | 1742 |
1736 } // namespace compiler | 1743 } // namespace compiler |
1737 } // namespace internal | 1744 } // namespace internal |
1738 } // namespace v8 | 1745 } // namespace v8 |
OLD | NEW |