Don't compute sharing of synthetics in intermediate builds.

Bug: 169095082
Bug: 169183194
Change-Id: I9b3f8b8be2bcd148ed80faf73f1327fdd58162e4
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index 31a4afd..9dd8bee 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.shaking.MainDexClasses;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.ListUtils;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -96,8 +97,11 @@
     List<SyntheticMethodDefinition> methodDefinitions =
         lookupSyntheticMethodDefinitions(application);
 
-    Map<HashCode, List<SyntheticMethodDefinition>> potentialEquivalences =
-        computePotentialEquivalences(methodDefinitions);
+    Collection<List<SyntheticMethodDefinition>> potentialEquivalences =
+        // Don't share synthetics in intermediate mode builds.
+        options.intermediate
+            ? ListUtils.map(methodDefinitions, Collections::singletonList)
+            : computePotentialEquivalences(methodDefinitions);
 
     Map<DexType, EquivalenceGroup<SyntheticMethodDefinition>> equivalences =
         computeActualEquivalences(potentialEquivalences, options.itemFactory);
@@ -328,10 +332,10 @@
 
   private static <T extends SyntheticDefinition & Comparable<T>>
       Map<DexType, EquivalenceGroup<T>> computeActualEquivalences(
-          Map<HashCode, List<T>> potentialEquivalences, DexItemFactory factory) {
+          Collection<List<T>> potentialEquivalences, DexItemFactory factory) {
     Map<DexType, List<EquivalenceGroup<T>>> groupsPerContext = new IdentityHashMap<>();
     potentialEquivalences.forEach(
-        (hash, members) -> {
+        members -> {
           // Get a representative member and add to its group.
           T representative = findDeterministicRepresentative(members);
           List<T> group = new ArrayList<>(members.size());
@@ -391,14 +395,14 @@
                 + nextContextId));
   }
 
-  private static <T extends SyntheticDefinition>
-      Map<HashCode, List<T>> computePotentialEquivalences(List<T> definitions) {
+  private static <T extends SyntheticDefinition> Collection<List<T>> computePotentialEquivalences(
+      List<T> definitions) {
     Map<HashCode, List<T>> equivalences = new HashMap<>(definitions.size());
     for (T definition : definitions) {
       HashCode hash = definition.computeHash();
       equivalences.computeIfAbsent(hash, k -> new ArrayList<>()).add(definition);
     }
-    return equivalences;
+    return equivalences.values();
   }
 
   private List<SyntheticMethodDefinition> lookupSyntheticMethodDefinitions(
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
index c805af6..d4346cc 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
@@ -7,9 +7,7 @@
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 
-import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
@@ -158,10 +156,9 @@
             });
   }
 
-  @Test(expected = CompilationFailedException.class)
+  @Test
   public void testD8FilePerClassFile() throws Exception {
     runD8FilePerMode(OutputMode.DexFilePerClassFile);
-    fail("b/169095082");
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
index 4db43fe..4a2e645 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
@@ -9,11 +9,9 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.ByteDataView;
-import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.GenerateMainDexListRunResult;
@@ -122,9 +120,6 @@
     Path out =
         testForD8()
             .addProgramClasses(CLASSES)
-            // Setting intermediate will annotate synthetics, which should not cause types in those
-            // to become main-dex included.
-            .setIntermediate(true)
             .setMinApi(parameters.getApiLevel())
             .compile()
             .writeToZip();
@@ -139,6 +134,24 @@
   }
 
   @Test
+  public void testMainDexTracingDexIntermediates() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    Path out =
+        testForD8()
+            .addProgramClasses(CLASSES)
+            // Setting intermediate will annotate synthetics, which should not cause types in those
+            // to become main-dex included.
+            .setIntermediate(true)
+            .setMinApi(parameters.getApiLevel())
+            .compile()
+            .writeToZip();
+    GenerateMainDexListRunResult mainDexListFromDex =
+        traceMainDex(Collections.emptyList(), Collections.singleton(out));
+    // Compiling in intermediate will not share the synthetics so there is one per call site.
+    assertEquals(MAIN_DEX_LIST_CLASSES.size() + 6, mainDexListFromDex.getMainDexList().size());
+  }
+
+  @Test
   public void testD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     MainDexConsumer mainDexConsumer = new MainDexConsumer();
@@ -154,10 +167,9 @@
     checkMainDex(mainDexConsumer);
   }
 
-  @Test(expected = CompilationFailedException.class)
+  @Test
   public void testD8FilePerClassFile() throws Exception {
     runD8FilePerMode(OutputMode.DexFilePerClassFile);
-    fail("b/169095082");
   }
 
   @Test