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<>();