Handle ParameterUsage removal with non-matching index.

Change-Id: I2461bfb31b03fa29d005430571b01fc278e4ce9b
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
index 74f4a15..e41989a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
@@ -36,43 +36,35 @@
         parametersUsages.stream().map(usage -> usage.index).collect(Collectors.toSet()).size();
   }
 
-  ParameterUsage getParameterUsage(int parameter) {
+  ParameterUsage getParameterUsage(int index) {
     for (ParameterUsage usage : parametersUsages) {
-      if (usage.index == parameter) {
+      if (usage.index == index) {
         return usage;
       }
     }
     return null;
   }
 
-  ParameterUsagesInfo remove(int parameter) {
+  ParameterUsagesInfo remove(int index) {
     assert parametersUsages.size() > 0;
-    assert 0 <= parameter && parameter < parametersUsages.size();
-    // Nothing to remove. Return the current one as-is.
-    if (getParameterUsage(parameter) == null) {
-      return this;
-    }
-    // If the parameter usage info we're about to remove is the only one in the list
-    if (parametersUsages.size() == 1) {
-      // Return the default one.
-      return DefaultMethodOptimizationInfo.UNKNOWN_PARAMETER_USAGE_INFO;
-    }
-    List<ParameterUsage> adjustedUsages = new ArrayList<>();
-    boolean removed = false;
+    assert 0 <= index && index <= ListUtils.last(parametersUsages).index;
+    ImmutableList.Builder<ParameterUsage> builder = ImmutableList.builder();
     for (ParameterUsage usage : parametersUsages) {
-      if (usage.index == parameter) {
-        removed = true;
-        continue;
-      }
-      if (removed) {
-        // Once we remove the designated parameter usage, copy-n-shift the remaining usages.
-        adjustedUsages.add(ParameterUsage.copyAndShift(usage, 1));
+      // Once we remove or pass the designated index, copy-n-shift the remaining usages.
+      if (index < usage.index) {
+        builder.add(ParameterUsage.copyAndShift(usage, 1));
+      } else if (index == usage.index) {
+        // Do not add the parameter usage with the matched index.
       } else {
         // Until we meet the `parameter` of interest, keep copying.
-        adjustedUsages.add(usage);
+        assert usage.index < index;
+        builder.add(usage);
       }
     }
-    assert removed;
+    ImmutableList<ParameterUsage> adjustedUsages = builder.build();
+    if (adjustedUsages.isEmpty()) {
+      return DefaultMethodOptimizationInfo.UNKNOWN_PARAMETER_USAGE_INFO;
+    }
     return new ParameterUsagesInfo(adjustedUsages);
   }
 
diff --git a/src/main/java/com/android/tools/r8/utils/ListUtils.java b/src/main/java/com/android/tools/r8/utils/ListUtils.java
index 79f4f6c..f570956 100644
--- a/src/main/java/com/android/tools/r8/utils/ListUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ListUtils.java
@@ -17,7 +17,6 @@
   }
 
   public static <T> T last(List<T> list) {
-    assert list instanceof ArrayList;
     return list.get(list.size() - 1);
   }