Fix class inliner error when singleton instance flows to static invoke
Bug: 160942326
Change-Id: If7ee1996c00f914c49e914fd3917c73ab48fedbb
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 3824962..acd7477 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -1222,8 +1222,9 @@
if (root.isStaticGet()) {
// If we are class inlining a singleton instance from a static-get, then we don't know
- // the value of the fields.
- if (parameterUsage.hasFieldRead) {
+ // the value of the fields, and we also can't optimize away instance-field assignments, as
+ // they have global side effects.
+ if (parameterUsage.hasFieldAssignment || parameterUsage.hasFieldRead) {
return false;
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningWithStaticEscapeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningWithStaticEscapeTest.java
index c87e0b0..681f958 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningWithStaticEscapeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningWithStaticEscapeTest.java
@@ -4,9 +4,7 @@
package com.android.tools.r8.ir.optimize.classinliner;
-import static org.junit.Assert.fail;
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -31,17 +29,14 @@
@Test
public void test() throws Exception {
- try {
- testForR8(parameters.getBackend())
- .addInnerClasses(StatefulSingletonClassInliningWithStaticEscapeTest.class)
- .addKeepMainRule(TestClass.class)
- .enableInliningAnnotations()
- .setMinApi(parameters.getApiLevel())
- .compile();
- fail();
- } catch (CompilationFailedException e) {
- // TODO(b/160942326): Fix class inliner.
- }
+ testForR8(parameters.getBackend())
+ .addInnerClasses(StatefulSingletonClassInliningWithStaticEscapeTest.class)
+ .addKeepMainRule(TestClass.class)
+ .enableInliningAnnotations()
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutputLines("true");
}
static class TestClass {