V8 Project
v8::internal::HEscapeAnalysisPhase Class Reference

#include <hydrogen-escape-analysis.h>

+ Inheritance diagram for v8::internal::HEscapeAnalysisPhase:
+ Collaboration diagram for v8::internal::HEscapeAnalysisPhase:

Public Member Functions

 HEscapeAnalysisPhase (HGraph *graph)
 
void Run ()
 
- Public Member Functions inherited from v8::internal::HPhase
 HPhase (const char *name, HGraph *graph)
 
 ~HPhase ()
 

Private Member Functions

void CollectCapturedValues ()
 
bool HasNoEscapingUses (HValue *value, int size)
 
void PerformScalarReplacement ()
 
void AnalyzeDataFlow (HInstruction *instr)
 
HCapturedObject * NewState (HInstruction *prev)
 
HCapturedObject * NewStateForAllocation (HInstruction *prev)
 
HCapturedObject * NewStateForLoopHeader (HInstruction *prev, HCapturedObject *)
 
HCapturedObject * NewStateCopy (HInstruction *prev, HCapturedObject *state)
 
HPhi * NewPhiAndInsert (HBasicBlock *block, HValue *incoming_value, int index)
 
HValueNewMapCheckAndInsert (HCapturedObject *state, HCheckMaps *mapcheck)
 
HValueNewLoadReplacement (HLoadNamedField *load, HValue *load_value)
 
HCapturedObject * StateAt (HBasicBlock *block)
 
void SetStateAt (HBasicBlock *block, HCapturedObject *state)
 

Private Attributes

ZoneList< HInstruction * > captured_
 
int number_of_objects_
 
int number_of_values_
 
int cumulative_values_
 
ZoneList< HCapturedObject * > block_states_
 

Additional Inherited Members

- Protected Member Functions inherited from v8::internal::HPhase
HGraph * graph () const
 

Detailed Description

Definition at line 15 of file hydrogen-escape-analysis.h.

Constructor & Destructor Documentation

◆ HEscapeAnalysisPhase()

v8::internal::HEscapeAnalysisPhase::HEscapeAnalysisPhase ( HGraph *  graph)
inlineexplicit

Definition at line 17 of file hydrogen-escape-analysis.h.

18  : HPhase("H_Escape analysis", graph),
19  captured_(0, zone()),
23  block_states_(graph->blocks()->length(), zone()) { }
ZoneList< HCapturedObject * > block_states_
HGraph * graph() const
Definition: hydrogen.h:2802
HPhase(const char *name, HGraph *graph)
Definition: hydrogen.h:2796

Member Function Documentation

◆ AnalyzeDataFlow()

void v8::internal::HEscapeAnalysisPhase::AnalyzeDataFlow ( HInstruction instr)
private

Definition at line 162 of file hydrogen-escape-analysis.cc.

162  {
163  HBasicBlock* allocate_block = allocate->block();
164  block_states_.AddBlock(NULL, graph()->blocks()->length(), zone());
165 
166  // Iterate all blocks starting with the allocation block, since the
167  // allocation cannot dominate blocks that come before.
168  int start = allocate_block->block_id();
169  for (int i = start; i < graph()->blocks()->length(); i++) {
170  HBasicBlock* block = graph()->blocks()->at(i);
171  HCapturedObject* state = StateAt(block);
172 
173  // Skip blocks that are not dominated by the captured allocation.
174  if (!allocate_block->Dominates(block) && allocate_block != block) continue;
175  if (FLAG_trace_escape_analysis) {
176  PrintF("Analyzing data-flow in B%d\n", block->block_id());
177  }
178 
179  // Go through all instructions of the current block.
180  for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
181  HInstruction* instr = it.Current();
182  switch (instr->opcode()) {
183  case HValue::kAllocate: {
184  if (instr != allocate) continue;
185  state = NewStateForAllocation(allocate);
186  break;
187  }
188  case HValue::kLoadNamedField: {
189  HLoadNamedField* load = HLoadNamedField::cast(instr);
190  int index = load->access().offset() / kPointerSize;
191  if (load->object() != allocate) continue;
192  DCHECK(load->access().IsInobject());
193  HValue* replacement =
194  NewLoadReplacement(load, state->OperandAt(index));
195  load->DeleteAndReplaceWith(replacement);
196  if (FLAG_trace_escape_analysis) {
197  PrintF("Replacing load #%d with #%d (%s)\n", load->id(),
198  replacement->id(), replacement->Mnemonic());
199  }
200  break;
201  }
202  case HValue::kStoreNamedField: {
203  HStoreNamedField* store = HStoreNamedField::cast(instr);
204  int index = store->access().offset() / kPointerSize;
205  if (store->object() != allocate) continue;
206  DCHECK(store->access().IsInobject());
207  state = NewStateCopy(store->previous(), state);
208  state->SetOperandAt(index, store->value());
209  if (store->has_transition()) {
210  state->SetOperandAt(0, store->transition());
211  }
212  if (store->HasObservableSideEffects()) {
213  state->ReuseSideEffectsFromStore(store);
214  }
215  store->DeleteAndReplaceWith(store->ActualValue());
216  if (FLAG_trace_escape_analysis) {
217  PrintF("Replacing store #%d%s\n", instr->id(),
218  store->has_transition() ? " (with transition)" : "");
219  }
220  break;
221  }
222  case HValue::kArgumentsObject:
223  case HValue::kCapturedObject:
224  case HValue::kSimulate: {
225  for (int i = 0; i < instr->OperandCount(); i++) {
226  if (instr->OperandAt(i) != allocate) continue;
227  instr->SetOperandAt(i, state);
228  }
229  break;
230  }
231  case HValue::kCheckHeapObject: {
232  HCheckHeapObject* check = HCheckHeapObject::cast(instr);
233  if (check->value() != allocate) continue;
234  check->DeleteAndReplaceWith(check->ActualValue());
235  break;
236  }
237  case HValue::kCheckMaps: {
238  HCheckMaps* mapcheck = HCheckMaps::cast(instr);
239  if (mapcheck->value() != allocate) continue;
240  NewMapCheckAndInsert(state, mapcheck);
241  mapcheck->DeleteAndReplaceWith(mapcheck->ActualValue());
242  break;
243  }
244  default:
245  // Nothing to see here, move along ...
246  break;
247  }
248  }
249 
250  // Propagate the block state forward to all successor blocks.
251  for (int i = 0; i < block->end()->SuccessorCount(); i++) {
252  HBasicBlock* succ = block->end()->SuccessorAt(i);
253  if (!allocate_block->Dominates(succ)) continue;
254  if (succ->predecessors()->length() == 1) {
255  // Case 1: This is the only predecessor, just reuse state.
256  SetStateAt(succ, state);
257  } else if (StateAt(succ) == NULL && succ->IsLoopHeader()) {
258  // Case 2: This is a state that enters a loop header, be
259  // pessimistic about loop headers, add phis for all values.
260  SetStateAt(succ, NewStateForLoopHeader(succ->first(), state));
261  } else if (StateAt(succ) == NULL) {
262  // Case 3: This is the first state propagated forward to the
263  // successor, leave a copy of the current state.
264  SetStateAt(succ, NewStateCopy(succ->first(), state));
265  } else {
266  // Case 4: This is a state that needs merging with previously
267  // propagated states, potentially introducing new phis lazily or
268  // adding values to existing phis.
269  HCapturedObject* succ_state = StateAt(succ);
270  for (int index = 0; index < number_of_values_; index++) {
271  HValue* operand = state->OperandAt(index);
272  HValue* succ_operand = succ_state->OperandAt(index);
273  if (succ_operand->IsPhi() && succ_operand->block() == succ) {
274  // Phi already exists, add operand.
275  HPhi* phi = HPhi::cast(succ_operand);
276  phi->SetOperandAt(succ->PredecessorIndexOf(block), operand);
277  } else if (succ_operand != operand) {
278  // Phi does not exist, introduce one.
279  HPhi* phi = NewPhiAndInsert(succ, succ_operand, index);
280  phi->SetOperandAt(succ->PredecessorIndexOf(block), operand);
281  succ_state->SetOperandAt(index, phi);
282  }
283  }
284  }
285  }
286  }
287 
288  // All uses have been handled.
289  DCHECK(allocate->HasNoUses());
290  allocate->DeleteAndReplaceWith(NULL);
291 }
HCapturedObject * NewStateForAllocation(HInstruction *prev)
HValue * NewMapCheckAndInsert(HCapturedObject *state, HCheckMaps *mapcheck)
HPhi * NewPhiAndInsert(HBasicBlock *block, HValue *incoming_value, int index)
HValue * NewLoadReplacement(HLoadNamedField *load, HValue *load_value)
HCapturedObject * NewStateForLoopHeader(HInstruction *prev, HCapturedObject *)
void SetStateAt(HBasicBlock *block, HCapturedObject *state)
HCapturedObject * StateAt(HBasicBlock *block)
HCapturedObject * NewStateCopy(HInstruction *prev, HCapturedObject *state)
Vector< T > AddBlock(T value, int count, AllocationPolicy allocator=AllocationPolicy())
Definition: list-inl.h:77
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
#define DCHECK(condition)
Definition: logging.h:205
const int kPointerSize
Definition: globals.h:129
void PrintF(const char *format,...)
Definition: utils.cc:80

References v8::internal::List< T, AllocationPolicy >::AddBlock(), v8::internal::HValue::block(), block_states_, DCHECK, v8::internal::HValue::DeleteAndReplaceWith(), v8::internal::HPhase::graph(), v8::internal::HValue::HasNoUses(), v8::internal::HValue::id(), v8::internal::HValue::IsPhi(), v8::internal::kPointerSize, v8::internal::HValue::Mnemonic(), NewLoadReplacement(), NewMapCheckAndInsert(), NewPhiAndInsert(), NewStateCopy(), NewStateForAllocation(), NewStateForLoopHeader(), NULL, number_of_values_, v8::internal::HValue::opcode(), v8::internal::HValue::OperandAt(), v8::internal::HValue::OperandCount(), v8::internal::PrintF(), v8::internal::HValue::SetOperandAt(), SetStateAt(), and StateAt().

Referenced by PerformScalarReplacement().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ CollectCapturedValues()

void v8::internal::HEscapeAnalysisPhase::CollectCapturedValues ( )
private

Definition at line 41 of file hydrogen-escape-analysis.cc.

41  {
42  int block_count = graph()->blocks()->length();
43  for (int i = 0; i < block_count; ++i) {
44  HBasicBlock* block = graph()->blocks()->at(i);
45  for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
46  HInstruction* instr = it.Current();
47  if (!instr->IsAllocate()) continue;
48  HAllocate* allocate = HAllocate::cast(instr);
49  if (!allocate->size()->IsInteger32Constant()) continue;
50  int size_in_bytes = allocate->size()->GetInteger32Constant();
51  if (HasNoEscapingUses(instr, size_in_bytes)) {
52  if (FLAG_trace_escape_analysis) {
53  PrintF("#%d (%s) is being captured\n", instr->id(),
54  instr->Mnemonic());
55  }
56  captured_.Add(instr, zone());
57  }
58  }
59  }
60 }
bool HasNoEscapingUses(HValue *value, int size)

References captured_, v8::internal::HPhase::graph(), HasNoEscapingUses(), v8::internal::HValue::id(), v8::internal::HValue::Mnemonic(), and v8::internal::PrintF().

Referenced by Run().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ HasNoEscapingUses()

bool v8::internal::HEscapeAnalysisPhase::HasNoEscapingUses ( HValue value,
int  size 
)
private

Definition at line 11 of file hydrogen-escape-analysis.cc.

11  {
12  for (HUseIterator it(value->uses()); !it.Done(); it.Advance()) {
13  HValue* use = it.value();
14  if (use->HasEscapingOperandAt(it.index())) {
15  if (FLAG_trace_escape_analysis) {
16  PrintF("#%d (%s) escapes through #%d (%s) @%d\n", value->id(),
17  value->Mnemonic(), use->id(), use->Mnemonic(), it.index());
18  }
19  return false;
20  }
21  if (use->HasOutOfBoundsAccess(size)) {
22  if (FLAG_trace_escape_analysis) {
23  PrintF("#%d (%s) out of bounds at #%d (%s) @%d\n", value->id(),
24  value->Mnemonic(), use->id(), use->Mnemonic(), it.index());
25  }
26  return false;
27  }
28  int redefined_index = use->RedefinedOperandIndex();
29  if (redefined_index == it.index() && !HasNoEscapingUses(use, size)) {
30  if (FLAG_trace_escape_analysis) {
31  PrintF("#%d (%s) escapes redefinition #%d (%s) @%d\n", value->id(),
32  value->Mnemonic(), use->id(), use->Mnemonic(), it.index());
33  }
34  return false;
35  }
36  }
37  return true;
38 }
enable harmony numeric enable harmony object literal extensions Optimize object size
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be expose gc extension under the specified name show built in functions in stack traces use random jit cookie to mask large constants minimum length for automatic enable preparsing CPU profiler sampling interval in microseconds trace out of bounds accesses to external arrays default size of stack region v8 is allowed to use(in kBytes)") DEFINE_INT(max_stack_trace_source_length

References v8::internal::HValue::id(), v8::internal::HValue::Mnemonic(), v8::internal::PrintF(), size, use(), and v8::internal::HValue::uses().

Referenced by CollectCapturedValues().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ NewLoadReplacement()

HValue * v8::internal::HEscapeAnalysisPhase::NewLoadReplacement ( HLoadNamedField *  load,
HValue load_value 
)
private

Definition at line 143 of file hydrogen-escape-analysis.cc.

144  {
145  HValue* replacement = load_value;
146  Representation representation = load->representation();
147  if (representation.IsSmiOrInteger32() || representation.IsDouble()) {
148  Zone* zone = graph()->zone();
149  HInstruction* new_instr =
150  HForceRepresentation::New(zone, NULL, load_value, representation);
151  new_instr->InsertAfter(load);
152  replacement = new_instr;
153  }
154  return replacement;
155 }

References v8::internal::HPhase::graph(), v8::internal::HInstruction::InsertAfter(), v8::internal::Representation::IsDouble(), v8::internal::Representation::IsSmiOrInteger32(), and NULL.

Referenced by AnalyzeDataFlow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ NewMapCheckAndInsert()

HValue * v8::internal::HEscapeAnalysisPhase::NewMapCheckAndInsert ( HCapturedObject *  state,
HCheckMaps *  mapcheck 
)
private

Definition at line 128 of file hydrogen-escape-analysis.cc.

129  {
130  Zone* zone = graph()->zone();
131  HValue* value = state->map_value();
132  // TODO(mstarzinger): This will narrow a map check against a set of maps
133  // down to the first element in the set. Revisit and fix this.
134  HCheckValue* check = HCheckValue::New(
135  zone, NULL, value, mapcheck->maps()->at(0), false);
136  check->InsertBefore(mapcheck);
137  return check;
138 }

References v8::internal::HPhase::graph(), and NULL.

Referenced by AnalyzeDataFlow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ NewPhiAndInsert()

HPhi * v8::internal::HEscapeAnalysisPhase::NewPhiAndInsert ( HBasicBlock *  block,
HValue incoming_value,
int  index 
)
private

Definition at line 114 of file hydrogen-escape-analysis.cc.

116  {
117  Zone* zone = graph()->zone();
118  HPhi* phi = new(zone) HPhi(HPhi::kInvalidMergedIndex, zone);
119  for (int i = 0; i < block->predecessors()->length(); i++) {
120  phi->AddInput(incoming_value);
121  }
122  block->AddPhi(phi);
123  return phi;
124 }

References v8::internal::HPhase::graph().

Referenced by AnalyzeDataFlow(), and NewStateForLoopHeader().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ NewState()

HCapturedObject * v8::internal::HEscapeAnalysisPhase::NewState ( HInstruction prev)
private

Definition at line 63 of file hydrogen-escape-analysis.cc.

63  {
64  Zone* zone = graph()->zone();
65  HCapturedObject* state =
66  new(zone) HCapturedObject(number_of_values_, number_of_objects_, zone);
67  state->InsertAfter(previous);
68  return state;
69 }

References v8::internal::HPhase::graph(), number_of_objects_, and number_of_values_.

Referenced by NewStateCopy(), NewStateForAllocation(), and NewStateForLoopHeader().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ NewStateCopy()

HCapturedObject * v8::internal::HEscapeAnalysisPhase::NewStateCopy ( HInstruction prev,
HCapturedObject *  state 
)
private

Definition at line 100 of file hydrogen-escape-analysis.cc.

102  {
103  HCapturedObject* state = NewState(previous);
104  for (int index = 0; index < number_of_values_; index++) {
105  HValue* operand = old_state->OperandAt(index);
106  state->SetOperandAt(index, operand);
107  }
108  return state;
109 }
HCapturedObject * NewState(HInstruction *prev)

References NewState(), number_of_values_, v8::internal::HValue::OperandAt(), and v8::internal::HValue::SetOperandAt().

Referenced by AnalyzeDataFlow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ NewStateForAllocation()

HCapturedObject * v8::internal::HEscapeAnalysisPhase::NewStateForAllocation ( HInstruction prev)
private

Definition at line 73 of file hydrogen-escape-analysis.cc.

74  {
75  HConstant* undefined = graph()->GetConstantUndefined();
76  HCapturedObject* state = NewState(previous);
77  for (int index = 0; index < number_of_values_; index++) {
78  state->SetOperandAt(index, undefined);
79  }
80  return state;
81 }

References v8::internal::HPhase::graph(), NewState(), and number_of_values_.

Referenced by AnalyzeDataFlow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ NewStateForLoopHeader()

HCapturedObject * v8::internal::HEscapeAnalysisPhase::NewStateForLoopHeader ( HInstruction prev,
HCapturedObject *  old_state 
)
private

Definition at line 85 of file hydrogen-escape-analysis.cc.

87  {
88  HBasicBlock* block = previous->block();
89  HCapturedObject* state = NewState(previous);
90  for (int index = 0; index < number_of_values_; index++) {
91  HValue* operand = old_state->OperandAt(index);
92  HPhi* phi = NewPhiAndInsert(block, operand, index);
93  state->SetOperandAt(index, phi);
94  }
95  return state;
96 }

References v8::internal::HValue::block(), NewPhiAndInsert(), NewState(), number_of_values_, and v8::internal::HValue::OperandAt().

Referenced by AnalyzeDataFlow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ PerformScalarReplacement()

void v8::internal::HEscapeAnalysisPhase::PerformScalarReplacement ( )
private

Definition at line 294 of file hydrogen-escape-analysis.cc.

294  {
295  for (int i = 0; i < captured_.length(); i++) {
296  HAllocate* allocate = HAllocate::cast(captured_.at(i));
297 
298  // Compute number of scalar values and start with clean slate.
299  int size_in_bytes = allocate->size()->GetInteger32Constant();
300  number_of_values_ = size_in_bytes / kPointerSize;
302  block_states_.Rewind(0);
303 
304  // Perform actual analysis step.
305  AnalyzeDataFlow(allocate);
306 
308  DCHECK(allocate->HasNoUses());
309  DCHECK(!allocate->IsLinked());
310  }
311 }

References AnalyzeDataFlow(), block_states_, captured_, cumulative_values_, DCHECK, v8::internal::kPointerSize, number_of_objects_, and number_of_values_.

Referenced by Run().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Run()

void v8::internal::HEscapeAnalysisPhase::Run ( )

Definition at line 314 of file hydrogen-escape-analysis.cc.

314  {
315  // TODO(mstarzinger): We disable escape analysis with OSR for now, because
316  // spill slots might be uninitialized. Needs investigation.
317  if (graph()->has_osr()) return;
318  int max_fixpoint_iteration_count = FLAG_escape_analysis_iterations;
319  for (int i = 0; i < max_fixpoint_iteration_count; i++) {
321  if (captured_.is_empty()) break;
323  captured_.Rewind(0);
324  }
325 }

References captured_, CollectCapturedValues(), v8::internal::HPhase::graph(), and PerformScalarReplacement().

+ Here is the call graph for this function:

◆ SetStateAt()

void v8::internal::HEscapeAnalysisPhase::SetStateAt ( HBasicBlock *  block,
HCapturedObject *  state 
)
inlineprivate

Definition at line 48 of file hydrogen-escape-analysis.h.

48  {
49  block_states_.Set(block->block_id(), state);
50  }
void Set(int index, const T &element)
Definition: list-inl.h:85

References block_states_, and v8::internal::List< T, AllocationPolicy >::Set().

Referenced by AnalyzeDataFlow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ StateAt()

HCapturedObject* v8::internal::HEscapeAnalysisPhase::StateAt ( HBasicBlock *  block)
inlineprivate

Definition at line 44 of file hydrogen-escape-analysis.h.

44  {
45  return block_states_.at(block->block_id());
46  }
T & at(int i) const
Definition: list.h:69

References v8::internal::List< T, AllocationPolicy >::at(), and block_states_.

Referenced by AnalyzeDataFlow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ block_states_

ZoneList<HCapturedObject*> v8::internal::HEscapeAnalysisPhase::block_states_
private

◆ captured_

ZoneList<HInstruction*> v8::internal::HEscapeAnalysisPhase::captured_
private

Definition at line 53 of file hydrogen-escape-analysis.h.

Referenced by CollectCapturedValues(), PerformScalarReplacement(), and Run().

◆ cumulative_values_

int v8::internal::HEscapeAnalysisPhase::cumulative_values_
private

Definition at line 60 of file hydrogen-escape-analysis.h.

Referenced by PerformScalarReplacement().

◆ number_of_objects_

int v8::internal::HEscapeAnalysisPhase::number_of_objects_
private

Definition at line 56 of file hydrogen-escape-analysis.h.

Referenced by NewState(), and PerformScalarReplacement().

◆ number_of_values_

int v8::internal::HEscapeAnalysisPhase::number_of_values_
private

The documentation for this class was generated from the following files: