Avoid some spurious allocations.

Bug:
Change-Id: I6ecc0ee1619fe11fed9a407ed016a6807e3f99a4
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 945632f..3bedf08 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -129,6 +129,23 @@
     this.proguardSeedsData = proguardSeedsData;
   }
 
+  private Iterable<VirtualFile> distribute()
+      throws ExecutionException, IOException, DexOverflowException {
+    // Distribute classes into dex files.
+    VirtualFile.Distributor distributor;
+    if (options.outputMode == OutputMode.FilePerInputClass) {
+      distributor = new VirtualFile.FilePerInputClassDistributor(this);
+    } else if (!options.canUseMultidex()
+        && options.mainDexKeepRules.isEmpty()
+        && application.mainDexList.isEmpty()) {
+      distributor = new VirtualFile.MonoDexDistributor(this, options);
+    } else {
+      distributor = new VirtualFile.FillFilesDistributor(this, options);
+    }
+
+    return distributor.run();
+  }
+
   public void write(OutputSink outputSink, ExecutorService executorService)
       throws IOException, ExecutionException, DexOverflowException {
     application.timing.begin("DexApplication.write");
@@ -139,24 +156,12 @@
       SortAnnotations sortAnnotations = new SortAnnotations();
       application.classes().forEach((clazz) -> clazz.addDependencies(sortAnnotations));
 
-      // Distribute classes into dex files.
-      VirtualFile.Distributor distributor;
-      if (options.outputMode == OutputMode.FilePerInputClass) {
-        distributor = new VirtualFile.FilePerInputClassDistributor(this);
-      } else if (!options.canUseMultidex()
-          && options.mainDexKeepRules.isEmpty()
-          && application.mainDexList.isEmpty()) {
-        distributor = new VirtualFile.MonoDexDistributor(this, options);
-      } else {
-        distributor = new VirtualFile.FillFilesDistributor(this, options);
-      }
-
       // Collect the indexed items sets for all files and perform JumboString processing.
       // This is required to ensure that shared code blocks have a single and consistent code
       // item that is valid for all dex files.
       // Use a linked hash map as the order matters when addDexProgramData is called below.
       Map<VirtualFile, Future<ObjectToOffsetMapping>> offsetMappingFutures = new LinkedHashMap<>();
-      for (VirtualFile newFile : distributor.run()) {
+      for (VirtualFile newFile : distribute()) {
         assert !newFile.isEmpty();
         if (!newFile.isEmpty()) {
           offsetMappingFutures
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 020580f..0bfe0a8 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -1233,9 +1233,13 @@
       return lookup(code, codes);
     }
 
-    private <T> void setOffsetFor(T item, int offset, Map<T, Integer> table) {
-      Integer old = table.put(item, offset);
-      assert old != null;
+    private <T> void setOffsetFor(T item, int offset, Object2IntMap<T> map) {
+      int old = map.put(item, offset);
+      assert old <= NOT_SET;
+    }
+
+    private <T> void setOffsetFor(T item, int offset, Reference2IntMap<T> map) {
+      int old = map.put(item, offset);
       assert old <= NOT_SET;
     }
 
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index 8cf4fbb..c7fc65d 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -78,7 +78,7 @@
     if (items.isEmpty()) {
       return null;
     }
-    Reference2IntMap<T> map = new Reference2IntLinkedOpenHashMap<>();
+    Reference2IntMap<T> map = new Reference2IntLinkedOpenHashMap<>(items.size());
     map.defaultReturnValue(NOT_FOUND);
     Collection<T> sorted = sort ? items.stream().sorted().collect(Collectors.toList()) : items;
     int index = 0;