| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/flow_graph_optimizer.h" | 5 #include "vm/flow_graph_optimizer.h" |
| 6 | 6 |
| 7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
| 8 #include "vm/cha.h" | 8 #include "vm/cha.h" |
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
| 10 #include "vm/flow_graph_builder.h" | 10 #include "vm/flow_graph_builder.h" |
| (...skipping 1364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1375 callee_receiver->IsParameter() && | 1375 callee_receiver->IsParameter() && |
| 1376 (callee_receiver->AsParameter()->index() == 0)) { | 1376 (callee_receiver->AsParameter()->index() == 0)) { |
| 1377 const String& field_name = | 1377 const String& field_name = |
| 1378 String::Handle(Field::NameFromGetter(call->function_name())); | 1378 String::Handle(Field::NameFromGetter(call->function_name())); |
| 1379 return CHA::HasOverride(Class::Handle(function.Owner()), field_name); | 1379 return CHA::HasOverride(Class::Handle(function.Owner()), field_name); |
| 1380 } | 1380 } |
| 1381 return true; | 1381 return true; |
| 1382 } | 1382 } |
| 1383 | 1383 |
| 1384 | 1384 |
| 1385 void FlowGraphOptimizer::AddToGuardedFields(const Field& field) { | |
| 1386 if ((field.guarded_cid() == kDynamicCid) || | |
| 1387 (field.guarded_cid() == kIllegalCid)) { | |
| 1388 return; | |
| 1389 } | |
| 1390 for (intptr_t j = 0; j < guarded_fields_->length(); j++) { | |
| 1391 if ((*guarded_fields_)[j]->raw() == field.raw()) { | |
| 1392 return; | |
| 1393 } | |
| 1394 } | |
| 1395 guarded_fields_->Add(&field); | |
| 1396 } | |
| 1397 | |
| 1398 | |
| 1399 void FlowGraphOptimizer::InlineImplicitInstanceGetter(InstanceCallInstr* call) { | 1385 void FlowGraphOptimizer::InlineImplicitInstanceGetter(InstanceCallInstr* call) { |
| 1400 ASSERT(call->HasICData()); | 1386 ASSERT(call->HasICData()); |
| 1401 const ICData& ic_data = *call->ic_data(); | 1387 const ICData& ic_data = *call->ic_data(); |
| 1402 Function& target = Function::Handle(); | 1388 Function& target = Function::Handle(); |
| 1403 GrowableArray<intptr_t> class_ids; | 1389 GrowableArray<intptr_t> class_ids; |
| 1404 ic_data.GetCheckAt(0, &class_ids, &target); | 1390 ic_data.GetCheckAt(0, &class_ids, &target); |
| 1405 ASSERT(class_ids.length() == 1); | 1391 ASSERT(class_ids.length() == 1); |
| 1406 // Inline implicit instance getter. | 1392 // Inline implicit instance getter. |
| 1407 const String& field_name = | 1393 const String& field_name = |
| 1408 String::Handle(Field::NameFromGetter(call->function_name())); | 1394 String::Handle(Field::NameFromGetter(call->function_name())); |
| 1409 const Field& field = Field::ZoneHandle(GetField(class_ids[0], field_name)); | 1395 const Field& field = Field::ZoneHandle(GetField(class_ids[0], field_name)); |
| 1410 ASSERT(!field.IsNull()); | 1396 ASSERT(!field.IsNull()); |
| 1411 | 1397 |
| 1412 if (InstanceCallNeedsClassCheck(call)) { | 1398 if (InstanceCallNeedsClassCheck(call)) { |
| 1413 AddReceiverCheck(call); | 1399 AddReceiverCheck(call); |
| 1414 } | 1400 } |
| 1415 LoadFieldInstr* load = new LoadFieldInstr( | 1401 LoadFieldInstr* load = new LoadFieldInstr( |
| 1416 new Value(call->ArgumentAt(0)), | 1402 new Value(call->ArgumentAt(0)), |
| 1417 field.Offset(), | 1403 field.Offset(), |
| 1418 AbstractType::ZoneHandle(field.type()), | 1404 AbstractType::ZoneHandle(field.type()), |
| 1419 field.is_final()); | 1405 field.is_final()); |
| 1420 load->set_field(&field); | 1406 load->set_field(&field); |
| 1421 if (field.guarded_cid() != kIllegalCid) { | 1407 if (field.guarded_cid() != kIllegalCid) { |
| 1422 if (!field.is_nullable() || (field.guarded_cid() == kNullCid)) { | 1408 if (!field.is_nullable() || (field.guarded_cid() == kNullCid)) { |
| 1423 load->set_result_cid(field.guarded_cid()); | 1409 load->set_result_cid(field.guarded_cid()); |
| 1424 } | 1410 } |
| 1425 AddToGuardedFields(field); | 1411 flow_graph_->builder().AddToGuardedFields(field); |
| 1426 } | 1412 } |
| 1427 | 1413 |
| 1428 // Discard the environment from the original instruction because the load | 1414 // Discard the environment from the original instruction because the load |
| 1429 // can't deoptimize. | 1415 // can't deoptimize. |
| 1430 call->RemoveEnvironment(); | 1416 call->RemoveEnvironment(); |
| 1431 ReplaceCall(call, load); | 1417 ReplaceCall(call, load); |
| 1432 | 1418 |
| 1433 if (load->result_cid() != kDynamicCid) { | 1419 if (load->result_cid() != kDynamicCid) { |
| 1434 // Reset value types if guarded_cid was used. | 1420 // Reset value types if guarded_cid was used. |
| 1435 for (Value::Iterator it(load->input_use_list()); | 1421 for (Value::Iterator it(load->input_use_list()); |
| (...skipping 6047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7483 } | 7469 } |
| 7484 | 7470 |
| 7485 // Insert materializations at environment uses. | 7471 // Insert materializations at environment uses. |
| 7486 for (intptr_t i = 0; i < exits.length(); i++) { | 7472 for (intptr_t i = 0; i < exits.length(); i++) { |
| 7487 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields); | 7473 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields); |
| 7488 } | 7474 } |
| 7489 } | 7475 } |
| 7490 | 7476 |
| 7491 | 7477 |
| 7492 } // namespace dart | 7478 } // namespace dart |
| OLD | NEW |