Handle assume instructions in bridge hoisting
Bug: b/295576241
Change-Id: I17f6760d041e95618a0d048572a306c64a042457
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java b/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java
index be806b4..8777128 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java
@@ -11,6 +11,7 @@
import static com.android.tools.r8.ir.code.Opcodes.RETURN;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.ir.code.AssumeAndCheckCastAliasedValueConfiguration;
import com.android.tools.r8.ir.code.CheckCast;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
@@ -155,10 +156,27 @@
private static boolean analyzeInvoke(InvokeMethodWithReceiver invoke) {
// All of the forwarded arguments of the enclosing method must be in the same argument position.
for (int argumentIndex = 0; argumentIndex < invoke.arguments().size(); argumentIndex++) {
- Value argument = invoke.getArgument(argumentIndex);
- if (argument.isArgument()
- && argumentIndex != argument.getDefinition().asArgument().getIndex()) {
+ Value argument = invoke.getArgument(argumentIndex).getAliasedValue();
+ if (argument.isPhi()
+ || (argument.isArgument()
+ && argumentIndex != argument.getDefinition().asArgument().getIndex())) {
return false;
+ } else {
+ // Validate that besides argument values only check-cast of argument values are allowed at
+ // their argument position.
+ assert argument.isArgument()
+ || (argument.getDefinition().isCheckCast()
+ && invoke
+ .getArgument(argumentIndex)
+ .getAliasedValue(AssumeAndCheckCastAliasedValueConfiguration.getInstance())
+ .isArgument()
+ && invoke
+ .getArgument(argumentIndex)
+ .getAliasedValue(AssumeAndCheckCastAliasedValueConfiguration.getInstance())
+ .getDefinition()
+ .asArgument()
+ .getIndex()
+ == argumentIndex);
}
}
return true;
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeAfterAssumeNoSideEffectsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeAfterAssumeNoSideEffectsTest.java
index 3a42f58..4fb933d 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeAfterAssumeNoSideEffectsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeAfterAssumeNoSideEffectsTest.java
@@ -59,12 +59,7 @@
.enableNoMethodStaticizingAnnotations()
.enableInliningAnnotations()
.run(parameters.getRuntime(), TestClass.class)
- .applyIf(
- parameters.isCfRuntime(),
- // TODO(b/295576241): R8 should not generate invalid code.
- r -> r.assertFailureWithErrorThatThrows(VerifyError.class),
- // TODO(b/296558387): Art should also reject this code.
- r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT));
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
}
static class TestClass {