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