Fix invalid removal of field assignment
Bug: b/445967247
Change-Id: I96c3d18e0b36b71ec95affcf1fe1a95c0594590c
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
index 5fad4d7..773f9c4 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
@@ -30,6 +30,8 @@
import com.android.tools.r8.ir.analysis.value.SingleValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
import com.android.tools.r8.ir.code.FieldInstruction;
+import com.android.tools.r8.ir.code.InstancePut;
+import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.ir.code.NewInstance;
import com.android.tools.r8.ir.code.Value;
@@ -319,6 +321,18 @@
abstractValue = UnknownValue.getInstance();
}
+ // Due to the possibility of constructor inlining we need to check for field puts in the
+ // caller.
+ if (!abstractValue.isUnknown()) {
+ for (InstancePut instancePut :
+ invoke.getReceiver().<InstancePut>uniqueUsers(Instruction::isInstancePut)) {
+ if (instancePut.getField().isIdenticalTo(field.getReference())) {
+ abstractValue = AbstractValue.unknown();
+ break;
+ }
+ }
+ }
+
assert !abstractValue.isBottom();
entry.setValue(abstractValue);
return abstractValue.isUnknown();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B445967247Test.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B445967247Test.java
index 48708a3..bdfb4c2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B445967247Test.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B445967247Test.java
@@ -41,8 +41,7 @@
.addKeepClassAndMembersRules(Main.class)
.enableInliningAnnotations()
.run(parameters.getRuntime(), Main.class)
- // TODO(b/445967247): Fixme.
- .assertSuccessWithOutputLines("[]");
+ .assertSuccessWithOutputLines("[Hello, world!]");
}
static class Main {