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();
