Revert "[LIR] Remove types that must be computed on build"
This reverts commit dd17d2094cf654653b4f2f6ffebf5e369f6ea57b.
Reason for revert: build failed
Change-Id: Icf377857032c1578355a776a63009d3c860b0819
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 836a5a5..ab357ed 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,6 +290,11 @@
@Override
public void buildLir(LirBuilder<Value, ?> builder) {
- builder.addArrayGet(getMemberType(), array(), index());
+ if (getMemberType().isObject()) {
+ DexType destType = dest().getType().asReferenceType().toDexType(builder.factory());
+ builder.addArrayGetObject(destType, array(), index());
+ } else {
+ builder.addArrayGetPrimitive(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 2e191a7..7f3335f 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(Arrays.asList(operands));
+ builder.addPhi(phi.getType(), 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 041af1c..fa14ca4 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(List<EV> operands) {
+ public void onPhi(DexType type, 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,18 +1000,19 @@
}
@Override
- 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);
+ 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));
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 68286a7..68b5c0e 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -745,8 +745,9 @@
return addOneItemInstruction(LirOpcodes.MOVEEXCEPTION, exceptionType);
}
- public LirBuilder<V, EV> addPhi(List<V> operands) {
- return addInstructionTemplate(LirOpcodes.PHI, Collections.emptyList(), operands);
+ 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> addDebugLocalWrite(V src) {
@@ -852,12 +853,14 @@
return addOneValueInstruction(opcode, value);
}
- public LirBuilder<V, EV> addArrayGet(MemberType memberType, V array, V index) {
+ 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) {
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 135ba99..d979ada 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -112,12 +112,23 @@
}
private void onArrayGetInternal(MemberType type, LirInstructionView view) {
- EV array = getNextValueOperand(view);
- EV index = getNextValueOperand(view);
- onArrayGet(type, array, index);
+ 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);
+ }
}
- public void onArrayGet(MemberType type, EV array, EV index) {
+ public void onArrayGetPrimitive(MemberType type, EV array, EV index) {
+ onInstruction();
+ }
+
+ public void onArrayGetObject(DexType type, EV array, EV index) {
onInstruction();
}
@@ -481,7 +492,7 @@
onInstruction();
}
- public void onPhi(List<EV> operands) {
+ public void onPhi(DexType type, List<EV> operands) {
onInstruction();
}
@@ -1157,7 +1168,7 @@
while (view.hasMoreOperands()) {
operands.add(getNextValueOperand(view));
}
- onPhi(operands);
+ onPhi(type, 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 83bcacc..dfbea22 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -378,7 +378,14 @@
}
@Override
- public void onArrayGet(MemberType type, EV array, EV index) {
+ 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) {
appendOutValue();
appendValueArguments(array, index);
builder.append(type);
@@ -396,9 +403,10 @@
}
@Override
- public void onPhi(List<EV> operands) {
+ public void onPhi(DexType type, List<EV> operands) {
appendOutValue();
appendValueArguments(operands);
+ builder.append(type);
}
@Override