Use static methods for creating bimaps with identity backing

Change-Id: I01a1284ef601131c02168c6d7603a6cd77b2889d
diff --git a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
index 187402a..349332a 100644
--- a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
@@ -27,7 +27,7 @@
 public final class AppliedGraphLens extends NonIdentityGraphLens {
 
   private final MutableBidirectionalManyToOneRepresentativeMap<DexType, DexType> renamedTypeNames =
-      new BidirectionalManyToOneRepresentativeHashMap<>();
+      BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
   private final BiMap<DexField, DexField> originalFieldSignatures = HashBiMap.create();
   private final BiMap<DexMethod, DexMethod> originalMethodSignatures = HashBiMap.create();
 
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
index 7135cfc..e5c349c 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -240,7 +240,7 @@
     protected final Map<DexType, DexType> typeMap = new IdentityHashMap<>();
     protected final Map<DexMethod, DexMethod> methodMap = new IdentityHashMap<>();
     protected final MutableBidirectionalManyToOneRepresentativeMap<DexField, DexField> fieldMap =
-        new BidirectionalManyToOneRepresentativeHashMap<>();
+        BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
 
     protected final MutableBidirectionalOneToOneMap<DexMethod, DexMethod> originalMethodSignatures =
         new BidirectionalOneToOneHashMap<>();
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
index f5fdd6f..bc713ce 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
@@ -91,16 +91,16 @@
   public static class Builder {
 
     private final MutableBidirectionalManyToOneRepresentativeMap<DexField, DexField> fieldMap =
-        new BidirectionalManyToOneRepresentativeHashMap<>();
+        BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
     private final BidirectionalManyToOneHashMap<DexMethod, DexMethod> methodMap =
-        new BidirectionalManyToOneHashMap<>();
+        BidirectionalManyToOneHashMap.newIdentityHashMap();
     private final BidirectionalOneToManyRepresentativeHashMap<DexMethod, DexMethod>
         originalMethodSignatures = new BidirectionalOneToManyRepresentativeHashMap<>();
     private final Map<DexMethod, List<ExtraParameter>> methodExtraParameters =
         new IdentityHashMap<>();
 
     private final BidirectionalManyToOneHashMap<DexMethod, DexMethod> pendingMethodMapUpdates =
-        new BidirectionalManyToOneHashMap<>();
+        BidirectionalManyToOneHashMap.newIdentityHashMap();
     private final BidirectionalOneToManyRepresentativeHashMap<DexMethod, DexMethod>
         pendingOriginalMethodSignatureUpdates = new BidirectionalOneToManyRepresentativeHashMap<>();
 
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java
index 06d582e..927e629 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java
@@ -85,7 +85,7 @@
   public static class Builder {
 
     private final MutableBidirectionalManyToOneMap<DexType, DexType> mergedClasses =
-        new BidirectionalManyToOneHashMap<>();
+        BidirectionalManyToOneHashMap.newIdentityHashMap();
 
     void addMergeGroup(MergeGroup group) {
       group.forEachSource(clazz -> mergedClasses.put(clazz.getType(), group.getTarget().getType()));
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingResult.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingResult.java
index 4439aea..e1311d5 100644
--- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingResult.java
+++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingResult.java
@@ -23,7 +23,7 @@
 
   // Mapping from non-hoisted bridge methods to hoisted bridge methods.
   private final MutableBidirectionalManyToOneRepresentativeMap<DexMethod, DexMethod>
-      bridgeToHoistedBridgeMap = new BidirectionalManyToOneRepresentativeHashMap<>();
+      bridgeToHoistedBridgeMap = BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
 
   BridgeHoistingResult(AppView<AppInfoWithLiveness> appView) {
     this.appView = appView;
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 761b314..b2d9332 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -208,7 +208,7 @@
 
   // Map from source class to target class.
   private final MutableBidirectionalManyToOneMap<DexType, DexType> mergedClasses =
-      new BidirectionalManyToOneHashMap<>();
+      BidirectionalManyToOneHashMap.newIdentityHashMap();
 
   // Set of types that must not be merged into their subtype.
   private final Set<DexType> pinnedTypes = Sets.newIdentityHashSet();
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 d610175..d4c124f 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -91,7 +91,7 @@
 
     Map<DexType, DexType> typeMap = new IdentityHashMap<>();
     BidirectionalManyToOneRepresentativeHashMap<DexField, DexField> fieldMap =
-        new BidirectionalManyToOneRepresentativeHashMap<>();
+        BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
     Map<DexMethod, DexMethod> methodMap = new IdentityHashMap<>();
 
     protected final MutableBidirectionalOneToManyRepresentativeMap<DexMethod, DexMethod>
diff --git a/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneHashMap.java b/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneHashMap.java
index b75d224..1e53a14 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneHashMap.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneHashMap.java
@@ -17,11 +17,11 @@
   private final Map<K, V> backing;
   private final Map<V, Set<K>> inverse;
 
-  public BidirectionalManyToOneHashMap() {
-    this(new IdentityHashMap<>(), new IdentityHashMap<>());
+  public static <K, V> BidirectionalManyToOneHashMap<K, V> newIdentityHashMap() {
+    return new BidirectionalManyToOneHashMap<>(new IdentityHashMap<>(), new IdentityHashMap<>());
   }
 
-  private BidirectionalManyToOneHashMap(Map<K, V> backing, Map<V, Set<K>> inverse) {
+  protected BidirectionalManyToOneHashMap(Map<K, V> backing, Map<V, Set<K>> inverse) {
     this.backing = backing;
     this.inverse = inverse;
   }
diff --git a/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneRepresentativeHashMap.java b/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneRepresentativeHashMap.java
index 4c2f3a8..ffd653e 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneRepresentativeHashMap.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/BidirectionalManyToOneRepresentativeHashMap.java
@@ -13,7 +13,18 @@
     extends BidirectionalManyToOneHashMap<K, V>
     implements MutableBidirectionalManyToOneRepresentativeMap<K, V> {
 
-  private final Map<V, K> representatives = new IdentityHashMap<>();
+  private final Map<V, K> representatives;
+
+  public static <K, V> BidirectionalManyToOneRepresentativeHashMap<K, V> newIdentityHashMap() {
+    return new BidirectionalManyToOneRepresentativeHashMap<>(
+        new IdentityHashMap<>(), new IdentityHashMap<>(), new IdentityHashMap<>());
+  }
+
+  private BidirectionalManyToOneRepresentativeHashMap(
+      Map<K, V> backing, Map<V, Set<K>> inverse, Map<V, K> representatives) {
+    super(backing, inverse);
+    this.representatives = representatives;
+  }
 
   @Override
   public void clear() {