diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index b55931c..3f8d6f4 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -365,6 +365,10 @@
     return predecessors.size() == 1;
   }
 
+  public boolean hasUniquePredecessorWithUniqueSuccessor() {
+    return hasUniquePredecessor() && getUniquePredecessor().getSuccessors().size() == 1;
+  }
+
   public BasicBlock getUniquePredecessor() {
     assert hasUniquePredecessor();
     return predecessors.get(0);
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 4bdf306..779c428 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
@@ -230,20 +230,6 @@
     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;
-      }
-    }
-    BasicBlockInstructionIterator iterator = lastArrayPutBlock.iterator(lastArrayPutBlock.size());
-    for (Instruction instruction = iterator.previous();
-        instruction != lastArrayPut;
-        instruction = iterator.previous()) {
-      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) {
diff --git a/src/main/java/com/android/tools/r8/utils/DominatorChecker.java b/src/main/java/com/android/tools/r8/utils/DominatorChecker.java
index d1dc853..94bdd97 100644
--- a/src/main/java/com/android/tools/r8/utils/DominatorChecker.java
+++ b/src/main/java/com/android/tools/r8/utils/DominatorChecker.java
@@ -56,12 +56,12 @@
       }
       // See if a block on the same linear path has already been checked.
       BasicBlock firstSplittingBlock = targetBlock;
-      if (firstSplittingBlock.hasUniqueSuccessor()) {
+      if (firstSplittingBlock.hasUniqueSuccessorWithUniquePredecessor()) {
         do {
           // knownDominators prevents firstSplittingBlock from being destBlock.
           assert firstSplittingBlock != subgraphExitBlock;
           firstSplittingBlock = firstSplittingBlock.getUniqueSuccessor();
-        } while (firstSplittingBlock.hasUniqueSuccessor());
+        } while (firstSplittingBlock.hasUniqueSuccessorWithUniquePredecessor());
 
         if (knownDominators.contains(firstSplittingBlock)) {
           knownDominators.add(targetBlock);
@@ -130,7 +130,7 @@
     // successors.
     Set<BasicBlock> headAndTailDominators = Sets.newIdentityHashSet();
     headAndTailDominators.add(subgraphEntryBlock);
-    while (subgraphEntryBlock.hasUniqueSuccessor()) {
+    while (subgraphEntryBlock.hasUniqueSuccessorWithUniquePredecessor()) {
       subgraphEntryBlock = subgraphEntryBlock.getUniqueSuccessor();
       if (!headAndTailDominators.add(subgraphEntryBlock)) {
         // Hit an infinite loop. Code would not verify in this case.
@@ -150,7 +150,7 @@
     // Shrink the subgraph by moving subgraphExitBlock back to the first block with multiple
     // predecessors.
     headAndTailDominators.add(subgraphExitBlock);
-    while (subgraphExitBlock.hasUniquePredecessor()) {
+    while (subgraphExitBlock.hasUniquePredecessorWithUniqueSuccessor()) {
       subgraphExitBlock = subgraphExitBlock.getUniquePredecessor();
       if (!headAndTailDominators.add(subgraphExitBlock)) {
         if (subgraphEntryBlock == subgraphExitBlock) {
diff --git a/src/main/java/com/android/tools/r8/utils/ValueUtils.java b/src/main/java/com/android/tools/r8/utils/ValueUtils.java
index 9082be5..178b51f 100644
--- a/src/main/java/com/android/tools/r8/utils/ValueUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ValueUtils.java
@@ -167,6 +167,7 @@
    *  * An array-put is found after the last-index array-put.
    *  * An array-put is found where the array and value are the same: arr[index] = arr;
    *  * There are multiple array-put instructions for the same index.
+   *  * An array-put exists that does not dominate the array-put of the highest index.
    * </pre>
    */
   public static ArrayValues computeInitialArrayValues(NewArrayEmpty newArrayEmpty) {
