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) {