Enable determinism testing of monomorphic methods and virtual roots
Change-Id: I4820dfa66037dc605a2016b57b44c43f91acf20e
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java
index aa805a6..b443888 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java
@@ -111,6 +111,9 @@
timing.end();
timing.end();
+
+ // Ensure determinism of monomorphic methods.
+ appView.testing().checkDeterminism(codeScanner::dump);
}
/** Called by {@link IRConverter} prior to finalizing methods. */
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
index 3b5fa35..7ee9fb5 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
@@ -66,8 +66,13 @@
import com.android.tools.r8.optimize.argumentpropagation.utils.WideningUtils;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.Action;
+import com.android.tools.r8.utils.DeterminismChecker;
+import com.android.tools.r8.utils.DeterminismChecker.LineCallback;
+import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.structural.StructuralItem;
import com.google.common.collect.Sets;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.IdentityHashMap;
@@ -833,4 +838,22 @@
methodStates.set(resolution.getResolvedProgramMethod(), UnknownMethodState.get());
}
}
+
+ public void dump(DeterminismChecker determinismChecker) throws IOException {
+ determinismChecker.accept(this::dump);
+ }
+
+ private void dump(LineCallback lineCallback) throws IOException {
+ List<DexMethod> monomorphicVirtualMethodsSorted =
+ ListUtils.sort(monomorphicVirtualMethods, StructuralItem::compareTo);
+ for (DexMethod method : monomorphicVirtualMethodsSorted) {
+ lineCallback.onLine(method.toSourceString());
+ }
+ List<DexMethod> virtualRootMethodsSorted =
+ ListUtils.sort(virtualRootMethods.keySet(), StructuralItem::compareTo);
+ for (DexMethod method : virtualRootMethodsSorted) {
+ lineCallback.onLine(
+ method.toSourceString() + " -> " + virtualRootMethods.get(method).toSourceString());
+ }
+ }
}