Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart

Issue 2400853003: dart2js: Constant fold num.round() (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698