[LIR] Remove types that must be computed on build

Bug: b/225838009
Change-Id: I6c089930f0c50defe0261cbb94268b5e2607804d
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index ab357ed..836a5a5 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -290,11 +290,6 @@
 
   @Override
   public void buildLir(LirBuilder<Value, ?> builder) {
-    if (getMemberType().isObject()) {
-      DexType destType = dest().getType().asReferenceType().toDexType(builder.factory());
-      builder.addArrayGetObject(destType, array(), index());
-    } else {
-      builder.addArrayGetPrimitive(getMemberType(), array(), index());
-    }
+    builder.addArrayGet(getMemberType(), array(), index());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/lightir/IR2LirConverter.java b/src/main/java/com/android/tools/r8/lightir/IR2LirConverter.java
index 7f3335f..2e191a7 100644
--- a/src/main/java/com/android/tools/r8/lightir/IR2LirConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/IR2LirConverter.java
@@ -133,7 +133,7 @@
       Value[] operands = new Value[block.getPredecessors().size()];
       for (Phi phi : block.getPhis()) {
         permuteOperands(phi.getOperands(), permutation, operands);
-        builder.addPhi(phi.getType(), Arrays.asList(operands));
+        builder.addPhi(Arrays.asList(operands));
         valuesOffset++;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
index fa14ca4..041af1c 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -904,7 +904,7 @@
     }
 
     @Override
-    public void onPhi(DexType type, List<EV> operands) {
+    public void onPhi(List<EV> operands) {
       // The type of the phi is determined by its operands during type widening.
       Phi phi = getPhiForNextInstructionAndAdvanceState(TypeElement.getBottom());
       List<Value> values = new ArrayList<>(operands.size());
@@ -1000,19 +1000,18 @@
     }
 
     @Override
-    public void onArrayGetObject(DexType unusedType, EV array, EV index) {
-      // TODO(b/225838009): Remove type and unify object/primitive methods now that it is computed.
-      // The output type depends on its input array member type, so it is computed by widening.
-      Value dest = getOutValueForNextInstruction(TypeElement.getBottom());
-      addInstruction(new ArrayGet(MemberType.OBJECT, dest, getValue(array), getValue(index)));
-    }
-
-    @Override
-    public void onArrayGetPrimitive(MemberType type, EV array, EV index) {
-      // Convert the member type to a "stack value type", e.g., byte, char etc to int.
-      ValueType valueType = ValueType.fromMemberType(type);
-      DexType dexType = valueType.toDexType(appView.dexItemFactory());
-      Value dest = getOutValueForNextInstruction(dexType.toTypeElement(appView));
+    public void onArrayGet(MemberType type, EV array, EV index) {
+      TypeElement typeElement;
+      if (type.isObject()) {
+        // The actual object type must be computed from its array value.
+        typeElement = TypeElement.getBottom();
+      } else {
+        // Convert the member type to a "stack value type", e.g., byte, char etc to int.
+        ValueType valueType = ValueType.fromMemberType(type);
+        DexType dexType = valueType.toDexType(appView.dexItemFactory());
+        typeElement = dexType.toTypeElement(appView);
+      }
+      Value dest = getOutValueForNextInstruction(typeElement);
       addInstruction(new ArrayGet(type, dest, getValue(array), getValue(index)));
     }
 
diff --git a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
index 68b5c0e..68286a7 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -745,9 +745,8 @@
     return addOneItemInstruction(LirOpcodes.MOVEEXCEPTION, exceptionType);
   }
 
-  public LirBuilder<V, EV> addPhi(TypeElement type, List<V> operands) {
-    DexType dexType = toDexType(type);
-    return addInstructionTemplate(LirOpcodes.PHI, Collections.singletonList(dexType), operands);
+  public LirBuilder<V, EV> addPhi(List<V> operands) {
+    return addInstructionTemplate(LirOpcodes.PHI, Collections.emptyList(), operands);
   }
 
   public LirBuilder<V, EV> addDebugLocalWrite(V src) {
@@ -853,14 +852,12 @@
     return addOneValueInstruction(opcode, value);
   }
 
-  public LirBuilder<V, EV> addArrayGetObject(DexType destType, V array, V index) {
-    return addInstructionTemplate(
-        LirOpcodes.AALOAD, Collections.singletonList(destType), ImmutableList.of(array, index));
-  }
-
-  public LirBuilder<V, EV> addArrayGetPrimitive(MemberType memberType, V array, V index) {
+  public LirBuilder<V, EV> addArrayGet(MemberType memberType, V array, V index) {
     int opcode;
     switch (memberType) {
+      case OBJECT:
+        opcode = LirOpcodes.AALOAD;
+        break;
       case BOOLEAN_OR_BYTE:
         opcode = LirOpcodes.BALOAD;
         break;
diff --git a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
index d979ada..135ba99 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -112,23 +112,12 @@
   }
 
   private void onArrayGetInternal(MemberType type, LirInstructionView view) {
-    if (type.isObject()) {
-      DexType destType = (DexType) getConstantItem(view.getNextConstantOperand());
-      EV array = getNextValueOperand(view);
-      EV index = getNextValueOperand(view);
-      onArrayGetObject(destType, array, index);
-    } else {
-      EV array = getNextValueOperand(view);
-      EV index = getNextValueOperand(view);
-      onArrayGetPrimitive(type, array, index);
-    }
+    EV array = getNextValueOperand(view);
+    EV index = getNextValueOperand(view);
+    onArrayGet(type, array, index);
   }
 
-  public void onArrayGetPrimitive(MemberType type, EV array, EV index) {
-    onInstruction();
-  }
-
-  public void onArrayGetObject(DexType type, EV array, EV index) {
+  public void onArrayGet(MemberType type, EV array, EV index) {
     onInstruction();
   }
 
@@ -492,7 +481,7 @@
     onInstruction();
   }
 
-  public void onPhi(DexType type, List<EV> operands) {
+  public void onPhi(List<EV> operands) {
     onInstruction();
   }
 
@@ -1168,7 +1157,7 @@
           while (view.hasMoreOperands()) {
             operands.add(getNextValueOperand(view));
           }
-          onPhi(type, operands);
+          onPhi(operands);
           return;
         }
       case LirOpcodes.FALLTHROUGH:
diff --git a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
index dfbea22..83bcacc 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -378,14 +378,7 @@
   }
 
   @Override
-  public void onArrayGetPrimitive(MemberType type, EV array, EV index) {
-    appendOutValue();
-    appendValueArguments(array, index);
-    builder.append(type);
-  }
-
-  @Override
-  public void onArrayGetObject(DexType type, EV array, EV index) {
+  public void onArrayGet(MemberType type, EV array, EV index) {
     appendOutValue();
     appendValueArguments(array, index);
     builder.append(type);
@@ -403,10 +396,9 @@
   }
 
   @Override
-  public void onPhi(DexType type, List<EV> operands) {
+  public void onPhi(List<EV> operands) {
     appendOutValue();
     appendValueArguments(operands);
-    builder.append(type);
   }
 
   @Override