| Index: runtime/vm/intermediate_language.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language.cc (revision 28802)
|
| +++ runtime/vm/intermediate_language.cc (working copy)
|
| @@ -1528,10 +1528,39 @@
|
| }
|
|
|
|
|
| +static bool MayBeBoxableNumber(intptr_t cid) {
|
| + return (cid == kDynamicCid) ||
|
| + (cid == kMintCid) ||
|
| + (cid == kBigintCid) ||
|
| + (cid == kDoubleCid);
|
| +}
|
| +
|
| +
|
| +static bool MaybeNumber(CompileType* type) {
|
| + ASSERT(Type::Handle(Type::Number()).IsMoreSpecificThan(
|
| + Type::Handle(Type::Number()), NULL));
|
| + return type->ToAbstractType()->IsDynamicType()
|
| + || type->IsMoreSpecificThan(Type::Handle(Type::Number()));
|
| +}
|
| +
|
| +
|
| // Returns a replacement for a strict comparison and signals if the result has
|
| // to be negated.
|
| static Definition* CanonicalizeStrictCompare(StrictCompareInstr* compare,
|
| bool* negated) {
|
| + // Use propagated cid and type information to eliminate number checks.
|
| + // If one of the inputs is not a boxable number (Mint, Double, Bigint), or
|
| + // is not a subtype of num, no need for number checks.
|
| + if (compare->needs_number_check()) {
|
| + if (!MayBeBoxableNumber(compare->left()->Type()->ToCid()) ||
|
| + !MayBeBoxableNumber(compare->right()->Type()->ToCid())) {
|
| + compare->set_needs_number_check(false);
|
| + } else if (!MaybeNumber(compare->left()->Type()) ||
|
| + !MaybeNumber(compare->right()->Type())) {
|
| + compare->set_needs_number_check(false);
|
| + }
|
| + }
|
| +
|
| *negated = false;
|
| Object& constant = Object::Handle();
|
| Value* other = NULL;
|
|
|