| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/redundancy_elimination.h" | 5 #include "vm/redundancy_elimination.h" |
| 6 | 6 |
| 7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
| 8 #include "vm/flow_graph.h" | 8 #include "vm/flow_graph.h" |
| 9 #include "vm/hash_map.h" | 9 #include "vm/hash_map.h" |
| 10 #include "vm/il_printer.h" | 10 #include "vm/il_printer.h" |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 | 474 |
| 475 private: | 475 private: |
| 476 Place(uword flags, Definition* instance, intptr_t selector) | 476 Place(uword flags, Definition* instance, intptr_t selector) |
| 477 : flags_(flags), | 477 : flags_(flags), |
| 478 instance_(instance), | 478 instance_(instance), |
| 479 raw_selector_(selector), | 479 raw_selector_(selector), |
| 480 id_(0) { | 480 id_(0) { |
| 481 } | 481 } |
| 482 | 482 |
| 483 bool SameField(const Place* other) const { | 483 bool SameField(const Place* other) const { |
| 484 return (kind() == kField) ? (field().raw() == other->field().raw()) | 484 return (kind() == kField) ? |
| 485 : (offset_in_bytes_ == other->offset_in_bytes_); | 485 (field().Original() == other->field().Original()) : |
| 486 (offset_in_bytes_ == other->offset_in_bytes_); |
| 486 } | 487 } |
| 487 | 488 |
| 488 intptr_t FieldHashcode() const { | 489 intptr_t FieldHashcode() const { |
| 489 return (kind() == kField) ? reinterpret_cast<intptr_t>(field().raw()) | 490 return (kind() == kField) ? reinterpret_cast<intptr_t>(field().Original()) |
| 490 : offset_in_bytes_; | 491 : offset_in_bytes_; |
| 491 } | 492 } |
| 492 | 493 |
| 493 void set_representation(Representation rep) { | 494 void set_representation(Representation rep) { |
| 494 flags_ = RepresentationBits::update(rep, flags_); | 495 flags_ = RepresentationBits::update(rep, flags_); |
| 495 } | 496 } |
| 496 | 497 |
| 497 void set_kind(Kind kind) { | 498 void set_kind(Kind kind) { |
| 498 flags_ = KindBits::update(kind, flags_); | 499 flags_ = KindBits::update(kind, flags_); |
| 499 } | 500 } |
| (...skipping 2578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3078 void AllocationSinking::DetachMaterializations() { | 3079 void AllocationSinking::DetachMaterializations() { |
| 3079 for (intptr_t i = 0; i < materializations_.length(); i++) { | 3080 for (intptr_t i = 0; i < materializations_.length(); i++) { |
| 3080 materializations_[i]->previous()->LinkTo(materializations_[i]->next()); | 3081 materializations_[i]->previous()->LinkTo(materializations_[i]->next()); |
| 3081 } | 3082 } |
| 3082 } | 3083 } |
| 3083 | 3084 |
| 3084 | 3085 |
| 3085 // Add a field/offset to the list of fields if it is not yet present there. | 3086 // Add a field/offset to the list of fields if it is not yet present there. |
| 3086 static bool AddSlot(ZoneGrowableArray<const Object*>* slots, | 3087 static bool AddSlot(ZoneGrowableArray<const Object*>* slots, |
| 3087 const Object& slot) { | 3088 const Object& slot) { |
| 3089 ASSERT(slot.IsSmi() || slot.IsField()); |
| 3090 ASSERT(!slot.IsField() || Field::Cast(slot).IsOriginal()); |
| 3088 for (intptr_t i = 0; i < slots->length(); i++) { | 3091 for (intptr_t i = 0; i < slots->length(); i++) { |
| 3089 if ((*slots)[i]->raw() == slot.raw()) { | 3092 if ((*slots)[i]->raw() == slot.raw()) { |
| 3090 return false; | 3093 return false; |
| 3091 } | 3094 } |
| 3092 } | 3095 } |
| 3093 slots->Add(&slot); | 3096 slots->Add(&slot); |
| 3094 return true; | 3097 return true; |
| 3095 } | 3098 } |
| 3096 | 3099 |
| 3097 | 3100 |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3274 // Collect all fields that are written for this instance. | 3277 // Collect all fields that are written for this instance. |
| 3275 ZoneGrowableArray<const Object*>* slots = | 3278 ZoneGrowableArray<const Object*>* slots = |
| 3276 new(Z) ZoneGrowableArray<const Object*>(5); | 3279 new(Z) ZoneGrowableArray<const Object*>(5); |
| 3277 | 3280 |
| 3278 for (Value* use = alloc->input_use_list(); | 3281 for (Value* use = alloc->input_use_list(); |
| 3279 use != NULL; | 3282 use != NULL; |
| 3280 use = use->next_use()) { | 3283 use = use->next_use()) { |
| 3281 StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField(); | 3284 StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField(); |
| 3282 if ((store != NULL) && (store->instance()->definition() == alloc)) { | 3285 if ((store != NULL) && (store->instance()->definition() == alloc)) { |
| 3283 if (!store->field().IsNull()) { | 3286 if (!store->field().IsNull()) { |
| 3284 AddSlot(slots, store->field()); | 3287 AddSlot(slots, *store->field().OriginalAsHandle(Z)); |
| 3285 } else { | 3288 } else { |
| 3286 AddSlot(slots, Smi::ZoneHandle(Z, Smi::New(store->offset_in_bytes()))); | 3289 AddSlot(slots, Smi::ZoneHandle(Z, Smi::New(store->offset_in_bytes()))); |
| 3287 } | 3290 } |
| 3288 } | 3291 } |
| 3289 } | 3292 } |
| 3290 | 3293 |
| 3291 if (alloc->ArgumentCount() > 0) { | 3294 if (alloc->ArgumentCount() > 0) { |
| 3292 AllocateObjectInstr* alloc_object = alloc->AsAllocateObject(); | 3295 AllocateObjectInstr* alloc_object = alloc->AsAllocateObject(); |
| 3293 ASSERT(alloc_object->ArgumentCount() == 1); | 3296 ASSERT(alloc_object->ArgumentCount() == 1); |
| 3294 intptr_t type_args_offset = | 3297 intptr_t type_args_offset = |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3458 join->phis_ = NULL; | 3461 join->phis_ = NULL; |
| 3459 } else { | 3462 } else { |
| 3460 join->phis_->TruncateTo(to_index); | 3463 join->phis_->TruncateTo(to_index); |
| 3461 } | 3464 } |
| 3462 } | 3465 } |
| 3463 } | 3466 } |
| 3464 } | 3467 } |
| 3465 | 3468 |
| 3466 | 3469 |
| 3467 } // namespace dart | 3470 } // namespace dart |
| OLD | NEW |