Revert "Extend LIR phase past proto shrinking"
This reverts commit 179bf8bf6248d88067e888b22664c193c46fd193.
Revert "Extend LIR phase past main-dex tracing and record-field removal"
This reverts commit 5922ecd10b09d6d516cacb8a19f707b06e265d8b.
Revert "Reland "[LIR] Remove types that must be computed on build""
This reverts commit f1bece362e72591e1e209a20b97c693778c1f666.
Bug: b/290585758
Change-Id: I78d9a4c5e31264be1b598139b248e1bfc31634f7
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index b8489e1..10d9755 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -548,7 +548,10 @@
appView.setGraphLens(new AppliedGraphLens(appView));
timing.end();
- if (options.shouldRerunEnqueuer()) {
+ if (!options.shouldRerunEnqueuer()) {
+ // TODO(b/225838009): Support tracing and building LIR in Enqueuer.
+ PrimaryR8IRConverter.finalizeLirToOutputFormat(appView, timing, executorService);
+ } else {
timing.begin("Post optimization code stripping");
try {
GraphConsumer keptGraphConsumer = null;
@@ -653,6 +656,9 @@
timing.end();
}
+ // TODO(b/225838009): Support LIR in proto shrinking.
+ PrimaryR8IRConverter.finalizeLirToOutputFormat(appView, timing, executorService);
+
if (appView.options().protoShrinking().isProtoShrinkingEnabled()) {
if (appView.options().protoShrinking().isEnumLiteProtoShrinkingEnabled()) {
appView.protoShrinker().enumLiteProtoShrinker.verifyDeadEnumLiteMapsAreDead();
@@ -686,9 +692,6 @@
}
}
- // TODO(b/225838009): Check support LIR in bridge remover.
- PrimaryR8IRConverter.finalizeLirToOutputFormat(appView, timing, executorService);
-
// Insert a member rebinding oracle in the graph to ensure that all subsequent rewritings of
// the application has an applied oracle for looking up non-rebound references.
MemberRebindingIdentityLens memberRebindingIdentityLens =
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
index afeeedb..5907290 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -181,7 +181,7 @@
OptimizationFeedbackIgnore.getInstance(),
methodProcessor,
methodProcessingContext,
- MethodConversionOptions.forLirPhase(appView)),
+ MethodConversionOptions.forPostLirPhase(appView)),
executorService);
timing.end();
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
index 0ccb858..49b2e91 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
@@ -257,7 +257,7 @@
OptimizationFeedbackIgnore.getInstance(),
methodProcessor,
methodProcessingContext,
- MethodConversionOptions.forLirPhase(appView)),
+ MethodConversionOptions.forPostLirPhase(appView)),
executorService);
timing.end();
}
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/ir/desugar/records/RecordFieldValuesRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
index 394241a..bd8b0fc 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
@@ -72,7 +72,7 @@
programMethod,
appView,
programMethod.getOrigin(),
- MethodConversionOptions.forLirPhase(appView));
+ MethodConversionOptions.forPostLirPhase(appView));
boolean done = false;
ListIterator<BasicBlock> blockIterator = irCode.listIterator();
while (blockIterator.hasNext()) {
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 a8cb780..16a09d6 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -927,7 +927,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());
@@ -1023,18 +1023,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 b450066..0cd52a4 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -773,8 +773,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) {
@@ -880,12 +881,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 5f1411d..e3ca61d 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -113,12 +113,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();
}
@@ -486,7 +497,7 @@
onInstruction();
}
- public void onPhi(List<EV> operands) {
+ public void onPhi(DexType type, List<EV> operands) {
onInstruction();
}
@@ -1165,11 +1176,12 @@
}
case LirOpcodes.PHI:
{
+ DexType type = getNextDexTypeOperand(view);
List<EV> operands = new ArrayList<>();
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 f2fcbac..c3a8406 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -385,7 +385,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);
@@ -403,9 +410,10 @@
}
@Override
- public void onPhi(List<EV> operands) {
+ public void onPhi(DexType type, List<EV> operands) {
appendOutValue();
appendValueArguments(operands);
+ builder.append(type);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/lightir/LirUseRegistryCallback.java b/src/main/java/com/android/tools/r8/lightir/LirUseRegistryCallback.java
index 00e00ca..3b43c56 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirUseRegistryCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirUseRegistryCallback.java
@@ -87,7 +87,7 @@
}
@Override
- public void onPhi(List<EV> operands) {
+ public void onPhi(DexType type, List<EV> operands) {
// Nothing to register.
}