Revert "Revert "Extend LIR phase past proto shrinking""
This reverts commit 5125cda1204ee92c813c20ec766e90d4cad094b3 and
fixes the issues by removing redundant blocks in the proto shrinker.
This relands the following reverts:
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: Ide5bb70461bb20045a6ee30f5d5d2eafbef435f8
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 10d9755..b8489e1 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -548,10 +548,7 @@
appView.setGraphLens(new AppliedGraphLens(appView));
timing.end();
- if (!options.shouldRerunEnqueuer()) {
- // TODO(b/225838009): Support tracing and building LIR in Enqueuer.
- PrimaryR8IRConverter.finalizeLirToOutputFormat(appView, timing, executorService);
- } else {
+ if (options.shouldRerunEnqueuer()) {
timing.begin("Post optimization code stripping");
try {
GraphConsumer keptGraphConsumer = null;
@@ -656,9 +653,6 @@
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();
@@ -692,6 +686,9 @@
}
}
+ // 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 5907290..5fbfb59 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
@@ -156,6 +156,7 @@
}
IRCodeUtils.removeInstructionAndTransitiveInputsIfNotUsed(code, instruction);
}
+ code.removeRedundantBlocks();
assert code.isConsistentSSA(appView);
}
@@ -181,7 +182,7 @@
OptimizationFeedbackIgnore.getInstance(),
methodProcessor,
methodProcessingContext,
- MethodConversionOptions.forPostLirPhase(appView)),
+ MethodConversionOptions.forLirPhase(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 49b2e91..7caae94 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.forPostLirPhase(appView)),
+ MethodConversionOptions.forLirPhase(appView)),
executorService);
timing.end();
}
@@ -311,6 +311,7 @@
assert false;
}
}
+ code.removeRedundantBlocks();
assert code.isConsistentSSA(appView);
}
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/ir/desugar/records/RecordFieldValuesRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
index bd8b0fc..394241a 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.forPostLirPhase(appView));
+ MethodConversionOptions.forLirPhase(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 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 16a09d6..a8cb780 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(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());
@@ -1023,19 +1023,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 0cd52a4..b450066 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -773,9 +773,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) {
@@ -881,14 +880,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 e3ca61d..5f1411d 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -113,23 +113,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();
}
@@ -497,7 +486,7 @@
onInstruction();
}
- public void onPhi(DexType type, List<EV> operands) {
+ public void onPhi(List<EV> operands) {
onInstruction();
}
@@ -1176,12 +1165,11 @@
}
case LirOpcodes.PHI:
{
- DexType type = getNextDexTypeOperand(view);
List<EV> operands = new ArrayList<>();
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 c3a8406..f2fcbac 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -385,14 +385,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);
@@ -410,10 +403,9 @@
}
@Override
- public void onPhi(DexType type, List<EV> operands) {
+ public void onPhi(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 3b43c56..00e00ca 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(DexType type, List<EV> operands) {
+ public void onPhi(List<EV> operands) {
// Nothing to register.
}