Fix CodeRewriterResult in several optimizations

Bug: b/284304606
Change-Id: I39445b580dab0df764c91104d686ef38d0a5c4f4
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
index ec226d9..2a2b802 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
@@ -19,6 +19,7 @@
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.conversion.passes.CodeRewriterPass;
 import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult;
+import com.android.tools.r8.utils.BooleanBox;
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.BitSet;
@@ -94,14 +95,15 @@
         }
       }
     }
-    rewriteConstants();
+    boolean hasChanged = rewriteConstants();
     assert code.isConsistentSSA(appView);
-    return CodeRewriterResult.NONE;
+    return CodeRewriterResult.hasChanged(hasChanged);
   }
 
-  private void rewriteConstants() {
+  private boolean rewriteConstants() {
     Set<Value> affectedValues = Sets.newIdentityHashSet();
     List<BasicBlock> blockToAnalyze = new ArrayList<>();
+    BooleanBox hasChanged = new BooleanBox(false);
     mapping.entrySet().stream()
         .filter(entry -> entry.getValue().isConst())
         .forEach(
@@ -127,12 +129,14 @@
                     }
                     iterator.add(newConst);
                     value.replaceUsers(newConst.outValue());
+                    hasChanged.set();
                   }
                 } else {
                   BasicBlock block = value.definition.getBlock();
                   InstructionListIterator iterator = block.listIterator(code);
                   iterator.nextUntil(i -> i == value.definition);
                   iterator.replaceCurrentInstruction(evaluatedConst);
+                  hasChanged.set();
                 }
               }
             });
@@ -142,8 +146,12 @@
     if (!affectedValues.isEmpty()) {
       new TypeAnalysis(appView).narrowing(affectedValues);
     }
-    code.removeAllDeadAndTrivialPhis();
-    code.removeRedundantBlocks();
+    boolean changed = hasChanged.get();
+    if (changed) {
+      code.removeAllDeadAndTrivialPhis();
+      code.removeRedundantBlocks();
+    }
+    return changed;
   }
 
   private LatticeElement getLatticeElement(Value value) {
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 3176d29..b8a54fb 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
@@ -94,14 +94,16 @@
 
   @Override
   protected CodeRewriterResult rewriteCode(IRCode code) {
+    boolean hasChanged = false;
     WorkList<BasicBlock> worklist = WorkList.newIdentityWorkList(code.blocks);
     while (worklist.hasNext()) {
       BasicBlock block = worklist.next();
-      simplifyArrayConstructionBlock(block, worklist, code, appView.options());
+      hasChanged |= simplifyArrayConstructionBlock(block, worklist, code, appView.options());
     }
-    // Do only when the rewriter pass has changed something.
-    code.removeRedundantBlocks();
-    return CodeRewriterResult.NONE;
+    if (hasChanged) {
+      code.removeRedundantBlocks();
+    }
+    return CodeRewriterResult.hasChanged(hasChanged);
   }
 
   @Override
@@ -109,8 +111,9 @@
     return appView.options().isGeneratingDex();
   }
 
-  private void simplifyArrayConstructionBlock(
+  private boolean simplifyArrayConstructionBlock(
       BasicBlock block, WorkList<BasicBlock> worklist, IRCode code, InternalOptions options) {
+    boolean hasChanged = false;
     RewriteArrayOptions rewriteOptions = options.rewriteArrayOptions();
     InstructionListIterator it = block.listIterator(code);
     while (it.hasNext()) {
@@ -199,7 +202,9 @@
 
       // The above has invalidated the block iterator so reset it and continue.
       it = block.listIterator(code, instructionAfterCandidate);
+      hasChanged = true;
     }
+    return hasChanged;
   }
 
   private short[] computeArrayFilledData(Value[] values, int size, int elementSize) {