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.
   }