summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
author Andreas Gampe <agampe@google.com> 2016-01-05 18:28:58 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-01-05 18:28:58 +0000
commit1e086c6474bdc5315b9baaf3a316624a058b8ff2 (patch)
treea3bca4f5ed222574999e9ef1c5dedc0ffed264d0 /compiler/optimizing
parent802207cbe3a39a89bcdfe687897711e0c8eb9f29 (diff)
parentfd2140f815bd173c9d399b2b012ea6d0075e77fa (diff)
Merge "ART: Make opt inliner a little bit cleaner/faster"
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/inliner.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index 7c2b8bc855..48d32999b7 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -226,6 +226,7 @@ bool HInliner::TryInline(HInvoke* invoke_instruction) {
ClassLinker* class_linker = caller_compilation_unit_.GetClassLinker();
// We can query the dex cache directly. The verifier has populated it already.
ArtMethod* resolved_method;
+ ArtMethod* actual_method = nullptr;
if (invoke_instruction->IsInvokeStaticOrDirect()) {
if (invoke_instruction->AsInvokeStaticOrDirect()->IsStringInit()) {
VLOG(compiler) << "Not inlining a String.<init> method";
@@ -237,9 +238,15 @@ bool HInliner::TryInline(HInvoke* invoke_instruction) {
: class_linker->FindDexCache(soa.Self(), *ref.dex_file);
resolved_method = dex_cache->GetResolvedMethod(
ref.dex_method_index, class_linker->GetImagePointerSize());
+ // actual_method == resolved_method for direct or static calls.
+ actual_method = resolved_method;
} else {
resolved_method = caller_compilation_unit_.GetDexCache().Get()->GetResolvedMethod(
method_index, class_linker->GetImagePointerSize());
+ if (resolved_method != nullptr) {
+ // Check if we can statically find the method.
+ actual_method = FindVirtualOrInterfaceTarget(invoke_instruction, resolved_method);
+ }
}
if (resolved_method == nullptr) {
@@ -249,15 +256,10 @@ bool HInliner::TryInline(HInvoke* invoke_instruction) {
return false;
}
- if (invoke_instruction->IsInvokeStaticOrDirect()) {
- return TryInline(invoke_instruction, resolved_method);
- }
-
- // Check if we can statically find the method.
- ArtMethod* actual_method = FindVirtualOrInterfaceTarget(invoke_instruction, resolved_method);
if (actual_method != nullptr) {
return TryInline(invoke_instruction, actual_method);
}
+ DCHECK(!invoke_instruction->IsInvokeStaticOrDirect());
// Check if we can use an inline cache.
ArtMethod* caller = graph_->GetArtMethod();