Index: src/compiler/escape-analysis.cc |
diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc |
index 273aca1ecd963813cfdfd1c2688ed14a35b34288..b46efdf0772ab7251db4119cd0b4f64fa3db0c14 100644 |
--- a/src/compiler/escape-analysis.cc |
+++ b/src/compiler/escape-analysis.cc |
@@ -200,7 +200,7 @@ class VirtualObject : public ZoneObject { |
return true; |
} |
bool UpdateFrom(const VirtualObject& other); |
- bool MergeFrom(MergeCache* cache, Node* at, Graph* graph, |
+ bool MergeFrom(MergeCache* cache, Zone* zone, Node* at, Graph* graph, |
CommonOperatorBuilder* common); |
void SetObjectState(Node* node) { object_state_ = node; } |
Node* GetObjectState() const { return object_state_; } |
@@ -217,8 +217,8 @@ class VirtualObject : public ZoneObject { |
void id(NodeId id) { id_ = id; } |
private: |
- bool MergeFields(size_t i, Node* at, MergeCache* cache, Graph* graph, |
- CommonOperatorBuilder* common); |
+ bool MergeFields(size_t i, Zone* zone, Node* at, MergeCache* cache, |
+ Graph* graph, CommonOperatorBuilder* common); |
NodeId id_; |
StatusFlags status_; |
@@ -432,10 +432,23 @@ bool IsEquivalentPhi(Node* phi, ZoneVector<Node*>& inputs) { |
return true; |
} |
+Type* GetTypeForPhi(Node* phi, Zone* zone) { |
+ int arity = phi->op()->ValueInputCount(); |
+ Type* type = Type::None(); |
+ for (int i = 1; i < arity; ++i) { |
+ Node* inner_node = NodeProperties::GetValueInput(phi, i); |
+ Type* inner_type = NodeProperties::IsTyped(inner_node) |
+ ? NodeProperties::GetType(inner_node) |
+ : Type::None(); |
+ type = Type::Union(type, inner_type, zone); |
+ } |
+ return type; |
+} |
} // namespace |
-bool VirtualObject::MergeFields(size_t i, Node* at, MergeCache* cache, |
- Graph* graph, CommonOperatorBuilder* common) { |
+bool VirtualObject::MergeFields(size_t i, Zone* zone, Node* at, |
+ MergeCache* cache, Graph* graph, |
+ CommonOperatorBuilder* common) { |
bool changed = false; |
int value_input_count = static_cast<int>(cache->fields().size()); |
Node* rep = GetField(i); |
@@ -446,6 +459,8 @@ bool VirtualObject::MergeFields(size_t i, Node* at, MergeCache* cache, |
common->Phi(MachineRepresentation::kTagged, value_input_count), |
value_input_count + 1, &cache->fields().front()); |
SetField(i, phi, true); |
+ NodeProperties::SetType(phi, GetTypeForPhi(phi, zone)); |
+ |
#ifdef DEBUG |
if (FLAG_trace_turbo_escape) { |
PrintF(" Creating Phi #%d as merge of", phi->id()); |
@@ -470,8 +485,8 @@ bool VirtualObject::MergeFields(size_t i, Node* at, MergeCache* cache, |
return changed; |
} |
-bool VirtualObject::MergeFrom(MergeCache* cache, Node* at, Graph* graph, |
- CommonOperatorBuilder* common) { |
+bool VirtualObject::MergeFrom(MergeCache* cache, Zone* zone, Node* at, |
+ Graph* graph, CommonOperatorBuilder* common) { |
DCHECK(at->opcode() == IrOpcode::kEffectPhi || |
at->opcode() == IrOpcode::kPhi); |
bool changed = false; |
@@ -487,7 +502,7 @@ bool VirtualObject::MergeFrom(MergeCache* cache, Node* at, Graph* graph, |
: at->op()->ValueInputCount(); |
if (cache->fields().size() == arity && |
(GetField(i) || !IsCreatedPhi(i))) { |
- changed = MergeFields(i, at, cache, graph, common) || changed; |
+ changed = MergeFields(i, zone, at, cache, graph, common) || changed; |
} else { |
if (GetField(i) != nullptr) { |
TRACE(" Field %zu cleared\n", i); |
@@ -544,7 +559,8 @@ bool VirtualState::MergeFrom(MergeCache* cache, Zone* zone, Graph* graph, |
PrintF("\n"); |
} |
#endif // DEBUG |
- changed = mergeObject->MergeFrom(cache, at, graph, common) || changed; |
+ changed = |
+ mergeObject->MergeFrom(cache, zone, at, graph, common) || changed; |
} else { |
if (mergeObject) { |
TRACE(" Alias %d, virtual object removed\n", alias); |
@@ -866,7 +882,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() {} |
@@ -1403,6 +1423,7 @@ void EscapeAnalysis::ProcessLoadFromPhi(int offset, Node* from, Node* load, |
Node* phi = graph()->NewNode( |
common()->Phi(MachineRepresentation::kTagged, value_input_count), |
value_input_count + 1, &cache_->fields().front()); |
+ NodeProperties::SetType(phi, GetTypeForPhi(phi, zone())); |
status_analysis_->ResizeStatusVector(); |
SetReplacement(load, phi); |
TRACE(" got phi created.\n"); |
@@ -1596,6 +1617,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::Internal()); |
vobj->SetObjectState(new_object_state); |
TRACE( |
"Creating object state #%d for vobj %p (from node #%d) at effect " |