Fix redundant field load elimination invoke direct field put
Change-Id: I0a6f3727a35c86879ea48d37848558ea3b20a166
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 eb6bddd..ae47cc2 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
@@ -372,13 +372,22 @@
invoke.getArgument(info.asArgumentInitializationInfo().getArgumentIndex());
Value object = invoke.getReceiver().getAliasedValue();
FieldAndObject fieldAndObject = new FieldAndObject(field.field, object);
- activeState.putNonFinalInstanceField(fieldAndObject, new ExistingValue(value));
+ if (field.isFinal()) {
+ activeState.putFinalInstanceField(fieldAndObject, new ExistingValue(value));
+ } else {
+ activeState.putNonFinalInstanceField(fieldAndObject, new ExistingValue(value));
+ }
} else if (info.isSingleValue()) {
SingleValue value = info.asSingleValue();
if (value.isMaterializableInContext(appView.withLiveness(), method)) {
Value object = invoke.getReceiver().getAliasedValue();
FieldAndObject fieldAndObject = new FieldAndObject(field.field, object);
- activeState.putNonFinalInstanceField(fieldAndObject, new MaterializableValue(value));
+ if (field.isFinal()) {
+ activeState.putFinalInstanceField(fieldAndObject, new MaterializableValue(value));
+ } else {
+ activeState.putNonFinalInstanceField(
+ fieldAndObject, new MaterializableValue(value));
+ }
}
} else {
assert info.isTypeInitializationInfo();