1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_COMPILER_ESCAPE_ANALYSIS_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_COMPILER_ESCAPE_ANALYSIS_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/graph.h"
9c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/globals.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Forward declarations.
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CommonOperatorBuilder;
17bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass EscapeStatusAnalysis;
18bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass MergeCache;
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass VirtualState;
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass VirtualObject;
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// EscapeObjectAnalysis simulates stores to determine values of loads if
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// an object is virtual and eliminated.
24c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE EscapeAnalysis {
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EscapeAnalysis(Graph* graph, CommonOperatorBuilder* common, Zone* zone);
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ~EscapeAnalysis();
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool Run();
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetReplacement(Node* node);
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* ResolveReplacement(Node* node);
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsVirtual(Node* node);
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsEscaped(Node* node);
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool CompareVirtualObjects(Node* left, Node* right);
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetOrCreateObjectState(Node* effect, Node* node);
37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool IsCyclicObjectState(Node* effect, Node* node);
38109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool ExistsVirtualAllocate();
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool SetReplacement(Node* node, Node* rep);
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void RunObjectAnalysis();
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool Process(Node* node);
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessLoadField(Node* node);
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessStoreField(Node* node);
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessLoadElement(Node* node);
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessStoreElement(Node* node);
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessAllocationUsers(Node* node);
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessAllocation(Node* node);
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessFinishRegion(Node* node);
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessCall(Node* node);
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessStart(Node* node);
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ProcessEffectPhi(Node* node);
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ProcessLoadFromPhi(int offset, Node* from, Node* node,
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          VirtualState* states);
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ForwardVirtualState(Node* node);
58109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  VirtualState* CopyForModificationAt(VirtualState* state, Node* node);
59109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  VirtualObject* CopyForModificationAt(VirtualObject* obj, VirtualState* state,
60109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                       Node* node);
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* replacement(Node* node);
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool UpdateReplacement(VirtualState* state, Node* node, Node* rep);
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VirtualObject* GetVirtualObject(VirtualState* state, Node* node);
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DebugPrint();
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DebugPrintState(VirtualState* state);
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
70bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Graph* graph() const;
71bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Zone* zone() const { return zone_; }
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CommonOperatorBuilder* common() const { return common_; }
73bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
74bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Zone* const zone_;
7513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Node* const slot_not_analyzed_;
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CommonOperatorBuilder* const common_;
77bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EscapeStatusAnalysis* status_analysis_;
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<VirtualState*> virtual_states_;
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<Node*> replacements_;
80f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ZoneSet<VirtualObject*> cycle_detection_;
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MergeCache* cache_;
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(EscapeAnalysis);
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_COMPILER_ESCAPE_ANALYSIS_H_
91