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 {