Don't inline unresolved invokes
Bug: 280354288
Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b
Change-Id: I1652d3f310791036da5ae6ea36266ecb89aaa080
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index 59d6c7f..91be79f 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -2026,8 +2026,10 @@
if (current->IsUnresolvedStaticFieldGet() ||
current->IsUnresolvedInstanceFieldGet() ||
current->IsUnresolvedStaticFieldSet() ||
- current->IsUnresolvedInstanceFieldSet()) {
- // Entrypoint for unresolved fields does not handle inlined frames.
+ current->IsUnresolvedInstanceFieldSet() ||
+ current->IsInvokeUnresolved()) {
+ // Unresolved invokes / field accesses are expensive at runtime when decoding inlining info,
+ // so don't inline methods that have them.
LOG_FAIL(stats_, MethodCompilationStat::kNotInlinedUnresolvedEntrypoint)
<< "Method " << resolved_method->PrettyMethod()
<< " could not be inlined because it is using an unresolved"
diff --git a/test/675-checker-unverified-method/smali/TestCase.smali b/test/675-checker-unverified-method/smali/TestCase.smali
index a1b89cb..cd9ed1e 100644
--- a/test/675-checker-unverified-method/smali/TestCase.smali
+++ b/test/675-checker-unverified-method/smali/TestCase.smali
@@ -19,7 +19,7 @@
#
## CHECK-START: void TestCase.foo(java.lang.Object) inliner (after)
## CHECK-DAG: InvokeStaticOrDirect method_name:TestCase.bar always_throws:true
-## CHECK-NOT: InvokeStaticOrDirect method_name:TestCase.bad
+## CHECK-DAG: InvokeStaticOrDirect method_name:TestCase.bad
.method public static foo(Ljava/lang/Object;)V
.registers 1
if-nez v0, :Skip1