diff options
Diffstat (limited to 'compiler/optimizing/inliner.cc')
-rw-r--r-- | compiler/optimizing/inliner.cc | 38 |
1 files changed, 9 insertions, 29 deletions
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 8ee04dd396..c67b2d5fe9 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -750,35 +750,7 @@ bool HInliner::TryInlinePolymorphicCallToSameTarget(HInvoke* invoke_instruction, bool HInliner::TryInlineAndReplace(HInvoke* invoke_instruction, ArtMethod* method, bool do_rtp) { HInstruction* return_replacement = nullptr; if (!TryBuildAndInline(invoke_instruction, method, &return_replacement)) { - if (invoke_instruction->IsInvokeInterface()) { - // Turn an invoke-interface into an invoke-virtual. An invoke-virtual is always - // better than an invoke-interface because: - // 1) In the best case, the interface call has one more indirection (to fetch the IMT). - // 2) We will not go to the conflict trampoline with an invoke-virtual. - // TODO: Consider sharpening once it is not dependent on the compiler driver. - HInvokeVirtual* new_invoke = new (graph_->GetArena()) HInvokeVirtual( - graph_->GetArena(), - invoke_instruction->GetNumberOfArguments(), - invoke_instruction->GetType(), - invoke_instruction->GetDexPc(), - invoke_instruction->GetDexMethodIndex(), - method->GetMethodIndex()); - HInputsRef inputs = invoke_instruction->GetInputs(); - size_t index = 0; - for (HInstruction* instr : inputs) { - new_invoke->SetArgumentAt(index++, instr); - } - invoke_instruction->GetBlock()->InsertInstructionBefore(new_invoke, invoke_instruction); - new_invoke->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); - if (invoke_instruction->GetType() == Primitive::kPrimNot) { - new_invoke->SetReferenceTypeInfo(invoke_instruction->GetReferenceTypeInfo()); - } - return_replacement = new_invoke; - } else { - // TODO: Consider sharpening an invoke virtual once it is not dependent on the - // compiler driver. - return false; - } + return false; } if (return_replacement != nullptr) { invoke_instruction->ReplaceWith(return_replacement); @@ -1267,6 +1239,14 @@ bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, return false; } + if (current->IsInvokeInterface()) { + // Disable inlining of interface calls. The cost in case of entering the + // resolution conflict is currently too high. + VLOG(compiler) << "Method " << PrettyMethod(method_index, callee_dex_file) + << " could not be inlined because it has an interface call."; + return false; + } + if (!same_dex_file && current->NeedsEnvironment()) { VLOG(compiler) << "Method " << PrettyMethod(method_index, callee_dex_file) << " could not be inlined because " << current->DebugName() |