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{