OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "hydrogen-escape-analysis.h" | 5 #include "hydrogen-escape-analysis.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 | 9 |
10 | 10 |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 } | 199 } |
200 break; | 200 break; |
201 } | 201 } |
202 case HValue::kStoreNamedField: { | 202 case HValue::kStoreNamedField: { |
203 HStoreNamedField* store = HStoreNamedField::cast(instr); | 203 HStoreNamedField* store = HStoreNamedField::cast(instr); |
204 int index = store->access().offset() / kPointerSize; | 204 int index = store->access().offset() / kPointerSize; |
205 if (store->object() != allocate) continue; | 205 if (store->object() != allocate) continue; |
206 ASSERT(store->access().IsInobject()); | 206 ASSERT(store->access().IsInobject()); |
207 state = NewStateCopy(store->previous(), state); | 207 state = NewStateCopy(store->previous(), state); |
208 state->SetOperandAt(index, store->value()); | 208 state->SetOperandAt(index, store->value()); |
| 209 if (store->has_transition()) { |
| 210 state->SetOperandAt(0, store->transition()); |
| 211 } |
209 if (store->HasObservableSideEffects()) { | 212 if (store->HasObservableSideEffects()) { |
210 state->ReuseSideEffectsFromStore(store); | 213 state->ReuseSideEffectsFromStore(store); |
211 } | 214 } |
212 store->DeleteAndReplaceWith(store->ActualValue()); | 215 store->DeleteAndReplaceWith(store->ActualValue()); |
213 if (FLAG_trace_escape_analysis) { | 216 if (FLAG_trace_escape_analysis) { |
214 PrintF("Replacing store #%d\n", instr->id()); | 217 PrintF("Replacing store #%d%s\n", instr->id(), |
| 218 store->has_transition() ? " (with transition)" : ""); |
215 } | 219 } |
216 break; | 220 break; |
217 } | 221 } |
218 case HValue::kArgumentsObject: | 222 case HValue::kArgumentsObject: |
219 case HValue::kCapturedObject: | 223 case HValue::kCapturedObject: |
220 case HValue::kSimulate: { | 224 case HValue::kSimulate: { |
221 for (int i = 0; i < instr->OperandCount(); i++) { | 225 for (int i = 0; i < instr->OperandCount(); i++) { |
222 if (instr->OperandAt(i) != allocate) continue; | 226 if (instr->OperandAt(i) != allocate) continue; |
223 instr->SetOperandAt(i, state); | 227 instr->SetOperandAt(i, state); |
224 } | 228 } |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 for (int i = 0; i < max_fixpoint_iteration_count; i++) { | 319 for (int i = 0; i < max_fixpoint_iteration_count; i++) { |
316 CollectCapturedValues(); | 320 CollectCapturedValues(); |
317 if (captured_.is_empty()) break; | 321 if (captured_.is_empty()) break; |
318 PerformScalarReplacement(); | 322 PerformScalarReplacement(); |
319 captured_.Clear(); | 323 captured_.Clear(); |
320 } | 324 } |
321 } | 325 } |
322 | 326 |
323 | 327 |
324 } } // namespace v8::internal | 328 } } // namespace v8::internal |
OLD | NEW |