| Index: runtime/vm/aot_optimizer.cc
|
| diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
|
| index 2ecb667c800ebbf5198f4ed20e87779038858e74..cf4d90ca198338ff54cbfcf59e977e9405e62e43 100644
|
| --- a/runtime/vm/aot_optimizer.cc
|
| +++ b/runtime/vm/aot_optimizer.cc
|
| @@ -1443,10 +1443,6 @@ static bool TryExpandTestCidsResult(ZoneGrowableArray<intptr_t>* results,
|
| return true; // May deoptimize since we have not identified all 'true' tests.
|
| }
|
|
|
| -// Tells whether the function of the call matches the core private name.
|
| -static bool matches_core(InstanceCallInstr* call, const String& name) {
|
| - return call->function_name().raw() == Library::PrivateCoreLibName(name).raw();
|
| -}
|
|
|
| // TODO(srdjan): Use ICData to check if always true or false.
|
| void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
|
| @@ -1454,39 +1450,13 @@ void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
|
| Definition* left = call->ArgumentAt(0);
|
| Definition* type_args = NULL;
|
| AbstractType& type = AbstractType::ZoneHandle(Z);
|
| - bool negate = false;
|
| if (call->ArgumentCount() == 2) {
|
| type_args = flow_graph()->constant_null();
|
| - if (matches_core(call, Symbols::_simpleInstanceOf())) {
|
| - type =
|
| - AbstractType::Cast(call->ArgumentAt(1)->AsConstant()->value()).raw();
|
| - negate = false; // Just to be sure.
|
| - } else {
|
| - if (matches_core(call, Symbols::_instanceOfNum())) {
|
| - type = Type::Number();
|
| - } else if (matches_core(call, Symbols::_instanceOfInt())) {
|
| - type = Type::IntType();
|
| - } else if (matches_core(call, Symbols::_instanceOfSmi())) {
|
| - type = Type::SmiType();
|
| - } else if (matches_core(call, Symbols::_instanceOfDouble())) {
|
| - type = Type::Double();
|
| - } else if (matches_core(call, Symbols::_instanceOfString())) {
|
| - type = Type::StringType();
|
| - } else {
|
| - UNIMPLEMENTED();
|
| - }
|
| - negate =
|
| - Bool::Cast(
|
| - call->ArgumentAt(1)->OriginalDefinition()->AsConstant()->value())
|
| - .value();
|
| - }
|
| + ASSERT(call->MatchesCoreName(Symbols::_simpleInstanceOf()));
|
| + type = AbstractType::Cast(call->ArgumentAt(1)->AsConstant()->value()).raw();
|
| } else {
|
| type_args = call->ArgumentAt(1);
|
| type = AbstractType::Cast(call->ArgumentAt(2)->AsConstant()->value()).raw();
|
| - negate =
|
| - Bool::Cast(
|
| - call->ArgumentAt(3)->OriginalDefinition()->AsConstant()->value())
|
| - .value();
|
| }
|
|
|
| if (TypeCheckAsClassEquality(type)) {
|
| @@ -1496,10 +1466,10 @@ void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
|
| ConstantInstr* cid =
|
| flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(type_cid)));
|
|
|
| - StrictCompareInstr* check_cid = new (Z) StrictCompareInstr(
|
| - call->token_pos(), negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
|
| - new (Z) Value(left_cid), new (Z) Value(cid),
|
| - false); // No number check.
|
| + StrictCompareInstr* check_cid =
|
| + new (Z) StrictCompareInstr(call->token_pos(), Token::kEQ_STRICT,
|
| + new (Z) Value(left_cid), new (Z) Value(cid),
|
| + false); // No number check.
|
| ReplaceCall(call, check_cid);
|
| return;
|
| }
|
| @@ -1535,8 +1505,7 @@ void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
|
|
|
| const Library& dart_internal =
|
| Library::Handle(Z, Library::InternalLibrary());
|
| - const String& target_name = negate ? Symbols::_classRangeCheckNegative()
|
| - : Symbols::_classRangeCheck();
|
| + const String& target_name = Symbols::_classRangeCheck();
|
| const Function& target = Function::ZoneHandle(
|
| Z, dart_internal.LookupFunctionAllowPrivate(target_name));
|
| ASSERT(!target.IsNull());
|
| @@ -1571,19 +1540,18 @@ void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
|
| // Guard against repeated speculative inlining.
|
| return;
|
| }
|
| - TestCidsInstr* test_cids = new (Z)
|
| - TestCidsInstr(call->token_pos(), negate ? Token::kISNOT : Token::kIS,
|
| - new (Z) Value(left), *results,
|
| - can_deopt ? call->deopt_id() : Thread::kNoDeoptId);
|
| + TestCidsInstr* test_cids = new (Z) TestCidsInstr(
|
| + call->token_pos(), Token::kIS, new (Z) Value(left), *results,
|
| + can_deopt ? call->deopt_id() : Thread::kNoDeoptId);
|
| // Remove type.
|
| ReplaceCall(call, test_cids);
|
| return;
|
| }
|
| }
|
|
|
| - InstanceOfInstr* instance_of = new (Z)
|
| - InstanceOfInstr(call->token_pos(), new (Z) Value(left),
|
| - new (Z) Value(type_args), type, negate, call->deopt_id());
|
| + InstanceOfInstr* instance_of =
|
| + new (Z) InstanceOfInstr(call->token_pos(), new (Z) Value(left),
|
| + new (Z) Value(type_args), type, call->deopt_id());
|
| ReplaceCall(call, instance_of);
|
| }
|
|
|
|
|