Deterministic vertical class merging
This fixes a bug that was introduced in https://r8-review.googlesource.com/c/r8/+/23183, which collected the merge candidates in a set, rather than iterating over all the classes using classesWithDeterministicOrder. This issue was caught by R8GMSCoreV10TreeShakeJarVerificationTest.
Change-Id: I5bebe889f6d2dfc2d784dbfc5195b42d65b5205e
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 2fbdab2..0a68b9e 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -146,8 +146,8 @@
private final Timing timing;
private Collection<DexMethod> invokes;
- // Set of merge candidates.
- private final Set<DexProgramClass> mergeCandidates = new HashSet<>();
+ // Set of merge candidates. Note that this must have a deterministic iteration order.
+ private final Set<DexProgramClass> mergeCandidates = new LinkedHashSet<>();
// Map from source class to target class.
private final Map<DexType, DexType> mergedClasses = new HashMap<>();