diff --git a/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java b/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java
index faf9046..f180e60 100644
--- a/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java
+++ b/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java
@@ -204,11 +204,17 @@
     }
     add(store, storeBlock, instruction.getPosition(), it);
     if (hasCatchHandlers && !instruction.instructionTypeCanThrow()) {
-      it.split(this.code, this.blockIterator);
-      this.blockIterator.previous();
+      splitAfterStoredOutValue(it);
     }
   }
 
+  // DebugLocalWrite encodes a store and it needs to consistently split out the catch range after
+  // its store.
+  public void splitAfterStoredOutValue(InstructionListIterator it) {
+    it.split(this.code, this.blockIterator);
+    this.blockIterator.previous();
+  }
+
   public void popOutType(DexType type, Instruction instruction, InstructionListIterator it) {
     popOutValue(createStackValue(type, 0), instruction, it);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
index ad9be48..b17536e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
@@ -65,6 +65,10 @@
   public void insertLoadAndStores(InstructionListIterator it, LoadStoreHelper helper) {
     helper.loadInValues(this, it);
     // A local-write does not have an outgoing stack value, but in writes directly to the local.
+    assert !instructionTypeCanThrow();
+    if (getBlock().hasCatchHandlers()) {
+      helper.splitAfterStoredOutValue(it);
+    }
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/cf/CfDebugLocalStackMapVerificationTest.java b/src/test/java/com/android/tools/r8/cf/CfDebugLocalStackMapVerificationTest.java
index 5108c8d..0f1668f 100644
--- a/src/test/java/com/android/tools/r8/cf/CfDebugLocalStackMapVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/cf/CfDebugLocalStackMapVerificationTest.java
@@ -5,10 +5,7 @@
 package com.android.tools.r8.cf;
 
 import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThrows;
 
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -18,12 +15,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
 
 /** Regression tests for b/237567012 */
 @RunWith(Parameterized.class)
@@ -59,7 +50,7 @@
   }
 
   @Test
-  public void testSmallReproD8() throws Exception {
+  public void testD8() throws Exception {
     testForD8(parameters.getBackend())
         .addProgramClasses(SmallRepro.class)
         .setMinApi(AndroidApiLevel.B)
@@ -69,967 +60,25 @@
               options.testing.neverReuseCfLocalRegisters = true;
             })
         .run(parameters.getRuntime(), SmallRepro.class)
-        // TODO(b/237567012): Run should succeed with printing of FOO.
-        .assertFailureWithErrorThatThrows(VerifyError.class);
+        .assertSuccessWithOutputThatMatches(containsString("FOO"));
   }
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/237567012): We should not fail compilation.
-    assertThrows(
-        CompilationFailedException.class,
-        () ->
-            testForR8(parameters.getBackend())
-                .addProgramClassFileData(CfDebugLocalStackMapVerificationTest$MainDump.dump())
-                .addKeepMainRule(Main.class)
-                .setMode(CompilationMode.DEBUG)
-                .addDontWarn("*")
-                // TODO(b/237567012): Remove option when resolved.
-                .addOptionsModification(
-                    options -> options.enableCheckAllInstructionsDuringStackMapVerification = true)
-                .compile()
-                .run(parameters.getRuntime(), Main.class));
-  }
-
-  public static class Main {
-
-    // InvokeSuspend is taken from an input program.jar and copied verbatim in the dump below.
-    public Object invokeSuspend(Object o) {
-      return o;
-    }
-
-    public static void main(String[] args) {
-      new Main().invokeSuspend(null);
-    }
-  }
-
-  public static class CfDebugLocalStackMapVerificationTest$MainDump implements Opcodes {
-
-    public static byte[] dump() throws Exception {
-
-      ClassWriter classWriter = new ClassWriter(0);
-      FieldVisitor fieldVisitor;
-      MethodVisitor methodVisitor;
-      AnnotationVisitor annotationVisitor0;
-
-      classWriter.visit(
-          V1_8,
-          ACC_FINAL | ACC_SUPER,
-          binaryName(Main.class),
-          null,
-          "kotlin/coroutines/jvm/internal/SuspendLambda",
-          new String[] {"kotlin/jvm/functions/Function2"});
-
-      {
-        fieldVisitor = classWriter.visitField(0, "L$1", "Ljava/lang/Object;", null, null);
-        fieldVisitor.visitEnd();
-      }
-      {
-        fieldVisitor = classWriter.visitField(0, "L$2", "Ljava/lang/Object;", null, null);
-        fieldVisitor.visitEnd();
-      }
-      {
-        fieldVisitor = classWriter.visitField(0, "label", "I", null, null);
-        fieldVisitor.visitEnd();
-      }
-      {
-        fieldVisitor =
-            classWriter.visitField(
-                ACC_PRIVATE | ACC_SYNTHETIC, "L$0", "Ljava/lang/Object;", null, null);
-        fieldVisitor.visitEnd();
-      }
-      {
-        fieldVisitor =
-            classWriter.visitField(
-                ACC_FINAL | ACC_SYNTHETIC,
-                "this$0",
-                "Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;",
-                null,
-                null);
-        fieldVisitor.visitEnd();
-      }
-      {
-        methodVisitor =
-            classWriter.visitMethod(
-                0,
-                "<init>",
-                "(Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;Lkotlin/coroutines/Continuation;)V",
-                "(Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;Lkotlin/coroutines/Continuation<-Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1;>;)V",
-                null);
-        methodVisitor.visitCode();
-        Label label0 = new Label();
-        methodVisitor.visitLabel(label0);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 1);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "this$0",
-            "Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;");
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitInsn(ICONST_2);
-        methodVisitor.visitVarInsn(ALOAD, 2);
-        methodVisitor.visitMethodInsn(
-            INVOKESPECIAL,
-            "kotlin/coroutines/jvm/internal/SuspendLambda",
-            "<init>",
-            "(ILkotlin/coroutines/Continuation;)V",
-            false);
-        methodVisitor.visitInsn(RETURN);
-        Label label1 = new Label();
-        methodVisitor.visitLabel(label1);
-        methodVisitor.visitLocalVariable(
-            "this",
-            "Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1;",
-            null,
-            label0,
-            label1,
-            0);
-        methodVisitor.visitLocalVariable(
-            "$receiver",
-            "Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;",
-            null,
-            label0,
-            label1,
-            1);
-        methodVisitor.visitLocalVariable(
-            "$completion", "Lkotlin/coroutines/Continuation;", null, label0, label1, 2);
-        methodVisitor.visitMaxs(3, 3);
-        methodVisitor.visitEnd();
-      }
-      {
-        methodVisitor =
-            classWriter.visitMethod(
-                ACC_PUBLIC | ACC_FINAL,
-                "invokeSuspend",
-                "(Ljava/lang/Object;)Ljava/lang/Object;",
-                null,
-                null);
-        {
-          annotationVisitor0 =
-              methodVisitor.visitAnnotation("Lorg/jetbrains/annotations/Nullable;", false);
-          annotationVisitor0.visitEnd();
-        }
-        methodVisitor.visitAnnotableParameterCount(1, false);
-        {
-          annotationVisitor0 =
-              methodVisitor.visitParameterAnnotation(
-                  0, "Lorg/jetbrains/annotations/NotNull;", false);
-          annotationVisitor0.visitEnd();
-        }
-        methodVisitor.visitCode();
-        Label label0 = new Label();
-        Label label1 = new Label();
-        Label label2 = new Label();
-        methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
-        Label label3 = new Label();
-        Label label4 = new Label();
-        methodVisitor.visitTryCatchBlock(label3, label4, label2, "java/lang/Throwable");
-        Label label5 = new Label();
-        Label label6 = new Label();
-        methodVisitor.visitTryCatchBlock(label5, label6, label2, "java/lang/Throwable");
-        Label label7 = new Label();
-        methodVisitor.visitTryCatchBlock(label0, label1, label7, null);
-        methodVisitor.visitTryCatchBlock(label3, label4, label7, null);
-        methodVisitor.visitTryCatchBlock(label5, label6, label7, null);
-        methodVisitor.visitTryCatchBlock(label2, label7, label7, null);
-        Label label8 = new Label();
-        methodVisitor.visitTryCatchBlock(label7, label8, label7, null);
-        Label label9 = new Label();
-        Label label10 = new Label();
-        methodVisitor.visitTryCatchBlock(
-            label9, label1, label10, "kotlinx/coroutines/channels/ClosedReceiveChannelException");
-        methodVisitor.visitTryCatchBlock(
-            label3, label4, label10, "kotlinx/coroutines/channels/ClosedReceiveChannelException");
-        methodVisitor.visitTryCatchBlock(
-            label5, label10, label10, "kotlinx/coroutines/channels/ClosedReceiveChannelException");
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "kotlin/coroutines/intrinsics/IntrinsicsKt",
-            "getCOROUTINE_SUSPENDED",
-            "()Ljava/lang/Object;",
-            false);
-        Label label11 = new Label();
-        methodVisitor.visitLabel(label11);
-        methodVisitor.visitLineNumber(60, label11);
-        methodVisitor.visitVarInsn(ASTORE, 10);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "label",
-            "I");
-        Label label12 = new Label();
-        Label label13 = new Label();
-        Label label14 = new Label();
-        Label label15 = new Label();
-        methodVisitor.visitTableSwitchInsn(0, 2, label15, new Label[] {label12, label13, label14});
-        methodVisitor.visitLabel(label12);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            0,
-            new Object[] {});
-        methodVisitor.visitVarInsn(ALOAD, 1);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC, "kotlin/ResultKt", "throwOnFailure", "(Ljava/lang/Object;)V", false);
-        Label label16 = new Label();
-        methodVisitor.visitLabel(label16);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$0",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(CHECKCAST, "kotlinx/coroutines/CoroutineScope");
-        methodVisitor.visitVarInsn(ASTORE, 2);
-        methodVisitor.visitLabel(label9);
-        methodVisitor.visitLineNumber(61, label9);
-        methodVisitor.visitInsn(NOP);
-        Label label17 = new Label();
-        methodVisitor.visitLabel(label17);
-        methodVisitor.visitLineNumber(62, label17);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "this$0",
-            "Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;");
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-            "access$getQueue$p",
-            "(Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;)Lkotlinx/coroutines/channels/Channel;",
-            false);
-        methodVisitor.visitTypeInsn(CHECKCAST, "kotlinx/coroutines/channels/ReceiveChannel");
-        methodVisitor.visitVarInsn(ASTORE, 3);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "this$0",
-            "Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;");
-        methodVisitor.visitVarInsn(ASTORE, 4);
-        Label label18 = new Label();
-        methodVisitor.visitLabel(label18);
-        methodVisitor.visitInsn(ICONST_0);
-        methodVisitor.visitVarInsn(ISTORE, 5);
-        Label label19 = new Label();
-        methodVisitor.visitLabel(label19);
-        methodVisitor.visitLineNumber(146, label19);
-        methodVisitor.visitInsn(NOP);
-        Label label20 = new Label();
-        methodVisitor.visitLabel(label20);
-        methodVisitor.visitLineNumber(149, label20);
-        methodVisitor.visitInsn(ACONST_NULL);
-        methodVisitor.visitVarInsn(ASTORE, 6);
-        methodVisitor.visitLabel(label0);
-        methodVisitor.visitLineNumber(150, label0);
-        methodVisitor.visitInsn(NOP);
-        Label label21 = new Label();
-        methodVisitor.visitLabel(label21);
-        methodVisitor.visitLineNumber(151, label21);
-        methodVisitor.visitInsn(ICONST_0);
-        methodVisitor.visitVarInsn(ISTORE, 7);
-        Label label22 = new Label();
-        methodVisitor.visitLabel(label22);
-        methodVisitor.visitLineNumber(63, label22);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "kotlinx/coroutines/channels/ReceiveChannel",
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-              Opcodes.INTEGER,
-              Opcodes.NULL,
-              Opcodes.INTEGER,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            0,
-            new Object[] {});
-        methodVisitor.visitVarInsn(ALOAD, 2);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "kotlinx/coroutines/CoroutineScopeKt",
-            "isActive",
-            "(Lkotlinx/coroutines/CoroutineScope;)Z",
-            false);
-        Label label23 = new Label();
-        methodVisitor.visitJumpInsn(IFEQ, label23);
-        Label label24 = new Label();
-        methodVisitor.visitLabel(label24);
-        methodVisitor.visitLineNumber(64, label24);
-        methodVisitor.visitVarInsn(ALOAD, 4);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-            "access$getQueue$p",
-            "(Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;)Lkotlinx/coroutines/channels/Channel;",
-            false);
-        methodVisitor.visitMethodInsn(
-            INVOKEINTERFACE,
-            "kotlinx/coroutines/channels/Channel",
-            "tryReceive-PtdJZtk",
-            "()Ljava/lang/Object;",
-            true);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "kotlinx/coroutines/channels/ChannelResult",
-            "getOrNull-impl",
-            "(Ljava/lang/Object;)Ljava/lang/Object;",
-            false);
-        methodVisitor.visitTypeInsn(CHECKCAST, "java/nio/ByteBuffer");
-        methodVisitor.visitVarInsn(ASTORE, 8);
-        Label label25 = new Label();
-        methodVisitor.visitLabel(label25);
-        methodVisitor.visitLineNumber(65, label25);
-        methodVisitor.visitVarInsn(ALOAD, 8);
-        Label label26 = new Label();
-        methodVisitor.visitJumpInsn(IFNONNULL, label26);
-        Label label27 = new Label();
-        methodVisitor.visitLabel(label27);
-        methodVisitor.visitLineNumber(66, label27);
-        methodVisitor.visitVarInsn(ALOAD, 4);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-            "subscription",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(CHECKCAST, "java/util/concurrent/Flow$Subscription");
-        methodVisitor.visitInsn(DUP);
-        Label label28 = new Label();
-        methodVisitor.visitJumpInsn(IFNULL, label28);
-        methodVisitor.visitInsn(LCONST_1);
-        methodVisitor.visitMethodInsn(
-            INVOKEINTERFACE, "java/util/concurrent/Flow$Subscription", "request", "(J)V", true);
-        Label label29 = new Label();
-        methodVisitor.visitJumpInsn(GOTO, label29);
-        methodVisitor.visitLabel(label28);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "kotlinx/coroutines/channels/ReceiveChannel",
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-              Opcodes.INTEGER,
-              Opcodes.NULL,
-              Opcodes.INTEGER,
-              "java/nio/ByteBuffer",
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            1,
-            new Object[] {"java/util/concurrent/Flow$Subscription"});
-        methodVisitor.visitInsn(POP);
-        methodVisitor.visitLabel(label29);
-        methodVisitor.visitLineNumber(67, label29);
-        methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-        methodVisitor.visitVarInsn(ALOAD, 4);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-            "access$getQueue$p",
-            "(Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;)Lkotlinx/coroutines/channels/Channel;",
-            false);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 2);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$0",
-            "Ljava/lang/Object;");
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 3);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$1",
-            "Ljava/lang/Object;");
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 4);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$2",
-            "Ljava/lang/Object;");
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitInsn(ICONST_1);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "label",
-            "I");
-        methodVisitor.visitMethodInsn(
-            INVOKEINTERFACE,
-            "kotlinx/coroutines/channels/Channel",
-            "receive",
-            "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;",
-            true);
-        methodVisitor.visitLabel(label1);
-        methodVisitor.visitInsn(DUP);
-        methodVisitor.visitVarInsn(ALOAD, 10);
-        Label label30 = new Label();
-        methodVisitor.visitJumpInsn(IF_ACMPNE, label30);
-        Label label31 = new Label();
-        methodVisitor.visitLabel(label31);
-        methodVisitor.visitLineNumber(60, label31);
-        methodVisitor.visitVarInsn(ALOAD, 10);
-        methodVisitor.visitInsn(ARETURN);
-        methodVisitor.visitLabel(label13);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            0,
-            new Object[] {});
-        methodVisitor.visitInsn(ICONST_0);
-        methodVisitor.visitVarInsn(ISTORE, 5);
-        Label label32 = new Label();
-        methodVisitor.visitLabel(label32);
-        methodVisitor.visitInsn(ICONST_0);
-        methodVisitor.visitVarInsn(ISTORE, 7);
-        Label label33 = new Label();
-        methodVisitor.visitLabel(label33);
-        methodVisitor.visitInsn(ACONST_NULL);
-        methodVisitor.visitVarInsn(ASTORE, 6);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$2",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(
-            CHECKCAST,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber");
-        methodVisitor.visitVarInsn(ASTORE, 4);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$1",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(CHECKCAST, "kotlinx/coroutines/channels/ReceiveChannel");
-        methodVisitor.visitVarInsn(ASTORE, 3);
-        Label label34 = new Label();
-        methodVisitor.visitLabel(label34);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$0",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(CHECKCAST, "kotlinx/coroutines/CoroutineScope");
-        methodVisitor.visitVarInsn(ASTORE, 2);
-        methodVisitor.visitLabel(label3);
-        methodVisitor.visitInsn(NOP);
-        methodVisitor.visitVarInsn(ALOAD, 1);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC, "kotlin/ResultKt", "throwOnFailure", "(Ljava/lang/Object;)V", false);
-        methodVisitor.visitVarInsn(ALOAD, 1);
-        methodVisitor.visitLabel(label30);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "kotlinx/coroutines/channels/ReceiveChannel",
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-              Opcodes.INTEGER,
-              Opcodes.NULL,
-              Opcodes.INTEGER,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            1,
-            new Object[] {"java/lang/Object"});
-        methodVisitor.visitTypeInsn(CHECKCAST, "java/nio/ByteBuffer");
-        methodVisitor.visitVarInsn(ASTORE, 8);
-        methodVisitor.visitLabel(label26);
-        methodVisitor.visitLineNumber(70, label26);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "kotlinx/coroutines/channels/ReceiveChannel",
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-              Opcodes.INTEGER,
-              Opcodes.NULL,
-              Opcodes.INTEGER,
-              "java/nio/ByteBuffer",
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            0,
-            new Object[] {});
-        methodVisitor.visitVarInsn(ALOAD, 4);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-            "access$getResponseChannel$p",
-            "(Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber;)Lio/ktor/utils/io/ByteChannel;",
-            false);
-        methodVisitor.visitVarInsn(ALOAD, 8);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 2);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$0",
-            "Ljava/lang/Object;");
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 3);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$1",
-            "Ljava/lang/Object;");
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitVarInsn(ALOAD, 4);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$2",
-            "Ljava/lang/Object;");
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitInsn(ICONST_2);
-        methodVisitor.visitFieldInsn(
-            PUTFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "label",
-            "I");
-        methodVisitor.visitMethodInsn(
-            INVOKEINTERFACE,
-            "io/ktor/utils/io/ByteChannel",
-            "writeFully",
-            "(Ljava/nio/ByteBuffer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;",
-            true);
-        methodVisitor.visitLabel(label4);
-        methodVisitor.visitInsn(DUP);
-        methodVisitor.visitVarInsn(ALOAD, 10);
-        Label label35 = new Label();
-        methodVisitor.visitJumpInsn(IF_ACMPNE, label35);
-        Label label36 = new Label();
-        methodVisitor.visitLabel(label36);
-        methodVisitor.visitLineNumber(60, label36);
-        methodVisitor.visitVarInsn(ALOAD, 10);
-        methodVisitor.visitInsn(ARETURN);
-        methodVisitor.visitLabel(label14);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            0,
-            new Object[] {});
-        methodVisitor.visitInsn(ICONST_0);
-        methodVisitor.visitVarInsn(ISTORE, 5);
-        Label label37 = new Label();
-        methodVisitor.visitLabel(label37);
-        methodVisitor.visitInsn(ICONST_0);
-        methodVisitor.visitVarInsn(ISTORE, 7);
-        Label label38 = new Label();
-        methodVisitor.visitLabel(label38);
-        methodVisitor.visitInsn(ACONST_NULL);
-        methodVisitor.visitVarInsn(ASTORE, 6);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$2",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(
-            CHECKCAST,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber");
-        methodVisitor.visitVarInsn(ASTORE, 4);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$1",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(CHECKCAST, "kotlinx/coroutines/channels/ReceiveChannel");
-        methodVisitor.visitVarInsn(ASTORE, 3);
-        Label label39 = new Label();
-        methodVisitor.visitLabel(label39);
-        methodVisitor.visitVarInsn(ALOAD, 0);
-        methodVisitor.visitFieldInsn(
-            GETFIELD,
-            "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-            "L$0",
-            "Ljava/lang/Object;");
-        methodVisitor.visitTypeInsn(CHECKCAST, "kotlinx/coroutines/CoroutineScope");
-        methodVisitor.visitVarInsn(ASTORE, 2);
-        methodVisitor.visitLabel(label5);
-        methodVisitor.visitInsn(NOP);
-        methodVisitor.visitVarInsn(ALOAD, 1);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC, "kotlin/ResultKt", "throwOnFailure", "(Ljava/lang/Object;)V", false);
-        methodVisitor.visitVarInsn(ALOAD, 1);
-        methodVisitor.visitLabel(label35);
-        methodVisitor.visitLineNumber(70, label35);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "kotlinx/coroutines/channels/ReceiveChannel",
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-              Opcodes.INTEGER,
-              Opcodes.NULL,
-              Opcodes.INTEGER,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            1,
-            new Object[] {"java/lang/Object"});
-        methodVisitor.visitInsn(POP);
-        methodVisitor.visitJumpInsn(GOTO, label22);
-        methodVisitor.visitLabel(label23);
-        methodVisitor.visitLineNumber(72, label23);
-        methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-        methodVisitor.visitInsn(NOP);
-        Label label40 = new Label();
-        methodVisitor.visitLabel(label40);
-        methodVisitor.visitFieldInsn(GETSTATIC, "kotlin/Unit", "INSTANCE", "Lkotlin/Unit;");
-        methodVisitor.visitVarInsn(ASTORE, 9);
-        methodVisitor.visitLabel(label6);
-        methodVisitor.visitLineNumber(156, label6);
-        methodVisitor.visitVarInsn(ALOAD, 3);
-        methodVisitor.visitVarInsn(ALOAD, 6);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "kotlinx/coroutines/channels/ChannelsKt",
-            "cancelConsumed",
-            "(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V",
-            false);
-        Label label41 = new Label();
-        methodVisitor.visitLabel(label41);
-        methodVisitor.visitLineNumber(151, label41);
-        Label label42 = new Label();
-        methodVisitor.visitJumpInsn(GOTO, label42);
-        methodVisitor.visitLabel(label2);
-        methodVisitor.visitLineNumber(152, label2);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "kotlinx/coroutines/channels/ReceiveChannel",
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-              Opcodes.INTEGER,
-              Opcodes.NULL,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            1,
-            new Object[] {"java/lang/Throwable"});
-        methodVisitor.visitVarInsn(ASTORE, 9);
-        Label label43 = new Label();
-        methodVisitor.visitLabel(label43);
-        methodVisitor.visitLineNumber(153, label43);
-        methodVisitor.visitVarInsn(ALOAD, 9);
-        methodVisitor.visitVarInsn(ASTORE, 6);
-        Label label44 = new Label();
-        methodVisitor.visitLabel(label44);
-        methodVisitor.visitLineNumber(154, label44);
-        methodVisitor.visitVarInsn(ALOAD, 9);
-        methodVisitor.visitInsn(ATHROW);
-        methodVisitor.visitLabel(label7);
-        methodVisitor.visitLineNumber(155, label7);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "kotlinx/coroutines/channels/ReceiveChannel",
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber",
-              Opcodes.INTEGER,
-              "java/lang/Throwable",
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            1,
-            new Object[] {"java/lang/Throwable"});
-        methodVisitor.visitVarInsn(ASTORE, 9);
-        methodVisitor.visitLabel(label8);
-        methodVisitor.visitLineNumber(156, label8);
-        methodVisitor.visitVarInsn(ALOAD, 3);
-        methodVisitor.visitVarInsn(ALOAD, 6);
-        methodVisitor.visitMethodInsn(
-            INVOKESTATIC,
-            "kotlinx/coroutines/channels/ChannelsKt",
-            "cancelConsumed",
-            "(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V",
-            false);
-        methodVisitor.visitVarInsn(ALOAD, 9);
-        methodVisitor.visitInsn(ATHROW);
-        methodVisitor.visitLabel(label10);
-        methodVisitor.visitLineNumber(73, label10);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            1,
-            new Object[] {"kotlinx/coroutines/channels/ClosedReceiveChannelException"});
-        methodVisitor.visitVarInsn(ASTORE, 3);
-        methodVisitor.visitLabel(label42);
-        methodVisitor.visitLineNumber(75, label42);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              "kotlinx/coroutines/CoroutineScope",
-              "java/lang/Object",
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            0,
-            new Object[] {});
-        methodVisitor.visitFieldInsn(GETSTATIC, "kotlin/Unit", "INSTANCE", "Lkotlin/Unit;");
-        methodVisitor.visitInsn(ARETURN);
-        methodVisitor.visitLabel(label15);
-        methodVisitor.visitFrame(
-            Opcodes.F_FULL,
-            11,
-            new Object[] {
-              "io/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1",
-              "java/lang/Object",
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              Opcodes.TOP,
-              "java/lang/Object"
-            },
-            0,
-            new Object[] {});
-        methodVisitor.visitTypeInsn(NEW, "java/lang/IllegalStateException");
-        methodVisitor.visitInsn(DUP);
-        methodVisitor.visitLdcInsn("call to 'resume' before 'invoke' with coroutine");
-        methodVisitor.visitMethodInsn(
-            INVOKESPECIAL,
-            "java/lang/IllegalStateException",
-            "<init>",
-            "(Ljava/lang/String;)V",
-            false);
-        methodVisitor.visitInsn(ATHROW);
-        methodVisitor.visitLocalVariable(
-            "$this$launch", "Lkotlinx/coroutines/CoroutineScope;", null, label9, label13, 2);
-        methodVisitor.visitLocalVariable(
-            "$this$launch", "Lkotlinx/coroutines/CoroutineScope;", null, label3, label14, 2);
-        methodVisitor.visitLocalVariable(
-            "$this$launch", "Lkotlinx/coroutines/CoroutineScope;", null, label5, label23, 2);
-        methodVisitor.visitLocalVariable(
-            "$this$consume$iv",
-            "Lkotlinx/coroutines/channels/ReceiveChannel;",
-            null,
-            label18,
-            label13,
-            3);
-        methodVisitor.visitLocalVariable(
-            "$this$consume$iv",
-            "Lkotlinx/coroutines/channels/ReceiveChannel;",
-            null,
-            label34,
-            label14,
-            3);
-        methodVisitor.visitLocalVariable(
-            "$this$consume$iv",
-            "Lkotlinx/coroutines/channels/ReceiveChannel;",
-            null,
-            label39,
-            label40,
-            3);
-        methodVisitor.visitLocalVariable(
-            "$this$consume$iv",
-            "Lkotlinx/coroutines/channels/ReceiveChannel;",
-            null,
-            label40,
-            label41,
-            3);
-        methodVisitor.visitLocalVariable(
-            "$this$consume$iv",
-            "Lkotlinx/coroutines/channels/ReceiveChannel;",
-            null,
-            label2,
-            label10,
-            3);
-        methodVisitor.visitLocalVariable(
-            "cause$iv", "Ljava/lang/Throwable;", null, label0, label13, 6);
-        methodVisitor.visitLocalVariable(
-            "cause$iv", "Ljava/lang/Throwable;", null, label34, label14, 6);
-        methodVisitor.visitLocalVariable(
-            "cause$iv", "Ljava/lang/Throwable;", null, label39, label40, 6);
-        methodVisitor.visitLocalVariable(
-            "cause$iv", "Ljava/lang/Throwable;", null, label40, label41, 6);
-        methodVisitor.visitLocalVariable(
-            "cause$iv", "Ljava/lang/Throwable;", null, label2, label44, 6);
-        methodVisitor.visitLocalVariable(
-            "cause$iv", "Ljava/lang/Throwable;", null, label44, label10, 6);
-        methodVisitor.visitLocalVariable(
-            "buffer", "Ljava/nio/ByteBuffer;", null, label25, label27, 8);
-        methodVisitor.visitLocalVariable(
-            "buffer", "Ljava/nio/ByteBuffer;", null, label26, label4, 8);
-        methodVisitor.visitLocalVariable("e$iv", "Ljava/lang/Throwable;", null, label43, label7, 9);
-        methodVisitor.visitLocalVariable(
-            "$i$a$-consume-JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1$1",
-            "I",
-            null,
-            label22,
-            label13,
-            7);
-        methodVisitor.visitLocalVariable("$i$f$consume", "I", null, label19, label13, 5);
-        methodVisitor.visitLocalVariable(
-            "this",
-            "Lio/ktor/client/engine/java/JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1;",
-            null,
-            label16,
-            label15,
-            0);
-        methodVisitor.visitLocalVariable(
-            "$result", "Ljava/lang/Object;", null, label16, label15, 1);
-        methodVisitor.visitLocalVariable(
-            "$i$a$-consume-JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1$1",
-            "I",
-            null,
-            label33,
-            label14,
-            7);
-        methodVisitor.visitLocalVariable("$i$f$consume", "I", null, label32, label14, 5);
-        methodVisitor.visitLocalVariable(
-            "$i$a$-consume-JavaHttpResponseBodyHandler$JavaHttpResponseBodySubscriber$1$1",
-            "I",
-            null,
-            label38,
-            label40,
-            7);
-        methodVisitor.visitLocalVariable("$i$f$consume", "I", null, label37, label10, 5);
-        methodVisitor.visitMaxs(5, 11);
-        methodVisitor.visitEnd();
-      }
-      {
-        methodVisitor =
-            classWriter.visitMethod(
-                ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
-        methodVisitor.visitCode();
-        Label label0 = new Label();
-        methodVisitor.visitLabel(label0);
-        methodVisitor.visitLineNumber(70, label0);
-        methodVisitor.visitTypeInsn(
-            NEW, "com/android/tools/r8/cf/CfDebugLocalStackMapVerificationTest$Main");
-        methodVisitor.visitInsn(DUP);
-        methodVisitor.visitMethodInsn(
-            INVOKESPECIAL,
-            "com/android/tools/r8/cf/CfDebugLocalStackMapVerificationTest$Main",
-            "<init>",
-            "()V",
-            false);
-        methodVisitor.visitInsn(ACONST_NULL);
-        methodVisitor.visitMethodInsn(
-            INVOKEVIRTUAL,
-            "com/android/tools/r8/cf/CfDebugLocalStackMapVerificationTest$Main",
-            "invokeSuspend",
-            "(Ljava/lang/Object;)Ljava/lang/Object;",
-            false);
-        methodVisitor.visitInsn(POP);
-        Label label1 = new Label();
-        methodVisitor.visitLabel(label1);
-        methodVisitor.visitLineNumber(71, label1);
-        methodVisitor.visitInsn(RETURN);
-        Label label2 = new Label();
-        methodVisitor.visitLabel(label2);
-        methodVisitor.visitLocalVariable("args", "[Ljava/lang/String;", null, label0, label2, 0);
-        methodVisitor.visitMaxs(2, 1);
-        methodVisitor.visitEnd();
-      }
-      classWriter.visitEnd();
-
-      return classWriter.toByteArray();
-    }
+    testForR8(parameters.getBackend())
+        .debug()
+        .addProgramClasses(SmallRepro.class)
+        .addKeepAllAttributes()
+        .addDontShrink()
+        .addDontObfuscate()
+        .addDontOptimize()
+        .addOptionsModification(
+            options -> {
+              options.testing.neverReuseCfLocalRegisters = true;
+              // TODO(b/237567012): Remove option when resolved.
+              options.enableCheckAllInstructionsDuringStackMapVerification = true;
+            })
+        .run(parameters.getRuntime(), SmallRepro.class)
+        .assertSuccessWithOutputThatMatches(containsString("FOO"));
   }
 }
