Index: src/compiler/escape-analysis.h |
diff --git a/src/compiler/escape-analysis.h b/src/compiler/escape-analysis.h |
index 44efd6369bad6a9272b4289b488657e38b8a67c1..38cecd233972810ccd3b708c6b03dea2b02ebe49 100644 |
--- a/src/compiler/escape-analysis.h |
+++ b/src/compiler/escape-analysis.h |
@@ -20,16 +20,25 @@ class VirtualObject : public ZoneObject { |
public: |
enum Status { kUntracked = 0, kTracked = 1 }; |
VirtualObject(NodeId id, Zone* zone) |
- : id_(id), status_(kUntracked), fields_(zone), replacement_(nullptr) {} |
+ : id_(id), |
+ status_(kUntracked), |
+ fields_(zone), |
+ replacement_(nullptr), |
+ object_state_(nullptr) {} |
VirtualObject(const VirtualObject& other) |
: id_(other.id_), |
status_(other.status_), |
fields_(other.fields_), |
- replacement_(other.replacement_) {} |
+ replacement_(other.replacement_), |
+ object_state_(other.object_state_) {} |
VirtualObject(NodeId id, Zone* zone, size_t field_number) |
Jarin
2015/12/02 12:24:34
does field_number mean field_count here?
sigurds
2015/12/02 16:35:12
Yes.
|
- : id_(id), status_(kTracked), fields_(zone), replacement_(nullptr) { |
+ : id_(id), |
+ status_(kTracked), |
+ fields_(zone), |
+ replacement_(nullptr), |
+ object_state_(nullptr) { |
fields_.resize(field_number); |
} |
@@ -54,6 +63,7 @@ class VirtualObject : public ZoneObject { |
return changed; |
} |
+ Node** fields_array() { return &fields_.front(); } |
size_t fields() { return fields_.size(); } |
Jarin
2015/12/02 12:24:34
fields -> field_count?
sigurds
2015/12/02 16:35:12
Changed.
|
bool ResizeFields(size_t field_number) { |
if (field_number != fields_.size()) { |
@@ -62,7 +72,8 @@ class VirtualObject : public ZoneObject { |
} |
return false; |
} |
- |
+ void SetObjectState(Node* node) { object_state_ = node; } |
+ Node* GetObjectState() { return object_state_; } |
bool UpdateFrom(const VirtualObject& other); |
NodeId id() { return id_; } |
@@ -73,6 +84,7 @@ class VirtualObject : public ZoneObject { |
Status status_; |
ZoneVector<Node*> fields_; |
Node* replacement_; |
+ Node* object_state_; |
}; |
@@ -164,6 +176,8 @@ class EscapeObjectAnalysis { |
void Run(); |
Node* GetReplacement(Node* at, NodeId id); |
+ VirtualObject* GetVirtualObject(Node* at, NodeId id); |
+ Node* GetEffect(Node* node); |
private: |
bool Process(Node* node); |
@@ -175,10 +189,13 @@ class EscapeObjectAnalysis { |
void ProcessStart(Node* node); |
bool ProcessEffectPhi(Node* node); |
void ForwardVirtualState(Node* node); |
+ void ProcessFrameState(Node* node); |
bool IsEffectBranchPoint(Node* node); |
bool IsDanglingEffectNode(Node* node); |
int OffsetFromAccess(Node* node); |
+ void RecordEffectForFrameStateUses(Node* node, Node* effect); |
+ |
void DebugPrint(); |
Graph* graph() const { return graph_; } |
@@ -189,6 +206,7 @@ class EscapeObjectAnalysis { |
CommonOperatorBuilder* const common_; |
Zone* const zone_; |
ZoneVector<VirtualState*> virtual_states_; |
+ ZoneVector<Node*> effects_; |
DISALLOW_COPY_AND_ASSIGN(EscapeObjectAnalysis); |
}; |