Revert "Remove unreachable blocks after lir lens rewriting"

This reverts commit c61b736341529e9c5f298a903e9860627b5f8a59.

Change-Id: I219d3f9bf8313226ddd0d1502b1e09dc0b1f95fc
diff --git a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
index 05bf1b7..aad4cc2 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
@@ -401,10 +401,6 @@
     return false;
   }
 
-  public final boolean isClassMergerLens() {
-    return isHorizontalClassMergerGraphLens() || isVerticalClassMergerLens();
-  }
-
   public boolean isClearCodeRewritingLens() {
     return false;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
index f4bc5e2..f1c8a4336 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
@@ -13,12 +13,10 @@
 import com.android.tools.r8.graph.lens.GraphLens;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.conversion.passes.FilledNewArrayRewriter;
-import com.android.tools.r8.ir.optimize.AffectedValues;
 import com.android.tools.r8.ir.optimize.ConstantCanonicalizer;
 import com.android.tools.r8.ir.optimize.DeadCodeRemover;
 import com.android.tools.r8.lightir.IR2LirConverter;
 import com.android.tools.r8.lightir.LirCode;
-import com.android.tools.r8.lightir.LirCode.TryCatchTable;
 import com.android.tools.r8.lightir.LirStrategy;
 import com.android.tools.r8.optimize.MemberRebindingIdentityLens;
 import com.android.tools.r8.utils.ObjectUtils;
@@ -131,51 +129,9 @@
       LensCodeRewriterUtils rewriterUtils) {
     LirCode<Integer> lirCode = method.getDefinition().getCode().asLirCode();
     LirCode<Integer> rewrittenLirCode = lirCode.rewriteWithLens(method, appView, rewriterUtils);
-    if (ObjectUtils.identical(lirCode, rewrittenLirCode)) {
-      return;
+    if (ObjectUtils.notIdentical(lirCode, rewrittenLirCode)) {
+      method.setCode(rewrittenLirCode, appView);
     }
-
-    // In the unusual case where a catch handler has been eliminated as a result of class merging
-    // we remove the unreachable blocks.
-    if (hasPrunedCatchHandlers(appView, lirCode, rewrittenLirCode)) {
-      IRCode code =
-          rewrittenLirCode.buildIR(
-              method,
-              appView,
-              MethodConversionOptions.forLirPhase(appView).disableStringSwitchConversion());
-      AffectedValues affectedValues = code.removeUnreachableBlocks();
-      affectedValues.narrowingWithAssumeRemoval(appView, code);
-      DeadCodeRemover deadCodeRemover = new DeadCodeRemover(appView);
-      deadCodeRemover.run(code, Timing.empty());
-      rewrittenLirCode =
-          new IRToLirFinalizer(appView, deadCodeRemover)
-              .finalizeCode(code, BytecodeMetadataProvider.empty(), Timing.empty());
-    }
-
-    method.setCode(rewrittenLirCode, appView);
-  }
-
-  private static boolean hasPrunedCatchHandlers(
-      AppView<? extends AppInfoWithClassHierarchy> appView,
-      LirCode<Integer> lirCode,
-      LirCode<Integer> rewrittenLirCode) {
-    if (!lirCode.hasTryCatchTable()) {
-      return false;
-    }
-    if (!appView.graphLens().isClassMergerLens()) {
-      assert !internalHasPrunedCatchHandlers(lirCode, rewrittenLirCode);
-      return false;
-    }
-    return internalHasPrunedCatchHandlers(lirCode, rewrittenLirCode);
-  }
-
-  private static boolean internalHasPrunedCatchHandlers(
-      LirCode<Integer> lirCode, LirCode<Integer> rewrittenLirCode) {
-    TryCatchTable tryCatchTable = lirCode.getTryCatchTable();
-    TryCatchTable rewrittenTryCatchTable = rewrittenLirCode.getTryCatchTable();
-    return tryCatchTable.hasHandlerThatMatches(
-        (blockIndex, handlers) ->
-            handlers.size() > rewrittenTryCatchTable.getHandlersForBlock(blockIndex).size());
   }
 
   public static void finalizeLirToOutputFormat(
@@ -223,6 +179,11 @@
     }
     IRCode irCode = method.buildIR(appView, MethodConversionOptions.forPostLirPhase(appView));
     assert irCode.verifyInvokeInterface(appView);
+    if (lirCode.hasTryCatchTable()) {
+      // Vertical class merging may lead to dead catch handlers.
+      // TODO(b/322762660): Ensure IR is valid immediately after IR building.
+      irCode.removeUnreachableBlocks();
+    }
     FilledNewArrayRewriter filledNewArrayRewriter = new FilledNewArrayRewriter(appView);
     boolean changed = filledNewArrayRewriter.run(irCode, onThreadTiming).hasChanged().toBoolean();
     if (appView.options().isGeneratingDex() && changed) {
diff --git a/src/main/java/com/android/tools/r8/lightir/LirCode.java b/src/main/java/com/android/tools/r8/lightir/LirCode.java
index a571e49..cbe9cc2 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirCode.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirCode.java
@@ -38,7 +38,6 @@
 import com.android.tools.r8.utils.ComparatorUtils;
 import com.android.tools.r8.utils.FastMapUtils;
 import com.android.tools.r8.utils.IntBox;
-import com.android.tools.r8.utils.IntObjPredicate;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
@@ -48,7 +47,6 @@
 import com.android.tools.r8.utils.structural.StructuralMapping;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceOpenHashMap;
 import java.util.ArrayList;
@@ -185,12 +183,6 @@
       this.tryCatchHandlers = new Int2ReferenceOpenHashMap<>(tryCatchHandlers);
     }
 
-    public boolean hasHandlerThatMatches(IntObjPredicate<CatchHandlers<Integer>> predicate) {
-      return Iterables.any(
-          tryCatchHandlers.int2ReferenceEntrySet(),
-          entry -> predicate.test(entry.getIntKey(), entry.getValue()));
-    }
-
     public CatchHandlers<Integer> getHandlersForBlock(int blockIndex) {
       return tryCatchHandlers.get(blockIndex);
     }