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 part of ssa; | 5 part of ssa; |
6 | 6 |
7 abstract class OptimizationPhase { | 7 abstract class OptimizationPhase { |
8 String get name; | 8 String get name; |
9 void visitGraph(HGraph graph); | 9 void visitGraph(HGraph graph); |
10 } | 10 } |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 simplifyCondition(node.elseBlock, condition, isNegated); | 570 simplifyCondition(node.elseBlock, condition, isNegated); |
571 return node; | 571 return node; |
572 } | 572 } |
573 | 573 |
574 HInstruction visitIs(HIs node) { | 574 HInstruction visitIs(HIs node) { |
575 DartType type = node.typeExpression; | 575 DartType type = node.typeExpression; |
576 Element element = type.element; | 576 Element element = type.element; |
577 | 577 |
578 if (!node.isRawCheck) { | 578 if (!node.isRawCheck) { |
579 return node; | 579 return node; |
580 } else if (element.isTypedef) { | 580 } else if (type.isTypedef) { |
581 return node; | 581 return node; |
582 } else if (element == compiler.functionClass) { | 582 } else if (element == compiler.functionClass) { |
583 return node; | 583 return node; |
584 } | 584 } |
585 | 585 |
586 if (element == compiler.objectClass || type.treatAsDynamic) { | 586 if (element == compiler.objectClass || type.treatAsDynamic) { |
587 return graph.addConstantBool(true, compiler); | 587 return graph.addConstantBool(true, compiler); |
588 } | 588 } |
589 | 589 |
590 HInstruction expression = node.expression; | 590 HInstruction expression = node.expression; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 return graph.addConstantBool(false, compiler); | 639 return graph.addConstantBool(false, compiler); |
640 } | 640 } |
641 } | 641 } |
642 return node; | 642 return node; |
643 } | 643 } |
644 | 644 |
645 HInstruction visitTypeConversion(HTypeConversion node) { | 645 HInstruction visitTypeConversion(HTypeConversion node) { |
646 HInstruction value = node.inputs[0]; | 646 HInstruction value = node.inputs[0]; |
647 DartType type = node.typeExpression; | 647 DartType type = node.typeExpression; |
648 if (type != null) { | 648 if (type != null) { |
649 if (type.kind == TypeKind.MALFORMED_TYPE) { | 649 if (type.isMalformed) { |
650 // Malformed types are treated as dynamic statically, but should | 650 // Malformed types are treated as dynamic statically, but should |
651 // throw a type error at runtime. | 651 // throw a type error at runtime. |
652 return node; | 652 return node; |
653 } | 653 } |
654 if (!type.treatAsRaw || type.kind == TypeKind.TYPE_VARIABLE) { | 654 if (!type.treatAsRaw || type.isTypeVariable) { |
655 return node; | 655 return node; |
656 } | 656 } |
657 if (type.kind == TypeKind.FUNCTION) { | 657 if (type.isFunctionType) { |
658 // TODO(johnniwinther): Optimize function type conversions. | 658 // TODO(johnniwinther): Optimize function type conversions. |
659 return node; | 659 return node; |
660 } | 660 } |
661 } | 661 } |
662 return removeIfCheckAlwaysSucceeds(node, node.checkedType); | 662 return removeIfCheckAlwaysSucceeds(node, node.checkedType); |
663 } | 663 } |
664 | 664 |
665 HInstruction visitTypeKnown(HTypeKnown node) { | 665 HInstruction visitTypeKnown(HTypeKnown node) { |
666 return removeIfCheckAlwaysSucceeds(node, node.knownType); | 666 return removeIfCheckAlwaysSucceeds(node, node.knownType); |
667 } | 667 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 HInstruction receiver = node.getDartReceiver(compiler); | 763 HInstruction receiver = node.getDartReceiver(compiler); |
764 VariableElement field = | 764 VariableElement field = |
765 findConcreteFieldForDynamicAccess(receiver, node.selector); | 765 findConcreteFieldForDynamicAccess(receiver, node.selector); |
766 if (field == null || !field.isAssignable) return node; | 766 if (field == null || !field.isAssignable) return node; |
767 // Use [:node.inputs.last:] in case the call follows the | 767 // Use [:node.inputs.last:] in case the call follows the |
768 // interceptor calling convention, but is not a call on an | 768 // interceptor calling convention, but is not a call on an |
769 // interceptor. | 769 // interceptor. |
770 HInstruction value = node.inputs.last; | 770 HInstruction value = node.inputs.last; |
771 if (compiler.enableTypeAssertions) { | 771 if (compiler.enableTypeAssertions) { |
772 DartType type = field.type; | 772 DartType type = field.type; |
773 if (!type.treatAsRaw || type.kind == TypeKind.TYPE_VARIABLE) { | 773 if (!type.treatAsRaw || type.isTypeVariable) { |
774 // We cannot generate the correct type representation here, so don't | 774 // We cannot generate the correct type representation here, so don't |
775 // inline this access. | 775 // inline this access. |
776 return node; | 776 return node; |
777 } | 777 } |
778 HInstruction other = value.convertType( | 778 HInstruction other = value.convertType( |
779 compiler, | 779 compiler, |
780 type, | 780 type, |
781 HTypeConversion.CHECKED_MODE_CHECK); | 781 HTypeConversion.CHECKED_MODE_CHECK); |
782 if (other != value) { | 782 if (other != value) { |
783 node.block.addBefore(node, other); | 783 node.block.addBefore(node, other); |
(...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2115 | 2115 |
2116 keyedValues.forEach((receiver, values) { | 2116 keyedValues.forEach((receiver, values) { |
2117 result.keyedValues[receiver] = | 2117 result.keyedValues[receiver] = |
2118 new Map<HInstruction, HInstruction>.from(values); | 2118 new Map<HInstruction, HInstruction>.from(values); |
2119 }); | 2119 }); |
2120 | 2120 |
2121 result.nonEscapingReceivers.addAll(nonEscapingReceivers); | 2121 result.nonEscapingReceivers.addAll(nonEscapingReceivers); |
2122 return result; | 2122 return result; |
2123 } | 2123 } |
2124 } | 2124 } |
OLD | NEW |