| 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 import '../compiler.dart' show Compiler; | 5 import '../compiler.dart' show Compiler; |
| 6 import '../constants/constant_system.dart'; | 6 import '../constants/constant_system.dart'; |
| 7 import '../constants/values.dart'; | 7 import '../constants/values.dart'; |
| 8 import '../elements/elements.dart'; | 8 import '../elements/elements.dart'; |
| 9 import '../js_backend/js_backend.dart'; | 9 import '../js_backend/js_backend.dart'; |
| 10 import '../types/types.dart'; | 10 import '../types/types.dart'; |
| 11 import '../universe/call_structure.dart'; | 11 import '../universe/call_structure.dart'; |
| 12 import '../universe/selector.dart'; | 12 import '../universe/selector.dart'; |
| 13 import '../world.dart' show ClosedWorld; | 13 import '../world.dart' show ClosedWorld; |
| 14 import 'nodes.dart'; | 14 import 'nodes.dart'; |
| 15 import 'types.dart'; | 15 import 'types.dart'; |
| 16 | 16 |
| 17 /** | 17 /** |
| 18 * [InvokeDynamicSpecializer] and its subclasses are helpers to | 18 * [InvokeDynamicSpecializer] and its subclasses are helpers to |
| 19 * optimize intercepted dynamic calls. It knows what input types | 19 * optimize intercepted dynamic calls. It knows what input types |
| 20 * would be beneficial for performance, and how to change a invoke | 20 * would be beneficial for performance, and how to change a invoke |
| 21 * dynamic to a builtin instruction (e.g. HIndex, HBitNot). | 21 * dynamic to a builtin instruction (e.g. HIndex, HBitNot). |
| 22 */ | 22 */ |
| 23 class InvokeDynamicSpecializer { | 23 class InvokeDynamicSpecializer { |
| 24 const InvokeDynamicSpecializer(); | 24 const InvokeDynamicSpecializer(); |
| 25 | 25 |
| 26 TypeMask computeTypeFromInputTypes( | 26 TypeMask computeTypeFromInputTypes( |
| 27 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { | 27 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { |
| 28 return TypeMaskFactory.inferredTypeForSelector( | 28 return TypeMaskFactory.inferredTypeForSelector(instruction.selector, |
| 29 instruction.selector, instruction.mask, compiler); | 29 instruction.mask, compiler.globalInference.results); |
| 30 } | 30 } |
| 31 | 31 |
| 32 HInstruction tryConvertToBuiltin( | 32 HInstruction tryConvertToBuiltin( |
| 33 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { | 33 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { |
| 34 return null; | 34 return null; |
| 35 } | 35 } |
| 36 | 36 |
| 37 void clearAllSideEffects(HInstruction instruction) { | 37 void clearAllSideEffects(HInstruction instruction) { |
| 38 instruction.sideEffects.clearAllSideEffects(); | 38 instruction.sideEffects.clearAllSideEffects(); |
| 39 instruction.sideEffects.clearAllDependencies(); | 39 instruction.sideEffects.clearAllDependencies(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 | 104 |
| 105 HInstruction tryConvertToBuiltin( | 105 HInstruction tryConvertToBuiltin( |
| 106 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { | 106 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { |
| 107 if (!instruction.inputs[1].isIndexablePrimitive(closedWorld)) return null; | 107 if (!instruction.inputs[1].isIndexablePrimitive(closedWorld)) return null; |
| 108 if (!instruction.inputs[2].isInteger(closedWorld) && | 108 if (!instruction.inputs[2].isInteger(closedWorld) && |
| 109 compiler.options.enableTypeAssertions) { | 109 compiler.options.enableTypeAssertions) { |
| 110 // We want the right checked mode error. | 110 // We want the right checked mode error. |
| 111 return null; | 111 return null; |
| 112 } | 112 } |
| 113 TypeMask receiverType = | 113 TypeMask receiverType = |
| 114 instruction.getDartReceiver(compiler).instructionType; | 114 instruction.getDartReceiver(closedWorld).instructionType; |
| 115 TypeMask type = TypeMaskFactory.inferredTypeForSelector( | 115 TypeMask type = TypeMaskFactory.inferredTypeForSelector( |
| 116 instruction.selector, receiverType, compiler); | 116 instruction.selector, receiverType, compiler.globalInference.results); |
| 117 return new HIndex(instruction.inputs[1], instruction.inputs[2], | 117 return new HIndex(instruction.inputs[1], instruction.inputs[2], |
| 118 instruction.selector, type); | 118 instruction.selector, type); |
| 119 } | 119 } |
| 120 } | 120 } |
| 121 | 121 |
| 122 class BitNotSpecializer extends InvokeDynamicSpecializer { | 122 class BitNotSpecializer extends InvokeDynamicSpecializer { |
| 123 const BitNotSpecializer(); | 123 const BitNotSpecializer(); |
| 124 | 124 |
| 125 UnaryOperation operation(ConstantSystem constantSystem) { | 125 UnaryOperation operation(ConstantSystem constantSystem) { |
| 126 return constantSystem.bitNot; | 126 return constantSystem.bitNot; |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 const CodeUnitAtSpecializer(); | 747 const CodeUnitAtSpecializer(); |
| 748 | 748 |
| 749 BinaryOperation operation(ConstantSystem constantSystem) { | 749 BinaryOperation operation(ConstantSystem constantSystem) { |
| 750 return constantSystem.codeUnitAt; | 750 return constantSystem.codeUnitAt; |
| 751 } | 751 } |
| 752 | 752 |
| 753 HInstruction tryConvertToBuiltin( | 753 HInstruction tryConvertToBuiltin( |
| 754 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { | 754 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { |
| 755 // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index | 755 // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index |
| 756 // bounds checking optimizations as for HIndex. | 756 // bounds checking optimizations as for HIndex. |
| 757 HInstruction receiver = instruction.getDartReceiver(compiler); | 757 HInstruction receiver = instruction.getDartReceiver(closedWorld); |
| 758 if (receiver.isStringOrNull(closedWorld)) { | 758 if (receiver.isStringOrNull(closedWorld)) { |
| 759 // Even if there is no builtin equivalent instruction, we know | 759 // Even if there is no builtin equivalent instruction, we know |
| 760 // String.codeUnitAt does not have any side effect (other than throwing), | 760 // String.codeUnitAt does not have any side effect (other than throwing), |
| 761 // and that it can be GVN'ed. | 761 // and that it can be GVN'ed. |
| 762 clearAllSideEffects(instruction); | 762 clearAllSideEffects(instruction); |
| 763 } | 763 } |
| 764 return null; | 764 return null; |
| 765 } | 765 } |
| 766 } | 766 } |
| 767 | 767 |
| 768 class RoundSpecializer extends InvokeDynamicSpecializer { | 768 class RoundSpecializer extends InvokeDynamicSpecializer { |
| 769 const RoundSpecializer(); | 769 const RoundSpecializer(); |
| 770 | 770 |
| 771 UnaryOperation operation(ConstantSystem constantSystem) { | 771 UnaryOperation operation(ConstantSystem constantSystem) { |
| 772 return constantSystem.round; | 772 return constantSystem.round; |
| 773 } | 773 } |
| 774 | 774 |
| 775 HInstruction tryConvertToBuiltin( | 775 HInstruction tryConvertToBuiltin( |
| 776 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { | 776 HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) { |
| 777 HInstruction receiver = instruction.getDartReceiver(compiler); | 777 HInstruction receiver = instruction.getDartReceiver(closedWorld); |
| 778 if (receiver.isNumberOrNull(closedWorld)) { | 778 if (receiver.isNumberOrNull(closedWorld)) { |
| 779 // Even if there is no builtin equivalent instruction, we know the | 779 // Even if there is no builtin equivalent instruction, we know the |
| 780 // instruction does not have any side effect, and that it can be GVN'ed. | 780 // instruction does not have any side effect, and that it can be GVN'ed. |
| 781 clearAllSideEffects(instruction); | 781 clearAllSideEffects(instruction); |
| 782 } | 782 } |
| 783 return null; | 783 return null; |
| 784 } | 784 } |
| 785 } | 785 } |
| OLD | NEW |