Version 2.0.78

Cherry pick: Account for unordered mapped positions in
LineNumberOptimizer
CL: https://r8-review.googlesource.com/51803

Bug: 157758209
Change-Id: I50e3119b0b0740d3010b9c371ed1b524d2aaec82
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 18a3cd7..988ad95 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 = "2.0.77";
+  public static final String LABEL = "2.0.78";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index c7324da..44a23f2 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -388,7 +388,14 @@
                   || !Objects.equals(mp.caller, lastPosition.caller)) {
                 break;
               }
-              lastPosition = mp;
+              // The mapped positions are not guaranteed to be in order, so maintain first and last
+              // position.
+              if (firstPosition.obfuscatedLine > mp.obfuscatedLine) {
+                firstPosition = mp;
+              }
+              if (lastPosition.obfuscatedLine < mp.obfuscatedLine) {
+                lastPosition = mp;
+              }
             }
             Range obfuscatedRange =
                 new Range(firstPosition.obfuscatedLine, lastPosition.obfuscatedLine);