OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/flow_graph_builder.h" | 9 #include "vm/flow_graph_builder.h" |
10 #include "vm/flow_graph_compiler.h" | 10 #include "vm/flow_graph_compiler.h" |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 bool FlowGraphOptimizer::TryReplaceWithStoreIndexed(InstanceCallInstr* call) { | 591 bool FlowGraphOptimizer::TryReplaceWithStoreIndexed(InstanceCallInstr* call) { |
592 const intptr_t class_id = ReceiverClassId(call); | 592 const intptr_t class_id = ReceiverClassId(call); |
593 ICData& value_check = ICData::ZoneHandle(); | 593 ICData& value_check = ICData::ZoneHandle(); |
594 switch (class_id) { | 594 switch (class_id) { |
595 case kArrayCid: | 595 case kArrayCid: |
596 case kGrowableObjectArrayCid: | 596 case kGrowableObjectArrayCid: |
597 if (ArgIsAlwaysSmi(*call->ic_data(), 2)) { | 597 if (ArgIsAlwaysSmi(*call->ic_data(), 2)) { |
598 value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2); | 598 value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2); |
599 } | 599 } |
600 break; | 600 break; |
| 601 case kInt8ArrayCid: |
601 case kUint8ArrayCid: | 602 case kUint8ArrayCid: |
| 603 case kUint8ClampedArrayCid: |
| 604 case kInt16ArrayCid: |
| 605 case kUint16ArrayCid: |
602 // Check that value is always smi. | 606 // Check that value is always smi. |
603 value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2); | 607 value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2); |
604 if ((value_check.NumberOfChecks() != 1) || | 608 if ((value_check.NumberOfChecks() != 1) || |
605 (value_check.GetReceiverClassIdAt(0) != kSmiCid)) { | 609 (value_check.GetReceiverClassIdAt(0) != kSmiCid)) { |
606 return false; | 610 return false; |
607 } | 611 } |
608 break; | 612 break; |
609 | 613 |
610 case kFloat32ArrayCid: | 614 case kFloat32ArrayCid: |
611 case kFloat64ArrayCid: { | 615 case kFloat64ArrayCid: { |
(...skipping 30 matching lines...) Expand all Loading... |
642 instantiator_class.type_arguments_field_offset(); | 646 instantiator_class.type_arguments_field_offset(); |
643 LoadFieldInstr* load_type_args = | 647 LoadFieldInstr* load_type_args = |
644 new LoadFieldInstr(array->Copy(), | 648 new LoadFieldInstr(array->Copy(), |
645 type_arguments_field_offset, | 649 type_arguments_field_offset, |
646 Type::ZoneHandle()); // No type. | 650 Type::ZoneHandle()); // No type. |
647 InsertBefore(call, load_type_args, NULL, Definition::kValue); | 651 InsertBefore(call, load_type_args, NULL, Definition::kValue); |
648 instantiator = array->Copy(); | 652 instantiator = array->Copy(); |
649 type_args = new Value(load_type_args); | 653 type_args = new Value(load_type_args); |
650 break; | 654 break; |
651 } | 655 } |
| 656 case kInt8ArrayCid: |
652 case kUint8ArrayCid: | 657 case kUint8ArrayCid: |
| 658 case kUint8ClampedArrayCid: |
| 659 case kInt16ArrayCid: |
| 660 case kUint16ArrayCid: |
| 661 ASSERT(value_type.IsIntType()); |
| 662 // Fall through. |
653 case kFloat32ArrayCid: | 663 case kFloat32ArrayCid: |
654 case kFloat64ArrayCid: { | 664 case kFloat64ArrayCid: { |
655 ConstantInstr* null_constant = new ConstantInstr(Object::ZoneHandle()); | 665 ConstantInstr* null_constant = new ConstantInstr(Object::ZoneHandle()); |
656 InsertBefore(call, null_constant, NULL, Definition::kValue); | 666 InsertBefore(call, null_constant, NULL, Definition::kValue); |
657 instantiator = new Value(null_constant); | 667 instantiator = new Value(null_constant); |
658 type_args = new Value(null_constant); | 668 type_args = new Value(null_constant); |
659 ASSERT((class_id != kUint8ArrayCid) || value_type.IsIntType()); | |
660 ASSERT((class_id != kFloat32ArrayCid && class_id != kFloat64ArrayCid) || | 669 ASSERT((class_id != kFloat32ArrayCid && class_id != kFloat64ArrayCid) || |
661 value_type.IsDoubleType()); | 670 value_type.IsDoubleType()); |
662 ASSERT(value_type.IsInstantiated()); | 671 ASSERT(value_type.IsInstantiated()); |
663 break; | 672 break; |
664 } | 673 } |
665 default: | 674 default: |
666 // TODO(fschneider): Add support for other array types. | 675 // TODO(fschneider): Add support for other array types. |
667 UNREACHABLE(); | 676 UNREACHABLE(); |
668 } | 677 } |
669 AssertAssignableInstr* assert_value = | 678 AssertAssignableInstr* assert_value = |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 | 722 |
714 | 723 |
715 bool FlowGraphOptimizer::TryReplaceWithLoadIndexed(InstanceCallInstr* call) { | 724 bool FlowGraphOptimizer::TryReplaceWithLoadIndexed(InstanceCallInstr* call) { |
716 const intptr_t class_id = ReceiverClassId(call); | 725 const intptr_t class_id = ReceiverClassId(call); |
717 switch (class_id) { | 726 switch (class_id) { |
718 case kArrayCid: | 727 case kArrayCid: |
719 case kImmutableArrayCid: | 728 case kImmutableArrayCid: |
720 case kGrowableObjectArrayCid: | 729 case kGrowableObjectArrayCid: |
721 case kFloat32ArrayCid: | 730 case kFloat32ArrayCid: |
722 case kFloat64ArrayCid: | 731 case kFloat64ArrayCid: |
| 732 case kInt8ArrayCid: |
723 case kUint8ArrayCid: | 733 case kUint8ArrayCid: |
724 case kUint8ClampedArrayCid: | 734 case kUint8ClampedArrayCid: |
725 case kExternalUint8ArrayCid: | 735 case kExternalUint8ArrayCid: |
| 736 case kInt16ArrayCid: |
| 737 case kUint16ArrayCid: |
726 // Acceptable load index classes. | 738 // Acceptable load index classes. |
727 break; | 739 break; |
728 default: | 740 default: |
729 return false; | 741 return false; |
730 } | 742 } |
731 Value* array = NULL; | 743 Value* array = NULL; |
732 Value* index = NULL; | 744 Value* index = NULL; |
733 intptr_t array_cid = PrepareIndexedOp(call, class_id, &array, &index); | 745 intptr_t array_cid = PrepareIndexedOp(call, class_id, &array, &index); |
734 Definition* array_op = new LoadIndexedInstr(array, index, array_cid); | 746 Definition* array_op = new LoadIndexedInstr(array, index, array_cid); |
735 call->ReplaceWith(array_op, current_iterator()); | 747 call->ReplaceWith(array_op, current_iterator()); |
(...skipping 3763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4499 | 4511 |
4500 if (FLAG_trace_constant_propagation) { | 4512 if (FLAG_trace_constant_propagation) { |
4501 OS::Print("\n==== After constant propagation ====\n"); | 4513 OS::Print("\n==== After constant propagation ====\n"); |
4502 FlowGraphPrinter printer(*graph_); | 4514 FlowGraphPrinter printer(*graph_); |
4503 printer.PrintBlocks(); | 4515 printer.PrintBlocks(); |
4504 } | 4516 } |
4505 } | 4517 } |
4506 | 4518 |
4507 | 4519 |
4508 } // namespace dart | 4520 } // namespace dart |
OLD | NEW |