Index: pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart |
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart |
index 463c31cfcd2009aff40c5abe25a0efda59d616c4..8bcca400dc94960fa7d885c62b801651f2c6362b 100644 |
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart |
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart |
@@ -34,6 +34,12 @@ class InvokeDynamicSpecializer { |
return null; |
} |
+ void clearAllSideEffects(HInstruction instruction) { |
+ instruction.sideEffects.clearAllSideEffects(); |
+ instruction.sideEffects.clearAllDependencies(); |
+ instruction.setUseGvn(); |
+ } |
+ |
Operation operation(ConstantSystem constantSystem) => null; |
static InvokeDynamicSpecializer lookupSpecializer(Selector selector) { |
@@ -85,6 +91,11 @@ class InvokeDynamicSpecializer { |
return const CodeUnitAtSpecializer(); |
} |
} |
+ if (selector.argumentCount == 0 && selector.namedArguments.length == 0) { |
+ if (selector.name == 'round') { |
+ return const RoundSpecializer(); |
+ } |
+ } |
} |
return const InvokeDynamicSpecializer(); |
} |
@@ -219,12 +230,6 @@ abstract class BinaryArithmeticSpecializer extends InvokeDynamicSpecializer { |
return null; |
} |
- void clearAllSideEffects(HInstruction instruction) { |
- instruction.sideEffects.clearAllSideEffects(); |
- instruction.sideEffects.clearAllDependencies(); |
- instruction.setUseGvn(); |
- } |
- |
bool inputsArePositiveIntegers(HInstruction instruction, Compiler compiler) { |
HInstruction left = instruction.inputs[1]; |
HInstruction right = instruction.inputs[2]; |
@@ -759,3 +764,22 @@ class CodeUnitAtSpecializer extends InvokeDynamicSpecializer { |
return null; |
} |
} |
+ |
+class RoundSpecializer extends InvokeDynamicSpecializer { |
+ const RoundSpecializer(); |
+ |
+ UnaryOperation operation(ConstantSystem constantSystem) { |
+ return constantSystem.round; |
+ } |
+ |
+ HInstruction tryConvertToBuiltin( |
+ HInvokeDynamic instruction, Compiler compiler) { |
+ HInstruction receiver = instruction.getDartReceiver(compiler); |
+ if (receiver.isNumberOrNull(compiler)) { |
+ // Even if there is no builtin equivalent instruction, we know the |
+ // instruction does not have any side effect, and that it can be GVN'ed. |
+ clearAllSideEffects(instruction); |
+ } |
+ return null; |
+ } |
+} |