Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: src/compiler/escape-analysis.cc

Issue 2610703002: [turbofan] second attempt to fix second divergence in escape analysis (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 bool AllFieldsClear() { 194 bool AllFieldsClear() {
195 for (size_t i = 0; i < fields_.size(); ++i) { 195 for (size_t i = 0; i < fields_.size(); ++i) {
196 if (fields_[i] != nullptr) { 196 if (fields_[i] != nullptr) {
197 return false; 197 return false;
198 } 198 }
199 } 199 }
200 return true; 200 return true;
201 } 201 }
202 bool UpdateFrom(const VirtualObject& other); 202 bool UpdateFrom(const VirtualObject& other);
203 bool MergeFrom(MergeCache* cache, Node* at, Graph* graph, 203 bool MergeFrom(MergeCache* cache, Node* at, Graph* graph,
204 CommonOperatorBuilder* common); 204 CommonOperatorBuilder* common, bool initialMerge);
205 void SetObjectState(Node* node) { object_state_ = node; } 205 void SetObjectState(Node* node) { object_state_ = node; }
206 Node* GetObjectState() const { return object_state_; } 206 Node* GetObjectState() const { return object_state_; }
207 bool IsCopyRequired() const { return status_ & kCopyRequired; } 207 bool IsCopyRequired() const { return status_ & kCopyRequired; }
208 void SetCopyRequired() { status_ |= kCopyRequired; } 208 void SetCopyRequired() { status_ |= kCopyRequired; }
209 bool NeedCopyForModification() { 209 bool NeedCopyForModification() {
210 if (!IsCopyRequired() || !IsInitialized()) { 210 if (!IsCopyRequired() || !IsInitialized()) {
211 return false; 211 return false;
212 } 212 }
213 return true; 213 return true;
214 } 214 }
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 if (old != cache->fields()[n]) { 472 if (old != cache->fields()[n]) {
473 changed = true; 473 changed = true;
474 NodeProperties::ReplaceValueInput(rep, cache->fields()[n], n); 474 NodeProperties::ReplaceValueInput(rep, cache->fields()[n], n);
475 } 475 }
476 } 476 }
477 } 477 }
478 return changed; 478 return changed;
479 } 479 }
480 480
481 bool VirtualObject::MergeFrom(MergeCache* cache, Node* at, Graph* graph, 481 bool VirtualObject::MergeFrom(MergeCache* cache, Node* at, Graph* graph,
482 CommonOperatorBuilder* common) { 482 CommonOperatorBuilder* common,
483 bool initialMerge) {
483 DCHECK(at->opcode() == IrOpcode::kEffectPhi || 484 DCHECK(at->opcode() == IrOpcode::kEffectPhi ||
484 at->opcode() == IrOpcode::kPhi); 485 at->opcode() == IrOpcode::kPhi);
485 bool changed = false; 486 bool changed = false;
486 for (size_t i = 0; i < field_count(); ++i) { 487 for (size_t i = 0; i < field_count(); ++i) {
488 if (!initialMerge && GetField(i) == nullptr) continue;
487 Node* field = cache->GetFields(i); 489 Node* field = cache->GetFields(i);
488 if (field && !IsCreatedPhi(i)) { 490 if (field && !IsCreatedPhi(i)) {
489 changed = changed || GetField(i) != field; 491 changed = changed || GetField(i) != field;
490 SetField(i, field); 492 SetField(i, field);
491 TRACE(" Field %zu agree on rep #%d\n", i, field->id()); 493 TRACE(" Field %zu agree on rep #%d\n", i, field->id());
492 } else { 494 } else {
493 size_t arity = at->opcode() == IrOpcode::kEffectPhi 495 size_t arity = at->opcode() == IrOpcode::kEffectPhi
494 ? at->op()->EffectInputCount() 496 ? at->op()->EffectInputCount()
495 : at->op()->ValueInputCount(); 497 : at->op()->ValueInputCount();
496 if (cache->fields().size() == arity) { 498 if (cache->fields().size() == arity) {
(...skipping 22 matching lines...) Expand all
519 for (VirtualState* state : cache->states()) { 521 for (VirtualState* state : cache->states()) {
520 if (VirtualObject* obj = state->VirtualObjectFromAlias(alias)) { 522 if (VirtualObject* obj = state->VirtualObjectFromAlias(alias)) {
521 cache->objects().push_back(obj); 523 cache->objects().push_back(obj);
522 if (mergeObject == obj) { 524 if (mergeObject == obj) {
523 copy_merge_object = true; 525 copy_merge_object = true;
524 } 526 }
525 fields = std::min(obj->field_count(), fields); 527 fields = std::min(obj->field_count(), fields);
526 } 528 }
527 } 529 }
528 if (cache->objects().size() == cache->states().size()) { 530 if (cache->objects().size() == cache->states().size()) {
531 bool initialMerge = false;
529 if (!mergeObject) { 532 if (!mergeObject) {
533 initialMerge = true;
530 VirtualObject* obj = new (zone) 534 VirtualObject* obj = new (zone)
531 VirtualObject(cache->objects().front()->id(), this, zone, fields, 535 VirtualObject(cache->objects().front()->id(), this, zone, fields,
532 cache->objects().front()->IsInitialized()); 536 cache->objects().front()->IsInitialized());
533 SetVirtualObject(alias, obj); 537 SetVirtualObject(alias, obj);
534 mergeObject = obj; 538 mergeObject = obj;
535 changed = true; 539 changed = true;
536 } else if (copy_merge_object) { 540 } else if (copy_merge_object) {
537 VirtualObject* obj = new (zone) VirtualObject(this, *mergeObject); 541 VirtualObject* obj = new (zone) VirtualObject(this, *mergeObject);
538 SetVirtualObject(alias, obj); 542 SetVirtualObject(alias, obj);
539 mergeObject = obj; 543 mergeObject = obj;
540 changed = true; 544 changed = true;
541 } else { 545 } else {
542 changed = mergeObject->ResizeFields(fields) || changed; 546 changed = mergeObject->ResizeFields(fields) || changed;
543 } 547 }
544 #ifdef DEBUG 548 #ifdef DEBUG
545 if (FLAG_trace_turbo_escape) { 549 if (FLAG_trace_turbo_escape) {
546 PrintF(" Alias @%d, merging into %p virtual objects", alias, 550 PrintF(" Alias @%d, merging into %p virtual objects", alias,
547 static_cast<void*>(mergeObject)); 551 static_cast<void*>(mergeObject));
548 for (size_t i = 0; i < cache->objects().size(); i++) { 552 for (size_t i = 0; i < cache->objects().size(); i++) {
549 PrintF(" %p", static_cast<void*>(cache->objects()[i])); 553 PrintF(" %p", static_cast<void*>(cache->objects()[i]));
550 } 554 }
551 PrintF("\n"); 555 PrintF("\n");
552 } 556 }
553 #endif // DEBUG 557 #endif // DEBUG
554 changed = mergeObject->MergeFrom(cache, at, graph, common) || changed; 558 changed =
559 mergeObject->MergeFrom(cache, at, graph, common, initialMerge) ||
560 changed;
555 } else { 561 } else {
556 if (mergeObject) { 562 if (mergeObject) {
557 TRACE(" Alias %d, virtual object removed\n", alias); 563 TRACE(" Alias %d, virtual object removed\n", alias);
558 changed = true; 564 changed = true;
559 } 565 }
560 SetVirtualObject(alias, nullptr); 566 SetVirtualObject(alias, nullptr);
561 } 567 }
562 } 568 }
563 return changed; 569 return changed;
564 } 570 }
(...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1706 } 1712 }
1707 } 1713 }
1708 return false; 1714 return false;
1709 } 1715 }
1710 1716
1711 Graph* EscapeAnalysis::graph() const { return status_analysis_->graph(); } 1717 Graph* EscapeAnalysis::graph() const { return status_analysis_->graph(); }
1712 1718
1713 } // namespace compiler 1719 } // namespace compiler
1714 } // namespace internal 1720 } // namespace internal
1715 } // namespace v8 1721 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698