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 b97cd7e..6290e20 100644
--- a/src/test/java/com/android/tools/r8/jasmin/Regress65432240.java
+++ b/src/test/java/com/android/tools/r8/jasmin/Regress65432240.java
@@ -6,39 +6,18 @@
 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);
@@ -79,38 +58,13 @@
     String expected = runOnJava(builder, clazz.name);
 
     AndroidApp originalApplication = builder.build();
-    AndroidApp processedApplication =
-        ToolHelper.runR8(
-            R8Command.builder(originalApplication)
-                .setProgramConsumer(emptyConsumer(backend))
-                .addLibraryFiles(runtimeJar(backend))
-                .build());
+    AndroidApp processedApplication = ToolHelper.runR8(originalApplication);
 
-    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());
+    DexEncodedMethod method = getMethod(processedApplication, clazz.name, signature);
+    DexCode code = method.getCode().asDexCode();
+    assertTrue(code.instructions[0] instanceof IfNez);
 
-    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);
+    String artResult = runOnArtR8(builder, clazz.name);
+    assertEquals(expected, artResult);
   }
 }
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 f639e87..6aa54df 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,7 +13,6 @@
 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;
@@ -156,8 +155,4 @@
   public boolean isIfNull() {
     return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNULL;
   }
-
-  public boolean isLoad() {
-    return instruction instanceof CfLoad;
-  }
 }
