Extend ArrayConstructionSimplifier dominance checks
Fixes: b/391417819
Change-Id: Id31f2463d9255415d33ce43bcafd9e794c550a49
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java
index f587ee6..e934e3e 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java
@@ -225,10 +225,25 @@
}
}
- // Ensure all blocks for users of the array are dominated by the last array-put's block.
+ // Ensure that the array-put assigning the highest index is dominated by all other array-puts.
ArrayPut lastArrayPut = ArrayUtils.last(arrayValues.getArrayPutsByIndex());
BasicBlock lastArrayPutBlock = lastArrayPut.getBlock();
BasicBlock subgraphEntryBlock = arrayValue.definition.getBlock();
+ for (ArrayPut arrayPut : arrayValues.getArrayPutsByIndex()) {
+ if (arrayPut.getBlock() != lastArrayPut.getBlock()
+ && !DominatorChecker.check(subgraphEntryBlock, lastArrayPutBlock, arrayPut.getBlock())) {
+ return false;
+ }
+ }
+ for (Instruction instruction = lastArrayPut.getBlock().getLastInstruction();
+ instruction != lastArrayPut;
+ instruction = instruction.getPrev()) {
+ if (instruction.isArrayPut() && instruction.asArrayPut().array() == arrayValue) {
+ return false;
+ }
+ }
+
+ // Ensure all blocks for users of the array are dominated by the last array-put's block.
for (BasicBlock usageBlock : usageBlocks) {
if (!DominatorChecker.check(subgraphEntryBlock, usageBlock, lastArrayPutBlock)) {
return false;
diff --git a/src/test/java/com/android/tools/r8/B391417819Repro.java b/src/test/java/com/android/tools/r8/B391417819Repro.java
index c7f0522..acac488 100644
--- a/src/test/java/com/android/tools/r8/B391417819Repro.java
+++ b/src/test/java/com/android/tools/r8/B391417819Repro.java
@@ -3,8 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;
-import static com.android.tools.r8.utils.codeinspector.AssertUtils.assertFailsCompilation;
-
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -35,26 +33,22 @@
@Test
public void testD8() throws Exception {
parameters.assumeDexRuntime();
- assertFailsCompilation(
- () ->
- testForD8(parameters.getBackend())
- .addInnerClasses(getClass())
- .release()
- .setMinApi(parameters)
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutputLines("[0, 1]"));
+ testForD8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .release()
+ .setMinApi(parameters)
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutputLines("[0, 1]");
}
@Test
public void testR8() throws Exception {
- assertFailsCompilation(
- () ->
- testForR8(parameters.getBackend())
- .addInnerClasses(getClass())
- .addKeepMainRule(TestClass.class)
- .setMinApi(parameters)
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutputLines("[0, 1]"));
+ testForR8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .addKeepMainRule(TestClass.class)
+ .setMinApi(parameters)
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutputLines("[0, 1]");
}
static class TestClass {