Remove TODO and update expectations for more kotlin tests

Fixes: 179866251
Fixes: 179951729
Bug: 202947898
Change-Id: I0a7d76471521dbb0fac3e02ecf511ebf30453f8d
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 79880c8..5759deb 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -31,10 +31,10 @@
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import org.junit.Assume;
@@ -66,32 +66,49 @@
   }
 
   protected static void checkMethodIsInvokedAtLeastOnce(
-      DexCode dexCode, MethodSignature... methodSignatures) {
+      MethodSubject subject, MethodSignature... methodSignatures) {
     for (MethodSignature methodSignature : methodSignatures) {
-      checkMethodIsInvokedAtLeastOnce(dexCode, methodSignature);
+      checkMethodIsInvokedAtLeastOnce(subject, methodSignature);
     }
   }
 
   private static void checkMethodIsInvokedAtLeastOnce(
-      DexCode dexCode, MethodSignature methodSignature) {
-    assertTrue("No invoke to '" + methodSignature.toString() + "'",
-        Arrays.stream(dexCode.instructions)
-            .filter((instr) -> instr.getMethod() != null)
-            .anyMatch((instr) -> instr.getMethod().name.toString().equals(methodSignature.name)));
+      MethodSubject subject, MethodSignature methodSignature) {
+    assertTrue(
+        "No invoke to '" + methodSignature.toString() + "'",
+        subject
+            .streamInstructions()
+            .filter(InstructionSubject::isInvoke)
+            .anyMatch(
+                instructionSubject ->
+                    instructionSubject
+                        .getMethod()
+                        .getName()
+                        .toString()
+                        .equals(methodSignature.name)));
   }
 
   protected static void checkMethodIsNeverInvoked(
-      DexCode dexCode, MethodSignature... methodSignatures) {
+      MethodSubject subject, MethodSignature... methodSignatures) {
     for (MethodSignature methodSignature : methodSignatures) {
-      checkMethodIsNeverInvoked(dexCode, methodSignature);
+      checkMethodIsNeverInvoked(subject, methodSignature);
     }
   }
 
-  private static void checkMethodIsNeverInvoked(DexCode dexCode, MethodSignature methodSignature) {
-    assertTrue("At least one invoke to '" + methodSignature.toString() + "'",
-        Arrays.stream(dexCode.instructions)
-            .filter((instr) -> instr.getMethod() != null)
-            .noneMatch((instr) -> instr.getMethod().name.toString().equals(methodSignature.name)));
+  private static void checkMethodIsNeverInvoked(
+      MethodSubject subject, MethodSignature methodSignature) {
+    assertTrue(
+        "At least one invoke to '" + methodSignature.toString() + "'",
+        subject
+            .streamInstructions()
+            .filter(InstructionSubject::isInvoke)
+            .noneMatch(
+                instructionSubject ->
+                    instructionSubject
+                        .getMethod()
+                        .getName()
+                        .toString()
+                        .equals(methodSignature.name)));
   }
 
   protected static void checkMethodsPresence(
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index 105d097..902ca67 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -14,13 +14,14 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.cf.code.CfInstruction;
+import com.android.tools.r8.cf.code.CfNew;
+import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.code.NewInstance;
 import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.IntBox;
@@ -35,7 +36,6 @@
 import java.util.Set;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -244,15 +244,16 @@
 
   @Test
   public void testDataClass() throws Exception {
-    // TODO(b/179866251): Update tests.
-    assumeTrue(kotlinc.is(KOTLINC_1_3_72) && testParameters.isDexRuntime());
     String mainClassName = "class_inliner_data_class.MainKt";
     runTest("class_inliner_data_class", mainClassName)
         .inspect(
             inspector -> {
               ClassSubject clazz = inspector.clazz(mainClassName);
               assertEquals(
-                  Collections.emptySet(),
+                  // TODO(b/202947898): Should be able to class inline alpha
+                  kotlinc.is(KOTLINC_1_5_0)
+                      ? Collections.singleton("class_inliner_data_class.Alpha")
+                      : Collections.emptySet(),
                   collectAccessedTypes(
                       type -> !type.toSourceString().startsWith("java."),
                       clazz,
@@ -260,7 +261,10 @@
                       String[].class.getCanonicalName()));
               assertEquals(
                   Lists.newArrayList(
-                      "void kotlin.jvm.internal.Intrinsics.throwParameterIsNullException(java.lang.String)"),
+                      kotlinc.is(KOTLINC_1_3_72)
+                          ? "void kotlin.jvm.internal.Intrinsics.throwParameterIsNullException(java.lang.String)"
+                          : "void kotlin.jvm.internal.Intrinsics.checkNotNullParameter(java.lang.Object,"
+                                + " java.lang.String)"),
                   collectStaticCalls(clazz, "main", String[].class.getCanonicalName()));
             });
   }
@@ -272,15 +276,30 @@
       String... params) {
     assertNotNull(clazz);
     MethodSignature signature = new MethodSignature(methodName, "void", params);
-    // TODO(b/179866251): Allow for CF code here.
-    DexCode code = clazz.method(signature).getMethod().getCode().asDexCode();
-    return Stream.concat(
-        filterInstructionKind(code, NewInstance.class)
-            .map(insn -> ((NewInstance) insn).getType()),
-        filterInstructionKind(code, SgetObject.class)
-            .map(insn -> insn.getField().holder)
-    )
-        .filter(isTypeOfInterest)
+    return clazz
+        .method(signature)
+        .streamInstructions()
+        .filter(instruction -> instruction.isNewInstance() || instruction.isStaticGet())
+        .map(
+            instruction -> {
+              if (instruction.isCfInstruction()) {
+                CfInstruction baseInstruction = instruction.asCfInstruction().getInstruction();
+                if (baseInstruction instanceof CfNew) {
+                  return ((CfNew) baseInstruction).getType();
+                } else if (instruction.getField().getType().isReferenceType()) {
+                  return instruction.getField().getHolderType();
+                }
+              } else {
+                Instruction baseInstruction = instruction.asDexInstruction().getInstruction();
+                if (baseInstruction instanceof SgetObject) {
+                  return baseInstruction.getField().getHolderType();
+                } else if (baseInstruction instanceof NewInstance) {
+                  return ((NewInstance) baseInstruction).getType();
+                }
+              }
+              return null;
+            })
+        .filter(type -> type != null && isTypeOfInterest.test(type))
         .map(DexType::toSourceString)
         .collect(Collectors.toSet());
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
index 6ec949a..c407a5b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
 import com.android.tools.r8.KotlinTestBase;
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
@@ -53,8 +53,6 @@
 
   @Test
   public void b139432507() throws Exception {
-    // TODO(b/179866251): Update tests.
-    assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
     testForR8(parameters.getBackend())
         .addProgramFiles(
             compiledJars.getForConfiguration(kotlinc, targetVersion),
@@ -78,7 +76,9 @@
               MethodSubject isSupported = main.uniqueMethodWithName("isSupported");
               assertThat(isSupported, isPresent());
               assertEquals(
-                  allowAccessModification ? 0 : 1,
+                  !kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72) || allowAccessModification
+                      ? 0
+                      : 1,
                   countCall(isSupported, "checkParameterIsNotNull"));
 
               // In general cases, null check won't be invoked only once or twice, hence no subtle
@@ -91,21 +91,22 @@
 
   @Test
   public void b139432507_isSupported() throws Exception {
-    // TODO(b/179866251): Update tests.
-    assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
     assumeTrue("Different inlining behavior on CF backend", parameters.isDexRuntime());
-    testSingle("isSupported");
+    testSingle(
+        "isSupported",
+        kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72) && !allowAccessModification);
   }
 
   @Test
   public void b139432507_containsArray() throws Exception {
-    // TODO(b/179866251): Update tests.
-    assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
     assumeTrue("Different inlining behavior on CF backend", parameters.isDexRuntime());
-    testSingle("containsArray");
+    // One for each of the method's own arguments, unless building with
+    // -allowaccessmodification.
+    testSingle("containsArray", allowAccessModification);
   }
 
-  private void testSingle(String methodName) throws Exception {
+  private void testSingle(String methodName, boolean checkParameterIsNotNullCountIsArity)
+      throws Exception {
     testForR8(parameters.getBackend())
         .addProgramFiles(
             compiledJars.getForConfiguration(kotlinc, targetVersion),
@@ -129,10 +130,8 @@
               MethodSubject method = main.uniqueMethodWithName(methodName);
               assertThat(method, isPresent());
               int arity = method.getMethod().getReference().getArity();
-              // One for each of the method's own arguments, unless building with
-              // -allowaccessmodification.
               assertEquals(
-                  allowAccessModification ? 0 : arity,
+                  checkParameterIsNotNullCountIsArity ? arity : 0,
                   countCall(method, "checkParameterIsNotNull"));
             });
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
index 9d66188..692f73b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
@@ -3,13 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
@@ -49,8 +47,6 @@
 
   @Test
   public void b110196118() throws Exception {
-    // TODO(b/179866251): Update tests.
-    assumeTrue(kotlinc.is(KOTLINC_1_3_72));
     final String mainClassName = "unused_singleton.MainKt";
     final String moduleName = "unused_singleton.TestModule";
     runTest("unused_singleton", mainClassName)
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index 2cb21d4..1da9c86 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -4,11 +4,8 @@
 
 package com.android.tools.r8.kotlin;
 
-import static org.junit.Assume.assumeTrue;
-
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -62,8 +59,6 @@
 
   @Test
   public void test_dataclass_gettersOnly() throws Exception {
-    // TODO(b/179866251): Allow for CF code.
-    assumeTrue(testParameters.isDexRuntime());
     String mainClassName = "dataclass.MainGettersOnlyKt";
     MethodSignature testMethodSignature =
         new MethodSignature("testDataClassGetters", "void", Collections.emptyList());
@@ -99,20 +94,17 @@
 
               ClassSubject classSubject = checkClassIsKept(inspector, mainClassName);
               MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
-              DexCode dexCode = getDexCode(testMethod);
               if (allowAccessModification) {
                 // Both getters should be inlined
-                checkMethodIsNeverInvoked(dexCode, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
+                checkMethodIsNeverInvoked(testMethod, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
               } else {
-                checkMethodIsInvokedAtLeastOnce(dexCode, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
+                checkMethodIsInvokedAtLeastOnce(testMethod, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
               }
             });
   }
 
   @Test
   public void test_dataclass_componentOnly() throws Exception {
-    // TODO(b/179866251): Allow for CF code.
-    assumeTrue(testParameters.isDexRuntime());
     String mainClassName = "dataclass.MainComponentOnlyKt";
     MethodSignature testMethodSignature =
         new MethodSignature("testAllDataClassComponentFunctions", "void", Collections.emptyList());
@@ -150,19 +142,16 @@
 
               ClassSubject classSubject = checkClassIsKept(inspector, mainClassName);
               MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
-              DexCode dexCode = getDexCode(testMethod);
               if (allowAccessModification) {
-                checkMethodIsNeverInvoked(dexCode, COMPONENT1_METHOD, COMPONENT2_METHOD);
+                checkMethodIsNeverInvoked(testMethod, COMPONENT1_METHOD, COMPONENT2_METHOD);
               } else {
-                checkMethodIsInvokedAtLeastOnce(dexCode, COMPONENT1_METHOD, COMPONENT2_METHOD);
+                checkMethodIsInvokedAtLeastOnce(testMethod, COMPONENT1_METHOD, COMPONENT2_METHOD);
               }
             });
   }
 
   @Test
   public void test_dataclass_componentPartial() throws Exception {
-    // TODO(b/179866251): Allow for CF code.
-    assumeTrue(testParameters.isDexRuntime());
     String mainClassName = "dataclass.MainComponentPartialKt";
     MethodSignature testMethodSignature =
         new MethodSignature("testSomeDataClassComponentFunctions", "void", Collections.emptyList());
@@ -198,11 +187,10 @@
 
               ClassSubject classSubject = checkClassIsKept(inspector, mainClassName);
               MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
-              DexCode dexCode = getDexCode(testMethod);
               if (allowAccessModification) {
-                checkMethodIsNeverInvoked(dexCode, COMPONENT2_METHOD);
+                checkMethodIsNeverInvoked(testMethod, COMPONENT2_METHOD);
               } else {
-                checkMethodIsInvokedAtLeastOnce(dexCode, COMPONENT2_METHOD);
+                checkMethodIsInvokedAtLeastOnce(testMethod, COMPONENT2_METHOD);
               }
             });
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
index 4457386..142e48d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
@@ -4,9 +4,7 @@
 
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
-import static org.junit.Assume.assumeTrue;
-
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -44,12 +42,9 @@
 
   @Test
   public void testParameterNullCheckIsInlined() throws Exception {
-    // TODO(b/179866251): Update tests.
-    assumeTrue(kotlinc.is(KOTLINC_1_3_72));
     final String extraRules = keepClassMethod("intrinsics.IntrinsicsKt",
         new MethodSignature("expectsNonNullParameters",
             "java.lang.String", Lists.newArrayList("java.lang.String", "java.lang.String")));
-
     runTest(
             "intrinsics",
             "intrinsics.IntrinsicsKt",
@@ -67,13 +62,15 @@
                               "throwParameterIsNullException",
                               "void",
                               Collections.singletonList("java.lang.String")),
-                          true)
+                          // throwParameterIsNullException is not added for test starting from 1.4
+                          kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72))
                       .put(
                           new MethodSignature(
                               "checkParameterIsNotNull",
                               "void",
                               Lists.newArrayList("java.lang.Object", "java.lang.String")),
-                          !allowAccessModification)
+                          kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72)
+                              && !allowAccessModification)
                       .build());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index 091a8b4..6f0ac32 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -3,9 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
@@ -69,20 +67,20 @@
               // Find forMakeAndModel(...) after parameter removal.
               MethodSubject testMethod = clazz.uniqueMethodWithName(testMethodSignature.name);
               long ifzCount =
-                  testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNez()).count();
+                  testMethod
+                      .streamInstructions()
+                      .filter(i -> i.isIfEqz() || i.isIfNez() || i.isIfNonNull())
+                      .count();
               long paramNullCheckCount =
                   countCall(testMethod, "Intrinsics", "checkParameterIsNotNull");
               // One after Iterator#hasNext, and another in the filter predicate: sinceYear != null.
-              // TODO(b/179951729): Not the same amount of ifz on CF and DEX.
-              assertEquals(testParameters.isCfRuntime() ? 1 : 2, ifzCount);
+              assertEquals(2, ifzCount);
               assertEquals(0, paramNullCheckCount);
             });
   }
 
   @Test
   public void test_example2() throws Exception {
-    // TODO(b/179866251): Update tests.
-    assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
     final TestKotlinClass ex2 = new TestKotlinClass("non_null.Example2Kt");
     final MethodSignature testMethodSignature =
         new MethodSignature("aOrDefault", STRING, ImmutableList.of(STRING, STRING));
@@ -93,15 +91,13 @@
         .inspect(
             inspector -> {
               ClassSubject clazz = checkClassIsKept(inspector, ex2.getClassName());
-
               MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
               long ifzCount =
-                  testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNez()).count();
+                  testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNull()).count();
               long paramNullCheckCount =
                   countCall(testMethod, "Intrinsics", "checkParameterIsNotNull");
               // ?: in aOrDefault
-              // TODO(b/179951729): Not the same amount of ifz on CF and DEX.
-              assertEquals(testParameters.isCfRuntime() ? 0 : 1, ifzCount);
+              assertEquals(1, ifzCount);
               assertEquals(0, paramNullCheckCount);
             });
   }
@@ -118,14 +114,12 @@
         .inspect(
             inspector -> {
               ClassSubject clazz = checkClassIsKept(inspector, ex3.getClassName());
-
               MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
               long ifzCount =
-                  testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNez()).count();
+                  testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNull()).count();
               // !! operator inside explicit null check should be gone.
               // One explicit null-check as well as 4 bar? accesses.
-              // TODO(b/179951729): Not the same amount of ifz on CF and DEX.
-              assertEquals(testParameters.isCfRuntime() ? 0 : 5, ifzCount);
+              assertEquals(5, ifzCount);
             });
   }
 }
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 64b3914..4465113 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
@@ -312,10 +312,16 @@
         && ((CfStackInstruction) instruction).getOpcode() == opcode;
   }
 
+  @Override
   public boolean isIfNull() {
     return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNULL;
   }
 
+  @Override
+  public boolean isIfNonNull() {
+    return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNONNULL;
+  }
+
   public boolean isLoad() {
     return instruction instanceof CfLoad;
   }
@@ -407,4 +413,8 @@
   public String toString() {
     return instruction.toString();
   }
+
+  public CfInstruction getInstruction() {
+    return instruction;
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
index 2bfadc8..91f0ea9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
@@ -336,6 +336,18 @@
   }
 
   @Override
+  public boolean isIfNull() {
+    // Not in DEX.
+    return false;
+  }
+
+  @Override
+  public boolean isIfNonNull() {
+    // Not in DEX.
+    return false;
+  }
+
+  @Override
   public boolean isReturn() {
     return instruction instanceof Return;
   }
@@ -496,4 +508,8 @@
   public String toString() {
     return instruction.toString();
   }
+
+  public Instruction getInstruction() {
+    return instruction;
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
index cf9ce0a..9f55b56 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
@@ -98,6 +98,10 @@
 
   boolean isIfEqz();
 
+  boolean isIfNull();
+
+  boolean isIfNonNull();
+
   boolean isReturn();
 
   boolean isReturnVoid();