Eliminated aggressive inlining removing access problems. BUG= Change-Id: Ieebb6faba5967329a720af1e9041493caca1781f
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java index 8b86ca8..e21b00a 100644 --- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java +++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -3,6 +3,11 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.graph; +import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_INLINING_CANDIDATE_PACKAGE_PRIVATE; +import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_INLINING_CANDIDATE_PRIVATE; +import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_INLINING_CANDIDATE_PUBLIC; +import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_NOT_INLINING_CANDIDATE; + import com.android.tools.r8.code.Const; import com.android.tools.r8.code.ConstString; import com.android.tools.r8.code.ConstStringJumbo; @@ -90,19 +95,23 @@ } } + public boolean isPublicInlining() { + return compilationState == PROCESSED_INLINING_CANDIDATE_PUBLIC; + } + public void markProcessed(InliningConstraint state) { switch (state) { case ALWAYS: - compilationState = CompilationState.PROCESSED_INLINING_CANDIDATE_PUBLIC; + compilationState = PROCESSED_INLINING_CANDIDATE_PUBLIC; break; case PACKAGE: - compilationState = CompilationState.PROCESSED_INLINING_CANDIDATE_PACKAGE_PRIVATE; + compilationState = PROCESSED_INLINING_CANDIDATE_PACKAGE_PRIVATE; break; case PRIVATE: - compilationState = CompilationState.PROCESSED_INLINING_CANDIDATE_PRIVATE; + compilationState = PROCESSED_INLINING_CANDIDATE_PRIVATE; break; case NEVER: - compilationState = CompilationState.PROCESSED_NOT_INLINING_CANDIDATE; + compilationState = PROCESSED_NOT_INLINING_CANDIDATE; break; } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java index e93f3a5..ba1e0e9 100644 --- a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java +++ b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
@@ -49,9 +49,6 @@ DexEncodedField target = info.lookupInstanceTarget(fieldHolder, field); DexClass fieldClass = info.definitionFor(fieldHolder); if ((target != null) && (fieldClass != null) && !fieldClass.isLibraryClass()) { - if (isInstanceGet() || isInstancePut()) { - return Inliner.InliningConstraint.PRIVATE; - } DexAccessFlags flags = target.accessFlags; if (flags.isPublic()) { return Inliner.InliningConstraint.ALWAYS;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java index bc9b95e..f677637 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -257,6 +257,12 @@ if (target.accessFlags.isConstructor() && !legalConstructorInline(method, inlinee)) { continue; } + // Ensure the container is compatible with the target. + if (!forceInline + && !result.target.isPublicInlining() + && (method.method.getHolder() != result.target.method.getHolder())) { + continue; + } DexType downcast = null; if (invoke.isInvokeMethodWithReceiver()) { // If the invoke has a receiver but the declared method holder is different
diff --git a/src/test/examples/shaking1/print-mapping.ref b/src/test/examples/shaking1/print-mapping.ref index d9e7f7b..8382304 100644 --- a/src/test/examples/shaking1/print-mapping.ref +++ b/src/test/examples/shaking1/print-mapping.ref
@@ -1,3 +1,4 @@ shaking1.Shaking -> shaking1.Shaking: shaking1.Used -> shaking1.a: java.lang.String name -> a + java.lang.String method() -> a