Early exit from comparers if having physical equality

Change-Id: I7a68c933ebe5fdd1aa2dd25a3a61bfab66a68be7
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java
index 7569929..6ccce86 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java
@@ -17,6 +17,9 @@
 
   public static <T> int run(
       T item1, T item2, NamingLens namingLens, CompareToAccept<T> compareToAccept) {
+    if (item1 == item2) {
+      return 0;
+    }
     CompareToVisitorWithNamingLens state = new CompareToVisitorWithNamingLens(namingLens);
     return compareToAccept.acceptCompareTo(item1, item2, state);
   }
@@ -29,6 +32,9 @@
 
   @Override
   public int visitDexType(DexType type1, DexType type2) {
+    if (type1 == type2) {
+      return 0;
+    }
     return debug(
         namingLens
             .lookupDescriptor(type1)
@@ -37,6 +43,9 @@
 
   @Override
   public int visitDexField(DexField field1, DexField field2) {
+    if (field1 == field2) {
+      return 0;
+    }
     int order = field1.holder.acceptCompareTo(field2.holder, this);
     if (order != 0) {
       return debug(order);
@@ -50,6 +59,9 @@
 
   @Override
   public int visitDexMethod(DexMethod method1, DexMethod method2) {
+    if (method1 == method2) {
+      return 0;
+    }
     int order = method1.holder.acceptCompareTo(method2.holder, this);
     if (order != 0) {
       return debug(order);
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java
index 78fb663..398e32f 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java
@@ -19,6 +19,9 @@
 
   @Override
   public int visitDexString(DexString string1, DexString string2) {
+    if (string1 == string2) {
+      return 0;
+    }
     return visitInt(stringTable.applyAsInt(string1), stringTable.applyAsInt(string2));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java
index ccb5c9e..f139bc9 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java
@@ -14,6 +14,9 @@
 
   public static <T> int run(
       T item1, T item2, RepresentativeMap map, CompareToAccept<T> compareToAccept) {
+    if (item1 == item2) {
+      return 0;
+    }
     CompareToVisitorWithTypeEquivalence state = new CompareToVisitorWithTypeEquivalence(map);
     return compareToAccept.acceptCompareTo(item1, item2, state);
   }
@@ -26,6 +29,9 @@
 
   @Override
   public int visitDexType(DexType type1, DexType type2) {
+    if (type1 == type2) {
+      return 0;
+    }
     DexType repr1 = representatives.getRepresentative(type1);
     DexType repr2 = representatives.getRepresentative(type2);
     return debug(repr1.getDescriptor().acceptCompareTo(repr2.getDescriptor(), this));
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java
index 52a718a..2ec2980 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java
@@ -22,6 +22,9 @@
 
   @Override
   public int visitDexType(DexType type1, DexType type2) {
+    if (type1 == type2) {
+      return 0;
+    }
     return visitInt(typeTable.applyAsInt(type1), typeTable.applyAsInt(type2));
   }
 }