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