[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