| Index: runtime/vm/intermediate_language.cc
|
| diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
|
| index 66abf754d28d3cf98448c14da174d22f91bc6f49..4704219e55303d585104b9f0a3d9b964f0f0a7c6 100644
|
| --- a/runtime/vm/intermediate_language.cc
|
| +++ b/runtime/vm/intermediate_language.cc
|
| @@ -3110,6 +3110,8 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| }
|
| }
|
| #else
|
| + call_ic_data = &ICData::ZoneHandle(call_ic_data->Original());
|
| +
|
| // Emit smi fast path instruction. If fast-path succeeds it skips the next
|
| // instruction otherwise it falls through.
|
| if (function_name().raw() == Symbols::Plus().raw()) {
|
| @@ -3131,13 +3133,18 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data);
|
| switch (call_ic_data->NumArgsTested()) {
|
| case 1:
|
| - __ InstanceCall(ArgumentCount(), call_ic_data_kidx);
|
| + if (compiler->is_optimizing()) {
|
| + __ InstanceCall1Opt(ArgumentCount(), call_ic_data_kidx);
|
| + } else {
|
| + __ InstanceCall1(ArgumentCount(), call_ic_data_kidx);
|
| + }
|
| break;
|
| case 2:
|
| - __ InstanceCall2(ArgumentCount(), call_ic_data_kidx);
|
| - break;
|
| - case 3:
|
| - __ InstanceCall3(ArgumentCount(), call_ic_data_kidx);
|
| + if (compiler->is_optimizing()) {
|
| + __ InstanceCall2Opt(ArgumentCount(), call_ic_data_kidx);
|
| + } else {
|
| + __ InstanceCall2(ArgumentCount(), call_ic_data_kidx);
|
| + }
|
| break;
|
| default:
|
| UNIMPLEMENTED();
|
| @@ -3146,6 +3153,11 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| compiler->AddCurrentDescriptor(RawPcDescriptors::kIcCall,
|
| deopt_id(),
|
| token_pos());
|
| + compiler->RecordAfterCall(this);
|
| +
|
| + if (compiler->is_optimizing()) {
|
| + __ PopLocal(locs()->out(0).reg());
|
| + }
|
| #endif // !defined(TARGET_ARCH_DBC)
|
| }
|
|
|
| @@ -3252,6 +3264,12 @@ void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| compiler->AddCurrentDescriptor(RawPcDescriptors::kUnoptStaticCall,
|
| deopt_id(),
|
| token_pos());
|
| +
|
| + compiler->RecordAfterCall(this);
|
| +
|
| + if (compiler->is_optimizing()) {
|
| + __ PopLocal(locs()->out(0).reg());
|
| + }
|
| #endif // !defined(TARGET_ARCH_DBC)
|
| }
|
|
|
| @@ -3266,7 +3284,10 @@ void AssertAssignableInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| // DBC does not use LocationSummaries in the same way as other architectures.
|
| #if !defined(TARGET_ARCH_DBC)
|
| ASSERT(locs()->in(0).reg() == locs()->out(0).reg());
|
| -#endif
|
| +#else
|
| + ASSERT(!compiler->is_optimizing() ||
|
| + (locs()->in(0).reg() == locs()->out(0).reg()));
|
| +#endif // !defined(TARGET_ARCH_DBC)
|
| }
|
|
|
|
|
|
|