Make SparseConditionalConstantPropagation a CodeRewriterPass
Bug: b/284304606
Change-Id: I2a7948133b04613d148dcc88fd6758ef0c91e189
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 e6a6d31..ec226d9 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
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.analysis.constant;
+import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
import com.android.tools.r8.ir.code.BasicBlock;
@@ -16,6 +17,8 @@
import com.android.tools.r8.ir.code.Phi;
import com.android.tools.r8.ir.code.StringSwitch;
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.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.BitSet;
@@ -31,9 +34,8 @@
* "Constant Propagation with Conditional Branches".
* https://www.cs.utexas.edu/users/lin/cs380c/wegman.pdf
*/
-public class SparseConditionalConstantPropagation {
+public class SparseConditionalConstantPropagation extends CodeRewriterPass<AppInfo> {
- private final AppView<?> appView;
private final IRCode code;
private final Map<Value, LatticeElement> mapping = new HashMap<>();
// TODO(b/270398965): Replace LinkedList.
@@ -43,19 +45,29 @@
@SuppressWarnings("JdkObsolete")
private final Deque<BasicBlock> flowEdges = new LinkedList<>();
- private final int maxBlockNumber;
private final BitSet[] executableFlowEdges;
private final BitSet visitedBlocks;
public SparseConditionalConstantPropagation(AppView<?> appView, IRCode code) {
- this.appView = appView;
+ super(appView);
this.code = code;
- maxBlockNumber = code.getCurrentBlockNumber() + 1;
+ int maxBlockNumber = code.getCurrentBlockNumber() + 1;
executableFlowEdges = new BitSet[maxBlockNumber];
visitedBlocks = new BitSet(maxBlockNumber);
}
- public void run() {
+ @Override
+ protected String getTimingId() {
+ return "SparseConditionalConstantPropagation";
+ }
+
+ @Override
+ protected boolean shouldRewriteCode(IRCode code) {
+ return true;
+ }
+
+ @Override
+ protected CodeRewriterResult rewriteCode(IRCode code) {
BasicBlock firstBlock = code.entryBlock();
visitInstructions(firstBlock);
@@ -82,11 +94,12 @@
}
}
}
- rewriteCode();
+ rewriteConstants();
assert code.isConsistentSSA(appView);
+ return CodeRewriterResult.NONE;
}
- private void rewriteCode() {
+ private void rewriteConstants() {
Set<Value> affectedValues = Sets.newIdentityHashSet();
List<BasicBlock> blockToAnalyze = new ArrayList<>();
mapping.entrySet().stream()
@@ -258,7 +271,7 @@
private void setExecutableEdge(int from, int to) {
BitSet previousExecutable = executableFlowEdges[to];
if (previousExecutable == null) {
- previousExecutable = new BitSet(maxBlockNumber);
+ previousExecutable = new BitSet(executableFlowEdges.length);
executableFlowEdges[to] = previousExecutable;
}
previousExecutable.set(from);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 8522b13..a7d54cab 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -755,9 +755,7 @@
if (options.enableStringConcatenationOptimization && !isDebugMode) {
new StringBuilderAppendOptimizer(appView).run(code, timing);
}
- timing.begin("Propagate sparse conditionals");
- new SparseConditionalConstantPropagation(appView, code).run();
- timing.end();
+ new SparseConditionalConstantPropagation(appView, code).run(code, timing);
timing.begin("Rewrite always throwing instructions");
new ThrowCatchOptimizer(appView).optimizeAlwaysThrowingInstructions(code);
timing.end();