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);
}