Merge "Redirect output from -printusage in app script"
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index 96b2122..182bb49 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -1165,7 +1165,7 @@
     @Override
     public int computeSize(DexBuilder builder) {
       Move move = getMove();
-      int srcRegister = builder.allocatedRegister(move.src(), move.getNumber());
+      int srcRegister = builder.argumentOrAllocateRegister(move.src(), move.getNumber());
       int destRegister = builder.allocatedRegister(move.dest(), move.getNumber());
       if (srcRegister == destRegister) {
         size = 1;
@@ -1183,8 +1183,8 @@
     public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
       Move move = getMove();
       MoveType moveType = MoveType.fromValueType(move.outType());
+      int src = builder.argumentOrAllocateRegister(move.src(), move.getNumber());
       int dest = builder.allocatedRegister(move.dest(), move.getNumber());
-      int src = builder.allocatedRegister(move.src(), move.getNumber());
       Instruction instruction = null;
       switch (size) {
         case 1:
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 85e0060..6803c75 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
@@ -513,9 +513,12 @@
     // Compute the set of registers that is used based on all live intervals.
     Set<Integer> usedRegisters = new HashSet<>();
     for (LiveIntervals intervals : liveIntervals) {
-      addRegisterIfUsed(usedRegisters, intervals);
-      for (LiveIntervals childIntervals : intervals.getSplitChildren()) {
-        addRegisterIfUsed(usedRegisters, childIntervals);
+      // Argument sentinel values do not occupy any registers.
+      if (!isArgumentSentinelIntervals(intervals)) {
+        addRegisterIfUsed(usedRegisters, intervals);
+        for (LiveIntervals childIntervals : intervals.getSplitChildren()) {
+          addRegisterIfUsed(usedRegisters, childIntervals);
+        }
       }
     }
     // Additionally, we have used temporary registers for parallel move scheduling, those
@@ -535,6 +538,11 @@
     unusedRegisters = computed;
   }
 
+  private boolean isArgumentSentinelIntervals(LiveIntervals intervals) {
+    return intervals.isArgumentInterval() &&
+            (intervals.getPreviousConsecutive() == null || intervals.getNextConsecutive() == null);
+  }
+
   private void addRegisterIfUsed(Set<Integer> used, LiveIntervals intervals) {
     boolean unused = intervals.isSpilledAndRematerializable(this);
     if (!unused) {