diff --git a/src/test/java/com/android/tools/r8/jasmin/Regress65432240.java b/src/test/java/com/android/tools/r8/jasmin/Regress65432240.java
index 6290e20..b97cd7e 100644
--- a/src/test/java/com/android/tools/r8/jasmin/Regress65432240.java
+++ b/src/test/java/com/android/tools/r8/jasmin/Regress65432240.java
@@ -6,18 +6,39 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.IfNez;
-import com.android.tools.r8.graph.DexCode;
-import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.codeinspector.CfInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class Regress65432240 extends JasminTestBase {
 
+  private Backend backend;
+
+  @Parameterized.Parameters(name = "Backend: {0}")
+  public static Collection<Backend> data() {
+    return Arrays.asList(Backend.values());
+  }
+
+  public Regress65432240(Backend backend) {
+    this.backend = backend;
+  }
+
   @Test
   public void testConstantNotIntoEntryBlock() throws Exception {
     JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
@@ -58,13 +79,38 @@
     String expected = runOnJava(builder, clazz.name);
 
     AndroidApp originalApplication = builder.build();
-    AndroidApp processedApplication = ToolHelper.runR8(originalApplication);
+    AndroidApp processedApplication =
+        ToolHelper.runR8(
+            R8Command.builder(originalApplication)
+                .setProgramConsumer(emptyConsumer(backend))
+                .addLibraryFiles(runtimeJar(backend))
+                .build());
 
-    DexEncodedMethod method = getMethod(processedApplication, clazz.name, signature);
-    DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof IfNez);
+    CodeInspector inspector =
+        new CodeInspector(processedApplication, o -> o.enableCfFrontend = true);
+    ClassSubject inspectedClass = inspector.clazz(clazz.name);
+    MethodSubject method = inspectedClass.method(signature);
+    assertTrue(method.isPresent());
+    Iterator<InstructionSubject> iterator = method.iterateInstructions();
+    InstructionSubject instruction = null;
+    boolean found = false;
+    while (iterator.hasNext()) {
+      instruction = iterator.next();
+      if (!(instruction instanceof CfInstructionSubject)
+          || !((CfInstructionSubject) instruction).isLoad()) {
+        found = true;
+        break;
+      }
+    }
+    assertTrue(found && instruction.isIfNez());
 
-    String artResult = runOnArtR8(builder, clazz.name);
-    assertEquals(expected, artResult);
+    String result;
+    if (backend == Backend.DEX) {
+      result = runOnArt(processedApplication, clazz.name);
+    } else {
+      assert backend == Backend.CF;
+      result = runOnJava(processedApplication, clazz.name, Collections.emptyList());
+    }
+    assertEquals(expected, result);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
index 6aa54df..f639e87 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.cf.code.CfInvoke;
 import com.android.tools.r8.cf.code.CfInvokeDynamic;
 import com.android.tools.r8.cf.code.CfLabel;
+import com.android.tools.r8.cf.code.CfLoad;
 import com.android.tools.r8.cf.code.CfNew;
 import com.android.tools.r8.cf.code.CfNop;
 import com.android.tools.r8.cf.code.CfPosition;
@@ -155,4 +156,8 @@
   public boolean isIfNull() {
     return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNULL;
   }
+
+  public boolean isLoad() {
+    return instruction instanceof CfLoad;
+  }
 }
