Index: src/compiler/escape-analysis.cc |
diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc |
index 273aca1ecd963813cfdfd1c2688ed14a35b34288..164af69c90d0460c86bfc85bf96d1e0b434b4152 100644 |
--- a/src/compiler/escape-analysis.cc |
+++ b/src/compiler/escape-analysis.cc |
@@ -431,7 +431,6 @@ bool IsEquivalentPhi(Node* phi, ZoneVector<Node*>& inputs) { |
} |
return true; |
} |
- |
} // namespace |
bool VirtualObject::MergeFields(size_t i, Node* at, MergeCache* cache, |
@@ -440,12 +439,21 @@ bool VirtualObject::MergeFields(size_t i, Node* at, MergeCache* cache, |
int value_input_count = static_cast<int>(cache->fields().size()); |
Node* rep = GetField(i); |
if (!rep || !IsCreatedPhi(i)) { |
+ Type* phi_type = Type::None(); |
+ for (Node* input : cache->fields()) { |
+ CHECK_NOT_NULL(input); |
+ CHECK(!input->IsDead()); |
+ Type* input_type = NodeProperties::GetType(input); |
+ phi_type = Type::Union(phi_type, input_type, graph->zone()); |
+ } |
Node* control = NodeProperties::GetControlInput(at); |
cache->fields().push_back(control); |
Node* phi = graph->NewNode( |
common->Phi(MachineRepresentation::kTagged, value_input_count), |
value_input_count + 1, &cache->fields().front()); |
+ NodeProperties::SetType(phi, phi_type); |
SetField(i, phi, true); |
+ |
#ifdef DEBUG |
if (FLAG_trace_turbo_escape) { |
PrintF(" Creating Phi #%d as merge of", phi->id()); |
@@ -866,7 +874,11 @@ EscapeAnalysis::EscapeAnalysis(Graph* graph, CommonOperatorBuilder* common, |
virtual_states_(zone), |
replacements_(zone), |
cycle_detection_(zone), |
- cache_(nullptr) {} |
+ cache_(nullptr) { |
+ // Type slot_not_analyzed_ manually. |
+ double v = OpParameter<double>(slot_not_analyzed_); |
+ NodeProperties::SetType(slot_not_analyzed_, Type::Range(v, v, zone)); |
+} |
EscapeAnalysis::~EscapeAnalysis() {} |
@@ -1399,10 +1411,16 @@ void EscapeAnalysis::ProcessLoadFromPhi(int offset, Node* from, Node* load, |
Node* rep = replacement(load); |
if (!rep || !IsEquivalentPhi(rep, cache_->fields())) { |
int value_input_count = static_cast<int>(cache_->fields().size()); |
+ Type* phi_type = Type::None(); |
+ for (Node* input : cache_->fields()) { |
+ Type* input_type = NodeProperties::GetType(input); |
+ phi_type = Type::Union(phi_type, input_type, graph()->zone()); |
+ } |
cache_->fields().push_back(NodeProperties::GetControlInput(from)); |
Node* phi = graph()->NewNode( |
common()->Phi(MachineRepresentation::kTagged, value_input_count), |
value_input_count + 1, &cache_->fields().front()); |
+ NodeProperties::SetType(phi, phi_type); |
status_analysis_->ResizeStatusVector(); |
SetReplacement(load, phi); |
TRACE(" got phi created.\n"); |
@@ -1596,6 +1614,7 @@ Node* EscapeAnalysis::GetOrCreateObjectState(Node* effect, Node* node) { |
Node* new_object_state = |
graph()->NewNode(common()->ObjectState(input_count), input_count, |
&cache_->fields().front()); |
+ NodeProperties::SetType(new_object_state, Type::OtherInternal()); |
vobj->SetObjectState(new_object_state); |
TRACE( |
"Creating object state #%d for vobj %p (from node #%d) at effect " |