Merge "Remove the original register field from values."
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index 35cf808..232e0ff 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -19,6 +19,7 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.Consumer;
@@ -632,8 +633,12 @@
     assert unfilledPredecessorsCount > 0;
     if (--unfilledPredecessorsCount == 0) {
       assert estimatedPredecessorsCount == predecessors.size();
-      for (Phi phi : incompletePhis.values()) {
-        phi.addOperands(builder);
+      for (Entry<Integer, Phi> entry : incompletePhis.entrySet()) {
+        int register = entry.getKey();
+        if (register < 0) {
+          register = onThrowValueRegister(register);
+        }
+        entry.getValue().addOperands(builder, register);
       }
       sealed = true;
       incompletePhis.clear();
@@ -1087,7 +1092,7 @@
       newPredecessors.add(newBlock);
       if (hasMoveException) {
         Value value = new Value(
-            valueNumberGenerator.next(), -1, MoveType.OBJECT, move.getDebugInfo());
+            valueNumberGenerator.next(), MoveType.OBJECT, move.getDebugInfo());
         values.add(value);
         newBlock.add(new MoveException(value));
       }
@@ -1105,7 +1110,7 @@
     // Insert a phi for the move-exception value.
     if (hasMoveException) {
       Phi phi = new Phi(valueNumberGenerator.next(),
-          -1, this, MoveType.OBJECT, move.getLocalInfo());
+          this, MoveType.OBJECT, move.getLocalInfo());
       phi.addOperands(values);
       move.outValue().replaceUsers(phi);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
index 8aff14a..451832f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -38,7 +38,6 @@
     Value newValue =
         new Value(
             code.valueNumberGenerator.next(),
-            original.outValue().getOriginalRegister(),
             original.outType(),
             original.getDebugInfo());
     return new ConstNumber(original.type, newValue, original.getRawValue());
diff --git a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
index c63d323..c5a7bbb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
@@ -10,7 +10,7 @@
 
   public FixedRegisterValue(MoveType type, int register) {
     // Set local info to null since these values are never representatives of live-ranges.
-    super(-1, -1, type, null);
+    super(-1, type, null);
     setNeedsRegister(true);
     this.register = register;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index c905a0f..3ff0624 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -349,7 +349,7 @@
   }
 
   public Value createValue(MoveType moveType, Value.DebugInfo debugInfo) {
-    return new Value(valueNumberGenerator.next(), -1, moveType, debugInfo);
+    return new Value(valueNumberGenerator.next(), moveType, debugInfo);
   }
 
   public Value createValue(MoveType moveType) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index 0d74321..5912f0f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -34,8 +34,8 @@
   // computation of the phi until all operands are known.
   private MoveType outType = null;
 
-  public Phi(int number, int register, BasicBlock block, MoveType type, DebugLocalInfo local) {
-    super(number, register, type, local == null ? null : new DebugInfo(local, null));
+  public Phi(int number, BasicBlock block, MoveType type, DebugLocalInfo local) {
+    super(number, type, local == null ? null : new DebugInfo(local, null));
     this.block = block;
     block.addPhi(this);
   }
@@ -54,7 +54,7 @@
     return block;
   }
 
-  public void addOperands(IRBuilder builder) {
+  public void addOperands(IRBuilder builder, int register) {
     // Phi operands are only filled in once to complete the phi. Some phis are incomplete for a
     // period of time to break cycles. When the cycle has been resolved they are completed
     // exactly once by adding the operands.
@@ -63,8 +63,7 @@
     for (BasicBlock pred : block.getPredecessors()) {
       EdgeType edgeType = pred.getEdgeType(block);
       // Since this read has been delayed we must provide the local info for the value.
-      Value operand = builder.readRegister(
-          getOriginalRegister(), pred, edgeType, type, getLocalInfo());
+      Value operand = builder.readRegister(register, pred, edgeType, type, getLocalInfo());
       canBeNull |= operand.canBeNull();
       appendOperand(operand);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index 2b7c647..6487631 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -53,11 +53,10 @@
     }
   }
 
-  public static final Value UNDEFINED = new Value(-1, -1, MoveType.OBJECT, null);
+  public static final Value UNDEFINED = new Value(-1, MoveType.OBJECT, null);
 
   protected final int number;
   protected MoveType type;
-  private int originalRegister;
   public Instruction definition = null;
   private LinkedList<Instruction> users = new LinkedList<>();
   private Set<Instruction> uniqueUsers = null;
@@ -73,10 +72,9 @@
   private LongInterval valueRange;
   private DebugData debugData;
 
-  public Value(int number, int originalRegister, MoveType type, DebugInfo debugInfo) {
+  public Value(int number, MoveType type, DebugInfo debugInfo) {
     this.number = number;
     this.type = type;
-    this.originalRegister = originalRegister;
     this.debugData = debugInfo == null ? null : new DebugData(debugInfo);
   }
 
@@ -92,10 +90,6 @@
     return number;
   }
 
-  public int getOriginalRegister() {
-    return originalRegister;
-  }
-
   public int requiredRegisters() {
     return type.requiredRegisters();
   }
@@ -374,26 +368,23 @@
     StringBuilder builder = new StringBuilder();
     builder.append("v");
     builder.append(number);
-    builder.append("(");
-    if (definition != null && isConstant()) {
-      ConstNumber constNumber = getConstInstruction().asConstNumber();
-      if (constNumber.outType() == MoveType.SINGLE) {
-        builder.append((int) constNumber.getRawValue());
-      } else {
-        builder.append(constNumber.getRawValue());
+    boolean isConstant = definition != null && isConstant();
+    boolean hasLocalInfo = getLocalInfo() != null;
+    if (isConstant || hasLocalInfo) {
+      builder.append("(");
+      if (isConstant) {
+        ConstNumber constNumber = getConstInstruction().asConstNumber();
+        if (constNumber.outType() == MoveType.SINGLE) {
+          builder.append((int) constNumber.getRawValue());
+        } else {
+          builder.append(constNumber.getRawValue());
+        }
       }
-    } else {
-      if (originalRegister >= 0) {
-        builder.append("r");
-        builder.append(originalRegister);
-      } else {
-        builder.append("_");
+      if (hasLocalInfo) {
+        builder.append(", ").append(getLocalInfo());
       }
+      builder.append(")");
     }
-    if (getLocalInfo() != null) {
-      builder.append(", ").append(getLocalInfo());
-    }
-    builder.append(")");
     if (valueRange != null) {
       builder.append(valueRange);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index b92ff71..bd8a469 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -1379,7 +1379,7 @@
     Value value;
     if (!block.isSealed()) {
       assert !blocks.isEmpty() : "No write to " + register;
-      Phi phi = new Phi(valueNumberGenerator.next(), register, block, type, local);
+      Phi phi = new Phi(valueNumberGenerator.next(), block, type, local);
       block.addIncompletePhi(register, phi, readingEdge);
       value = phi;
     } else if (block.getPredecessors().size() == 1) {
@@ -1388,11 +1388,11 @@
       EdgeType edgeType = pred.getEdgeType(block);
       value = readRegister(register, pred, edgeType, type, local);
     } else {
-      Phi phi = new Phi(valueNumberGenerator.next(), register, block, type, local);
+      Phi phi = new Phi(valueNumberGenerator.next(), block, type, local);
       // We need to write the phi before adding operands to break cycles. If the phi is trivial
       // and is removed by addOperands, the definition is overwritten and looked up again below.
       block.updateCurrentDefinition(register, phi, readingEdge);
-      phi.addOperands(this);
+      phi.addOperands(this, register);
       // Lookup the value for the register again at this point. Recursive trivial
       // phi removal could have simplified what we wanted to return here.
       value = block.readCurrentDefinition(register, readingEdge);
@@ -1406,7 +1406,7 @@
   }
 
   public Value readLiteral(NumericType type, long constant) {
-    Value value = new Value(valueNumberGenerator.next(), -1, MoveType.fromNumericType(type), null);
+    Value value = new Value(valueNumberGenerator.next(), MoveType.fromNumericType(type), null);
     add(new ConstNumber(ConstType.fromNumericType(type), value, constant));
     return value;
   }
@@ -1415,7 +1415,7 @@
   // See addDebugLocalStart and addDebugLocalEnd.
   private Value writeRegister(int register, MoveType type, ThrowingInfo throwing, DebugInfo info) {
     checkRegister(register);
-    Value value = new Value(valueNumberGenerator.next(), register, type, info);
+    Value value = new Value(valueNumberGenerator.next(), type, info);
     currentBlock.writeCurrentDefinition(register, value, throwing);
     return value;
   }
@@ -1610,7 +1610,7 @@
         MoveType returnType = origReturn.getReturnType();
         assert origReturn.getLocalInfo() == null;
         phi = new Phi(
-            valueNumberGenerator.next(), -1, normalExitBlock, returnValue.outType(), null);
+            valueNumberGenerator.next(), normalExitBlock, returnValue.outType(), null);
         normalExitBlock.add(new Return(phi, returnType));
         assert returnType == MoveType.fromDexType(method.method.proto.returnType);
       }
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 3ccf2b3..a981990 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
@@ -1726,7 +1726,7 @@
   }
 
   private Value createValue(MoveType type, DebugInfo debugInfo) {
-    Value value = new Value(code.valueNumberGenerator.next(), NO_REGISTER, type, debugInfo);
+    Value value = code.createValue(type, debugInfo);
     value.setNeedsRegister(true);
     return value;
   }
diff --git a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
index 291c2c5..90e2089 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -355,8 +355,8 @@
     BasicBlock originalReturnBlock = code.getNormalExitBlock();
     BasicBlock newReturnBlock = originalReturnBlock.listIterator().split(code);
     // Modify the code to make the inserted block add the constant 10 to the original return value.
-    Value newConstValue = new Value(test.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
-    Value newReturnValue = new Value(test.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
+    Value newConstValue = new Value(test.valueNumberGenerator.next(), MoveType.SINGLE, null);
+    Value newReturnValue = new Value(test.valueNumberGenerator.next(), MoveType.SINGLE, null);
     Value oldReturnValue = newReturnBlock.listIterator().next().asReturn().returnValue();
     newReturnBlock.listIterator().next().asReturn().returnValue().replaceUsers(newReturnValue);
     Instruction constInstruction = new ConstNumber(ConstType.INT, newConstValue, 10);
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
index 7eebf9b..0df0031 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
@@ -41,13 +41,13 @@
   @Test
   public void equalityOfConstantOperands() {
     RegisterAllocator allocator = new MockRegisterAllocator();
-    Value value0 = new Value(0, -1, MoveType.SINGLE, null);
+    Value value0 = new Value(0, MoveType.SINGLE, null);
     ConstNumber const0 = new ConstNumber(ConstType.INT, value0, 0);
-    Value value1 = new Value(1, -1, MoveType.SINGLE, null);
+    Value value1 = new Value(1, MoveType.SINGLE, null);
     ConstNumber const1 = new ConstNumber(ConstType.INT, value1, 1);
-    Value value2 = new Value(2, -1, MoveType.SINGLE, null);
+    Value value2 = new Value(2, MoveType.SINGLE, null);
     ConstNumber const2 = new ConstNumber(ConstType.INT, value2, 2);
-    Value value3 = new Value(2, -1, MoveType.SINGLE, null);
+    Value value3 = new Value(2, MoveType.SINGLE, null);
     Add add0 = new Add(NumericType.INT, value3, value0, value1);
     Add add1 = new Add(NumericType.INT, value3, value0, value2);
     value0.computeNeedsRegister();