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'; |
(...skipping 16 matching lines...) Expand all Loading... |
27 HInvokeDynamic instruction, Compiler compiler) { | 27 HInvokeDynamic instruction, Compiler compiler) { |
28 return TypeMaskFactory.inferredTypeForSelector( | 28 return TypeMaskFactory.inferredTypeForSelector( |
29 instruction.selector, instruction.mask, compiler); | 29 instruction.selector, instruction.mask, compiler); |
30 } | 30 } |
31 | 31 |
32 HInstruction tryConvertToBuiltin( | 32 HInstruction tryConvertToBuiltin( |
33 HInvokeDynamic instruction, Compiler compiler) { | 33 HInvokeDynamic instruction, Compiler compiler) { |
34 return null; | 34 return null; |
35 } | 35 } |
36 | 36 |
| 37 void clearAllSideEffects(HInstruction instruction) { |
| 38 instruction.sideEffects.clearAllSideEffects(); |
| 39 instruction.sideEffects.clearAllDependencies(); |
| 40 instruction.setUseGvn(); |
| 41 } |
| 42 |
37 Operation operation(ConstantSystem constantSystem) => null; | 43 Operation operation(ConstantSystem constantSystem) => null; |
38 | 44 |
39 static InvokeDynamicSpecializer lookupSpecializer(Selector selector) { | 45 static InvokeDynamicSpecializer lookupSpecializer(Selector selector) { |
40 if (selector.isIndex) { | 46 if (selector.isIndex) { |
41 return const IndexSpecializer(); | 47 return const IndexSpecializer(); |
42 } else if (selector.isIndexSet) { | 48 } else if (selector.isIndexSet) { |
43 return const IndexAssignSpecializer(); | 49 return const IndexAssignSpecializer(); |
44 } else if (selector.isOperator) { | 50 } else if (selector.isOperator) { |
45 if (selector.name == 'unary-') { | 51 if (selector.name == 'unary-') { |
46 return const UnaryNegateSpecializer(); | 52 return const UnaryNegateSpecializer(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 return const GreaterSpecializer(); | 84 return const GreaterSpecializer(); |
79 } else if (selector.name == '>=') { | 85 } else if (selector.name == '>=') { |
80 return const GreaterEqualSpecializer(); | 86 return const GreaterEqualSpecializer(); |
81 } | 87 } |
82 } else if (selector.isCall) { | 88 } else if (selector.isCall) { |
83 if (selector.argumentCount == 1 && selector.namedArguments.length == 0) { | 89 if (selector.argumentCount == 1 && selector.namedArguments.length == 0) { |
84 if (selector.name == 'codeUnitAt') { | 90 if (selector.name == 'codeUnitAt') { |
85 return const CodeUnitAtSpecializer(); | 91 return const CodeUnitAtSpecializer(); |
86 } | 92 } |
87 } | 93 } |
| 94 if (selector.argumentCount == 0 && selector.namedArguments.length == 0) { |
| 95 if (selector.name == 'round') { |
| 96 return const RoundSpecializer(); |
| 97 } |
| 98 } |
88 } | 99 } |
89 return const InvokeDynamicSpecializer(); | 100 return const InvokeDynamicSpecializer(); |
90 } | 101 } |
91 } | 102 } |
92 | 103 |
93 class IndexAssignSpecializer extends InvokeDynamicSpecializer { | 104 class IndexAssignSpecializer extends InvokeDynamicSpecializer { |
94 const IndexAssignSpecializer(); | 105 const IndexAssignSpecializer(); |
95 | 106 |
96 HInstruction tryConvertToBuiltin( | 107 HInstruction tryConvertToBuiltin( |
97 HInvokeDynamic instruction, Compiler compiler) { | 108 HInvokeDynamic instruction, Compiler compiler) { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 HInstruction builtin = newBuiltinVariant(instruction, compiler); | 223 HInstruction builtin = newBuiltinVariant(instruction, compiler); |
213 if (builtin != null) return builtin; | 224 if (builtin != null) return builtin; |
214 // Even if there is no builtin equivalent instruction, we know | 225 // Even if there is no builtin equivalent instruction, we know |
215 // the instruction does not have any side effect, and that it | 226 // the instruction does not have any side effect, and that it |
216 // can be GVN'ed. | 227 // can be GVN'ed. |
217 clearAllSideEffects(instruction); | 228 clearAllSideEffects(instruction); |
218 } | 229 } |
219 return null; | 230 return null; |
220 } | 231 } |
221 | 232 |
222 void clearAllSideEffects(HInstruction instruction) { | |
223 instruction.sideEffects.clearAllSideEffects(); | |
224 instruction.sideEffects.clearAllDependencies(); | |
225 instruction.setUseGvn(); | |
226 } | |
227 | |
228 bool inputsArePositiveIntegers(HInstruction instruction, Compiler compiler) { | 233 bool inputsArePositiveIntegers(HInstruction instruction, Compiler compiler) { |
229 HInstruction left = instruction.inputs[1]; | 234 HInstruction left = instruction.inputs[1]; |
230 HInstruction right = instruction.inputs[2]; | 235 HInstruction right = instruction.inputs[2]; |
231 return left.isPositiveIntegerOrNull(compiler) && | 236 return left.isPositiveIntegerOrNull(compiler) && |
232 right.isPositiveIntegerOrNull(compiler); | 237 right.isPositiveIntegerOrNull(compiler); |
233 } | 238 } |
234 | 239 |
235 bool inputsAreUInt31(HInstruction instruction, Compiler compiler) { | 240 bool inputsAreUInt31(HInstruction instruction, Compiler compiler) { |
236 HInstruction left = instruction.inputs[1]; | 241 HInstruction left = instruction.inputs[1]; |
237 HInstruction right = instruction.inputs[2]; | 242 HInstruction right = instruction.inputs[2]; |
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 return constantSystem.codeUnitAt; | 757 return constantSystem.codeUnitAt; |
753 } | 758 } |
754 | 759 |
755 HInstruction tryConvertToBuiltin( | 760 HInstruction tryConvertToBuiltin( |
756 HInvokeDynamic instruction, Compiler compiler) { | 761 HInvokeDynamic instruction, Compiler compiler) { |
757 // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index | 762 // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index |
758 // bounds checking optimizations as for HIndex. | 763 // bounds checking optimizations as for HIndex. |
759 return null; | 764 return null; |
760 } | 765 } |
761 } | 766 } |
| 767 |
| 768 class RoundSpecializer extends InvokeDynamicSpecializer { |
| 769 const RoundSpecializer(); |
| 770 |
| 771 UnaryOperation operation(ConstantSystem constantSystem) { |
| 772 return constantSystem.round; |
| 773 } |
| 774 |
| 775 HInstruction tryConvertToBuiltin( |
| 776 HInvokeDynamic instruction, Compiler compiler) { |
| 777 HInstruction receiver = instruction.getDartReceiver(compiler); |
| 778 if (receiver.isNumberOrNull(compiler)) { |
| 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. |
| 781 clearAllSideEffects(instruction); |
| 782 } |
| 783 return null; |
| 784 } |
| 785 } |
OLD | NEW |