Fix removal of live array-puts in presence of Assume instruction
Bug: b/280659987
Change-Id: Ief4e51fcccba7e777f57efe9377ab20e89ca0554
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index c521bf5..a09fa5e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -170,9 +170,13 @@
@Override
public DeadInstructionResult canBeDeadCode(AppView<?> appView, IRCode code) {
- return instructionInstanceCanThrow(appView, code.context())
- ? DeadInstructionResult.notDead()
- : DeadInstructionResult.deadIfInValueIsDead(array());
+ if (!instructionInstanceCanThrow(appView, code.context())) {
+ Value arrayRoot = array().getAliasedValue();
+ if (arrayRoot.isDefinedByInstructionSatisfying(Instruction::isCreatingArray)) {
+ return DeadInstructionResult.deadIfInValueIsDead(arrayRoot);
+ }
+ }
+ return DeadInstructionResult.notDead();
}
@Override
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
index eabdea5..8bc3bc1 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
@@ -43,8 +43,7 @@
.enableInliningAnnotations()
.setMinApi(parameters)
.run(parameters.getRuntime(), Main.class)
- // TODO(b/280659987): Should succeed with "Hello, world!".
- .assertSuccessWithOutputLines("Hellonull");
+ .assertSuccessWithOutputLines("Hello, world!");
}
static class Main {