| 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 "src/crankshaft/hydrogen-load-elimination.h" | 5 #include "src/crankshaft/hydrogen-load-elimination.h" |
| 6 | 6 |
| 7 #include "src/crankshaft/hydrogen-alias-analysis.h" | 7 #include "src/crankshaft/hydrogen-alias-analysis.h" |
| 8 #include "src/crankshaft/hydrogen-flow-engine.h" | 8 #include "src/crankshaft/hydrogen-flow-engine.h" |
| 9 #include "src/crankshaft/hydrogen-instructions.h" | 9 #include "src/crankshaft/hydrogen-instructions.h" |
| 10 | 10 |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 | 236 |
| 237 int field = FieldOf(instr->access()); | 237 int field = FieldOf(instr->access()); |
| 238 if (field < 0) return KillIfMisaligned(instr); | 238 if (field < 0) return KillIfMisaligned(instr); |
| 239 | 239 |
| 240 HValue* object = instr->object()->ActualValue(); | 240 HValue* object = instr->object()->ActualValue(); |
| 241 HValue* value = instr->value(); | 241 HValue* value = instr->value(); |
| 242 | 242 |
| 243 if (instr->has_transition()) { | 243 if (instr->has_transition()) { |
| 244 // A transition introduces a new field and alters the map of the object. | 244 // A transition introduces a new field and alters the map of the object. |
| 245 // Since the field in the object is new, it cannot alias existing entries. | 245 // Since the field in the object is new, it cannot alias existing entries. |
| 246 // TODO(titzer): introduce a constant for the new map and remember it. | |
| 247 KillFieldInternal(object, FieldOf(JSObject::kMapOffset), NULL); | 246 KillFieldInternal(object, FieldOf(JSObject::kMapOffset), NULL); |
| 248 } else { | 247 } else { |
| 249 // Kill non-equivalent may-alias entries. | 248 // Kill non-equivalent may-alias entries. |
| 250 KillFieldInternal(object, field, value); | 249 KillFieldInternal(object, field, value); |
| 251 } | 250 } |
| 252 HFieldApproximation* approx = FindOrCreate(object, field); | 251 HFieldApproximation* approx = FindOrCreate(object, field); |
| 253 | 252 |
| 254 if (Equal(approx->last_value_, value)) { | 253 if (Equal(approx->last_value_, value)) { |
| 255 // The store is redundant because the field already has this value. | 254 // The store is redundant because the field already has this value. |
| 256 return NULL; | 255 return NULL; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 } | 394 } |
| 396 | 395 |
| 397 // Compute the field index for the given object access; -1 if not tracked. | 396 // Compute the field index for the given object access; -1 if not tracked. |
| 398 int FieldOf(HObjectAccess access) { | 397 int FieldOf(HObjectAccess access) { |
| 399 return access.IsInobject() ? FieldOf(access.offset()) : -1; | 398 return access.IsInobject() ? FieldOf(access.offset()) : -1; |
| 400 } | 399 } |
| 401 | 400 |
| 402 // Compute the field index for the given in-object offset; -1 if not tracked. | 401 // Compute the field index for the given in-object offset; -1 if not tracked. |
| 403 int FieldOf(int offset) { | 402 int FieldOf(int offset) { |
| 404 if (offset >= kMaxTrackedFields * kPointerSize) return -1; | 403 if (offset >= kMaxTrackedFields * kPointerSize) return -1; |
| 405 // TODO(titzer): track misaligned loads in a separate list? | |
| 406 if ((offset % kPointerSize) != 0) return -1; // Ignore misaligned accesses. | 404 if ((offset % kPointerSize) != 0) return -1; // Ignore misaligned accesses. |
| 407 return offset / kPointerSize; | 405 return offset / kPointerSize; |
| 408 } | 406 } |
| 409 | 407 |
| 410 // Ensure internal storage for the given number of fields. | 408 // Ensure internal storage for the given number of fields. |
| 411 void EnsureFields(int num_fields) { | 409 void EnsureFields(int num_fields) { |
| 412 if (fields_.length() < num_fields) { | 410 if (fields_.length() < num_fields) { |
| 413 fields_.AddBlock(NULL, num_fields - fields_.length(), zone_); | 411 fields_.AddBlock(NULL, num_fields - fields_.length(), zone_); |
| 414 } | 412 } |
| 415 } | 413 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 // Perform only local analysis. | 502 // Perform only local analysis. |
| 505 for (int i = 0; i < graph()->blocks()->length(); i++) { | 503 for (int i = 0; i < graph()->blocks()->length(); i++) { |
| 506 table->Kill(); | 504 table->Kill(); |
| 507 engine.AnalyzeOneBlock(graph()->blocks()->at(i), table); | 505 engine.AnalyzeOneBlock(graph()->blocks()->at(i), table); |
| 508 } | 506 } |
| 509 } | 507 } |
| 510 } | 508 } |
| 511 | 509 |
| 512 } // namespace internal | 510 } // namespace internal |
| 513 } // namespace v8 | 511 } // namespace v8 |
| OLD | NEW |