Index: src/compiler/escape-analysis.h |
diff --git a/src/compiler/escape-analysis.h b/src/compiler/escape-analysis.h |
index b2ecb3f68b6d8fb29cc196f0f27c38296cb5cedc..ea7b11ecdf00d3ffe8d01638a3774c67f6acb065 100644 |
--- a/src/compiler/escape-analysis.h |
+++ b/src/compiler/escape-analysis.h |
@@ -26,10 +26,12 @@ class EscapeStatusAnalysis { |
enum EscapeStatusFlag { |
kUnknown = 0u, |
- kVirtual = 1u << 0, |
+ kTracked = 1u << 0, |
kEscaped = 1u << 1, |
+ kOnStack = 1u << 2, |
+ kVisited = 1u << 3, |
}; |
- typedef base::Flags<EscapeStatusFlag> EscapeStatusFlags; |
+ typedef base::Flags<EscapeStatusFlag, unsigned char> EscapeStatusFlags; |
void Run(); |
@@ -67,7 +69,7 @@ class EscapeStatusAnalysis { |
EscapeAnalysis* object_analysis_; |
Graph* const graph_; |
Zone* const zone_; |
- ZoneVector<EscapeStatusFlags> info_; |
+ ZoneVector<EscapeStatusFlags> status_; |
ZoneDeque<Node*> queue_; |
DISALLOW_COPY_AND_ASSIGN(EscapeStatusAnalysis); |
@@ -85,6 +87,8 @@ class MergeCache; |
// an object is virtual and eliminated. |
class EscapeAnalysis { |
public: |
+ typedef NodeId Alias; |
+ |
EscapeAnalysis(Graph* graph, CommonOperatorBuilder* common, Zone* zone); |
~EscapeAnalysis(); |
@@ -98,6 +102,7 @@ class EscapeAnalysis { |
private: |
void RunObjectAnalysis(); |
+ void AssignAliases(); |
bool Process(Node* node); |
void ProcessLoadField(Node* node); |
void ProcessStoreField(Node* node); |
@@ -129,14 +134,21 @@ class EscapeAnalysis { |
bool SetReplacement(Node* node, Node* rep); |
bool UpdateReplacement(VirtualState* state, Node* node, Node* rep); |
+ VirtualObject* GetVirtualObject(VirtualState* state, Node* node); |
+ |
void DebugPrint(); |
void DebugPrintState(VirtualState* state); |
- void DebugPrintObject(VirtualObject* state, NodeId id); |
+ void DebugPrintObject(VirtualObject* state, Alias id); |
+ |
+ Alias NextAlias() { return next_free_alias_++; } |
+ Alias AliasCount() const { return next_free_alias_; } |
Graph* graph() const { return graph_; } |
CommonOperatorBuilder* common() const { return common_; } |
Zone* zone() const { return zone_; } |
+ static const Alias kNotReachable; |
+ static const Alias kUntrackable; |
Graph* const graph_; |
CommonOperatorBuilder* const common_; |
Zone* const zone_; |
@@ -144,6 +156,8 @@ class EscapeAnalysis { |
ZoneVector<Node*> replacements_; |
EscapeStatusAnalysis escape_status_; |
MergeCache* cache_; |
+ ZoneVector<Alias> aliases_; |
+ Alias next_free_alias_; |
DISALLOW_COPY_AND_ASSIGN(EscapeAnalysis); |
}; |