Version 1.6.51

Cherry-pick: Don't do checksum callbacks if there are no checksums at all
CL: https://r8-review.googlesource.com/c/r8/+/45290

Cherry-pick: Update checksum marker comparison
CL: https://r8-review.googlesource.com/c/r8/+/45289
Change-Id: Ia5c5e636085ea69870af30fbef9e6b07ede932b1
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index ad2811c..e9ad7d9 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "1.6.50";
+  public static final String LABEL = "1.6.51";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java b/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java
index ffdb9a4..3624975 100644
--- a/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java
+++ b/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java
@@ -83,13 +83,22 @@
       assert PREFIX.length() == 3;
       char[] prefix = new char[PREFIX.length()];
       int prefixLength = string.decodePrefix(prefix);
-      return prefixLength == 0
-          || (prefixLength == 1 && prefix[0] <= PREFIX_CHAR0)
-          || (prefixLength == 2 && prefix[0] == PREFIX_CHAR0 && prefix[1] <= PREFIX_CHAR1)
-          || (prefixLength == 3
-              && prefix[0] == PREFIX_CHAR0
-              && prefix[1] == PREFIX_CHAR1
-              && prefix[2] < PREFIX_CHAR2);
+      if (prefixLength == 0) {
+        return true;
+      }
+      if (prefix[0] != PREFIX_CHAR0) {
+        return prefix[0] < PREFIX_CHAR0;
+      }
+      if (prefixLength == 1) {
+        return true;
+      }
+      if (prefix[1] != PREFIX_CHAR1) {
+        return prefix[1] < PREFIX_CHAR1;
+      }
+      if (prefixLength == 2) {
+        return true;
+      }
+      return prefix[2] < PREFIX_CHAR2;
     } catch (UTFDataFormatException e) {
       throw new RuntimeException("Bad format", e);
     }
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 34244b7..9085e5a 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -715,7 +715,7 @@
       AnnotationsDirectory annotationsDirectory = annotationsDirectoryAt(annotationsOffsets[i]);
 
       Long checksum = null;
-      if (checksums != null) {
+      if (checksums != null && !checksums.isEmpty()) {
         String desc = type.descriptor.toASCIIString();
         checksum = checksums.getOrDefault(desc, null);
         if (!options.dexClassChecksumFilter.test(desc, checksum)) {
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java
index c5ad260..24601c1 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java
@@ -121,6 +121,14 @@
     assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("~")));
     assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("}")));
 
+    assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("z")));
+    assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("zz")));
+    assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("zzz")));
+    assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("zzzz")));
+
+    assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("this")));
+    assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("println")));
+
     // False negatives.
     assertFalse(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("~~~")));
     assertFalse(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("~~~z")));