5 #ifndef V8_COMPILER_ESCAPE_ANALYSIS_H_ 6 #define V8_COMPILER_ESCAPE_ANALYSIS_H_ 8 #include "src/base/functional.h" 9 #include "src/compiler/graph-reducer.h" 10 #include "src/compiler/js-graph.h" 11 #include "src/compiler/persistent-map.h" 12 #include "src/globals.h" 13 #include "src/objects/name.h" 19 class CommonOperatorBuilder;
20 class VariableTracker;
21 class EscapeAnalysisTracker;
30 bool value_changed()
const {
return value_changed_; }
31 void set_value_changed() { value_changed_ =
true; }
32 bool effect_changed()
const {
return effect_changed_; }
33 void set_effect_changed() { effect_changed_ =
true; }
36 bool value_changed_ =
false;
37 bool effect_changed_ =
false;
43 void ReduceGraph() { ReduceFrom(graph_->end()); }
46 void Revisit(
Node* node);
51 void AddRoot(
Node* node) {
52 DCHECK_EQ(State::kUnvisited, state_.Get(node));
53 state_.Set(node, State::kRevisit);
57 bool Complete() {
return stack_.empty() && revisit_.empty(); }
64 void ReduceFrom(Node* node);
65 enum class State : uint8_t { kUnvisited = 0, kRevisit, kOnStack, kVisited };
66 const uint8_t kNumStates =
static_cast<uint8_t
>(State::kVisited) + 1;
68 NodeMarker<State> state_;
69 ZoneStack<Node*> revisit_;
70 ZoneStack<NodeState> stack_;
71 std::function<void(Node*, Reduction*)> reduce_;
79 bool operator==(
Variable other)
const {
return id_ == other.id_; }
80 bool operator!=(
Variable other)
const {
return id_ != other.id_; }
81 bool operator<(
Variable other)
const {
return id_ < other.id_; }
83 friend V8_INLINE
size_t hash_value(
Variable v) {
84 return base::hash_value(v.id_);
86 friend std::ostream& operator<<(std::ostream& os,
Variable var) {
94 static const Id kInvalid = -1;
104 void AddDependency(
Node* node) { dependants_.push_back(node); }
106 for (
Node* node : dependants_) {
107 reducer->Revisit(node);
124 CHECK_EQ(0, offset % kPointerSize);
125 CHECK(!HasEscaped());
126 if (offset >= size()) {
131 return Nothing<Variable>();
133 return Just(fields_.at(offset / kPointerSize));
135 Id id()
const {
return id_; }
136 int size()
const {
return static_cast<int>(kPointerSize * fields_.size()); }
139 void SetEscaped() { escaped_ =
true; }
140 bool HasEscaped()
const {
return escaped_; }
141 const_iterator begin()
const {
return fields_.begin(); }
142 const_iterator end()
const {
return fields_.end(); }
145 bool escaped_ =
false;
153 : tracker_(tracker) {}
165 :
public NON_EXPORTED_BASE(EffectGraphReducer) {
176 JSGraph* jsgraph() {
return jsgraph_; }
177 Isolate* isolate()
const {
return jsgraph_->isolate(); }
186 #endif // V8_COMPILER_ESCAPE_ANALYSIS_H_