| Index: runtime/vm/aot_optimizer.cc
|
| diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
|
| index 1e72f79a3fd18575d1d53bed32e109855651a3ec..c39f74c88523fa12516a60d60113924011f46102 100644
|
| --- a/runtime/vm/aot_optimizer.cc
|
| +++ b/runtime/vm/aot_optimizer.cc
|
| @@ -1311,40 +1311,6 @@ RawField* AotOptimizer::GetField(intptr_t class_id,
|
| }
|
|
|
|
|
| -// Use CHA to determine if the call needs a class check: if the callee's
|
| -// receiver is the same as the caller's receiver and there are no overriden
|
| -// callee functions, then no class check is needed.
|
| -bool AotOptimizer::InstanceCallNeedsClassCheck(
|
| - InstanceCallInstr* call, RawFunction::Kind kind) const {
|
| - if (!FLAG_use_cha_deopt && !isolate()->all_classes_finalized()) {
|
| - // Even if class or function are private, lazy class finalization
|
| - // may later add overriding methods.
|
| - return true;
|
| - }
|
| - Definition* callee_receiver = call->ArgumentAt(0);
|
| - ASSERT(callee_receiver != NULL);
|
| - const Function& function = flow_graph_->function();
|
| - if (function.IsDynamicFunction() &&
|
| - callee_receiver->IsParameter() &&
|
| - (callee_receiver->AsParameter()->index() == 0)) {
|
| - const String& name = (kind == RawFunction::kMethodExtractor)
|
| - ? String::Handle(Z, Field::NameFromGetter(call->function_name()))
|
| - : call->function_name();
|
| - const Class& cls = Class::Handle(Z, function.Owner());
|
| - if (!thread()->cha()->HasOverride(cls, name)) {
|
| - if (FLAG_trace_cha) {
|
| - THR_Print(" **(CHA) Instance call needs no check, "
|
| - "no overrides of '%s' '%s'\n",
|
| - name.ToCString(), cls.ToCString());
|
| - }
|
| - thread()->cha()->AddToLeafClasses(cls);
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -
|
| bool AotOptimizer::InlineImplicitInstanceGetter(InstanceCallInstr* call) {
|
| ASSERT(call->HasICData());
|
| const ICData& ic_data = *call->ic_data();
|
| @@ -1359,7 +1325,8 @@ bool AotOptimizer::InlineImplicitInstanceGetter(InstanceCallInstr* call) {
|
| Field::ZoneHandle(Z, GetField(class_ids[0], field_name));
|
| ASSERT(!field.IsNull());
|
|
|
| - if (InstanceCallNeedsClassCheck(call, RawFunction::kImplicitGetter)) {
|
| + if (flow_graph()->InstanceCallNeedsClassCheck(
|
| + call, RawFunction::kImplicitGetter)) {
|
| return false;
|
| }
|
| LoadFieldInstr* load = new(Z) LoadFieldInstr(
|
| @@ -2470,7 +2437,8 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
|
| if (has_one_target) {
|
| RawFunction::Kind function_kind =
|
| Function::Handle(Z, unary_checks.GetTargetAt(0)).kind();
|
| - if (!InstanceCallNeedsClassCheck(instr, function_kind)) {
|
| + if (!flow_graph()->InstanceCallNeedsClassCheck(
|
| + instr, function_kind)) {
|
| PolymorphicInstanceCallInstr* call =
|
| new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
|
| /* with_checks = */ false);
|
| @@ -2771,7 +2739,8 @@ bool AotOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
|
| Field::ZoneHandle(Z, GetField(class_id, field_name));
|
| ASSERT(!field.IsNull());
|
|
|
| - if (InstanceCallNeedsClassCheck(instr, RawFunction::kImplicitSetter)) {
|
| + if (flow_graph()->InstanceCallNeedsClassCheck(
|
| + instr, RawFunction::kImplicitSetter)) {
|
| return false;
|
| }
|
|
|
|
|