Index: runtime/vm/jit_optimizer.cc |
diff --git a/runtime/vm/jit_optimizer.cc b/runtime/vm/jit_optimizer.cc |
index fb6ee1d43be1d01be334cbb573a14b2f57af868e..e69a8c3ce19a5fcab2020a4e60acd4d321c760fb 100644 |
--- a/runtime/vm/jit_optimizer.cc |
+++ b/runtime/vm/jit_optimizer.cc |
@@ -199,9 +199,6 @@ void JitOptimizer::SpecializePolymorphicInstanceCall( |
// Specialization adds receiver checks which can lead to deoptimization. |
return; |
} |
- if (!call->with_checks()) { |
- return; // Already specialized. |
- } |
const intptr_t receiver_cid = |
call->PushArgumentAt(0)->value()->Type()->ToCid(); |
@@ -220,11 +217,9 @@ void JitOptimizer::SpecializePolymorphicInstanceCall( |
return; |
} |
- const bool with_checks = false; |
- const bool complete = false; |
- PolymorphicInstanceCallInstr* specialized = |
- new (Z) PolymorphicInstanceCallInstr(call->instance_call(), *targets, |
- with_checks, complete); |
+ ASSERT(targets->HasSingleTarget()); |
+ const Function& target = targets->FirstTarget(); |
+ StaticCallInstr* specialized = StaticCallInstr::FromCall(Z, call, target); |
call->ReplaceWith(specialized, current_iterator()); |
} |
@@ -1531,10 +1526,7 @@ void JitOptimizer::VisitInstanceCall(InstanceCallInstr* instr) { |
const Function& target = Function::Handle(Z, unary_checks.GetTargetAt(0)); |
const RawFunction::Kind function_kind = target.kind(); |
if (!flow_graph()->InstanceCallNeedsClassCheck(instr, function_kind)) { |
- PolymorphicInstanceCallInstr* call = |
- new (Z) PolymorphicInstanceCallInstr(instr, *targets, |
- /* call_with_checks = */ false, |
- /* complete = */ false); |
+ StaticCallInstr* call = StaticCallInstr::FromCall(Z, instr, target); |
instr->ReplaceWith(call, current_iterator()); |
return; |
} |
@@ -1550,7 +1542,6 @@ void JitOptimizer::VisitInstanceCall(InstanceCallInstr* instr) { |
// very polymorphic sites we don't make this optimization, keeping it as a |
// regular checked PolymorphicInstanceCall, which falls back to the slow but |
// non-deopting megamorphic call stub when it sees new receiver classes. |
- bool call_with_checks; |
if (has_one_target && FLAG_polymorphic_with_deopt && |
(!instr->ic_data()->HasDeoptReason(ICData::kDeoptCheckClass) || |
unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks)) { |
@@ -1559,14 +1550,15 @@ void JitOptimizer::VisitInstanceCall(InstanceCallInstr* instr) { |
// array, not the IC array. |
AddReceiverCheck(instr); |
// Call can still deoptimize, do not detach environment from instr. |
- call_with_checks = false; |
+ const Function& target = Function::Handle(Z, unary_checks.GetTargetAt(0)); |
+ StaticCallInstr* call = StaticCallInstr::FromCall(Z, instr, target); |
+ instr->ReplaceWith(call, current_iterator()); |
} else { |
- call_with_checks = true; |
+ PolymorphicInstanceCallInstr* call = |
+ new (Z) PolymorphicInstanceCallInstr(instr, *targets, |
+ /* complete = */ false); |
+ instr->ReplaceWith(call, current_iterator()); |
} |
- PolymorphicInstanceCallInstr* call = |
- new (Z) PolymorphicInstanceCallInstr(instr, *targets, call_with_checks, |
- /* complete = */ false); |
- instr->ReplaceWith(call, current_iterator()); |
} |