Flush optimization info after staticizing.
Bug: 141457484
Change-Id: I5f9daa04d3c6e2f017b84690f7f3594dc0c22e21
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 7e15e72..7989ddf 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -706,6 +706,7 @@
if (!options.isGeneratingClassFiles()) {
printPhase("Class staticizer post processing");
staticizeClasses(feedback, executorService);
+ feedback.updateVisibleOptimizationInfo();
}
// Build a new application with jumbo string info.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index f0c6a78..99d27fa 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -65,7 +65,7 @@
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
// TODO(b/112831361): support for class staticizer in CF backend.
- return getTestParameters().withDexRuntimes().build();
+ return getTestParameters().withDexRuntimes().withAllApiLevels().build();
}
public ClassStaticizerTest(TestParameters parameters) {
@@ -95,7 +95,7 @@
.addKeepRules("-keepattributes InnerClasses,EnclosingMethod")
.addOptionsModification(this::configure)
.allowAccessModification()
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), main)
.assertSuccessWithOutput(javaOutput);
@@ -109,7 +109,9 @@
"STATIC: String trivial.TrivialTestClass.next()"),
references(clazz, "testSimple", "void"));
- assertTrue(instanceMethods(inspector.clazz(Simple.class)).isEmpty());
+ ClassSubject simple = inspector.clazz(Simple.class);
+ assertTrue(instanceMethods(simple).isEmpty());
+ assertThat(simple.clinit(), not(isPresent()));
assertEquals(
Lists.newArrayList(
@@ -119,7 +121,9 @@
"STATIC: String trivial.TrivialTestClass.next()"),
references(clazz, "testSimpleWithPhi", "void", "int"));
- assertTrue(instanceMethods(inspector.clazz(SimpleWithPhi.class)).isEmpty());
+ ClassSubject simpleWithPhi = inspector.clazz(SimpleWithPhi.class);
+ assertTrue(instanceMethods(simpleWithPhi).isEmpty());
+ assertThat(simpleWithPhi.clinit(), not(isPresent()));
assertEquals(
Lists.newArrayList(
@@ -128,7 +132,9 @@
"STATIC: String trivial.TrivialTestClass.next()"),
references(clazz, "testSimpleWithParams", "void"));
- assertTrue(instanceMethods(inspector.clazz(SimpleWithParams.class)).isEmpty());
+ ClassSubject simpleWithParams = inspector.clazz(SimpleWithParams.class);
+ assertTrue(instanceMethods(simpleWithParams).isEmpty());
+ assertThat(simpleWithParams.clinit(), not(isPresent()));
assertEquals(
Lists.newArrayList(
@@ -139,7 +145,10 @@
"trivial.SimpleWithSideEffects trivial.SimpleWithSideEffects.INSTANCE"),
references(clazz, "testSimpleWithSideEffects", "void"));
- assertTrue(instanceMethods(inspector.clazz(SimpleWithSideEffects.class)).isEmpty());
+ ClassSubject simpleWithSideEffects = inspector.clazz(SimpleWithSideEffects.class);
+ assertTrue(instanceMethods(simpleWithSideEffects).isEmpty());
+ // As its name implies, its clinit has side effects.
+ assertThat(simpleWithSideEffects.clinit(), isPresent());
// TODO(b/111832046): add support for singleton instance getters.
assertEquals(
@@ -151,7 +160,9 @@
"trivial.SimpleWithGetter trivial.SimpleWithGetter.INSTANCE"),
references(clazz, "testSimpleWithGetter", "void"));
- assertFalse(instanceMethods(inspector.clazz(SimpleWithGetter.class)).isEmpty());
+ ClassSubject simpleWithGetter = inspector.clazz(SimpleWithGetter.class);
+ assertFalse(instanceMethods(simpleWithGetter).isEmpty());
+ assertThat(simpleWithGetter.clinit(), isPresent());
}
@Test
@@ -172,7 +183,7 @@
.allowAccessModification()
.noMinification()
.addOptionsModification(this::configure)
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), main);
CodeInspector inspector = result.inspector();
@@ -182,7 +193,7 @@
Lists.newArrayList(),
references(clazz, "testOk_fieldOnly", "void"));
- assertFalse(inspector.clazz(CandidateOkFieldOnly.class).isPresent());
+ assertThat(inspector.clazz(CandidateOkFieldOnly.class), not(isPresent()));
}
@Test
@@ -210,7 +221,7 @@
.allowAccessModification()
.noMinification()
.addOptionsModification(this::configure)
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), main)
.assertSuccessWithOutput(javaOutput);
@@ -226,7 +237,7 @@
"STATIC: void movetohost.HostOk.blah(String)"),
references(clazz, "testOk", "void"));
- assertFalse(inspector.clazz(CandidateOk.class).isPresent());
+ assertThat(inspector.clazz(CandidateOk.class), not(isPresent()));
assertEquals(
Lists.newArrayList(
@@ -237,7 +248,7 @@
"movetohost.HostOkSideEffects movetohost.HostOkSideEffects.INSTANCE"),
references(clazz, "testOkSideEffects", "void"));
- assertFalse(inspector.clazz(CandidateOkSideEffects.class).isPresent());
+ assertThat(inspector.clazz(CandidateOkSideEffects.class), not(isPresent()));
assertEquals(
Lists.newArrayList(
@@ -249,7 +260,7 @@
"VIRTUAL: String movetohost.HostConflictMethod.bar(String)"),
references(clazz, "testConflictMethod", "void"));
- assertTrue(inspector.clazz(CandidateConflictMethod.class).isPresent());
+ assertThat(inspector.clazz(CandidateConflictMethod.class), isPresent());
assertEquals(
Lists.newArrayList(
@@ -260,12 +271,12 @@
"String movetohost.CandidateConflictField.field"),
references(clazz, "testConflictField", "void"));
- assertTrue(inspector.clazz(CandidateConflictMethod.class).isPresent());
+ assertThat(inspector.clazz(CandidateConflictMethod.class), isPresent());
}
private List<String> instanceMethods(ClassSubject clazz) {
assertNotNull(clazz);
- assertTrue(clazz.isPresent());
+ assertThat(clazz, isPresent());
return Streams.stream(clazz.getDexClass().methods())
.filter(method -> !method.isStatic())
.map(method -> method.method.toSourceString())
@@ -276,7 +287,7 @@
private List<String> references(
ClassSubject clazz, String methodName, String retValue, String... params) {
assertNotNull(clazz);
- assertTrue(clazz.isPresent());
+ assertThat(clazz, isPresent());
MethodSignature signature = new MethodSignature(methodName, retValue, params);
DexCode code = clazz.method(signature).getMethod().getCode().asDexCode();
@@ -335,7 +346,7 @@
.allowAccessModification()
.noMinification()
.addOptionsModification(this::configure)
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), main)
.assertSuccessWithOutput(javaOutput);