Fix indequate non-null field propagation
Bug: b/274802355
Change-Id: Ibb8d33b3eb20fa04a1126a651c1fcb9f28741632
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index 1279d85..4e4f5ae 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -240,6 +240,10 @@
if (abstractValue.isNonConstantNumberValue()) {
return FieldClassification.NON_CONSTANT;
}
+ if (field.getType().isReferenceType()
+ && field.getOptimizationInfo().getDynamicType().getNullability().isDefinitelyNotNull()) {
+ return FieldClassification.NON_CONSTANT;
+ }
return FieldClassification.UNKNOWN;
}
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index cc5e538..cdf7a0d 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -136,7 +136,7 @@
.withOptionConsumer(opts -> opts.enableClassInlining = false)
.withBuilderTransformation(
b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
- .withDexCheck(inspector -> checkLambdaCount(inspector, 4, "lambdadesugaring"))
+ .withDexCheck(inspector -> checkLambdaCount(inspector, 3, "lambdadesugaring"))
.run(Paths.get(ToolHelper.THIRD_PARTY_DIR, "examplesAndroidOLegacy"));
test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
@@ -175,7 +175,7 @@
.withOptionConsumer(opts -> opts.enableClassInlining = false)
.withBuilderTransformation(
b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
- .withDexCheck(inspector -> checkLambdaCount(inspector, 4, "lambdadesugaring"))
+ .withDexCheck(inspector -> checkLambdaCount(inspector, 3, "lambdadesugaring"))
.run(Paths.get(ToolHelper.THIRD_PARTY_DIR, "examplesAndroidOLegacy"));
test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
@@ -255,7 +255,7 @@
b ->
b.addProguardConfiguration(
getProguardOptionsNPlus(enableProguardCompatibilityMode), Origin.unknown()))
- .withDexCheck(inspector -> checkLambdaCount(inspector, 2, "lambdadesugaringnplus"))
+ .withDexCheck(inspector -> checkLambdaCount(inspector, 1, "lambdadesugaringnplus"))
.run();
test("lambdadesugaringnplus", "lambdadesugaringnplus", "LambdasWithStaticAndDefaultMethods")
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndDifferentArgumentAndAssignmentOrderMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndDifferentArgumentAndAssignmentOrderMergingTest.java
index dcf7ad6..b885a75 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndDifferentArgumentAndAssignmentOrderMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndDifferentArgumentAndAssignmentOrderMergingTest.java
@@ -9,6 +9,7 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverPropagateValue;
import com.android.tools.r8.NoHorizontalClassMerging;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -44,6 +45,7 @@
.addHorizontallyMergedClassesInspector(
inspector ->
inspector.assertIsCompleteMergeGroup(A.class, B.class).assertNoOtherClassesMerged())
+ .enableMemberValuePropagationAnnotations()
.enableNeverClassInliningAnnotations()
.enableNoHorizontalClassMergingAnnotations()
.setMinApi(parameters)
@@ -72,8 +74,9 @@
@NeverClassInline
static class A {
- private final C c;
- private final D d;
+ @NeverPropagateValue private final C c;
+
+ @NeverPropagateValue private final D d;
A(C c, D d) {
this.c = c;
@@ -89,8 +92,9 @@
@NeverClassInline
static class B {
- private final C c;
- private final D d;
+ @NeverPropagateValue private final C c;
+
+ @NeverPropagateValue private final D d;
B(D d, C c) {
this.d = d;
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java
index 7cef546..223fc6d 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java
@@ -9,6 +9,7 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverPropagateValue;
import com.android.tools.r8.NoAccessModification;
import com.android.tools.r8.NoHorizontalClassMerging;
import com.android.tools.r8.TestBase;
@@ -43,6 +44,7 @@
.addHorizontallyMergedClassesInspector(
inspector ->
inspector.assertIsCompleteMergeGroup(A.class, B.class).assertNoOtherClassesMerged())
+ .enableMemberValuePropagationAnnotations()
.enableNeverClassInliningAnnotations()
.enableNoAccessModificationAnnotationsForMembers()
.enableNoHorizontalClassMergingAnnotations()
@@ -73,7 +75,7 @@
@NeverClassInline
static class A {
- @NoAccessModification private final Object c;
+ @NeverPropagateValue @NoAccessModification private final Object c;
A(C c) {
this.c = c;
@@ -93,7 +95,7 @@
@NeverClassInline
static class B {
- @NoAccessModification private final D d;
+ @NeverPropagateValue @NoAccessModification private final D d;
B(D d) {
this.d = d;
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/PinnedClassMemberReferenceTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/PinnedClassMemberReferenceTest.java
index 1fabb4f..ea96310 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/PinnedClassMemberReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/PinnedClassMemberReferenceTest.java
@@ -4,8 +4,8 @@
package com.android.tools.r8.classmerging.horizontal;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assume.assumeTrue;
@@ -50,15 +50,8 @@
ClassSubject aClassSubject = codeInspector.clazz(A.class);
assertThat(aClassSubject, isPresent());
- assertThat(codeInspector.clazz(B.class), not(isPresent()));
-
- ClassSubject cClassSubject = codeInspector.clazz(C.class);
- assertThat(cClassSubject, isPresent());
- assertThat(cClassSubject.field(aClassSubject.getFinalName(), "a"), isPresent());
- assertThat(cClassSubject.field(aClassSubject.getFinalName(), "b"), isPresent());
-
- assertThat(
- cClassSubject.method("void", "foo", aClassSubject.getFinalName()), isPresent());
+ assertThat(codeInspector.clazz(B.class), isAbsent());
+ assertThat(codeInspector.clazz(C.class), isAbsent());
});
}
@@ -69,7 +62,7 @@
.addKeepRules(
"-keepclassmembers class " + C.class.getTypeName() + " { ",
" " + A.class.getTypeName() + " a;",
- " " + C.class.getTypeName() + " c;",
+ " " + B.class.getTypeName() + " b;",
" void foo(" + A.class.getTypeName() + ");",
" void foo(" + B.class.getTypeName() + ");",
"}"))
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/B274802355Test.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/B274802355Test.java
index 758696d..099bccc 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/B274802355Test.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/B274802355Test.java
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize.membervaluepropagation.fields;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestBase;
@@ -36,10 +36,9 @@
.compile()
.inspect(
inspector -> {
- // TODO(b/274802355): Should be absent.
FieldSubject fieldSubject =
inspector.clazz(Main.class).uniqueFieldWithOriginalName("f");
- assertThat(fieldSubject, isPresent());
+ assertThat(fieldSubject, isAbsent());
})
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithEmptyOutput();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithUnusedArgumentAndParameterAnnotationsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithUnusedArgumentAndParameterAnnotationsTest.java
index 17b34b7..4ea3d94 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithUnusedArgumentAndParameterAnnotationsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithUnusedArgumentAndParameterAnnotationsTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.ir.optimize.unusedarguments;
import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverPropagateValue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -38,6 +39,7 @@
.addKeepMainRule(TestClass.class)
.addKeepRuntimeVisibleParameterAnnotations()
.addKeepClassAndMembersRules(ParameterAnnotation.class)
+ .enableMemberValuePropagationAnnotations()
.setMinApi(parameters.getApiLevel())
.enableNeverClassInliningAnnotations()
.run(parameters.getRuntime(), TestClass.class)
@@ -51,6 +53,7 @@
.addKeepMainRule(TestClass.class)
.addKeepRuntimeVisibleParameterAnnotations()
.addKeepClassAndMembersRules(ParameterAnnotation.class)
+ .enableMemberValuePropagationAnnotations()
.setMinApi(parameters.getApiLevel())
.enableNeverClassInliningAnnotations()
.run(parameters.getRuntime(), TestClass.class)
@@ -69,7 +72,8 @@
@NeverClassInline
static class A {
- B b;
+
+ @NeverPropagateValue B b;
// Unused argument is removed, but then an extra argument is added to avoid the signature
// collision.