Fix recent nondeterminism in Enqueuer
Bug: 138813331
Change-Id: Ia9640b4780200cfd401e270d5d27e3538e7926f2
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index b7dcd14..175a41d 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1181,6 +1181,13 @@
* depending on the currently seen invokes and field reads.
*/
private void processNewlyInstantiatedClass(DexClass clazz, KeepReason reason) {
+ // Notify analyses. This is done even if `clazz` has already been marked as instantiated,
+ // because each analysis may depend on seeing all the (clazz, reason) pairs. Thus, not doing so
+ // could lead to nondeterminism.
+ if (clazz.isProgramClass()) {
+ analyses.forEach(
+ analysis -> analysis.processNewlyInstantiatedClass(clazz.asProgramClass(), reason));
+ }
if (!instantiatedTypes.add(clazz.type, reason)) {
return;
}
@@ -1197,11 +1204,6 @@
transitionFieldsForInstantiatedClass(clazz.type);
// Add all dependent instance members to the workqueue.
transitionDependentItemsForInstantiatedClass(clazz);
- // Notify analyses.
- if (clazz.isProgramClass()) {
- analyses.forEach(
- analysis -> analysis.processNewlyInstantiatedClass(clazz.asProgramClass(), reason));
- }
}
/**