Merge "Unset ACC_ANNOTATION flag for companion class"
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 3639d9e..210a632 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 = "v1.2.8-dev";
+  public static final String LABEL = "v1.2.9-dev";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 31eb337..87a5f83 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -131,9 +131,7 @@
   // The set of registers that are free for allocation.
   private TreeSet<Integer> freeRegisters = new TreeSet<>();
   // The max register number used.
-  private int maxRegisterNumber = 0;
-  // The next available register number not yet included in the set of used registers.
-  private int nextUnusedRegisterNumber = 0;
+  private int maxRegisterNumber = -1;
 
   // List of all top-level live intervals for all SSA values.
   private List<LiveIntervals> liveIntervals = new ArrayList<>();
@@ -164,6 +162,10 @@
         RESERVED_MOVE_EXCEPTION_REGISTER;
   }
 
+  private int getNextUnusedRegisterNumber() {
+    return maxRegisterNumber + 1;
+  }
+
   public LinearScanRegisterAllocator(IRCode code, InternalOptions options) {
     this.code = code;
     this.options = options;
@@ -677,8 +679,7 @@
 
   private void clearRegisterAssignments() {
     freeRegisters.clear();
-    maxRegisterNumber = 0;
-    nextUnusedRegisterNumber = 0;
+    maxRegisterNumber = -1;
     active.clear();
     inactive.clear();
     unhandled.clear();
@@ -928,7 +929,7 @@
         if (destIntervals.getRegister() == NO_REGISTER) {
           // Save the current register allocation state so we can restore it at the end.
           TreeSet<Integer> savedFreeRegisters = new TreeSet<>(freeRegisters);
-          int savedUnusedRegisterNumber = nextUnusedRegisterNumber;
+          int savedUnusedRegisterNumber = getNextUnusedRegisterNumber();
           List<LiveIntervals> savedActive = new LinkedList<>(active);
           List<LiveIntervals> savedInactive = new LinkedList<>(inactive);
 
@@ -956,7 +957,7 @@
           allocateLinkedIntervals(destIntervals);
           // Restore the register allocation state.
           freeRegisters = savedFreeRegisters;
-          for (int i = savedUnusedRegisterNumber; i < nextUnusedRegisterNumber; i++) {
+          for (int i = savedUnusedRegisterNumber, j = getNextUnusedRegisterNumber(); i < j; i++) {
             freeRegisters.add(i);
           }
           active = savedActive;
@@ -1033,17 +1034,13 @@
   // Update the information about used registers when |register| has been selected for use.
   private void updateRegisterState(int register, boolean needsRegisterPair) {
     int maxRegister = register + (needsRegisterPair ? 1 : 0);
-    if (maxRegister >= nextUnusedRegisterNumber) {
-      nextUnusedRegisterNumber = maxRegister + 1;
-    }
     maxRegisterNumber = Math.max(maxRegisterNumber, maxRegister);
   }
 
   private int getSpillRegister(LiveIntervals intervals) {
-    int registerNumber = nextUnusedRegisterNumber++;
+    int registerNumber = getNextUnusedRegisterNumber();
     maxRegisterNumber = registerNumber;
     if (intervals.getType().isWide()) {
-      nextUnusedRegisterNumber++;
       maxRegisterNumber++;
     }
     return registerNumber;
@@ -2176,22 +2173,7 @@
             if (options.isGeneratingDex()) {
               int inConstraint = instruction.maxInValueRegister();
               LiveIntervals useIntervals = use.getLiveIntervals();
-              // Arguments are always kept in their original, incoming register. For every
-              // unconstrained use of an argument we therefore use its incoming register.
-              // As a result, we do not need to record that the argument is being used at the
-              // current instruction.
-              //
-              // For ranged invoke instructions that use a subset of the arguments in the current
-              // order, registering a use for the arguments at the invoke can cause us to run out of
-              // registers. That is because all arguments are forced back into a chosen register at
-              // all uses. Therefore, if we register a use of an argument where we can actually use
-              // it in the argument register, the register allocator would use two registers for the
-              // argument but in reality only use one.
-              boolean isUnconstrainedArgumentUse =
-                  use.isArgument() && inConstraint == Constants.U16BIT_MAX;
-              if (!isUnconstrainedArgumentUse) {
-                useIntervals.addUse(new LiveIntervalsUse(instruction.getNumber(), inConstraint));
-              }
+              useIntervals.addUse(new LiveIntervalsUse(instruction.getNumber(), inConstraint));
             }
           }
         }
@@ -2388,7 +2370,6 @@
       }
     }
     freeRegisters.addAll(unused);
-    maxRegisterNumber = Math.max(maxRegisterNumber, first + numberOfRegister - 1);
     return first;
   }
 
@@ -2396,7 +2377,8 @@
     if (freeRegisters.size() > 0) {
       return freeRegisters.pollFirst();
     }
-    return nextUnusedRegisterNumber++;
+    maxRegisterNumber = getNextUnusedRegisterNumber();
+    return maxRegisterNumber;
   }
 
   private void excludeRegistersForInterval(LiveIntervals intervals, Set<Integer> excluded) {
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
index 28a6fa3..440f4f3 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
@@ -16,6 +16,7 @@
 import org.junit.Test;
 
 public class B77240639 extends TestBase {
+  @Ignore("b/77240639")
   @Test
   public void test() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));