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