Fix use of dominatedBlocks from AssumeInserter

Bug: b/411554202
Change-Id: I7430bd1489219331bc431e9327d1780a571bbbf4
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java
index 58256f5..287930f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java
@@ -46,6 +46,8 @@
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntList;
 import it.unimi.dsi.fastutil.ints.IntListIterator;
+import it.unimi.dsi.fastutil.objects.Reference2BooleanMap;
+import it.unimi.dsi.fastutil.objects.Reference2BooleanOpenHashMap;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.IdentityHashMap;
@@ -442,7 +444,6 @@
       IRCode code, AssumedValues assumedValues) {
     Map<Instruction, Map<Value, AssumedValueInfo>> redundantAssumedValues = new IdentityHashMap<>();
     LazyDominatorTree lazyDominatorTree = new LazyDominatorTree(code);
-    Map<BasicBlock, Set<BasicBlock>> dominatedBlocksCache = new IdentityHashMap<>();
     assumedValues.computeDominance(
         (instruction, assumedValue, assumedValueInfo) -> {
           Map<Value, AssumedValueInfo> alreadyAssumedValues =
@@ -507,13 +508,20 @@
           // or the new split-off block. Since NPE can be explicitly caught, nullness should be
           // propagated through dominance.
           DominatorTree dominatorTree = lazyDominatorTree.get();
-          Set<BasicBlock> dominatedBlocks =
-              dominatedBlocksCache.computeIfAbsent(
-                  insertionBlock, x -> dominatorTree.dominatedBlocks(x, Sets.newIdentityHashSet()));
-
+          Reference2BooleanMap<BasicBlock> dominatedByInsertionBlockCache =
+              new Reference2BooleanOpenHashMap<>();
+          Predicate<BasicBlock> dominatedByInsertionBlock =
+              b -> {
+                if (dominatedByInsertionBlockCache.containsKey(b)) {
+                  return dominatedByInsertionBlockCache.getBoolean(b);
+                }
+                boolean result = dominatorTree.dominatedBy(b, insertionBlock);
+                dominatedByInsertionBlockCache.put(b, result);
+                return result;
+              };
           AssumedDominance.Builder dominance = AssumedDominance.builder(assumedValue);
           for (Instruction user : assumedValue.uniqueUsers()) {
-            if (user != instruction && dominatedBlocks.contains(user.getBlock())) {
+            if (user != instruction && dominatedByInsertionBlock.test(user.getBlock())) {
               if (user.getBlock() == insertionBlock && insertionBlock == block) {
                 Instruction first = block.iterator().nextUntil(x -> x == instruction || x == user);
                 assert first != null;
@@ -532,7 +540,7 @@
           }
           for (Phi user : assumedValue.uniquePhiUsers()) {
             IntList dominatedPredecessorIndices =
-                findDominatedPredecessorIndexesInPhi(user, assumedValue, dominatedBlocks);
+                findDominatedPredecessorIndexesInPhi(user, assumedValue, dominatedByInsertionBlock);
             if (!dominatedPredecessorIndices.isEmpty()) {
               dominance.addDominatedPhiUser(user, dominatedPredecessorIndices);
             }
@@ -700,7 +708,7 @@
   }
 
   private IntList findDominatedPredecessorIndexesInPhi(
-      Phi user, Value assumedValue, Set<BasicBlock> dominatedBlocks) {
+      Phi user, Value assumedValue, Predicate<BasicBlock> dominatedByInsertionBlock) {
     assert user.getOperands().contains(assumedValue);
     List<Value> operands = user.getOperands();
     List<BasicBlock> predecessors = user.getBlock().getPredecessors();
@@ -715,7 +723,7 @@
       BasicBlock predecessor = predecessorIterator.next();
       // When this phi is chosen to be known-to-be-non-null value,
       // check if the corresponding predecessor is dominated by the block where non-null is added.
-      if (operand == assumedValue && dominatedBlocks.contains(predecessor)) {
+      if (operand == assumedValue && dominatedByInsertionBlock.test(predecessor)) {
         predecessorIndexes.add(index);
       }