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.