Index: src/compiler/escape-analysis.cc |
diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc |
index ebeae3218109786c139b0e31a555d2ce7afce0df..1575d5ae217dc716044995e95535d42fc032d982 100644 |
--- a/src/compiler/escape-analysis.cc |
+++ b/src/compiler/escape-analysis.cc |
@@ -390,17 +390,16 @@ bool VirtualState::MergeFrom(MergeCache* cache, Zone* zone, Graph* graph, |
graph->NewNode(common->Phi(MachineRepresentation::kTagged, 2), |
static_cast<int>(cache->fields().size()), |
&cache->fields().front()); |
- if (mergeObject->SetField(i, phi, true)) { |
- if (FLAG_trace_turbo_escape) { |
- PrintF(" Creating Phi #%d as merge of", phi->id()); |
- for (size_t i = 0; i + 1 < cache->fields().size(); i++) { |
- PrintF(" #%d (%s)", cache->fields()[i]->id(), |
- cache->fields()[i]->op()->mnemonic()); |
- } |
- PrintF("\n"); |
+ mergeObject->SetField(i, phi, true); |
+ if (FLAG_trace_turbo_escape) { |
+ PrintF(" Creating Phi #%d as merge of", phi->id()); |
+ for (size_t i = 0; i + 1 < cache->fields().size(); i++) { |
+ PrintF(" #%d (%s)", cache->fields()[i]->id(), |
+ cache->fields()[i]->op()->mnemonic()); |
} |
- changed = true; |
+ PrintF("\n"); |
} |
+ changed = true; |
} else { |
DCHECK(rep->opcode() == IrOpcode::kPhi); |
for (size_t n = 0; n < cache->fields().size(); ++n) { |
@@ -444,10 +443,8 @@ EscapeStatusAnalysis::EscapeStatusAnalysis(EscapeAnalysis* object_analysis, |
: object_analysis_(object_analysis), |
graph_(graph), |
zone_(zone), |
- info_(zone), |
- queue_(zone) { |
- info_.resize(graph->NodeCount()); |
-} |
+ info_(graph->NodeCount(), kUnknown, zone), |
+ queue_(zone) {} |
EscapeStatusAnalysis::~EscapeStatusAnalysis() {} |
@@ -459,9 +456,6 @@ bool EscapeStatusAnalysis::HasEntry(Node* node) { |
bool EscapeStatusAnalysis::IsVirtual(Node* node) { |
- if (node->id() >= info_.size()) { |
- return false; |
- } |
return info_[node->id()] == kVirtual; |
} |
@@ -484,8 +478,16 @@ bool EscapeStatusAnalysis::SetEscaped(Node* node) { |
} |
+void EscapeStatusAnalysis::Resize() { |
+ info_.resize(graph()->NodeCount(), kUnknown); |
+} |
+ |
+ |
+size_t EscapeStatusAnalysis::size() { return info_.size(); } |
+ |
+ |
void EscapeStatusAnalysis::Run() { |
- info_.resize(graph()->NodeCount()); |
+ Resize(); |
ZoneVector<bool> visited(zone()); |
visited.resize(graph()->NodeCount()); |
queue_.push_back(graph()->end()); |
@@ -967,6 +969,7 @@ bool EscapeAnalysis::ProcessEffectPhi(Node* node) { |
if (changed) { |
mergeState->LastChangedAt(node); |
+ escape_status_.Resize(); |
} |
return changed; |
} |
@@ -1072,11 +1075,17 @@ Node* EscapeAnalysis::GetReplacement(NodeId id) { |
bool EscapeAnalysis::IsVirtual(Node* node) { |
+ if (node->id() >= escape_status_.size()) { |
+ return false; |
+ } |
return escape_status_.IsVirtual(node); |
} |
bool EscapeAnalysis::IsEscaped(Node* node) { |
+ if (node->id() >= escape_status_.size()) { |
+ return false; |
+ } |
return escape_status_.IsEscaped(node); |
} |
@@ -1133,6 +1142,7 @@ void EscapeAnalysis::ProcessLoadFromPhi(int offset, Node* from, Node* node, |
Node* phi = graph()->NewNode( |
common()->Phi(MachineRepresentation::kTagged, 2), |
static_cast<int>(cache_.fields().size()), &cache_.fields().front()); |
+ escape_status_.Resize(); |
SetReplacement(node, phi); |
state->LastChangedAt(node); |
if (FLAG_trace_turbo_escape) { |