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 {