Merge "Handle values defined by NonNull in field load elimination"
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java
index 905d4a8..9b0ab04 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java
@@ -112,6 +112,11 @@
             assert !couldBeVolatile(field);
             if (instruction.isInstanceGet() && !instruction.outValue().hasLocalInfo()) {
               Value object = instruction.asInstanceGet().object();
+              // Values from NonNull instructions will always be replaced with their original
+              // value before code is generated.
+              if (!object.isPhi() && object.definition.isNonNull()) {
+                object = object.definition.asNonNull().src();
+              }
               FieldAndObject fieldAndObject = new FieldAndObject(field, object);
               if (activeInstanceFields.containsKey(fieldAndObject)) {
                 Instruction active = activeInstanceFields.get(fieldAndObject);
diff --git a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
index 2e050ca..abf43b2 100644
--- a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
+++ b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
@@ -302,9 +302,7 @@
   public void testWholeProgram() throws Exception {
     DexInspector inspector =
         new DexInspector(compileWithR8(readClasses(A.class, B.class), this::releaseMode));
-    // The reason for getting two Igets in B.mf is that the first Iget inserts a NonNull
-    // instruction which creates a new value for the remaining Igets.
-    check(inspector, 2, 1);
+    check(inspector, 1, 1);
   }
 
   private void checkMixed(AndroidApp app) throws Exception{