Remove CfFrames if they do not pass validation
Bug: 168675474
Change-Id: Ia9e57abe354b33e7183e9c4ed64a01af7b6cbc2e
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index ff71ef8..263a21b 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -212,9 +212,8 @@
@Override
public IRCode buildIR(ProgramMethod method, AppView<?> appView, Origin origin) {
- CfCode cfCode = asCfCode();
- cfCode.verifyFrames(method.getDefinition(), appView, origin, true);
- return cfCode.buildIR(method, appView, origin);
+ return verifyFrames(asCfCode(), method.getDefinition(), appView, origin, true)
+ .buildIR(method, appView, origin);
}
@Override
@@ -226,11 +225,32 @@
Position callerPosition,
Origin origin,
MethodProcessor methodProcessor) {
- CfCode cfCode = asCfCode();
- cfCode.verifyFrames(
- method.getDefinition(), appView, origin, methodProcessor.shouldApplyCodeRewritings(method));
- return cfCode.buildInliningIR(
- context, method, appView, valueNumberGenerator, callerPosition, origin, methodProcessor);
+ return verifyFrames(
+ asCfCode(),
+ method.getDefinition(),
+ appView,
+ origin,
+ methodProcessor.shouldApplyCodeRewritings(method))
+ .buildInliningIR(
+ context,
+ method,
+ appView,
+ valueNumberGenerator,
+ callerPosition,
+ origin,
+ methodProcessor);
+ }
+
+ private CfCode verifyFrames(
+ CfCode cfCode,
+ DexEncodedMethod method,
+ AppView<?> appView,
+ Origin origin,
+ boolean shouldApplyCodeRewritings) {
+ if (!cfCode.verifyFrames(method, appView, origin, shouldApplyCodeRewritings)) {
+ cfCode.instructions.removeIf(CfInstruction::isFrame);
+ }
+ return cfCode;
}
@Override