Merge "Increase stack space for javac processes."
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 403790c..b02222f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -192,6 +192,7 @@
   public final DexType stringArrayType = createType(stringArrayDescriptor);
   public final DexType objectType = createType(objectDescriptor);
   public final DexType objectArrayType = createType(objectArrayDescriptor);
+  public final DexType classArrayType = createType(classArrayDescriptor);
   public final DexType enumType = createType(enumDescriptor);
   public final DexType annotationType = createType(annotationDescriptor);
   public final DexType throwableType = createType(throwableDescriptor);
@@ -214,6 +215,8 @@
   public final LongMethods longMethods = new LongMethods();
   public final ThrowableMethods throwableMethods = new ThrowableMethods();
   public final ClassMethods classMethods = new ClassMethods();
+  public final PrimitiveTypesBoxedTypeFields primitiveTypesBoxedTypeFields =
+      new PrimitiveTypesBoxedTypeFields();
   public final AtomicFieldUpdaterMethods atomicFieldUpdaterMethods =
       new AtomicFieldUpdaterMethods();
   public final Kotlin kotlin;
@@ -403,8 +406,54 @@
   }
 
   /**
+   * All boxed types (Boolean, Byte, ...) have a field named TYPE which contains the Class object
+   * for the primitive type.
+   *
+   * E.g. for Boolean https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#TYPE.
+   */
+  public class PrimitiveTypesBoxedTypeFields {
+    public DexField booleanTYPE;
+    public DexField byteTYPE;
+    public DexField charTYPE;
+    public DexField shortTYPE;
+    public DexField intTYPE;
+    public DexField longTYPE;
+    public DexField floatTYPE;
+    public DexField doubleTYPE;
+
+    private final Map<DexField, DexType> boxedFieldTypeToPrimitiveType;
+
+    private PrimitiveTypesBoxedTypeFields() {
+      booleanTYPE = createField(boxedBooleanType, classType, "TYPE");
+      byteTYPE = createField(boxedByteType, classType, "TYPE");
+      charTYPE = createField(boxedCharType, classType, "TYPE");
+      shortTYPE = createField(boxedShortType, classType, "TYPE");
+      intTYPE = createField(boxedIntType, classType, "TYPE");
+      longTYPE = createField(boxedLongType, classType, "TYPE");
+      floatTYPE = createField(boxedFloatType, classType, "TYPE");
+      doubleTYPE = createField(boxedDoubleType, classType, "TYPE");
+
+      boxedFieldTypeToPrimitiveType =
+          ImmutableMap.<DexField, DexType>builder()
+              .put(booleanTYPE, booleanType)
+              .put(byteTYPE, byteType)
+              .put(charTYPE, charType)
+              .put(shortTYPE, shortType)
+              .put(intTYPE, intType)
+              .put(longTYPE, longType)
+              .put(floatTYPE, floatType)
+              .put(doubleTYPE, doubleType)
+              .build();
+    }
+
+    public DexType boxedFieldTypeToPrimitiveType(DexField field) {
+      return boxedFieldTypeToPrimitiveType.get(field);
+    }
+  }
+
+  /**
    * A class that encompasses methods that create different types of atomic field updaters:
-   *   Atomic(Integer|Long|Reference)FieldUpdater#newUpdater.
+   * Atomic(Integer|Long|Reference)FieldUpdater#newUpdater.
    */
   public class AtomicFieldUpdaterMethods {
     public DexMethod intUpdater;
diff --git a/src/main/java/com/android/tools/r8/graph/JarCode.java b/src/main/java/com/android/tools/r8/graph/JarCode.java
index 0a1ee94..b978408 100644
--- a/src/main/java/com/android/tools/r8/graph/JarCode.java
+++ b/src/main/java/com/android/tools/r8/graph/JarCode.java
@@ -163,7 +163,7 @@
       InternalOptions options,
       ValueNumberGenerator generator,
       Position callerPosition) {
-    if (!options.debug) {
+    if (!options.debug || options.testing.removeLocalsTable) {
       node.localVariables.clear();
     }
     JarSourceCode source =
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
index d719d8f..9d815ce 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
@@ -120,6 +120,11 @@
       return b == factory.objectType || b.isArrayType();
     }
 
+    if (b.isArrayType()) {
+      // If A is typed object it can be convertible to an array type.
+      return a == factory.objectType;
+    }
+
     if (a.isPrimitiveType()) {
       if (b.isPrimitiveType()) {
         return isSameOrAdaptableTo(a.descriptor.content[0], b.descriptor.content[0]);
@@ -357,7 +362,8 @@
       return register;
     }
 
-    if (fromType.isClassType() && toType.isClassType()) {
+    if ((fromType.isClassType() && toType.isClassType())
+        || (fromType == factory().objectType && toType.isArrayType())) {
       if (returnType) {
         // For return type adjustment in case `fromType` and `toType` are both reference types,
         // `fromType` does NOT have to be deriving from `toType` and we need to add a cast.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index d220d28..d11946c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -2184,6 +2184,9 @@
                   storesToRemoveForArray.put(array, --toRemoveCount);
                   Instruction construction = instructionToInsertForArray.get(array);
                   if (construction != null) {
+                    // Update the position of the array construction to be the position of the
+                    // last removed put at which point we are now adding the construction.
+                    construction.forceSetPosition(instruction.getPosition());
                     it.add(construction);
                   }
                 }
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
index 5128b96..3d1539e 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
@@ -18,13 +18,15 @@
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.ir.code.ArrayPut;
 import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.ConstInstruction;
+import com.android.tools.r8.ir.code.CheckCast;
 import com.android.tools.r8.ir.code.ConstString;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.NewArrayEmpty;
 import com.android.tools.r8.ir.code.Value;
+import com.google.common.collect.Sets;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
@@ -187,7 +189,11 @@
       itemBasedString = inferFieldInHolder(appInfo, holder, dexString.toString(), null);
     } else {
       assert numOfParams == 3;
-      DexTypeList arguments = retrieveDexTypeListFromClassList(invoke, ins.get(2));
+      DexTypeList arguments =
+          retrieveDexTypeListFromClassList(invoke, ins.get(2), appInfo.dexItemFactory);
+      if (arguments == null) {
+        return null;
+      }
       itemBasedString = inferMethodInHolder(appInfo, holder, dexString.toString(), arguments);
     }
     return itemBasedString;
@@ -246,7 +252,7 @@
     DexItemBasedString itemBasedString =
         inferFieldInHolder(appInfo, holder, memberIdentifier, null);
     if (itemBasedString == null) {
-      itemBasedString = inferMethodInHolder(appInfo, holder, memberIdentifier, null);
+      itemBasedString = inferMethodNameInHolder(appInfo, holder, memberIdentifier);
     }
     return itemBasedString;
   }
@@ -273,20 +279,18 @@
     return itemBasedString;
   }
 
-  private static DexItemBasedString inferMethodInHolder(
-      AppInfo appInfo, DexClass holder, String name, DexTypeList arguments) {
+  private static DexItemBasedString inferMethodNameInHolder(
+      AppInfo appInfo, DexClass holder, String name) {
     DexItemBasedString itemBasedString = null;
     for (DexEncodedMethod encodedMethod : holder.directMethods()) {
-      if (encodedMethod.method.name.toString().equals(name)
-          && (arguments == null || encodedMethod.method.proto.parameters.equals(arguments))) {
+      if (encodedMethod.method.name.toString().equals(name)) {
         itemBasedString = appInfo.dexItemFactory.createItemBasedString(encodedMethod.method);
         break;
       }
     }
     if (itemBasedString == null) {
       for (DexEncodedMethod encodedMethod : holder.virtualMethods()) {
-        if (encodedMethod.method.name.toString().equals(name)
-            && (arguments == null || encodedMethod.method.proto.parameters.equals(arguments))) {
+        if (encodedMethod.method.name.toString().equals(name)) {
           itemBasedString = appInfo.dexItemFactory.createItemBasedString(encodedMethod.method);
           break;
         }
@@ -295,13 +299,59 @@
     return itemBasedString;
   }
 
-  // Perform a conservative evaluation of the constant content of an array from its construction
+  private static DexItemBasedString inferMethodInHolder(
+      AppInfo appInfo, DexClass holder, String name, DexTypeList arguments) {
+    assert arguments != null;
+    DexItemBasedString itemBasedString = null;
+    for (DexEncodedMethod encodedMethod : holder.directMethods()) {
+      if (encodedMethod.method.name.toString().equals(name)
+          && encodedMethod.method.proto.parameters.equals(arguments)) {
+        itemBasedString = appInfo.dexItemFactory.createItemBasedString(encodedMethod.method);
+        break;
+      }
+    }
+    if (itemBasedString == null) {
+      for (DexEncodedMethod encodedMethod : holder.virtualMethods()) {
+        if (encodedMethod.method.name.toString().equals(name)
+            && encodedMethod.method.proto.parameters.equals(arguments)) {
+          itemBasedString = appInfo.dexItemFactory.createItemBasedString(encodedMethod.method);
+          break;
+        }
+      }
+    }
+    return itemBasedString;
+  }
+
+  private static DexType getTypeFromConstClassOrBoxedPrimitive(
+      Value value, DexItemFactory factory) {
+    if (value.isPhi()) {
+      return null;
+    }
+    if (value.isConstant() && value.getConstInstruction().isConstClass()) {
+      return value.getConstInstruction().asConstClass().getValue();
+    }
+    if (value.definition.isStaticGet()) {
+      return factory.primitiveTypesBoxedTypeFields.boxedFieldTypeToPrimitiveType(
+          value.definition.asStaticGet().getField());
+    }
+    return null;
+  }
+
+  // Perform a conservative evaluation of an array content of dex type values from its construction
   // until its use at a given instruction.
-  private static ConstInstruction[] evaluateConstArrayContentFromConstructionToUse(
-      NewArrayEmpty newArray, int size, Instruction user) {
-    ConstInstruction[] values = new ConstInstruction[size];
+  private static DexType[] evaluateTypeArrayContentFromConstructionToUse(
+      NewArrayEmpty newArray,
+      List<CheckCast> aliases,
+      int size,
+      Instruction user,
+      DexItemFactory factory) {
+    DexType[] values = new DexType[size];
     int remaining = size;
-    Set<Instruction> users = newArray.outValue().uniqueUsers();
+    Set<Instruction> users = Sets.newIdentityHashSet();
+    users.addAll(newArray.outValue().uniqueUsers());
+    for (CheckCast alias : aliases) {
+      users.addAll(alias.outValue().uniqueUsers());
+    }
     // Follow the path from the array construction to the requested use collecting the constants
     // put into the array. Conservatively bail out if the content of the array cannot be statically
     // computed.
@@ -320,25 +370,33 @@
           // the content was requested.
           return remaining == 0 ? values : null;
         }
-        // Any other kinds of use besides array-put mean that the array escapes and could be
-        // altered.
+        // Any other kinds of use besides array-put mean that the array escapes and its content
+        // could be altered.
         if (!instruction.isArrayPut()) {
-          return null;
+          if (instruction.isCheckCast() && aliases.contains(instruction.asCheckCast())) {
+            continue;
+          }
+          values = new DexType[size];
+          remaining = size;
+          continue;
         }
         ArrayPut arrayPut = instruction.asArrayPut();
-        if (!(arrayPut.value().isConstant() && arrayPut.index().isConstNumber())) {
+        if (!arrayPut.index().isConstNumber()) {
           return null;
         }
         int index = arrayPut.index().getConstInstruction().asConstNumber().getIntValue();
         if (index < 0 || index >= values.length) {
           return null;
         }
+        DexType type = getTypeFromConstClassOrBoxedPrimitive(arrayPut.value(), factory);
+        if (type == null) {
+          return null;
+        }
         // Allow several writes to the same array element.
         if (values[index] == null) {
           remaining--;
         }
-        ConstInstruction value = arrayPut.value().getConstInstruction();
-        values[index] = value;
+        values[index] = type;
       }
       if (!block.exit().isGoto()) {
         return null;
@@ -364,7 +422,7 @@
    * @return a list of {@link DexType} that corresponds to const class in {@param classListValue}
    */
   private static DexTypeList retrieveDexTypeListFromClassList(
-      InvokeMethod invoke, Value classListValue) {
+      InvokeMethod invoke, Value classListValue, DexItemFactory factory) {
 
     // The code
     //   A.class.getMethod("m", String.class, String.class)
@@ -385,8 +443,31 @@
     // INVOKEVIRTUAL java/lang/Class.getMethod \
     //     (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
 
+    // Besides the code pattern above this supports a series of check-cast instructions. e.g.:
+    //
+    // A.class.getMethod("name", (Class<?>[]) new Class<?>[]{String.class})
+
+    List<CheckCast> aliases = new ArrayList<>();
+    if (!classListValue.isPhi()
+        && classListValue.definition.isCheckCast()
+        && classListValue.definition.asCheckCast().getType() == factory.classArrayType) {
+      while (!classListValue.isPhi() && classListValue.definition.isCheckCast()) {
+        aliases.add(classListValue.definition.asCheckCast());
+        classListValue = classListValue.definition.asCheckCast().object();
+      }
+    }
+    if (classListValue.isPhi()) {
+      return null;
+    }
+
+    // A null argument list is an empty argument list
+    if (classListValue.isZero()) {
+      return DexTypeList.empty();
+    }
+
     // Make sure this Value refers to a new array.
-    if (!classListValue.definition.isNewArrayEmpty()) {
+    if (!classListValue.definition.isNewArrayEmpty()
+        || !classListValue.definition.asNewArrayEmpty().size().isConstant()) {
       return null;
     }
 
@@ -402,20 +483,13 @@
       return DexTypeList.empty();
     }
 
-    ConstInstruction[] arrayContent =
-        evaluateConstArrayContentFromConstructionToUse(
-            classListValue.definition.asNewArrayEmpty(), size, invoke);
+    DexType[] arrayContent =
+        evaluateTypeArrayContentFromConstructionToUse(
+            classListValue.definition.asNewArrayEmpty(), aliases, size, invoke, factory);
 
     if (arrayContent == null) {
       return null;
     }
-    DexType[] types = new DexType[size];
-    for (int i = 0; i < size; i++) {
-      if (!arrayContent[i].isConstClass()) {
-        return null;
-      }
-      types[i] = arrayContent[i].asConstClass().getValue();
-    }
-    return new DexTypeList(types);
+    return new DexTypeList(arrayContent);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 5975442..c7d6561 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -462,6 +462,7 @@
     public boolean nondeterministicCycleElimination = false;
     public Set<Inliner.Reason> validInliningReasons = null;
     public boolean suppressExperimentalCfBackendWarning = false;
+    public boolean removeLocalsTable = false;
   }
 
   public boolean canUseInvokePolymorphicOnVarHandle() {
diff --git a/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java b/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java
index 1d6772a..c533684 100644
--- a/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java
+++ b/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java
@@ -462,6 +462,42 @@
     builder.append(a.greet()).append('\n');
   }
 
+  // Make the test independent of libraries by not using java.util.function.Function.
+  interface MyFunction<T, R> {
+    R apply(T var1);
+  }
+
+  static class Observable<T> {
+  }
+
+  static class Handler<T> {
+    T elements;
+
+    Handler(T e) {
+      elements = e;
+    }
+
+    public T handleErrors(T result) {
+      System.out.println(result.getClass().getName());
+      return null;
+    }
+
+    public final Observable<T> map(MyFunction<? super T, ? extends T> mapper) {
+      System.out.println("Handler.map");
+      mapper.apply(elements);
+      return null;
+    }
+  }
+
+
+  static class B116542124 {
+    private Handler<String[]> approvalManagersHandler = new Handler<>(new String[] { "asdf" });
+
+    public void test() {
+      approvalManagersHandler.map(approvalManagersHandler::handleErrors);
+    }
+  }
+
   public static void main(String[] args) {
     StringBuffer builder = new StringBuffer();
 
@@ -482,7 +518,7 @@
 
     checkMisc(builder);
     bB70348575(builder);
-
+    new B116542124().test();
     System.out.println(builder.toString());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
index 7e3be90..f734ab8 100644
--- a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
+++ b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
@@ -7,104 +7,98 @@
 import static com.android.tools.r8.TestCondition.R8_COMPILER;
 import static com.android.tools.r8.TestCondition.and;
 import static com.android.tools.r8.TestCondition.any;
-import static com.android.tools.r8.TestCondition.anyDexVm;
-import static com.android.tools.r8.TestCondition.artRuntimesFromAndJava;
-import static com.android.tools.r8.TestCondition.artRuntimesUpToAndJava;
 import static com.android.tools.r8.TestCondition.match;
 import static com.android.tools.r8.TestCondition.runtimes;
+import static com.android.tools.r8.TestCondition.runtimesFrom;
+import static com.android.tools.r8.TestCondition.runtimesUpTo;
 
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
 import com.android.tools.r8.R8RunArtTestsTest.DexTool;
-import com.android.tools.r8.TestCondition.Runtime;
+import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
 import java.util.Collection;
-import java.util.Set;
 import java.util.function.BiFunction;
 
 public class JctfTestSpecifications {
 
   public enum Outcome {
     PASSES,
-    FAILS_WHEN_RUN,
-    TIMEOUTS_WHEN_RUN,
-    FLAKY_WHEN_RUN
+    FAILS_WITH_ART,
+    TIMEOUTS_WITH_ART,
+    FLAKY_WITH_ART
   }
 
   public static final Multimap<String, TestCondition> failuresToTriage =
       new ImmutableListMultimap.Builder<String, TestCondition>()
-          .put("math.BigInteger.nextProbablePrime.BigInteger_nextProbablePrime_A02", anyDexVm())
+          .put("math.BigInteger.nextProbablePrime.BigInteger_nextProbablePrime_A02", any())
           .put("math.BigInteger.ConstructorLjava_lang_String.BigInteger_Constructor_A02", any())
           .put(
               "lang.StringBuffer.insertILjava_lang_Object.StringBuffer_insert_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA)))
-          .put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", anyDexVm())
+              match(runtimes(Version.DEFAULT)))
+          .put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", any())
           .put(
               "lang.CloneNotSupportedException.serialization.CloneNotSupportedException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.NumberFormatException.serialization.NumberFormatException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.StrictMath.roundF.StrictMath_round_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0, Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0)))
           .put(
               "lang.StrictMath.roundD.StrictMath_round_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0, Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0)))
           .put("lang.StrictMath.atan2DD.StrictMath_atan2_A01", any())
           .put("lang.Thread.stop.Thread_stop_A05", any())
-          .put("lang.Thread.resume.Thread_resume_A02", anyDexVm())
-          .put("lang.Thread.suspend.Thread_suspend_A02", anyDexVm())
+          .put("lang.Thread.resume.Thread_resume_A02", any())
+          .put("lang.Thread.suspend.Thread_suspend_A02", any())
           .put("lang.Thread.stop.Thread_stop_A03", any())
           .put("lang.Thread.interrupt.Thread_interrupt_A03", any())
           .put("lang.Thread.stop.Thread_stop_A04", any())
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0, Runtime.ART_V6_0_1)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1)))
           .put(
               "lang.Thread.getUncaughtExceptionHandler.Thread_getUncaughtExceptionHandler_A01",
-              anyDexVm())
-          .put("lang.Thread.getStackTrace.Thread_getStackTrace_A02", anyDexVm())
-          .put("lang.Thread.enumerate_Ljava_lang_Thread.Thread_enumerate_A02", anyDexVm())
+              any())
+          .put("lang.Thread.getStackTrace.Thread_getStackTrace_A02", any())
+          .put("lang.Thread.enumerate_Ljava_lang_Thread.Thread_enumerate_A02", any())
           .put("lang.Thread.countStackFrames.Thread_countStackFrames_A01", any())
           .put(
               "lang.Thread.getAllStackTraces.Thread_getAllStackTraces_A01",
-              match(runtimes(Runtime.ART_V7_0_0)))
-          .put(
-              "lang.Thread.destroy.Thread_destroy_A01",
-              match(TestCondition.artRuntimesFrom(Runtime.ART_V4_4_4)))
-          .put("lang.Thread.isAlive.Thread_isAlive_A01", anyDexVm())
+              match(runtimes(Version.V7_0_0)))
+          .put("lang.Thread.destroy.Thread_destroy_A01", match(runtimesFrom(Version.V4_4_4)))
+          .put("lang.Thread.isAlive.Thread_isAlive_A01", any())
           .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A04", any())
           .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A03", any())
           .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A05", any())
-          .put("lang.Thread.getPriority.Thread_getPriority_A01", anyDexVm())
+          .put("lang.Thread.getPriority.Thread_getPriority_A01", any())
           .put(
               "lang.Thread.getContextClassLoader.Thread_getContextClassLoader_A03",
-              match(runtimes(Runtime.ART_V7_0_0)))
-          .put("lang.OutOfMemoryError.serialization.OutOfMemoryError_serialization_A01", anyDexVm())
+              match(runtimes(Version.V7_0_0)))
+          .put("lang.OutOfMemoryError.serialization.OutOfMemoryError_serialization_A01", any())
           .put(
               "lang.RuntimePermission.ConstructorLjava_lang_StringLjava_lang_String.RuntimePermission_Constructor_A01",
-              anyDexVm())
-          .put(
-              "lang.RuntimePermission.serialization.RuntimePermission_serialization_A01",
-              anyDexVm())
+              any())
+          .put("lang.RuntimePermission.serialization.RuntimePermission_serialization_A01", any())
           .put(
               "lang.RuntimePermission.ConstructorLjava_lang_StringLjava_lang_String.RuntimePermission_Constructor_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.RuntimePermission.ConstructorLjava_lang_StringLjava_lang_String.RuntimePermission_Constructor_A03",
-              anyDexVm())
+              any())
           .put("lang.RuntimePermission.Class.RuntimePermission_class_A17", any())
           .put(
               "lang.RuntimePermission.ConstructorLjava_lang_String.RuntimePermission_Constructor_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.RuntimePermission.ConstructorLjava_lang_String.RuntimePermission_Constructor_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.RuntimePermission.ConstructorLjava_lang_String.RuntimePermission_Constructor_A01",
-              anyDexVm())
+              any())
           .put("lang.RuntimePermission.Class.RuntimePermission_class_A26", any())
           .put("lang.RuntimePermission.Class.RuntimePermission_class_A04", any())
           .put("lang.RuntimePermission.Class.RuntimePermission_class_A03", any())
@@ -129,615 +123,474 @@
           .put("lang.RuntimePermission.Class.RuntimePermission_class_A01", any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A06",
-              anyDexVm())
+              any())
           .put("lang.RuntimePermission.Class.RuntimePermission_class_A14", any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A05",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A04",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A07",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.setPackageAssertionStatusLjava_lang_StringZ.ClassLoader_setPackageAssertionStatus_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.setPackageAssertionStatusLjava_lang_StringZ.ClassLoader_setPackageAssertionStatus_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.setPackageAssertionStatusLjava_lang_StringZ.ClassLoader_setPackageAssertionStatus_A03",
-              anyDexVm())
-          .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A03", anyDexVm())
-          .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A01", anyDexVm())
-          .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A04", anyDexVm())
+              any())
+          .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A03", any())
+          .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A01", any())
+          .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A04", any())
           .put(
               "lang.ClassLoader.definePackageLjava_lang_String6Ljava_net_URL.ClassLoader_definePackage_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.definePackageLjava_lang_String6Ljava_net_URL.ClassLoader_definePackage_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.definePackageLjava_lang_String6Ljava_net_URL.ClassLoader_definePackage_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A05",
-              anyDexVm())
-          .put(
-              "lang.ClassLoader.getResourceLjava_lang_String.ClassLoader_getResource_A01",
-              anyDexVm())
+              any())
+          .put("lang.ClassLoader.getResourceLjava_lang_String.ClassLoader_getResource_A01", any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A06",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A07",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0)))
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A04",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.setSignersLjava_lang_Class_Ljava_lang_Object.ClassLoader_setSigners_A01",
-              anyDexVm())
-          .put(
-              "lang.ClassLoader.clearAssertionStatus.ClassLoader_clearAssertionStatus_A01",
-              anyDexVm())
-          .put("lang.ClassLoader.Constructor.ClassLoader_Constructor_A02", anyDexVm())
+              any())
+          .put("lang.ClassLoader.clearAssertionStatus.ClassLoader_clearAssertionStatus_A01", any())
+          .put("lang.ClassLoader.Constructor.ClassLoader_Constructor_A02", any())
           .put(
               "lang.ClassLoader.getSystemResourceLjava_lang_String.ClassLoader_getSystemResource_A01",
-              anyDexVm())
-          .put(
-              "lang.ClassLoader.getResourcesLjava_lang_String.ClassLoader_getResources_A01",
-              anyDexVm())
-          .put(
-              "lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A02",
-              anyDexVm())
+              any())
+          .put("lang.ClassLoader.getResourcesLjava_lang_String.ClassLoader_getResources_A01", any())
+          .put("lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A02", any())
           .put(
               "lang.ClassLoader.getResourceAsStreamLjava_lang_String.ClassLoader_getResourceAsStream_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.findLoadedClassLjava_lang_String.ClassLoader_findLoadedClass_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A02",
-              anyDexVm())
-          .put(
-              "lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A01",
-              anyDexVm())
+              any())
+          .put("lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A01", any())
           .put(
               "lang.ClassLoader.setDefaultAssertionStatusZ.ClassLoader_setDefaultAssertionStatus_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A05",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A06",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A08",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.getSystemResourcesLjava_lang_String.ClassLoader_getSystemResources_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A07",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A09",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A04",
-              anyDexVm())
-          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A02", anyDexVm())
+              any())
+          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A02", any())
           .put(
               "lang.ClassLoader.getSystemResourceAsStreamLjava_lang_String.ClassLoader_getSystemResourceAsStream_A01",
-              anyDexVm())
-          .put("lang.ClassLoader.getPackages.ClassLoader_getPackages_A01", anyDexVm())
+              any())
+          .put("lang.ClassLoader.getPackages.ClassLoader_getPackages_A01", any())
           .put(
               "lang.ClassLoader.setClassAssertionStatusLjava_lang_StringZ.ClassLoader_setClassAssertionStatus_A01",
               any())
-          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A03", anyDexVm())
-          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A01", anyDexVm())
-          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A04", anyDexVm())
-          .put("lang.ClassLoader.getParent.ClassLoader_getParent_A01", anyDexVm())
+          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A03", any())
+          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A01", any())
+          .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A04", any())
+          .put("lang.ClassLoader.getParent.ClassLoader_getParent_A01", any())
           .put(
               "lang.ClassLoader.setClassAssertionStatusLjava_lang_StringZ.ClassLoader_setClassAssertionStatus_A04",
               any())
           .put(
               "lang.ClassLoader.setClassAssertionStatusLjava_lang_StringZ.ClassLoader_setClassAssertionStatus_A02",
-              anyDexVm())
-          .put("lang.ClassLoader.getParent.ClassLoader_getParent_A02", anyDexVm())
-          .put(
-              "lang.ClassLoader.getSystemClassLoader.ClassLoader_getSystemClassLoader_A02",
-              anyDexVm())
+              any())
+          .put("lang.ClassLoader.getParent.ClassLoader_getParent_A02", any())
+          .put("lang.ClassLoader.getSystemClassLoader.ClassLoader_getSystemClassLoader_A02", any())
           .put(
               "lang.ClassLoader.ConstructorLjava_lang_ClassLoader.ClassLoader_Constructor_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.ClassLoader.findSystemClassLjava_lang_String.ClassLoader_findSystemClass_A04",
-              anyDexVm())
-          .put(
-              "lang.ClassLoader.getPackageLjava_lang_String.ClassLoader_getPackage_A01", anyDexVm())
+              any())
+          .put("lang.ClassLoader.getPackageLjava_lang_String.ClassLoader_getPackage_A01", any())
           .put(
               "lang.NoClassDefFoundError.serialization.NoClassDefFoundError_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.TypeNotPresentException.serialization.TypeNotPresentException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.IndexOutOfBoundsException.serialization.IndexOutOfBoundsException_serialization_A01",
-              anyDexVm())
-          .put("lang.Enum.serialization.Enum_serialization_A01", anyDexVm())
-          .put("lang.Enum.ConstructorLjava_lang_StringI.Enum_Constructor_A01", anyDexVm())
-          .put("lang.InternalError.serialization.InternalError_serialization_A01", anyDexVm())
-          .put("lang.Error.serialization.Error_serialization_A01", anyDexVm())
+              any())
+          .put("lang.Enum.serialization.Enum_serialization_A01", any())
+          .put("lang.Enum.ConstructorLjava_lang_StringI.Enum_Constructor_A01", any())
+          .put("lang.InternalError.serialization.InternalError_serialization_A01", any())
+          .put("lang.Error.serialization.Error_serialization_A01", any())
           .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A02", any())
           .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A05", any())
           .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A03", any())
           .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A04", any())
-          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A02", anyDexVm())
-          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A03", anyDexVm())
-          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A01", anyDexVm())
+          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A02", any())
+          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A03", any())
+          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A01", any())
           .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A04", any())
           .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A05", any())
           .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A03", any())
-          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A02", anyDexVm())
-          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A03", anyDexVm())
+          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A02", any())
+          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A03", any())
           .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A02", any())
-          .put("lang.Runtime.traceMethodCallsZ.Runtime_traceMethodCalls_A01", anyDexVm())
-          .put(
-              "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A01",
-              anyDexVm())
-          .put(
-              "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A08",
-              anyDexVm())
-          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A01", anyDexVm())
-          .put(
-              "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A03",
-              anyDexVm())
-          .put(
-              "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A07",
-              anyDexVm())
-          .put(
-              "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A05",
-              anyDexVm())
-          .put(
-              "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A06",
-              anyDexVm())
-          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A03", anyDexVm())
-          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A02", anyDexVm())
-          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A01", anyDexVm())
+          .put("lang.Runtime.traceMethodCallsZ.Runtime_traceMethodCalls_A01", any())
+          .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A01", any())
+          .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A08", any())
+          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A01", any())
+          .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A03", any())
+          .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A07", any())
+          .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A05", any())
+          .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A06", any())
+          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A03", any())
+          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A02", any())
+          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A01", any())
           .put(
               "lang.Runtime.removeShutdownHookLjava_lang_Thread.Runtime_removeShutdownHook_A02",
-              anyDexVm())
-          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A01", anyDexVm())
+              any())
+          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A01", any())
           .put(
               "lang.Runtime.removeShutdownHookLjava_lang_Thread.Runtime_removeShutdownHook_A01",
-              anyDexVm())
-          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A02", anyDexVm())
+              any())
+          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A02", any())
           .put(
               "lang.Runtime.removeShutdownHookLjava_lang_Thread.Runtime_removeShutdownHook_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A01",
-              anyDexVm())
-          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A03", anyDexVm())
+              any())
+          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A03", any())
           .put(
               "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A02",
-              anyDexVm())
+              any())
           .put("lang.Runtime.haltI.Runtime_halt_A02", any())
           .put(
               "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A03",
-              anyDexVm())
+              any())
           .put("lang.Runtime.haltI.Runtime_halt_A03", any())
-          .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A01", anyDexVm())
+          .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A01", any())
           .put("lang.Runtime.haltI.Runtime_halt_A01", any())
-          .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A03", anyDexVm())
+          .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A03", any())
           .put(
               "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A01",
-              anyDexVm())
-          .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A02", anyDexVm())
+              any())
+          .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A02", any())
           .put("lang.Runtime.exitI.Runtime_exit_A03", any())
           .put(
               "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A02",
-              anyDexVm())
+              any())
           .put("lang.Runtime.exitI.Runtime_exit_A04", any())
           .put(
               "lang.NoSuchMethodException.serialization.NoSuchMethodException_serialization_A01",
-              anyDexVm())
+              any())
           .put("lang.Runtime.exitI.Runtime_exit_A01", any())
           .put("lang.Runtime.exitI.Runtime_exit_A02", any())
           .put(
               "lang.InstantiationException.serialization.InstantiationException_serialization_A01",
-              anyDexVm())
-          .put("lang.Exception.serialization.Exception_serialization_A01", anyDexVm())
-          .put(
-              "lang.StackOverflowError.serialization.StackOverflowError_serialization_A01",
-              anyDexVm())
+              any())
+          .put("lang.Exception.serialization.Exception_serialization_A01", any())
+          .put("lang.StackOverflowError.serialization.StackOverflowError_serialization_A01", any())
           .put(
               "lang.NoSuchFieldException.serialization.NoSuchFieldException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.NegativeArraySizeException.serialization.NegativeArraySizeException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ArrayIndexOutOfBoundsException.serialization.ArrayIndexOutOfBoundsException_serialization_A01",
-              anyDexVm())
-          .put("lang.VerifyError.serialization.VerifyError_serialization_A01", anyDexVm())
+              any())
+          .put("lang.VerifyError.serialization.VerifyError_serialization_A01", any())
           .put(
               "lang.IllegalArgumentException.serialization.IllegalArgumentException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.IllegalStateException.serialization.IllegalStateException_serialization_A01",
-              anyDexVm())
-          .put("lang.Double.serialization.Double_serialization_A01", anyDexVm())
+              any())
+          .put("lang.Double.serialization.Double_serialization_A01", any())
           .put("lang.Double.toStringD.Double_toString_A05", any())
           .put(
-              "lang.ArithmeticException.serialization.ArithmeticException_serialization_A01",
-              anyDexVm())
+              "lang.ArithmeticException.serialization.ArithmeticException_serialization_A01", any())
           .put(
               "lang.ExceptionInInitializerError.serialization.ExceptionInInitializerError_serialization_A01",
-              anyDexVm())
-          .put("lang.ThreadLocal.Class.ThreadLocal_class_A01", anyDexVm())
-          .put("lang.Byte.serialization.Byte_serialization_A01", anyDexVm())
+              any())
+          .put("lang.ThreadLocal.Class.ThreadLocal_class_A01", any())
+          .put("lang.Byte.serialization.Byte_serialization_A01", any())
           .put(
               "lang.Byte.parseByteLjava_lang_StringI.Byte_parseByte_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Byte.valueOfLjava_lang_StringI.Byte_valueOf_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Byte.valueOfLjava_lang_String.Byte_ValueOf_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Byte.decodeLjava_lang_String.Byte_decode_A04",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
-          .put("lang.LinkageError.serialization.LinkageError_serialization_A01", anyDexVm())
-          .put(
-              "lang.ClassCastException.serialization.ClassCastException_serialization_A01",
-              anyDexVm())
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
+          .put("lang.LinkageError.serialization.LinkageError_serialization_A01", any())
+          .put("lang.ClassCastException.serialization.ClassCastException_serialization_A01", any())
           .put(
               "lang.Byte.ConstructorLjava_lang_String.Byte_Constructor_A02",
               match(
                   runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+                      DexVm.Version.DEFAULT,
+                      DexVm.Version.V7_0_0,
+                      DexVm.Version.V6_0_1,
+                      DexVm.Version.V5_1_1)))
           .put(
               "lang.Byte.parseByteLjava_lang_String.Byte_parseByte_A02",
               match(
                   runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
-          .put("lang.NoSuchFieldError.serialization.NoSuchFieldError_serialization_A01", anyDexVm())
+                      DexVm.Version.DEFAULT,
+                      DexVm.Version.V7_0_0,
+                      DexVm.Version.V6_0_1,
+                      DexVm.Version.V5_1_1)))
+          .put("lang.NoSuchFieldError.serialization.NoSuchFieldError_serialization_A01", any())
           .put(
               "lang.UnsupportedOperationException.serialization.UnsupportedOperationException_serialization_A01",
-              anyDexVm())
-          .put(
-              "lang.NoSuchMethodError.serialization.NoSuchMethodError_serialization_A01",
-              anyDexVm())
+              any())
+          .put("lang.NoSuchMethodError.serialization.NoSuchMethodError_serialization_A01", any())
           .put(
               "lang.IllegalMonitorStateException.serialization.IllegalMonitorStateException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.StringIndexOutOfBoundsException.serialization.StringIndexOutOfBoundsException_serialization_A01",
-              anyDexVm())
+              any())
+          .put("lang.SecurityException.serialization.SecurityException_serialization_A01", any())
+          .put("lang.IllegalAccessError.serialization.IllegalAccessError_serialization_A01", any())
           .put(
-              "lang.SecurityException.serialization.SecurityException_serialization_A01",
-              anyDexVm())
-          .put(
-              "lang.IllegalAccessError.serialization.IllegalAccessError_serialization_A01",
-              anyDexVm())
-          .put(
-              "lang.ArrayStoreException.serialization.ArrayStoreException_serialization_A01",
-              anyDexVm())
-          .put("lang.UnknownError.serialization.UnknownError_serialization_A01", anyDexVm())
-          .put("lang.Boolean.serialization.Boolean_serialization_A01", anyDexVm())
+              "lang.ArrayStoreException.serialization.ArrayStoreException_serialization_A01", any())
+          .put("lang.UnknownError.serialization.UnknownError_serialization_A01", any())
+          .put("lang.Boolean.serialization.Boolean_serialization_A01", any())
           .put(
               "lang.Integer.valueOfLjava_lang_StringI.Integer_valueOf_A02",
               match(
                   runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
-          .put("lang.Integer.serialization.Integer_serialization_A01", anyDexVm())
+                      DexVm.Version.DEFAULT,
+                      DexVm.Version.V7_0_0,
+                      Version.V6_0_1,
+                      DexVm.Version.V5_1_1)))
+          .put("lang.Integer.serialization.Integer_serialization_A01", any())
           .put(
               "lang.Integer.parseIntLjava_lang_String.Integer_parseInt_A02",
               match(
                   runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+                      Version.DEFAULT,
+                      DexVm.Version.V7_0_0,
+                      DexVm.Version.V6_0_1,
+                      DexVm.Version.V5_1_1)))
           .put(
               "lang.Integer.getIntegerLjava_lang_StringI.Integer_getInteger_A02",
               match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+                  runtimes(Version.DEFAULT, DexVm.Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Integer.valueOfLjava_lang_String.Integer_valueOf_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Integer.decodeLjava_lang_String.Integer_decode_A04",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Integer.parseIntLjava_lang_StringI.Integer_parseInt_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Integer.getIntegerLjava_lang_StringLjava_lang_Integer.Integer_getInteger_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Integer.ConstructorLjava_lang_String.Integer_Constructor_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.Integer.getIntegerLjava_lang_String.Integer_getInteger_A02",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put(
               "lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
           .put("lang.ref.SoftReference.get.SoftReference_get_A01", any())
           .put(
               "lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V6_0_1,
-                      Runtime.ART_V5_1_1,
-                      Runtime.JAVA)))
-          .put(
-              "lang.StackTraceElement.serialization.StackTraceElement_serialization_A01",
-              anyDexVm())
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
+          .put("lang.StackTraceElement.serialization.StackTraceElement_serialization_A01", any())
           .put("lang.ref.WeakReference.get.WeakReference_get_A01", any())
           .put(
               "lang.StackTraceElement.toString.StackTraceElement_toString_A01",
-              match(runtimes(Runtime.ART_DEFAULT)))
+              match(runtimes(Version.DEFAULT)))
           .put(
               "lang.NullPointerException.serialization.NullPointerException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
-              "lang.VirtualMachineError.serialization.VirtualMachineError_serialization_A01",
-              anyDexVm())
+              "lang.VirtualMachineError.serialization.VirtualMachineError_serialization_A01", any())
           .put(
               "lang.ClassCircularityError.serialization.ClassCircularityError_serialization_A01",
-              anyDexVm())
-          .put("lang.ThreadDeath.serialization.ThreadDeath_serialization_A01", anyDexVm())
-          .put(
-              "lang.InstantiationError.serialization.InstantiationError_serialization_A01",
-              anyDexVm())
+              any())
+          .put("lang.ThreadDeath.serialization.ThreadDeath_serialization_A01", any())
+          .put("lang.InstantiationError.serialization.InstantiationError_serialization_A01", any())
           .put(
               "lang.IllegalThreadStateException.serialization.IllegalThreadStateException_serialization_A01",
-              anyDexVm())
-          .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A05", anyDexVm())
-          .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A06", anyDexVm())
-          .put("lang.ProcessBuilder.start.ProcessBuilder_start_A05", anyDexVm())
-          .put("lang.ProcessBuilder.start.ProcessBuilder_start_A06", anyDexVm())
-          .put("lang.ClassFormatError.serialization.ClassFormatError_serialization_A01", anyDexVm())
-          .put(
-              "lang.Math.cbrtD.Math_cbrt_A01",
-              match(TestCondition.artRuntimesFrom(Runtime.ART_V6_0_1)))
-          .put("lang.Math.powDD.Math_pow_A08", anyDexVm())
+              any())
+          .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A05", any())
+          .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A06", any())
+          .put("lang.ProcessBuilder.start.ProcessBuilder_start_A05", any())
+          .put("lang.ProcessBuilder.start.ProcessBuilder_start_A06", any())
+          .put("lang.ClassFormatError.serialization.ClassFormatError_serialization_A01", any())
+          .put("lang.Math.cbrtD.Math_cbrt_A01", match(runtimesFrom(Version.V6_0_1)))
+          .put("lang.Math.powDD.Math_pow_A08", any())
           .put(
               "lang.IncompatibleClassChangeError.serialization.IncompatibleClassChangeError_serialization_A01",
-              anyDexVm())
-          .put("lang.Float.serialization.Float_serialization_A01", anyDexVm())
+              any())
+          .put("lang.Float.serialization.Float_serialization_A01", any())
           .put("lang.Float.toStringF.Float_toString_A02", any())
           .put(
               "lang.Short.valueOfLjava_lang_StringI.Short_valueOf_A02",
-              match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
+              match(runtimesFrom(Version.V5_1_1)))
           .put(
               "lang.Short.valueOfLjava_lang_String.Short_valueOf_A02",
-              match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
-          .put("lang.Short.serialization.Short_serialization_A01", anyDexVm())
+              match(runtimesFrom(Version.V5_1_1)))
+          .put("lang.Short.serialization.Short_serialization_A01", any())
           .put(
               "lang.Short.parseShortLjava_lang_String.Short_parseShort_A02",
-              match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
+              match(runtimesFrom(Version.V5_1_1)))
           .put(
               "lang.Short.decodeLjava_lang_String.Short_decode_A04",
-              match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
+              match(runtimesFrom(Version.V5_1_1)))
           .put(
               "lang.Short.ConstructorLjava_lang_String.Short_Constructor_A02",
-              match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
+              match(runtimesFrom(Version.V5_1_1)))
           .put(
               "lang.ClassNotFoundException.serialization.ClassNotFoundException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.annotation.AnnotationFormatError.serialization.AnnotationFormatError_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.Short.parseShortLjava_lang_StringI.Short_parseShort_A02",
-              match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
+              match(runtimesFrom(Version.V5_1_1)))
           .put(
               "lang.annotation.IncompleteAnnotationException.ConstructorLjava_lang_ClassLjava_lang_String.IncompleteAnnotationException_Constructor_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT)))
           .put(
               "lang.InterruptedException.serialization.InterruptedException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.annotation.IncompleteAnnotationException.Class.IncompleteAnnotationException_class_A01",
               any())
-          .put("lang.annotation.Annotation.Class.Annotation_class_A03", anyDexVm())
-          .put("lang.annotation.Annotation.serialization.Annotation_serialization_A01", anyDexVm())
-          .put(
-              "lang.annotation.Annotation.annotationType.Annotation_annotationType_A01", anyDexVm())
+          .put("lang.annotation.Annotation.Class.Annotation_class_A03", any())
+          .put("lang.annotation.Annotation.serialization.Annotation_serialization_A01", any())
+          .put("lang.annotation.Annotation.annotationType.Annotation_annotationType_A01", any())
           .put(
               "lang.annotation.IncompleteAnnotationException.serialization.IncompleteAnnotationException_serialization_A01",
-              anyDexVm())
+              any())
           .put("lang.annotation.Annotation.Class.Annotation_class_A02", any())
-          .put("lang.annotation.Retention.Retention_class_A01", anyDexVm())
+          .put("lang.annotation.Retention.Retention_class_A01", any())
           .put(
               "lang.annotation.AnnotationTypeMismatchException.Class.AnnotationTypeMismatchException_class_A01",
               any())
-          .put("lang.Long.serialization.Long_serialization_A01", anyDexVm())
-          .put("lang.ThreadGroup.resume.ThreadGroup_resume_A01", anyDexVm())
+          .put("lang.Long.serialization.Long_serialization_A01", any())
+          .put("lang.ThreadGroup.resume.ThreadGroup_resume_A01", any())
           .put(
-              "lang.AbstractMethodError.serialization.AbstractMethodError_serialization_A01",
-              anyDexVm())
-          .put("lang.RuntimeException.serialization.RuntimeException_serialization_A01", anyDexVm())
-          .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A01", anyDexVm())
+              "lang.AbstractMethodError.serialization.AbstractMethodError_serialization_A01", any())
+          .put("lang.RuntimeException.serialization.RuntimeException_serialization_A01", any())
+          .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A01", any())
           .put(
               "lang.ThreadGroup.ConstructorLjava_lang_ThreadGroupLjava_lang_String.ThreadGroup_Constructor_A03",
-              anyDexVm())
-          .put("lang.ThreadGroup.stop.ThreadGroup_stop_A01", anyDexVm())
-          .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A01", anyDexVm())
+              any())
+          .put("lang.ThreadGroup.stop.ThreadGroup_stop_A01", any())
+          .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A01", any())
           .put(
               "lang.ThreadGroup.ConstructorLjava_lang_ThreadGroupLjava_lang_String.ThreadGroup_Constructor_A04",
-              anyDexVm())
-          .put(
-              "lang.ThreadGroup.parentOfLjava_lang_ThreadGroup.ThreadGroup_parentOf_A01",
-              anyDexVm())
-          .put("lang.ThreadGroup.getMaxPriority.ThreadGroup_getMaxPriority_A02", anyDexVm())
-          .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A03", anyDexVm())
-          .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A01", anyDexVm())
+              any())
+          .put("lang.ThreadGroup.parentOfLjava_lang_ThreadGroup.ThreadGroup_parentOf_A01", any())
+          .put("lang.ThreadGroup.getMaxPriority.ThreadGroup_getMaxPriority_A02", any())
+          .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A03", any())
+          .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A01", any())
           .put(
               "lang.ThreadGroup.uncaughtExceptionLjava_lang_ThreadLjava_lang_Throwable.ThreadGroup_uncaughtException_A01",
-              anyDexVm())
-          .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A02", anyDexVm())
-          .put(
-              "lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A04",
-              anyDexVm())
-          .put("lang.ThreadGroup.activeCount.ThreadGroup_activeCount_A01", anyDexVm())
-          .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A03", anyDexVm())
-          .put(
-              "lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A03",
-              anyDexVm())
-          .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A03", anyDexVm())
+              any())
+          .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A02", any())
+          .put("lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A04", any())
+          .put("lang.ThreadGroup.activeCount.ThreadGroup_activeCount_A01", any())
+          .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A03", any())
+          .put("lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A03", any())
+          .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A03", any())
           .put("lang.Class.getDeclaredConstructors.Class_getDeclaredConstructors_A02", any())
-          .put("lang.AssertionError.serialization.AssertionError_serialization_A01", anyDexVm())
-          .put("lang.Class.getClassLoader.Class_getClassLoader_A01", anyDexVm())
-          .put("lang.Class.getDeclaringClass.Class_getDeclaringClass_A01", anyDexVm())
+          .put("lang.AssertionError.serialization.AssertionError_serialization_A01", any())
+          .put("lang.Class.getClassLoader.Class_getClassLoader_A01", any())
+          .put("lang.Class.getDeclaringClass.Class_getDeclaringClass_A01", any())
           .put(
               "lang.Class.getDeclaredFields.Class_getDeclaredFields_A01",
-              match(TestCondition.artRuntimesFrom(Runtime.ART_V5_1_1)))
-          .put("lang.Class.getClassLoader.Class_getClassLoader_A02", anyDexVm())
-          .put("lang.Class.getClassLoader.Class_getClassLoader_A03", anyDexVm())
+              match(runtimesFrom(Version.V5_1_1)))
+          .put("lang.Class.getClassLoader.Class_getClassLoader_A02", any())
+          .put("lang.Class.getClassLoader.Class_getClassLoader_A03", any())
           .put("lang.Class.getDeclaredFields.Class_getDeclaredFields_A02", any())
-          .put("lang.Class.getResourceLjava_lang_String.Class_getResource_A01", anyDexVm())
-          .put("lang.Class.getConstructor_Ljava_lang_Class.Class_getConstructor_A03", anyDexVm())
+          .put("lang.Class.getResourceLjava_lang_String.Class_getResource_A01", any())
+          .put("lang.Class.getConstructor_Ljava_lang_Class.Class_getConstructor_A03", any())
           .put(
               "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A03", any())
           .put(
-              "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A07",
-              anyDexVm())
+              "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A07", any())
           .put(
-              "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A01",
-              anyDexVm())
+              "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A01", any())
           .put("lang.Class.getConstructor_Ljava_lang_Class.Class_getConstructor_A04", any())
-          .put("lang.Class.serialization.Class_serialization_A01", anyDexVm())
+          .put("lang.Class.serialization.Class_serialization_A01", any())
           .put("lang.Class.getMethods.Class_getMethods_A02", any())
           .put(
               "lang.Class.getDeclaredMethodLjava_lang_String_Ljava_lang_Class.Class_getDeclaredMethod_A05",
@@ -745,36 +598,28 @@
           .put("lang.Class.getClasses.Class_getClasses_A02", any())
           .put(
               "lang.Class.getDeclaredMethodLjava_lang_String_Ljava_lang_Class.Class_getDeclaredMethod_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.Class.getClasses.Class_getClasses_A01",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V4_4_4,
-                      Runtime.ART_V4_0_4,
-                      Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V4_4_4, Version.V4_0_4)))
           .put("lang.Class.getProtectionDomain.Class_getProtectionDomain_A01", any())
-          .put("lang.Class.getProtectionDomain.Class_getProtectionDomain_A02", anyDexVm())
+          .put("lang.Class.getProtectionDomain.Class_getProtectionDomain_A02", any())
           .put(
               "lang.Class.getDeclaredMethods.Class_getDeclaredMethods_A01",
-              match(artRuntimesFromAndJava(Runtime.ART_V7_0_0)))
-          .put(
-              "lang.Class.getMethods.Class_getMethods_A01",
-              match(artRuntimesFromAndJava(Runtime.ART_V7_0_0)))
+              match(runtimesFrom(Version.V7_0_0)))
+          .put("lang.Class.getMethods.Class_getMethods_A01", match(runtimesFrom(Version.V7_0_0)))
           .put("lang.Class.getGenericInterfaces.Class_getGenericInterfaces_A04", any())
           .put("lang.Class.getDeclaredFieldLjava_lang_String.Class_getDeclaredField_A04", any())
           .put("lang.Class.getDeclaredMethods.Class_getDeclaredMethods_A02", any())
           .put(
               "lang.Class.getResourceAsStreamLjava_lang_String.Class_getResourceAsStream_A01",
-              anyDexVm())
+              any())
           .put("lang.Class.getGenericInterfaces.Class_getGenericInterfaces_A05", any())
           .put("lang.Class.getAnnotationLjava_lang_Class.Class_getAnnotation_A01", any())
           .put("lang.Class.getGenericInterfaces.Class_getGenericInterfaces_A03", any())
           .put("lang.Class.getDeclaredClasses.Class_getDeclaredClasses_A02", any())
-          .put("lang.Class.desiredAssertionStatus.Class_desiredAssertionStatus_A01", anyDexVm())
-          .put("lang.Class.getPackage.Class_getPackage_A01", anyDexVm())
+          .put("lang.Class.desiredAssertionStatus.Class_desiredAssertionStatus_A01", any())
+          .put("lang.Class.getPackage.Class_getPackage_A01", any())
           .put("lang.Class.getFieldLjava_lang_String.Class_getField_A04", any())
           .put("lang.Class.getTypeParameters.Class_getTypeParameters_A02", any())
           .put("lang.Class.getDeclaredAnnotations.Class_getDeclaredAnnotations_A01", any())
@@ -784,384 +629,344 @@
           .put("lang.Class.getFields.Class_getFields_A02", any())
           .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A03", any())
           .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A04", any())
-          .put("lang.Class.getSigners.Class_getSigners_A01", anyDexVm())
+          .put("lang.Class.getSigners.Class_getSigners_A01", any())
           .put(
               "lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A01",
-              match(
-                  runtimes(
-                      Runtime.ART_DEFAULT,
-                      Runtime.ART_V7_0_0,
-                      Runtime.ART_V4_4_4,
-                      Runtime.ART_V4_0_4)))
-          .put(
-              "lang.Class.getModifiers.Class_getModifiers_A03", match(runtimes(Runtime.ART_V4_0_4)))
-          .put("lang.Class.newInstance.Class_newInstance_A06", match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V4_4_4, Version.V4_0_4)))
+          .put("lang.Class.getModifiers.Class_getModifiers_A03", match(runtimes(Version.V4_0_4)))
+          .put("lang.Class.newInstance.Class_newInstance_A06", match(runtimes(Version.V4_0_4)))
           .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A01", any())
           .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A02", any())
           .put("lang.Class.newInstance.Class_newInstance_A07", any())
           .put(
               "lang.Class.getDeclaredConstructor_Ljava_lang_Class.Class_getDeclaredConstructor_A02",
-              anyDexVm())
+              any())
           .put("lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A05", any())
-          .put("lang.Class.forNameLjava_lang_String.Class_forName_A01", anyDexVm())
+          .put("lang.Class.forNameLjava_lang_String.Class_forName_A01", any())
           .put(
               "lang.Class.getDeclaredConstructor_Ljava_lang_Class.Class_getDeclaredConstructor_A03",
               any())
-          .put(
-              "lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A03",
-              anyDexVm())
+          .put("lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A03", any())
           .put("lang.Class.forNameLjava_lang_String.Class_forName_A02", any())
           .put(
               "lang.UnsatisfiedLinkError.serialization.UnsatisfiedLinkError_serialization_A01",
-              anyDexVm())
+              any())
           .put("lang.Class.getAnnotations.Class_getAnnotations_A01", any())
           .put(
               "lang.EnumConstantNotPresentException.serialization.EnumConstantNotPresentException_serialization_A01",
-              anyDexVm())
+              any())
           .put("lang.String.toLowerCase.String_toLowerCase_A01", any())
           .put("lang.String.splitLjava_lang_StringI.String_split_A01", any())
-          .put("lang.String.serialization.String_serialization_A01", anyDexVm())
+          .put("lang.String.serialization.String_serialization_A01", any())
           .put("lang.String.regionMatchesZILjava_lang_StringII.String_regionMatches_A01", any())
           .put("lang.String.valueOfF.String_valueOf_A01", any())
           .put("lang.String.Constructor_BLjava_nio_charset_Charset.String_Constructor_A01", any())
-          .put("lang.String.concatLjava_lang_String.String_concat_A01", anyDexVm())
-          .put("lang.String.matchesLjava_lang_String.String_matches_A01", anyDexVm())
-          .put(
-              "lang.String.CASE_INSENSITIVE_ORDER.serialization.String_serialization_A01",
-              anyDexVm())
+          .put("lang.String.concatLjava_lang_String.String_concat_A01", any())
+          .put("lang.String.matchesLjava_lang_String.String_matches_A01", any())
+          .put("lang.String.CASE_INSENSITIVE_ORDER.serialization.String_serialization_A01", any())
           .put(
               "lang.String.getBytesLjava_lang_String.String_getBytes_A14",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0)))
+              match(runtimesUpTo(Version.V7_0_0)))
           .put("lang.String.splitLjava_lang_String.String_split_A01", any())
           .put("lang.String.getBytesII_BI.String_getBytes_A03", any())
-          .put("lang.String.getBytesII_BI.String_getBytes_A02", anyDexVm())
+          .put("lang.String.getBytesII_BI.String_getBytes_A02", any())
           .put("lang.String.toLowerCaseLjava_util_Locale.String_toLowerCase_A01", any())
           .put("lang.String.Constructor_BIILjava_nio_charset_Charset.String_Constructor_A01", any())
-          .put("lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A01", anyDexVm())
+          .put("lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A01", any())
           .put("lang.String.valueOfD.String_valueOf_A01", any())
           .put(
               "lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A14",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0)))
-          .put("lang.Package.isSealed.Package_isSealed_A01", anyDexVm())
-          .put(
-              "lang.Package.getSpecificationRuntime.ART_Package_getSpecificationVersion_A01",
-              anyDexVm())
+              match(runtimesUpTo(Version.V7_0_0)))
+          .put("lang.Package.isSealed.Package_isSealed_A01", any())
+          .put("lang.Package.getSpecificationVersion.Package_getSpecificationVersion_A01", any())
           .put("lang.Package.getAnnotationLjava_lang_Class.Package_getAnnotation_A01", any())
           .put(
               "lang.Package.isAnnotationPresentLjava_lang_Class.Package_isAnnotationPresent_A02",
-              match(
-                  and(
-                      runtimes(Runtime.ART_V4_0_4),
-                      TestCondition.artRuntimesFrom(Runtime.ART_V7_0_0))))
-          .put("lang.Package.getName.Package_getName_A01", anyDexVm())
-          .put(
-              "lang.Package.getImplementationRuntime.ART_Package_getImplementationVersion_A01",
-              anyDexVm())
+              match(and(runtimes(Version.V4_0_4), runtimesFrom(Version.V7_0_0))))
+          .put("lang.Package.getName.Package_getName_A01", any())
+          .put("lang.Package.getImplementationVersion.Package_getImplementationVersion_A01", any())
           .put("lang.Package.getDeclaredAnnotations.Package_getDeclaredAnnotations_A01", any())
-          .put("lang.Package.getSpecificationVendor.Package_getSpecificationVendor_A01", anyDexVm())
+          .put("lang.Package.getSpecificationVendor.Package_getSpecificationVendor_A01", any())
           .put(
               "lang.Package.getAnnotationLjava_lang_Class.Package_getAnnotation_A02",
-              match(
-                  and(
-                      TestCondition.artRuntimesFrom(Runtime.ART_V7_0_0),
-                      runtimes(Runtime.ART_V4_0_4))))
-          .put(
-              "lang.Package.isCompatibleWithLjava_lang_String.Package_isCompatibleWith_A01",
-              anyDexVm())
-          .put("lang.Package.toString.Package_toString_A01", anyDexVm())
+              match(and(runtimesFrom(Version.V7_0_0), runtimes(Version.V4_0_4))))
+          .put("lang.Package.isCompatibleWithLjava_lang_String.Package_isCompatibleWith_A01", any())
+          .put("lang.Package.toString.Package_toString_A01", any())
           .put("lang.Package.getAnnotations.Package_getAnnotations_A01", any())
           .put(
               "lang.Package.isAnnotationPresentLjava_lang_Class.Package_isAnnotationPresent_A01",
               any())
-          .put("lang.Package.getSpecificationTitle.Package_getSpecificationTitle_A01", anyDexVm())
-          .put("lang.Package.getImplementationTitle.Package_getImplementationTitle_A01", anyDexVm())
-          .put("lang.Package.getPackages.Package_getPackages_A01", anyDexVm())
-          .put("lang.Package.hashCode.Package_hashCode_A01", anyDexVm())
-          .put("lang.Package.getPackageLjava_lang_String.Package_getPackage_A01", anyDexVm())
-          .put(
-              "lang.Package.getImplementationVendor.Package_getImplementationVendor_A01",
-              anyDexVm())
-          .put("lang.Package.isSealedLjava_net_URL.Package_isSealed_A01", anyDexVm())
-          .put("lang.StringBuilder.serialization.StringBuilder_serialization_A01", anyDexVm())
+          .put("lang.Package.getSpecificationTitle.Package_getSpecificationTitle_A01", any())
+          .put("lang.Package.getImplementationTitle.Package_getImplementationTitle_A01", any())
+          .put("lang.Package.getPackages.Package_getPackages_A01", any())
+          .put("lang.Package.hashCode.Package_hashCode_A01", any())
+          .put("lang.Package.getPackageLjava_lang_String.Package_getPackage_A01", any())
+          .put("lang.Package.getImplementationVendor.Package_getImplementationVendor_A01", any())
+          .put("lang.Package.isSealedLjava_net_URL.Package_isSealed_A01", any())
+          .put("lang.StringBuilder.serialization.StringBuilder_serialization_A01", any())
           .put(
               "lang.SecurityManager.checkReadLjava_io_FileDescriptor.SecurityManager_checkRead_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkAwtEventQueueAccess.SecurityManager_checkAwtEventQueueAccess_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkWriteLjava_lang_String.SecurityManager_checkWrite_A02",
-              anyDexVm())
-          .put("lang.SecurityManager.inClassLoader.SecurityManager_inClassLoader_A01", anyDexVm())
+              any())
+          .put("lang.SecurityManager.inClassLoader.SecurityManager_inClassLoader_A01", any())
           .put(
               "lang.SecurityManager.checkPermissionLjava_security_PermissionLjava_lang_Object.SecurityManager_checkPermission_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkReadLjava_io_FileDescriptor.SecurityManager_checkRead_A01",
-              anyDexVm())
-          .put("lang.SecurityManager.inCheck.SecurityManager_inCheck_A01", anyDexVm())
+              any())
+          .put("lang.SecurityManager.inCheck.SecurityManager_inCheck_A01", any())
           .put(
               "lang.SecurityManager.currentClassLoader.SecurityManager_currentClassLoader_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPrintJobAccess.SecurityManager_checkPrintJobAccess_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkWriteLjava_lang_String.SecurityManager_checkWrite_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPackageAccessLjava_lang_String.SecurityManager_checkPackageAccess_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkAcceptLjava_lang_StringI.SecurityManager_checkAccept_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPermissionLjava_security_PermissionLjava_lang_Object.SecurityManager_checkPermission_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.currentClassLoader.SecurityManager_currentClassLoader_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkMulticastLjava_net_InetAddress.SecurityManager_checkMulticast_A02",
-              anyDexVm())
-          .put("lang.SecurityManager.checkListenI.SecurityManager_checkListen_A01", anyDexVm())
+              any())
+          .put("lang.SecurityManager.checkListenI.SecurityManager_checkListen_A01", any())
           .put(
               "lang.SecurityManager.getSecurityContext.SecurityManager_getSecurityContext_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPackageAccessLjava_lang_String.SecurityManager_checkPackageAccess_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkMemberAccessLjava_lang_ClassI.SecurityManager_checkMemberAccess_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkMulticastLjava_net_InetAddressB.SecurityManager_checkMulticast_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkAcceptLjava_lang_StringI.SecurityManager_checkAccept_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkMulticastLjava_net_InetAddress.SecurityManager_checkMulticast_A01",
-              anyDexVm())
-          .put("lang.SecurityManager.Constructor.SecurityManager_Constructor_A01", anyDexVm())
+              any())
+          .put("lang.SecurityManager.Constructor.SecurityManager_Constructor_A01", any())
           .put("lang.SecurityManager.getClassContext.SecurityManager_getClassContext_A01", any())
           .put(
               "lang.SecurityManager.checkMemberAccessLjava_lang_ClassI.SecurityManager_checkMemberAccess_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkDeleteLjava_lang_String.SecurityManager_checkDelete_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkReadLjava_lang_StringLjava_lang_Object.SecurityManager_checkRead_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkMulticastLjava_net_InetAddressB.SecurityManager_checkMulticast_A01",
-              anyDexVm())
+              any())
           .put("lang.SecurityManager.checkListenI.SecurityManager_checkListen_A02", any())
           .put(
               "lang.SecurityManager.checkAccessLjava_lang_Thread.SecurityManager_checkAccess_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkWriteLjava_io_FileDescriptor.SecurityManager_checkWrite_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkDeleteLjava_lang_String.SecurityManager_checkDelete_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPropertiesAccess.SecurityManager_checkPropertiesAccess_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkReadLjava_lang_StringLjava_lang_Object.SecurityManager_checkRead_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkAccessLjava_lang_ThreadGroup.SecurityManager_checkAccess_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkAccessLjava_lang_Thread.SecurityManager_checkAccess_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPackageDefinitionLjava_lang_String.SecurityManager_checkPackageDefinition_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkReadLjava_lang_String.SecurityManager_checkRead_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkWriteLjava_io_FileDescriptor.SecurityManager_checkWrite_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkReadLjava_lang_StringLjava_lang_Object.SecurityManager_checkRead_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkExecLjava_lang_String.SecurityManager_checkExec_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPackageDefinitionLjava_lang_String.SecurityManager_checkPackageDefinition_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkExecLjava_lang_String.SecurityManager_checkExec_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkCreateClassLoader.SecurityManager_checkCreateClassLoader_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkReadLjava_lang_String.SecurityManager_checkRead_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkAccessLjava_lang_ThreadGroup.SecurityManager_checkAccess_A01",
-              anyDexVm())
-          .put(
-              "lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A03",
-              anyDexVm())
+              any())
+          .put("lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A03", any())
           .put(
               "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkExecLjava_lang_String.SecurityManager_checkExec_A01",
-              anyDexVm())
-          .put(
-              "lang.SecurityManager.checkSetFactory.SecurityManager_checkSetFactory_A01",
-              anyDexVm())
+              any())
+          .put("lang.SecurityManager.checkSetFactory.SecurityManager_checkSetFactory_A01", any())
           .put(
               "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A04",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPermissionLjava_security_Permission.SecurityManager_checkPermission_A01",
-              anyDexVm())
-          .put(
-              "lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A01",
-              anyDexVm())
-          .put(
-              "lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A02",
-              anyDexVm())
+              any())
+          .put("lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A01", any())
+          .put("lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A02", any())
           .put(
               "lang.SecurityManager.checkPropertyAccessLjava_lang_String.SecurityManager_checkPropertyAccess_A02",
-              anyDexVm())
-          .put("lang.SecurityManager.checkExitI.SecurityManager_checkExit_A01", anyDexVm())
+              any())
+          .put("lang.SecurityManager.checkExitI.SecurityManager_checkExit_A01", any())
           .put(
               "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A01",
-              anyDexVm())
-          .put(
-              "lang.SecurityManager.classLoaderDepth.SecurityManager_classLoaderDepth_A02",
-              anyDexVm())
+              any())
+          .put("lang.SecurityManager.classLoaderDepth.SecurityManager_classLoaderDepth_A02", any())
           .put(
               "lang.SecurityManager.classDepthLjava_lang_String.SecurityManager_classDepth_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPropertyAccessLjava_lang_String.SecurityManager_checkPropertyAccess_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkPropertyAccessLjava_lang_String.SecurityManager_checkPropertyAccess_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkConnectLjava_lang_StringI.SecurityManager_checkConnect_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkLinkLjava_lang_String.SecurityManager_checkLink_A02",
-              anyDexVm())
+              any())
           .put("lang.SecurityManager.classLoaderDepth.SecurityManager_classLoaderDepth_A01", any())
           .put(
               "lang.SecurityManager.checkPermissionLjava_security_Permission.SecurityManager_checkPermission_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.currentLoadedClass.SecurityManager_currentLoadedClass_A01",
               any())
           .put(
               "lang.SecurityManager.checkSecurityAccessLjava_lang_String.SecurityManager_checkSecurityAccess_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkConnectLjava_lang_StringI.SecurityManager_checkConnect_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkConnectLjava_lang_StringI.SecurityManager_checkConnect_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkTopLevelWindowLjava_lang_Object.SecurityManager_checkTopLevelWindow_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.currentLoadedClass.SecurityManager_currentLoadedClass_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.classDepthLjava_lang_String.SecurityManager_classDepth_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkSecurityAccessLjava_lang_String.SecurityManager_checkSecurityAccess_A01",
-              anyDexVm())
-          .put("lang.Throwable.serialization.Throwable_serialization_A01", anyDexVm())
+              any())
+          .put("lang.Throwable.serialization.Throwable_serialization_A01", any())
           .put(
               "lang.SecurityManager.checkTopLevelWindowLjava_lang_Object.SecurityManager_checkTopLevelWindow_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkLinkLjava_lang_String.SecurityManager_checkLink_A01",
-              anyDexVm())
+              any())
           .put("lang.Throwable.getStackTrace.Throwable_getStackTrace_A01", any())
           .put(
               "lang.SecurityManager.checkSystemClipboardAccess.SecurityManager_checkSystemClipboardAccess_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.SecurityManager.checkSecurityAccessLjava_lang_String.SecurityManager_checkSecurityAccess_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.ReflectPermission.Constructor_java_lang_String.ReflectPermission_Constructor_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.MalformedParameterizedTypeException.serialization.MalformedParameterizedTypeException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.ReflectPermission.Constructor_java_lang_StringLjava_lang_String.ReflectPermission_Constructor_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.UnsupportedClassVersionError.serialization.UnsupportedClassVersionError_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.ReflectPermission.Constructor_java_lang_String.ReflectPermission_Constructor_A01",
               any())
-          .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A01", anyDexVm())
+          .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A01", any())
           .put("lang.reflect.Proxy.serialization.Proxy_serialization_A01", any())
           .put(
               "lang.reflect.ReflectPermission.Constructor_java_lang_StringLjava_lang_String.ReflectPermission_Constructor_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.ReflectPermission.Constructor_java_lang_String.ReflectPermission_Constructor_A02",
-              anyDexVm())
-          .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A02", anyDexVm())
+              any())
+          .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A02", any())
           .put(
               "lang.reflect.ReflectPermission.Constructor_java_lang_StringLjava_lang_String.ReflectPermission_Constructor_A01",
               any())
           .put(
               "lang.reflect.Proxy.getInvocationHandlerLjava_lang_Object.Proxy_getInvocationHandler_A02",
-              match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
+              match(runtimesFrom(Version.V5_1_1)))
           .put("lang.reflect.Proxy.Class.Proxy_class_A01", any())
-          .put(
-              "lang.reflect.Proxy.Class.Proxy_class_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put(
-              "lang.reflect.Proxy.Class.Proxy_class_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
+          .put("lang.reflect.Proxy.Class.Proxy_class_A02", match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Proxy.Class.Proxy_class_A03", match(runtimesUpTo(Version.V4_4_4)))
           .put(
               "lang.reflect.Proxy.getProxyClassLjava_lang_ClassLoader_Ljava_lang_Class.Proxy_getProxyClass_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.Proxy.getProxyClassLjava_lang_ClassLoader_Ljava_lang_Class.Proxy_getProxyClass_A03",
-              anyDexVm())
-          .put(
-              "lang.reflect.Proxy.h.Proxy_h_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA)))
+              any())
+          .put("lang.reflect.Proxy.h.Proxy_h_A01", match(runtimes(Version.DEFAULT)))
           .put("lang.reflect.Proxy.serialization.Proxy_serialization_A02", any())
           .put(
               "lang.reflect.GenericSignatureFormatError.serialization.GenericSignatureFormatError_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.Proxy.newProxyInstanceLjava_lang_ClassLoader_Ljava_lang_ClassLjava_lang_reflect_InvocationHandler.Proxy_newProxyInstance_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.Proxy.ConstructorLjava_lang_reflect_InvocationHandler.Proxy_Constructor_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA)))
+              match(runtimes(Version.DEFAULT)))
           .put(
               "lang.reflect.Proxy.newProxyInstanceLjava_lang_ClassLoader_Ljava_lang_ClassLjava_lang_reflect_InvocationHandler.Proxy_newProxyInstance_A01",
-              anyDexVm())
+              any())
           .put("lang.reflect.Modifier.isStrictI.Modifier_isStrict_A01", any())
           .put("lang.reflect.Method.getGenericReturnType.Method_getGenericReturnType_A03", any())
           .put("lang.reflect.Method.getGenericReturnType.Method_getGenericReturnType_A02", any())
@@ -1177,7 +982,7 @@
               any())
           .put(
               "lang.reflect.Method.invokeLjava_lang_Object_Ljava_lang_Object.Method_invoke_A07",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.Method.getGenericExceptionTypes.Method_getGenericExceptionTypes_A04",
               any())
@@ -1196,85 +1001,85 @@
               any())
           .put(
               "lang.reflect.InvocationHandler.invokeLjava_lang_ObjectLjava_lang_reflect_Method_Ljava_lang_Object.InvocationHandler_invoke_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
+              match(runtimesUpTo(Version.V4_4_4)))
           .put(
               "lang.reflect.InvocationHandler.invokeLjava_lang_ObjectLjava_lang_reflect_Method_Ljava_lang_Object.InvocationHandler_invoke_A02",
-              anyDexVm())
+              any())
           .put("lang.reflect.Method.getDefaultValue.Method_getDefaultValue_A02", any())
           .put(
               "lang.reflect.Method.hashCode.Method_hashCode_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
+              match(runtimesUpTo(Version.V4_4_4)))
           .put("lang.reflect.Method.toString.Method_toString_A01", any())
           .put(
               "lang.reflect.Method.getGenericParameterTypes.Method_getGenericParameterTypes_A02",
               any())
-          .put("lang.reflect.Field.getFloatLjava_lang_Object.Field_getFloat_A05", anyDexVm())
-          .put("lang.reflect.Field.getDeclaringClass.Field_getDeclaringClass_A01", anyDexVm())
-          .put("lang.reflect.Field.getByteLjava_lang_Object.Field_getByte_A05", anyDexVm())
-          .put("lang.reflect.Field.getCharLjava_lang_Object.Field_getChar_A05", anyDexVm())
-          .put("lang.reflect.Field.getBooleanLjava_lang_Object.Field_getBoolean_A05", anyDexVm())
-          .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A05", anyDexVm())
-          .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A01", anyDexVm())
+          .put("lang.reflect.Field.getFloatLjava_lang_Object.Field_getFloat_A05", any())
+          .put("lang.reflect.Field.getDeclaringClass.Field_getDeclaringClass_A01", any())
+          .put("lang.reflect.Field.getByteLjava_lang_Object.Field_getByte_A05", any())
+          .put("lang.reflect.Field.getCharLjava_lang_Object.Field_getChar_A05", any())
+          .put("lang.reflect.Field.getBooleanLjava_lang_Object.Field_getBoolean_A05", any())
+          .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A05", any())
+          .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A01", any())
           .put(
               "lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A01", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A01", any())
           .put(
               "lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A05", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A05", any())
           .put("lang.reflect.Field.isSynthetic.Field_isSynthetic_A01", any())
-          .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A05", anyDexVm())
-          .put("lang.reflect.Field.getType.Field_getType_A01", anyDexVm())
-          .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A01", anyDexVm())
+          .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A05", any())
+          .put("lang.reflect.Field.getType.Field_getType_A01", any())
+          .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A01", any())
           .put(
               "lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.getDoubleLjava_lang_Object.Field_getDouble_A05", anyDexVm())
-          .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A01", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.getDoubleLjava_lang_Object.Field_getDouble_A05", any())
+          .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A01", any())
           .put(
               "lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
+              match(runtimesUpTo(Version.V4_4_4)))
           .put("lang.reflect.Field.getAnnotationLjava_lang_Class.Field_getAnnotation_A01", any())
           .put(
               "lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.getIntLjava_lang_Object.Field_getInt_A05", anyDexVm())
-          .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A05", anyDexVm())
-          .put("lang.reflect.Field.getShortLjava_lang_Object.Field_getShort_A05", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.getIntLjava_lang_Object.Field_getInt_A05", any())
+          .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A05", any())
+          .put("lang.reflect.Field.getShortLjava_lang_Object.Field_getShort_A05", any())
           .put("lang.reflect.Field.getGenericType.Field_getGenericType_A03", any())
           .put("lang.reflect.Field.getDeclaredAnnotations.Field_getDeclaredAnnotations_A01", any())
-          .put("lang.reflect.Field.getGenericType.Field_getGenericType_A01", anyDexVm())
-          .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A05", anyDexVm())
+          .put("lang.reflect.Field.getGenericType.Field_getGenericType_A01", any())
+          .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A05", any())
           .put("lang.reflect.Field.getGenericType.Field_getGenericType_A02", any())
-          .put("lang.reflect.Field.toGenericString.Field_toGenericString_A01", anyDexVm())
+          .put("lang.reflect.Field.toGenericString.Field_toGenericString_A01", any())
           .put("lang.reflect.Field.getGenericType.Field_getGenericType_A04", any())
-          .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A01", anyDexVm())
+          .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A01", any())
           .put(
               "lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A05", anyDexVm())
-          .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A01", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A05", any())
+          .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A01", any())
           .put(
               "lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A05", anyDexVm())
-          .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A01", anyDexVm())
-          .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A01", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A05", any())
+          .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A01", any())
+          .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A01", any())
           .put(
               "lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A05", anyDexVm())
-          .put("lang.reflect.Field.getLjava_lang_Object.Field_get_A05", anyDexVm())
-          .put("lang.reflect.Field.getLongLjava_lang_Object.Field_getLong_A05", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A05", any())
+          .put("lang.reflect.Field.getLjava_lang_Object.Field_get_A05", any())
+          .put("lang.reflect.Field.getLongLjava_lang_Object.Field_getLong_A05", any())
           .put(
               "lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A05", anyDexVm())
-          .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A01", anyDexVm())
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A05", any())
+          .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A01", any())
           .put(
               "lang.reflect.Constructor.newInstance_Ljava_lang_Object.Constructor_newInstance_A06",
-              anyDexVm())
+              any())
           .put("lang.reflect.Constructor.isSynthetic.Constructor_isSynthetic_A01", any())
           .put(
               "lang.reflect.Constructor.getGenericExceptionTypes.Constructor_getGenericExceptionTypes_A03",
@@ -1296,10 +1101,8 @@
               any())
           .put(
               "lang.reflect.InvocationTargetException.serialization.InvocationTargetException_serialization_A01",
-              anyDexVm())
-          .put(
-              "lang.reflect.Constructor.toGenericString.Constructor_toGenericString_A01",
-              anyDexVm())
+              any())
+          .put("lang.reflect.Constructor.toGenericString.Constructor_toGenericString_A01", any())
           .put(
               "lang.reflect.Constructor.getTypeParameters.Constructor_getTypeParameters_A02", any())
           .put(
@@ -1313,22 +1116,22 @@
               any())
           .put(
               "lang.reflect.AccessibleObject.setAccessibleZ.AccessibleObject_setAccessible_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.UndeclaredThrowableException.serialization.UndeclaredThrowableException_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.AccessibleObject.setAccessibleZ.AccessibleObject_setAccessible_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.AccessibleObject.setAccessible_Ljava_lang_reflect_AccessibleObjectZ.AccessibleObject_setAccessible_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.AccessibleObject.isAnnotationPresentLjava_lang_Class.AccessibleObject_isAnnotationPresent_A01",
               any())
           .put(
               "lang.reflect.AccessibleObject.setAccessible_Ljava_lang_reflect_AccessibleObjectZ.AccessibleObject_setAccessible_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.reflect.AccessibleObject.getAnnotations.AccessibleObject_getAnnotations_A01",
               any())
@@ -1340,472 +1143,453 @@
               any())
           .put(
               "lang.IllegalAccessException.serialization.IllegalAccessException_serialization_A01",
-              anyDexVm())
+              any())
           .put("lang.Character.getTypeI.Character_getType_A01", any())
           .put("lang.Character.isDigitI.Character_isDigit_A01", any())
           .put("lang.Character.getTypeC.Character_getType_A01", any())
-          .put("lang.Character.serialization.Character_serialization_A01", anyDexVm())
+          .put("lang.Character.serialization.Character_serialization_A01", any())
           .put("lang.Character.isDigitC.Character_isDigit_A01", any())
           .put("lang.Character.digitCI.Character_digit_A01", any())
           .put("lang.Character.digitII.Character_digit_A01", any())
-          .put("lang.Character.isLowerCaseC.Character_isLowerCase_A01", anyDexVm())
+          .put("lang.Character.isLowerCaseC.Character_isLowerCase_A01", any())
           .put(
               "lang.Character.isSpaceCharC.Character_isSpaceChar_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.Character.isSpaceCharI.Character_isSpaceChar_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.Character.isWhitespaceC.Character_isWhitespace_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.Character.isWhitespaceI.Character_isWhitespace_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put("lang.Character.getDirectionalityI.Character_getDirectionality_A01", any())
-          .put("lang.Character.UnicodeBlock.ofC.UnicodeBlock_of_A01", any())
-          .put("lang.Character.UnicodeBlock.ofI.UnicodeBlock_of_A01", any())
-          .put("lang.Character.isLowerCaseI.Character_isLowerCase_A01", anyDexVm())
-          .put("lang.Process.waitFor.Process_waitFor_A01", anyDexVm())
-          .put("lang.System.getProperties.System_getProperties_A01", anyDexVm())
-          .put("lang.Process.getErrorStream.Process_getErrorStream_A01", anyDexVm())
+          .put(
+              "lang.Character.UnicodeBlock.ofC.UnicodeBlock_of_A01",
+              match(runtimesFrom(Version.V4_4_4)))
+          .put(
+              "lang.Character.UnicodeBlock.ofI.UnicodeBlock_of_A01",
+              match(runtimesFrom(Version.V4_4_4)))
+          .put("lang.Character.isLowerCaseI.Character_isLowerCase_A01", any())
+          .put("lang.Process.waitFor.Process_waitFor_A01", any())
+          .put("lang.System.getProperties.System_getProperties_A01", any())
+          .put("lang.Process.getErrorStream.Process_getErrorStream_A01", any())
           .put("lang.Character.getDirectionalityC.Character_getDirectionality_A01", any())
-          .put("lang.Process.exitValue.Process_exitValue_A01", anyDexVm())
-          .put("lang.System.loadLjava_lang_String.System_load_A01", anyDexVm())
-          .put("lang.Process.getInputStream.Process_getInputStream_A01", anyDexVm())
-          .put("lang.System.loadLibraryLjava_lang_String.System_loadLibrary_A01", anyDexVm())
+          .put("lang.Process.exitValue.Process_exitValue_A01", any())
+          .put("lang.System.loadLjava_lang_String.System_load_A01", any())
+          .put("lang.Process.getInputStream.Process_getInputStream_A01", any())
+          .put("lang.System.loadLibraryLjava_lang_String.System_loadLibrary_A01", any())
           .put(
               "lang.System.setSecurityManagerLjava_lang_SecurityManager.System_setSecurityManager_A02",
-              anyDexVm())
-          .put("lang.System.runFinalizersOnExitZ.System_runFinalizersOnExit_A01", anyDexVm())
-          .put("lang.System.getenvLjava_lang_String.System_getenv_A01", anyDexVm())
-          .put("lang.System.getenv.System_getenv_A01", anyDexVm())
+              any())
+          .put("lang.System.runFinalizersOnExitZ.System_runFinalizersOnExit_A01", any())
+          .put("lang.System.getenvLjava_lang_String.System_getenv_A01", any())
+          .put("lang.System.getenv.System_getenv_A01", any())
           .put(
               "lang.System.getPropertyLjava_lang_StringLjava_lang_String.System_getProperty_A01",
-              anyDexVm())
-          .put("lang.System.exitI.System_exit_A01", anyDexVm())
+              any())
+          .put("lang.System.exitI.System_exit_A01", any())
           .put(
               "util.concurrent.ArrayBlockingQueue.serialization.ArrayBlockingQueue_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.System.arraycopyLjava_lang_ObjectILjava_lang_ObjectII.System_arraycopy_A04",
-              anyDexVm())
-          .put(
-              "lang.System.setPropertiesLjava_util_Properties.System_setProperties_A02", anyDexVm())
-          .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A02", anyDexVm())
-          .put("lang.System.getPropertyLjava_lang_String.System_getProperty_A01", anyDexVm())
+              any())
+          .put("lang.System.setPropertiesLjava_util_Properties.System_setProperties_A02", any())
+          .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A02", any())
+          .put("lang.System.getPropertyLjava_lang_String.System_getProperty_A01", any())
           .put(
               "util.concurrent.LinkedBlockingQueue.serialization.LinkedBlockingQueue_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.LinkedBlockingDeque.serialization.LinkedBlockingDeque_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.ConcurrentLinkedQueue.serialization.ConcurrentLinkedQueue_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.SynchronousQueue.serialization.SynchronousQueue_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.CopyOnWriteArrayList.serialization.CopyOnWriteArrayList_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.CopyOnWriteArrayList.subListII.CopyOnWriteArrayList_subList_A01",
               any())
           .put(
               "util.concurrent.ConcurrentHashMap.serialization.ConcurrentHashMap_serialization_A01",
-              match(TestCondition.artRuntimesFrom(Runtime.ART_V5_1_1)))
-          .put("util.concurrent.ConcurrentHashMap.keySet.ConcurrentHashMap_keySet_A01", anyDexVm())
+              match(runtimesFrom(Version.V5_1_1)))
+          .put("util.concurrent.ConcurrentHashMap.keySet.ConcurrentHashMap_keySet_A01", any())
           .put(
               "util.concurrent.Executors.privilegedThreadFactory.Executors_privilegedThreadFactory_A01",
               any())
           .put(
               "util.concurrent.Executors.privilegedCallableLjava_util_concurrent_Callable.Executors_privilegedCallable_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.CopyOnWriteArraySet.serialization.CopyOnWriteArraySet_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.Executors.privilegedCallableUsingCurrentClassLoaderLjava_util_concurrent_Callable.Executors_privilegedCallableUsingCurrentClassLoader_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.PriorityBlockingQueue.ConstructorLjava_util_Collection.PriorityBlockingQueue_Constructor_A01",
               any())
           .put(
               "util.concurrent.PriorityBlockingQueue.serialization.PriorityBlockingQueue_serialization_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.ThreadGroup.destroy.ThreadGroup_destroy_A01",
-              match(artRuntimesUpToAndJava(Runtime.ART_V6_0_1)))
-          .put("lang.Thread.start.Thread_start_A01", match(runtimes(Runtime.ART_V7_0_0)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.Thread.start.Thread_start_A01", match(runtimes(Version.V7_0_0)))
           .put(
               "lang.String.getBytesLjava_lang_String.String_getBytes_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0)))
+              match(runtimesUpTo(Version.V7_0_0)))
           .put(
               "util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0)))
+              match(runtimesUpTo(Version.V7_0_0)))
           .put(
               "util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0)))
+              match(runtimesUpTo(Version.V7_0_0)))
           .put(
               "lang.StringBuffer.getCharsII_CI.StringBuffer_getChars_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.StringBuffer.appendF.StringBuffer_append_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.StringBuffer.insertI_CII.StringBuffer_insert_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.StrictMath.scalbDI.StrictMath_scalb_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.StrictMath.scalbDI.StrictMath_scalb_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.StrictMath.scalbFI.StrictMath_scalb_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.StrictMath.scalbFI.StrictMath_scalb_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.StrictMath.scalbDI.StrictMath_scalb_A03", match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.StrictMath.scalbDI.StrictMath_scalb_A01", match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.StrictMath.scalbFI.StrictMath_scalb_A03", match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.StrictMath.scalbFI.StrictMath_scalb_A01", match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A07",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A07",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.Thread.toString.Thread_toString_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.Thread.start.Thread_start_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.Thread.toString.Thread_toString_A01", match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.Thread.start.Thread_start_A02", match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.Thread.setPriorityI.Thread_setPriority_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ClassLoader.ConstructorLjava_lang_ClassLoader.ClassLoader_Constructor_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.Enum.compareToLjava_lang_Enum.Enum_compareTo_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.Enum.hashCode.Enum_hashCode_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.Enum.hashCode.Enum_hashCode_A01", match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.StackTraceElement.hashCode.StackTraceElement_hashCode_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ProcessBuilder.environment.ProcessBuilder_environment_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ProcessBuilder.environment.ProcessBuilder_environment_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.Float.toStringF.Float_toString_A04",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.Float.toStringF.Float_toString_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.Float.toStringF.Float_toString_A04", match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.Float.toStringF.Float_toString_A03", match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ThreadGroup.getMaxPriority.ThreadGroup_getMaxPriority_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ThreadGroup.uncaughtExceptionLjava_lang_ThreadLjava_lang_Throwable.ThreadGroup_uncaughtException_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.ThreadGroup.list.ThreadGroup_list_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.ThreadGroup.list.ThreadGroup_list_A01", match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A04",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.ThreadGroup.toString.ThreadGroup_toString_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.Class.getFieldLjava_lang_String.Class_getField_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.String.replaceCC.String_replace_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.String.replaceCC.String_replace_A01", match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.Package.isCompatibleWithLjava_lang_String.Package_isCompatibleWith_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.StringBuilder.appendF.StringBuilder_append_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.StringBuilder.insertIF.StringBuilder_insert_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.reflect.AccessibleObject.setAccessibleZ.AccessibleObject_setAccessible_A04",
-              match(runtimes(Runtime.ART_V4_4_4, Runtime.JAVA)))
+              match(runtimesUpTo(Version.V4_4_4)))
           .put(
               "lang.reflect.AccessibleObject.setAccessible_Ljava_lang_reflect_AccessibleObjectZ.AccessibleObject_setAccessible_A04",
-              match(artRuntimesUpToAndJava(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.Character.UnicodeBlock.forName_java_lang_String.UnicodeBlock_forName_A03",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
           .put(
               "lang.System.loadLjava_lang_String.System_load_A02",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1)))
-          .put(
-              "lang.Math.hypotDD.Math_hypot_A04",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V5_1_1)))
+              match(runtimesUpTo(Version.V6_0_1)))
+          .put("lang.Math.hypotDD.Math_hypot_A04", match(runtimesUpTo(Version.V5_1_1)))
           .put(
               "math.BigInteger.probablePrimeIjava_util_Random.BigInteger_probablePrime_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
-          .put("lang.Math.sqrtD.Math_sqrt_A01", match(runtimes(Runtime.ART_V4_0_4)))
-          .put("lang.StrictMath.cbrtD.StrictMath_cbrt_A01", match(runtimes(Runtime.ART_V4_0_4)))
-          .put("lang.StrictMath.log10D.StrictMath_log10_A01", match(runtimes(Runtime.ART_V4_0_4)))
-          .put(
-              "lang.StrictMath.powDD.StrictMath_pow_A01",
-              match(runtimes(Runtime.ART_V4_0_4, Runtime.JAVA)))
-          .put("lang.String.indexOfII.String_indexOf_A01", match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
+          .put("lang.Math.sqrtD.Math_sqrt_A01", match(runtimes(Version.V4_0_4)))
+          .put("lang.StrictMath.cbrtD.StrictMath_cbrt_A01", match(runtimes(Version.V4_0_4)))
+          .put("lang.StrictMath.log10D.StrictMath_log10_A01", match(runtimes(Version.V4_0_4)))
+          .put("lang.StrictMath.powDD.StrictMath_pow_A01", match(runtimes(Version.V4_0_4)))
+          .put("lang.String.indexOfII.String_indexOf_A01", match(runtimes(Version.V4_0_4)))
           .put(
               "lang.String.indexOfLjava_lang_StringI.String_indexOf_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getByteLjava_lang_ObjectI.Array_getByte_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getDoubleLjava_lang_ObjectI.Array_getDouble_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getDoubleLjava_lang_ObjectI.Array_getDouble_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getFloatLjava_lang_ObjectI.Array_getFloat_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getFloatLjava_lang_ObjectI.Array_getFloat_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getIntLjava_lang_ObjectI.Array_getInt_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getIntLjava_lang_ObjectI.Array_getInt_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getLongLjava_lang_ObjectI.Array_getLong_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getLongLjava_lang_ObjectI.Array_getLong_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.getShortLjava_lang_ObjectI.Array_getShort_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.setBooleanLjava_lang_ObjectIZ.Array_setBoolean_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.setCharLjava_lang_ObjectIC.Array_setChar_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.setLjava_lang_ObjectILjava_lang_Object.Array_set_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Array.setLjava_lang_ObjectILjava_lang_Object.Array_set_A03",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "lang.reflect.Constructor.toString.Constructor_toString_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "math.BigInteger.modPowLjava_math_BigIntegerLjava_math_Integer.BigInteger_modPow_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "util.concurrent.LinkedBlockingDeque.drainToLjava_util_CollectionI.LinkedBlockingDeque_drainTo_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
+              match(runtimes(Version.V4_0_4)))
           .put(
               "util.concurrent.LinkedBlockingQueue.drainToLjava_util_CollectionI.LinkedBlockingQueue_drainTo_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
-          .put(
-              "lang.Thread.stopLjava_lang_Throwable.Thread_stop_A02", match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.AssertionError.ConstructorLjava_lang_Object.AssertionError_Constructor_A01",
-              match(runtimes(Runtime.ART_V4_0_4)))
-          .put(
-              "lang.RuntimePermission.Class.RuntimePermission_class_A13",
-              match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.Thread.stopLjava_lang_Throwable.Thread_stop_A01", match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A02",
-              match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.ref.PhantomReference.clear.PhantomReference_clear_A01",
-              match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01",
-              match(runtimes(Runtime.JAVA)))
-          .put("lang.ThreadGroup.destroy.ThreadGroup_destroy_A04", match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A02",
-              match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.String.replaceFirstLjava_lang_StringLjava_lang_String.String_replaceFirst_A01",
-              match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.String.replaceAllLjava_lang_StringLjava_lang_String.String_replaceAll_A01",
-              match(runtimes(Runtime.JAVA)))
-          .put(
-              "lang.System.inheritedChannel.System_inheritedChannel_A01",
-              match(runtimes(Runtime.JAVA)))
+              match(runtimes(Version.V4_0_4)))
           .build(); // end of failuresToTriage
 
-  public static final Multimap<String, TestCondition> flakyWhenRun =
+  public static final Multimap<String, TestCondition> flakyWithArt =
       new ImmutableListMultimap.Builder<String, TestCondition>()
-          .put("lang.Object.notifyAll.Object_notifyAll_A03", anyDexVm())
-          .put("lang.Object.notify.Object_notify_A03", anyDexVm())
+
+          .put("lang.Object.notifyAll.Object_notifyAll_A03", any())
+
+
+
+          .put("lang.Object.notify.Object_notify_A03", any())
+
+
+
           .put(
               "util.concurrent.ConcurrentSkipListSet.addLjava_lang_Object.ConcurrentSkipListSet_add_A01",
               any())
-          .put("util.concurrent.SynchronousQueue.ConstructorZ", anyDexVm())
-          .put("lang.Thread.interrupt.Thread_interrupt_A04", anyDexVm())
-          .put(
-              "util.concurrent.SynchronousQueue.ConstructorZ.SynchronousQueue_Constructor_A01",
-              anyDexVm())
-          .put("lang.Thread.getState.Thread_getState_A01", anyDexVm())
+
+
+
+          .put("util.concurrent.SynchronousQueue.ConstructorZ", any())
+
+
+
+
+          .put("lang.Thread.interrupt.Thread_interrupt_A04", any())
+
+
+
+
+          .put("util.concurrent.SynchronousQueue.ConstructorZ.SynchronousQueue_Constructor_A01",
+              any())
+
+
+
+
+          .put("lang.Thread.getState.Thread_getState_A01", any())
+
+
+
+
           .put(
               "util.concurrent.ScheduledThreadPoolExecutor.getTaskCount.ScheduledThreadPoolExecutor_getTaskCount_A01",
               any())
-          .put(
-              "lang.ref.PhantomReference.clear.PhantomReference_clear_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put(
-              "lang.ref.SoftReference.clear.SoftReference_clear_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put(
-              "lang.ref.WeakReference.clear.WeakReference_clear_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put(
-              "lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01", anyDexVm())
-          .put(
-              "lang.ref.WeakReference.enqueue.WeakReference_enqueue_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put(
-              "lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put(
-              "lang.ref.SoftReference.enqueue.SoftReference_enqueue_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put(
-              "lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01",
-              match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4)))
-          .put("lang.Runtime.gc.Runtime_gc_A01", match(runtimes(Runtime.JAVA)))
-          .build(); // end of flakyWhenRun
 
-  public static final Multimap<String, TestCondition> timeoutsWhenRun =
+
+
+          .put("lang.ref.PhantomReference.clear.PhantomReference_clear_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.ref.SoftReference.clear.SoftReference_clear_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+          .put("lang.ref.WeakReference.clear.WeakReference_clear_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+
+
+          .put("lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+
+          .put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01", any())
+
+
+
+          .put("lang.ref.WeakReference.enqueue.WeakReference_enqueue_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+
+
+
+          .put("lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+
+
+          .put("lang.ref.SoftReference.enqueue.SoftReference_enqueue_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+
+
+
+          .put("lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01",
+              match(runtimesUpTo(Version.V4_4_4)))
+
+
+          .put("lang.AssertionError.ConstructorLjava_lang_Object.AssertionError_Constructor_A01",
+              match(runtimes(Version.V4_0_4)))
+
+
+
+
+          .build(); // end of flakyWithArt
+
+  public static final Multimap<String, TestCondition> timeoutsWithArt =
       new ImmutableListMultimap.Builder<String, TestCondition>()
-          .put("lang.Thread.interrupt.Thread_interrupt_A01", anyDexVm())
-          .put("lang.Thread.resume.Thread_resume_A01", anyDexVm())
-          .put("lang.Thread.stop.Thread_stop_A01", anyDexVm())
-          .put("lang.Thread.suspend.Thread_suspend_A01", anyDexVm())
+          .put("lang.Thread.interrupt.Thread_interrupt_A01", any())
+          .put("lang.Thread.resume.Thread_resume_A01", any())
+          .put("lang.Thread.stop.Thread_stop_A01", any())
+          .put("lang.Thread.suspend.Thread_suspend_A01", any())
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A04",
-              anyDexVm())
+              any())
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A03",
-              anyDexVm())
+              any())
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A05",
-              anyDexVm())
-          .put("lang.Thread.setNameLjava_lang_String.Thread_setName_A02", anyDexVm())
-          .put("lang.Thread.stop.Thread_stop_A02", anyDexVm())
+              any())
+          .put("lang.Thread.setNameLjava_lang_String.Thread_setName_A02", any())
+          .put("lang.Thread.stop.Thread_stop_A02", any())
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A02",
-              anyDexVm())
+              any())
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A03",
-              anyDexVm())
-          .put("lang.Thread.getStackTrace.Thread_getStackTrace_A03", anyDexVm())
+              any())
+          .put("lang.Thread.getStackTrace.Thread_getStackTrace_A03", any())
           .put(
               "lang.Thread.setDefaultUncaughtExceptionHandler.Thread_setDefaultUncaughtExceptionHandler_A02",
-              anyDexVm())
-          .put("lang.Thread.checkAccess.Thread_checkAccess_A01", anyDexVm())
+              any())
+          .put("lang.Thread.checkAccess.Thread_checkAccess_A01", any())
           .put(
               "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A04",
-              anyDexVm())
-          .put(
-              "lang.Thread.setUncaughtExceptionHandler.Thread_setUncaughtExceptionHandler_A02",
-              anyDexVm())
-          .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A01", anyDexVm())
-          .put("lang.Thread.getAllStackTraces.Thread_getAllStackTraces_A02", anyDexVm())
+              any())
+          .put("lang.Thread.setUncaughtExceptionHandler.Thread_setUncaughtExceptionHandler_A02",
+              any())
+          .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A01", any())
+          .put("lang.Thread.getAllStackTraces.Thread_getAllStackTraces_A02", any())
           .put(
               "lang.Thread.setContextClassLoaderLjava_lang_ClassLoader.Thread_setContextClassLoader_A02",
-              anyDexVm())
-          .put("lang.Thread.setPriorityI.Thread_setPriority_A02", anyDexVm())
-          .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A02", anyDexVm())
-          .put(
-              "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A04",
-              anyDexVm())
-          .put("lang.Thread.getContextClassLoader.Thread_getContextClassLoader_A02", anyDexVm())
-          .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A02", anyDexVm())
-          .put("lang.Thread.setDaemonZ.Thread_setDaemon_A03", anyDexVm())
-          .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A07", anyDexVm())
+              any())
+          .put("lang.Thread.setPriorityI.Thread_setPriority_A02", any())
+          .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A02", any())
+          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A04",
+              any())
+          .put("lang.Thread.getContextClassLoader.Thread_getContextClassLoader_A02", any())
+          .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A02", any())
+          .put("lang.Thread.setDaemonZ.Thread_setDaemon_A03", any())
+          .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A07", any())
           .put(
               "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A04",
-              anyDexVm())
-          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A04", anyDexVm())
-          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A04", anyDexVm())
-          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A04", anyDexVm())
-          .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A03", anyDexVm())
-          .put("lang.System.getSecurityManager.System_getSecurityManager_A01", anyDexVm())
-          .put("lang.System.setInLjava_io_InputStream.System_setIn_A02", anyDexVm())
-          .put("lang.System.setOutLjava_io_PrintStream.System_setOut_A02", anyDexVm())
-          .put("lang.ThreadGroup.destroy.ThreadGroup_destroy_A04", anyDexVm())
-          .put("lang.ThreadGroup.enumerate_ThreadGroupZ.ThreadGroup_enumerate_A03", anyDexVm())
-          .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A03", anyDexVm())
-          .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A03", anyDexVm())
-          .put("lang.ThreadGroup.interrupt.ThreadGroup_interrupt_A02", anyDexVm())
-          .put("lang.ThreadGroup.resume.ThreadGroup_resume_A02", anyDexVm())
-          .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A02", anyDexVm())
-          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A04", anyDexVm())
-          .put("lang.System.getenvLjava_lang_String.System_getenv_A03", anyDexVm())
-          .put(
-              "lang.System.setPropertyLjava_lang_StringLjava_lang_String.System_setProperty_A02",
-              anyDexVm())
-          .put("lang.ThreadGroup.enumerate_ThreadGroup.ThreadGroup_enumerate_A03", anyDexVm())
-          .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A02", anyDexVm())
-          .put("lang.ThreadGroup.setDaemonZ.ThreadGroup_setDaemon_A02", anyDexVm())
-          .put("lang.ThreadGroup.stop.ThreadGroup_stop_A02", anyDexVm())
-          .put("lang.Class.getSuperclass.Class_getSuperclass_A01", anyDexVm())
-          .put("lang.System.getenv.System_getenv_A03", anyDexVm())
-          .put("lang.System.inheritedChannel.System_inheritedChannel_A01", anyDexVm())
+              any())
+          .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A04", any())
+          .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A04", any())
+          .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A04", any())
+          .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A03", any())
+          .put("lang.System.getSecurityManager.System_getSecurityManager_A01", any())
+          .put("lang.System.setInLjava_io_InputStream.System_setIn_A02", any())
+          .put("lang.System.setOutLjava_io_PrintStream.System_setOut_A02", any())
+          .put("lang.ThreadGroup.destroy.ThreadGroup_destroy_A04", any())
+          .put("lang.ThreadGroup.enumerate_ThreadGroupZ.ThreadGroup_enumerate_A03", any())
+          .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A03", any())
+          .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A03", any())
+          .put("lang.ThreadGroup.interrupt.ThreadGroup_interrupt_A02", any())
+          .put("lang.ThreadGroup.resume.ThreadGroup_resume_A02", any())
+          .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A02", any())
+          .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A04", any())
+          .put("lang.System.getenvLjava_lang_String.System_getenv_A03", any())
+          .put("lang.System.setPropertyLjava_lang_StringLjava_lang_String.System_setProperty_A02",
+              any())
+          .put("lang.ThreadGroup.enumerate_ThreadGroup.ThreadGroup_enumerate_A03", any())
+          .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A02", any())
+          .put("lang.ThreadGroup.setDaemonZ.ThreadGroup_setDaemon_A02", any())
+          .put("lang.ThreadGroup.stop.ThreadGroup_stop_A02", any())
+          .put("lang.Class.getSuperclass.Class_getSuperclass_A01", any())
+          .put("lang.System.getenv.System_getenv_A03", any())
+          .put("lang.System.inheritedChannel.System_inheritedChannel_A01", any())
           .put(
               "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01",
-              anyDexVm())
-          .put(
-              "lang.System.arraycopyLjava_lang_ObjectILjava_lang_ObjectII.System_arraycopy_A03",
-              anyDexVm())
-          .put("lang.System.setErrLjava_io_PrintStream.System_setErr_A02", anyDexVm())
+              any())
+          .put("lang.System.arraycopyLjava_lang_ObjectILjava_lang_ObjectII.System_arraycopy_A03",
+              any())
+          .put("lang.System.setErrLjava_io_PrintStream.System_setErr_A02", any())
           .put(
               "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01",
-              anyDexVm())
+              any())
           .put(
               "lang.System.setSecurityManagerLjava_lang_SecurityManager.System_setSecurityManager_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01",
-              anyDexVm())
+              any())
           .put(
               "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01",
-              anyDexVm())
-          .put(
-              "lang.System.setPropertiesLjava_util_Properties.System_setProperties_A01", anyDexVm())
+              any())
+          .put("lang.System.setPropertiesLjava_util_Properties.System_setProperties_A01", any())
           .put(
               "util.concurrent.CopyOnWriteArrayList.ConstructorLjava_util_Collection.CopyOnWriteArrayList_Constructor_A02",
-              anyDexVm())
+              any())
           .put("util.concurrent.CyclicBarrier.reset.CyclicBarrier_reset_A03", any())
-          .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A01", anyDexVm())
-          .put("lang.System.getenv.System_getenv_A04", anyDexVm())
-          .put("lang.RuntimePermission.Class.RuntimePermission_class_A02", anyDexVm())
-          .put("lang.RuntimePermission.Class.RuntimePermission_class_A13", anyDexVm())
-          .build(); // end of timeoutsWhenRun
+          .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A01", any())
+          .put("lang.System.getenv.System_getenv_A04", any())
+          .put("lang.RuntimePermission.Class.RuntimePermission_class_A02", any())
+          .put("lang.RuntimePermission.Class.RuntimePermission_class_A13", any())
+          .build(); // end of timeoutsWithArt
 
   public static final Multimap<String, TestCondition> requiresInliningDisabled =
       new ImmutableListMultimap.Builder<String, TestCondition>()
@@ -1821,18 +1605,15 @@
           .put("lang.Thread.dumpStack.Thread_dumpStack_A01", match(R8_COMPILER))
           .build();
 
-  public static final Set<String> compilationFailsWithAsmMethodTooLarge =
-      ImmutableSet.of("lang.StrictMath.powDD.StrictMath_pow_A01");
-
   private static final boolean testMatch(
       Multimap<String, TestCondition> testConditions,
       String name,
       CompilerUnderTest compilerUnderTest,
-      Runtime runtime,
+      DexVm dexVm,
       CompilationMode compilationMode) {
     Collection<TestCondition> entries = testConditions.get(name);
     for (TestCondition entry : entries) {
-      if (entry.test(DexTool.NONE, compilerUnderTest, runtime, compilationMode)) {
+      if (entry.test(DexTool.NONE, compilerUnderTest, dexVm.getVersion(), compilationMode)) {
         return true;
       }
     }
@@ -1842,28 +1623,28 @@
   public static final <T> T getExpectedOutcome(
       String name,
       CompilerUnderTest compilerUnderTest,
-      Runtime runtime,
+      DexVm dexVm,
       CompilationMode compilationMode,
       BiFunction<Outcome, Boolean, T> consumer) {
 
     Outcome outcome = null;
 
-    if (testMatch(failuresToTriage, name, compilerUnderTest, runtime, compilationMode)) {
-      outcome = Outcome.FAILS_WHEN_RUN;
+    if (testMatch(failuresToTriage, name, compilerUnderTest, dexVm, compilationMode)) {
+      outcome = Outcome.FAILS_WITH_ART;
     }
-    if (testMatch(timeoutsWhenRun, name, compilerUnderTest, runtime, compilationMode)) {
+    if (testMatch(timeoutsWithArt, name, compilerUnderTest, dexVm, compilationMode)) {
       assert outcome == null;
-      outcome = Outcome.TIMEOUTS_WHEN_RUN;
+      outcome = Outcome.TIMEOUTS_WITH_ART;
     }
-    if (testMatch(flakyWhenRun, name, compilerUnderTest, runtime, compilationMode)) {
+    if (testMatch(flakyWithArt, name, compilerUnderTest, dexVm, compilationMode)) {
       assert outcome == null;
-      outcome = Outcome.FLAKY_WHEN_RUN;
+      outcome = Outcome.FLAKY_WITH_ART;
     }
     if (outcome == null) {
       outcome = Outcome.PASSES;
     }
-    boolean disableInlining =
-        testMatch(requiresInliningDisabled, name, compilerUnderTest, runtime, compilationMode);
+    boolean disableInlining = testMatch(requiresInliningDisabled, name, compilerUnderTest, dexVm,
+        compilationMode);
     return consumer.apply(outcome, disableInlining);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index dd4ce6f..3ef4037 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -7,7 +7,6 @@
 import static org.junit.Assert.fail;
 
 import com.android.tools.r8.JctfTestSpecifications.Outcome;
-import com.android.tools.r8.TestCondition.Runtime;
 import com.android.tools.r8.TestCondition.RuntimeSet;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.ToolHelper.DexVm;
@@ -82,8 +81,7 @@
     D8,
     R8,
     R8_AFTER_D8, // refers to the R8 (default: debug) step but implies a previous D8 step as well
-    D8_AFTER_R8CF,
-    R8CF
+    D8_AFTER_R8CF
   }
 
   public static final String ART_TESTS_DIR = "tests/2017-10-04/art";
@@ -1092,8 +1090,8 @@
     private final DexTool dexTool;
     // Native library to use for running this test - if any.
     private final String nativeLibrary;
-    // Skip running this test with Art or Java - most likely due to timeout.
-    private final boolean skipRun;
+    // Skip running this test with Art - most likely due to timeout.
+    private final boolean skipArt;
     // Skip running this test altogether. For example, there might be no input in this configuration
     // (e.g. no class files).
     private final boolean skipTest;
@@ -1101,9 +1099,9 @@
     private final boolean failsWithX8;
     // Expected to fail compilation with a CompilationError.
     private final boolean expectedToFailWithX8;
-    // Fails running the output in Art or on Java with an assertion error. On Art it's typically due
-    // to verification errors.
-    private final boolean failsOnRun;
+    // Fails running the output in Art with an assertion error. Typically due to verification
+    // errors.
+    private final boolean failsWithArt;
     // Runs in art but fails the run because it produces different results.
     private final boolean failsWithArtOutput;
     // Original fails in art but the R8/D8 version can run in art.
@@ -1121,10 +1119,10 @@
         String name,
         DexTool dexTool,
         File directory,
-        boolean skipRun,
+        boolean skipArt,
         boolean skipTest,
         boolean failsWithX8,
-        boolean failsOnRun,
+        boolean failsWithArt,
         boolean failsWithArtOutput,
         boolean failsWithArtOriginalOnly,
         String nativeLibrary,
@@ -1132,15 +1130,16 @@
         boolean outputMayDiffer,
         boolean disableInlining,
         boolean disableClassInlining,
-        boolean hasMissingClasses) {
+        boolean hasMissingClasses,
+        DexVm dexVm) {
       this.name = name;
       this.dexTool = dexTool;
       this.nativeLibrary = nativeLibrary;
       this.directory = directory;
-      this.skipRun = skipRun;
-      this.skipTest = skipTest;
+      this.skipArt = skipArt;
+      this.skipTest = skipTest || (ToolHelper.isWindows() && dexVm.getKind() == Kind.HOST);
       this.failsWithX8 = failsWithX8;
-      this.failsOnRun = failsOnRun;
+      this.failsWithArt = failsWithArt;
       this.failsWithArtOutput = failsWithArtOutput;
       this.failsWithArtOriginalOnly = failsWithArtOriginalOnly;
       this.expectedToFailWithX8 = expectedToFailWithX8;
@@ -1154,18 +1153,18 @@
         String name,
         DexTool dexTool,
         File directory,
-        boolean skipRun,
-        boolean failsOnRun,
+        boolean skipArt,
+        boolean failsWithArt,
         boolean disableInlining,
         DexVm dexVm) {
       this(
           name,
           dexTool,
           directory,
-          skipRun,
-          ToolHelper.isWindows() && dexVm.getKind() == Kind.HOST,
+          skipArt,
           false,
-          failsOnRun,
+          false,
+          failsWithArt,
           false,
           false,
           null,
@@ -1173,32 +1172,8 @@
           false,
           disableInlining,
           true, // Disable class inlining for JCTF tests.
-          false);
-    }
-
-    TestSpecification(
-        String name,
-        DexTool dexTool,
-        File directory,
-        boolean skipRun,
-        boolean failsOnRun,
-        boolean disableInlining) {
-      this(
-          name,
-          dexTool,
-          directory,
-          skipRun,
           false,
-          false,
-          failsOnRun,
-          false,
-          false,
-          null,
-          false,
-          false,
-          disableInlining,
-          true, // Disable class inlining for JCTF tests.
-          false);
+          dexVm);
     }
 
     public File resolveFile(String name) {
@@ -1352,7 +1327,7 @@
                 dexTool,
                 testDir,
                 skipArt.contains(name),
-                skip || ToolHelper.isWindows() && dexVm.getKind() == Kind.HOST,
+                skip,
                 failsWithCompiler.contains(name),
                 failsWithArt.contains(name),
                 failsRunWithArtOutput.contains(name),
@@ -1362,7 +1337,8 @@
                 outputMayDiffer.contains(name),
                 requireInliningToBeDisabled.contains(name),
                 requireClassInliningToBeDisabled.contains(name),
-                hasMissingClasses.contains(name)));
+                hasMissingClasses.contains(name),
+                dexVm));
       }
     }
     return data;
@@ -1372,7 +1348,6 @@
     CompilationMode compilationMode = null;
     switch (compilerUnderTest) {
       case R8:
-      case R8CF:
         compilationMode = CompilationMode.RELEASE;
         break;
       case D8:
@@ -1559,27 +1534,19 @@
         break;
       }
       case R8:
-      case R8CF:
         {
-          boolean cfBackend = compilerUnderTest == CompilerUnderTest.R8CF;
           R8Command.Builder builder =
               R8Command.builder()
                   .setMode(mode)
-                  .setOutput(
-                      Paths.get(resultPath),
-                      cfBackend ? OutputMode.ClassFile : OutputMode.DexIndexed);
+                  .setOutput(Paths.get(resultPath), OutputMode.DexIndexed);
           // Add program files directly to the underlying app to avoid errors on DEX inputs.
           ToolHelper.getAppBuilder(builder).addProgramFiles(ListUtils.map(fileNames, Paths::get));
-          if (cfBackend) {
-            builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
-          } else {
           AndroidApiLevel minSdkVersion = needMinSdkVersion.get(name);
           if (minSdkVersion != null) {
             builder.setMinApiLevel(minSdkVersion.getLevel());
             ToolHelper.addFilteredAndroidJar(builder, minSdkVersion);
           } else {
             ToolHelper.addFilteredAndroidJar(builder, AndroidApiLevel.getDefault());
-            }
           }
           if (keepRulesFile != null) {
             builder.addProguardConfigurationFiles(Paths.get(keepRulesFile));
@@ -1665,36 +1632,18 @@
             name,
             dexTool,
             resultDir,
-            outcome == JctfTestSpecifications.Outcome.TIMEOUTS_WHEN_RUN
-                || outcome == JctfTestSpecifications.Outcome.FLAKY_WHEN_RUN,
-            outcome == JctfTestSpecifications.Outcome.FAILS_WHEN_RUN,
+            outcome == JctfTestSpecifications.Outcome.TIMEOUTS_WITH_ART
+                || outcome == JctfTestSpecifications.Outcome.FLAKY_WITH_ART,
+            outcome == JctfTestSpecifications.Outcome.FAILS_WITH_ART,
             noInlining,
             dexVm);
   }
 
-  private static BiFunction<Outcome, Boolean, TestSpecification> jctfOutcomeToSpecificationJava(
-      String name, File resultDir) {
-    return (outcome, noInlining) ->
-        new TestSpecification(
-            name,
-            DexTool.NONE,
-            resultDir,
-            outcome == JctfTestSpecifications.Outcome.TIMEOUTS_WHEN_RUN
-                || outcome == JctfTestSpecifications.Outcome.FLAKY_WHEN_RUN,
-            outcome == JctfTestSpecifications.Outcome.FAILS_WHEN_RUN,
-            noInlining);
-  }
-
   protected void runJctfTest(CompilerUnderTest compilerUnderTest, String classFilePath,
       String fullClassName)
       throws IOException, ProguardRuleParserException, ExecutionException,
       CompilationFailedException {
-    Runtime runtime;
-    if (compilerUnderTest == CompilerUnderTest.R8CF) {
-      runtime = Runtime.JAVA;
-    } else {
-      runtime = Runtime.fromDexVmVersion(ToolHelper.getDexVm().getVersion());
-    }
+    DexVm dexVm = ToolHelper.getDexVm();
 
     CompilerUnderTest firstCompilerUnderTest =
         compilerUnderTest == CompilerUnderTest.R8_AFTER_D8
@@ -1708,11 +1657,9 @@
         JctfTestSpecifications.getExpectedOutcome(
             name,
             firstCompilerUnderTest,
-            runtime,
+            dexVm,
             compilationMode,
-            compilerUnderTest == CompilerUnderTest.R8CF
-                ? jctfOutcomeToSpecificationJava(name, resultDir)
-                : jctfOutcomeToSpecification(name, DexTool.NONE, resultDir, ToolHelper.getDexVm()));
+            jctfOutcomeToSpecification(name, DexTool.NONE, resultDir, dexVm));
 
     if (specification.skipTest) {
       return;
@@ -1777,19 +1724,14 @@
       fileNames.add(f.getCanonicalPath());
     }
 
-    if (compilerUnderTest == CompilerUnderTest.R8CF) {
-      runJctfTestDoRunOnJava(fileNames, specification, fullClassName, compilationMode, resultDir);
-    } else {
-
-      runJctfTestDoRunOnArt(
-          fileNames,
-          specification,
-          firstCompilerUnderTest,
-          fullClassName,
-          compilationMode,
-          ToolHelper.getDexVm(),
-          resultDir);
-    }
+    runJctfTestDoRunOnArt(
+        fileNames,
+        specification,
+        firstCompilerUnderTest,
+        fullClassName,
+        compilationMode,
+        dexVm,
+        resultDir);
 
     // second pass if D8_R8Debug
     if (compilerUnderTest == CompilerUnderTest.R8_AFTER_D8) {
@@ -1804,9 +1746,9 @@
           JctfTestSpecifications.getExpectedOutcome(
               name,
               CompilerUnderTest.R8_AFTER_D8,
-              runtime,
+              dexVm,
               compilationMode,
-              jctfOutcomeToSpecification(name, DexTool.DX, r8ResultDir, ToolHelper.getDexVm()));
+              jctfOutcomeToSpecification(name, DexTool.DX, r8ResultDir, dexVm));
       if (specification.skipTest) {
         return;
       }
@@ -1816,7 +1758,7 @@
           CompilerUnderTest.R8,
           fullClassName,
           compilationMode,
-          ToolHelper.getDexVm(),
+          dexVm,
           r8ResultDir);
     }
   }
@@ -1829,7 +1771,8 @@
       CompilationMode mode,
       DexVm dexVm,
       File resultDir)
-      throws IOException, CompilationFailedException {
+      throws IOException, ProguardRuleParserException, ExecutionException,
+      CompilationFailedException {
     executeCompilerUnderTest(compilerUnderTest, fileNames, resultDir.getAbsolutePath(), mode,
         specification.disableInlining, specification.disableClassInlining,
         specification.hasMissingClasses);
@@ -1854,7 +1797,7 @@
     }
 
     boolean compileOnly = System.getProperty("jctf_compile_only", "0").equals("1");
-    if (compileOnly || specification.skipRun) {
+    if (compileOnly || specification.skipArt) {
       if (ToolHelper.isDex2OatSupported()) {
         // verify dex code instead of running it
         Path oatFile = temp.getRoot().toPath().resolve("all.oat");
@@ -1873,7 +1816,7 @@
     builder.setMainClass(JUNIT_TEST_RUNNER);
     builder.appendProgramArgument(fullClassName);
 
-    if (specification.failsOnRun) {
+    if (specification.failsWithArt) {
       expectException(AssertionError.class);
     }
 
@@ -1884,54 +1827,10 @@
           specification.resolveFile("classes.dex"), e);
       throw e;
     }
-    if (specification.failsOnRun) {
-      System.err.println("Should have failed run with art.");
-    }
-  }
-
-  private void runJctfTestDoRunOnJava(
-      Collection<String> fileNames,
-      TestSpecification specification,
-      String fullClassName,
-      CompilationMode mode,
-      File resultDir)
-      throws IOException, CompilationFailedException {
-    if (JctfTestSpecifications.compilationFailsWithAsmMethodTooLarge.contains(specification.name)) {
-      expectException(org.objectweb.asm.MethodTooLargeException.class);
-    }
-    executeCompilerUnderTest(
-        CompilerUnderTest.R8CF,
-        fileNames,
-        resultDir.getAbsolutePath(),
-        mode,
-        specification.disableInlining,
-        specification.disableClassInlining,
-        specification.hasMissingClasses);
-
-    boolean compileOnly = System.getProperty("jctf_compile_only", "0").equals("1");
-
-    if (compileOnly || specification.skipRun) {
+    if (specification.failsWithArt) {
+      System.err.println("Should have failed run with art");
       return;
     }
-
-    if (specification.failsOnRun) {
-      expectException(AssertionError.class);
-    }
-
-    ProcessResult result = ToolHelper.runJava(resultDir.toPath(), JUNIT_TEST_RUNNER, fullClassName);
-
-    if (result.exitCode != 0) {
-      throw new AssertionError(
-          "Test failed on java.\nSTDOUT >>>\n"
-              + result.stdout
-              + "\n<<< STDOUT\nSTDERR >>>\n"
-              + result.stderr
-              + "\n<<< STDERR\n");
-    }
-
-    if (specification.failsOnRun) {
-      System.err.println("Should have failed run with java.");
-    }
   }
 
   protected void runArtTest(DexVm dexVm, CompilerUnderTest compilerUnderTest) throws Throwable {
@@ -2073,8 +1972,7 @@
           specification.hasMissingClasses);
     }
 
-    if (!specification.skipRun
-        && (ToolHelper.artSupported() || ToolHelper.dealsWithGoldenFiles())) {
+    if (!specification.skipArt && (ToolHelper.artSupported() || ToolHelper.dealsWithGoldenFiles())) {
       File originalFile;
       File processedFile;
 
@@ -2094,7 +1992,7 @@
       File expectedFile = specification.resolveFile("expected.txt");
       String expected =
           com.google.common.io.Files.asCharSource(expectedFile, Charsets.UTF_8).read();
-      if (specification.failsOnRun) {
+      if (specification.failsWithArt) {
         expectException(AssertionError.class);
       }
 
@@ -2107,7 +2005,7 @@
             specification.resolveFile("classes.dex"), e);
         throw e;
       }
-      if (specification.failsOnRun) {
+      if (specification.failsWithArt) {
         System.err.println("Should have failed run with art");
         return;
       }
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 15dc55a..101fbb8 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -37,7 +37,6 @@
       "-allowaccessmodification"
   );
 
-
   private static final ArrayList<String> PROGUARD_OPTIONS_N_PLUS = Lists.newArrayList(
       "-keepclasseswithmembers public class * {",
       "    public static void main(java.lang.String[]);",
@@ -101,7 +100,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = false)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 179, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 180, "lambdadesugaring"))
         .run();
 
     test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
@@ -109,7 +108,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = true)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 23, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 24, "lambdadesugaring"))
         .run();
   }
 
@@ -121,7 +120,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = false)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 179, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 180, "lambdadesugaring"))
         .run();
 
     test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
@@ -129,7 +128,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = true)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 23, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 24, "lambdadesugaring"))
         .run();
   }
 
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java
index c8dca5c..b85e2f2 100644
--- a/src/test/java/com/android/tools/r8/TestCondition.java
+++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -6,52 +6,13 @@
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
 import com.android.tools.r8.R8RunArtTestsTest.DexTool;
 import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.errors.Unreachable;
-import com.google.common.collect.Sets;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.EnumSet;
-import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 public class TestCondition {
 
-  enum Runtime {
-    ART_V4_0_4,
-    ART_V4_4_4,
-    ART_V5_1_1,
-    ART_V6_0_1,
-    ART_V7_0_0,
-    ART_DEFAULT,
-    JAVA;
-
-    static final Runtime LOWEST_ART_VERSION = ART_V4_0_4;
-    static final Runtime HIGHEST_ART_VERSION = ART_DEFAULT;
-
-    static Runtime fromDexVmVersion(DexVm.Version version) {
-      switch (version) {
-        case V4_0_4:
-          return ART_V4_0_4;
-        case V4_4_4:
-          return ART_V4_4_4;
-        case V5_1_1:
-          return ART_V5_1_1;
-        case V6_0_1:
-          return ART_V6_0_1;
-        case V7_0_0:
-          return ART_V7_0_0;
-        case DEFAULT:
-          return ART_DEFAULT;
-        default:
-          throw new Unreachable();
-      }
-    }
-
-    static boolean isArt(Runtime runtime) {
-      return EnumSet.range(LOWEST_ART_VERSION, HIGHEST_ART_VERSION).contains(runtime);
-    }
-  }
-
   static class ToolSet {
 
     final EnumSet<DexTool> set;
@@ -72,18 +33,14 @@
 
   static class RuntimeSet {
 
-    final EnumSet<Runtime> set;
+    final EnumSet<DexVm.Version> set;
 
-    public RuntimeSet(EnumSet<Runtime> set) {
+    public RuntimeSet(EnumSet<DexVm.Version> set) {
       this.set = set;
     }
 
-    public static RuntimeSet fromDexVmVersionSet(EnumSet<DexVm.Version> dexVmSet) {
-      List<Runtime> list = new ArrayList<>(dexVmSet.size());
-      for (DexVm.Version version : dexVmSet) {
-        list.add(Runtime.fromDexVmVersion(version));
-      }
-      return new RuntimeSet(EnumSet.copyOf(list));
+    public RuntimeSet(Set<DexVm.Version> set) {
+      this.set = EnumSet.copyOf(set);
     }
   }
 
@@ -106,15 +63,12 @@
   // settings, respectively
   public static final CompilerSet R8_COMPILER =
       compilers(
-          CompilerUnderTest.R8,
-          CompilerUnderTest.R8_AFTER_D8,
-          CompilerUnderTest.D8_AFTER_R8CF,
-          CompilerUnderTest.R8CF);
+          CompilerUnderTest.R8, CompilerUnderTest.R8_AFTER_D8, CompilerUnderTest.D8_AFTER_R8CF);
   public static final CompilerSet R8DEX_COMPILER =
       compilers(CompilerUnderTest.R8, CompilerUnderTest.R8_AFTER_D8);
   public static final CompilerSet R8_AFTER_D8_COMPILER = compilers(CompilerUnderTest.R8_AFTER_D8);
   public static final CompilerSet R8_NOT_AFTER_D8_COMPILER =
-      compilers(CompilerUnderTest.R8, CompilerUnderTest.D8_AFTER_R8CF, CompilerUnderTest.R8CF);
+      compilers(CompilerUnderTest.R8, CompilerUnderTest.D8_AFTER_R8CF);
   public static final CompilerSet R8DEX_NOT_AFTER_D8_COMPILER = compilers(CompilerUnderTest.R8);
 
   public static final CompilationModeSet DEBUG_MODE =
@@ -125,25 +79,23 @@
   private static final ToolSet ANY_TOOL = new ToolSet(EnumSet.allOf(DexTool.class));
   private static final CompilerSet ANY_COMPILER =
       new CompilerSet(EnumSet.allOf(CompilerUnderTest.class));
-  private static final RuntimeSet ANY_RUNTIME = new RuntimeSet(EnumSet.allOf(Runtime.class));
-  private static final RuntimeSet ANY_DEX_VM_RUNTIME =
-      RuntimeSet.fromDexVmVersionSet(EnumSet.allOf(ToolHelper.DexVm.Version.class));
+  private static final RuntimeSet ANY_RUNTIME = new RuntimeSet(EnumSet.allOf(DexVm.Version.class));
   private static final CompilationModeSet ANY_MODE =
       new CompilationModeSet(EnumSet.allOf(CompilationMode.class));
 
   private final EnumSet<DexTool> dexTools;
   private final EnumSet<CompilerUnderTest> compilers;
-  private final EnumSet<Runtime> runtimes;
+  private final EnumSet<DexVm.Version> dexVms;
   private final EnumSet<CompilationMode> compilationModes;
 
   public TestCondition(
       EnumSet<DexTool> dexTools,
       EnumSet<CompilerUnderTest> compilers,
-      EnumSet<Runtime> runtimes,
+      EnumSet<DexVm.Version> dexVms,
       EnumSet<CompilationMode> compilationModes) {
     this.dexTools = dexTools;
     this.compilers = compilers;
-    this.runtimes = runtimes;
+    this.dexVms = dexVms;
     this.compilationModes = compilationModes;
   }
 
@@ -159,48 +111,20 @@
 
   public static RuntimeSet runtimes(DexVm.Version... runtimes) {
     assert runtimes.length > 0;
-    return RuntimeSet.fromDexVmVersionSet(EnumSet.copyOf(Arrays.asList(runtimes)));
-  }
-
-  public static RuntimeSet runtimes(Runtime... runtimes) {
-    assert runtimes.length > 0;
     return new RuntimeSet(EnumSet.copyOf(Arrays.asList(runtimes)));
   }
 
   public static RuntimeSet runtimesUpTo(DexVm.Version upto) {
-    return RuntimeSet.fromDexVmVersionSet(EnumSet.range(DexVm.Version.first(), upto));
-  }
-
-  public static RuntimeSet artRuntimesUpTo(Runtime upto) {
-    assert Runtime.isArt(upto);
-    return new RuntimeSet(EnumSet.range(Runtime.LOWEST_ART_VERSION, upto));
-  }
-
-  public static RuntimeSet artRuntimesUpToAndJava(Runtime upto) {
-    return runtimes(
-        Sets.union(artRuntimesUpTo(upto).set, runtimes(Runtime.JAVA).set).toArray(new Runtime[0]));
+    return new RuntimeSet(EnumSet.range(DexVm.Version.first(), upto));
   }
 
   public static RuntimeSet runtimesFrom(DexVm.Version start) {
-    return RuntimeSet.fromDexVmVersionSet(EnumSet.range(start, DexVm.Version.last()));
-  }
-
-  public static RuntimeSet artRuntimesFrom(Runtime start) {
-    assert Runtime.isArt(start);
-    return new RuntimeSet(EnumSet.range(start, Runtime.HIGHEST_ART_VERSION));
-  }
-
-  public static RuntimeSet artRuntimesFromAndJava(Runtime start) {
-    return runtimes(
-        Sets.union(artRuntimesFrom(start).set, runtimes(Runtime.JAVA).set).toArray(new Runtime[0]));
+    return new RuntimeSet(EnumSet.range(start, DexVm.Version.last()));
   }
 
   public static RuntimeSet and(RuntimeSet... sets) {
-    return new RuntimeSet(
-        EnumSet.copyOf(
-            Arrays.stream(sets)
-                .flatMap(runtimeSet -> runtimeSet.set.stream())
-                .collect(Collectors.toSet())));
+    return new RuntimeSet(Arrays.stream(sets).flatMap(runtimeSet -> runtimeSet.set.stream())
+        .collect(Collectors.toSet()));
   }
 
   public static TestCondition match(
@@ -219,11 +143,6 @@
     return match(TestCondition.ANY_TOOL, TestCondition.ANY_COMPILER, TestCondition.ANY_RUNTIME);
   }
 
-  public static TestCondition anyDexVm() {
-    return match(
-        TestCondition.ANY_TOOL, TestCondition.ANY_COMPILER, TestCondition.ANY_DEX_VM_RUNTIME);
-  }
-
   public static TestCondition match(ToolSet tools) {
     return match(tools, TestCondition.ANY_COMPILER, TestCondition.ANY_RUNTIME);
   }
@@ -255,19 +174,11 @@
   public boolean test(
       DexTool dexTool,
       CompilerUnderTest compilerUnderTest,
-      Runtime runtime,
+      DexVm.Version dexVmVersion,
       CompilationMode compilationMode) {
     return dexTools.contains(dexTool)
         && compilers.contains(compilerUnderTest)
-        && runtimes.contains(runtime)
+        && dexVms.contains(dexVmVersion)
         && compilationModes.contains(compilationMode);
   }
-
-  public boolean test(
-      DexTool dexTool,
-      CompilerUnderTest compilerUnderTest,
-      DexVm.Version version,
-      CompilationMode compilationMode) {
-    return test(dexTool, compilerUnderTest, Runtime.fromDexVmVersion(version), compilationMode);
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java b/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java
index c90e0fb..c86711f 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java
@@ -8,7 +8,11 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -38,13 +42,22 @@
   }
 }
 
-class Main {
+class MainTest {
+  @SuppressWarnings("warning")
   public static void main(String[] args) throws Exception {
     A a = new A();
 
     Method m;
     m = A.class.getMethod("method0");
     m.invoke(a);
+    m = A.class.getMethod("method0", null);
+    m.invoke(a);
+    m = A.class.getMethod("method0", (Class<?>[]) null);
+    m.invoke(a);
+    m = A.class.getMethod("method0", (Class<?>[]) (Class<?>[]) null);
+    m.invoke(a);
+    m = A.class.getMethod("method0", (Class<?>[]) (Object[]) (Class<?>[]) null);
+    m.invoke(a);
     m = A.class.getMethod("method1", String.class);
     m.invoke(a, "1");
     m = A.class.getMethod("method2", String.class, String.class);
@@ -74,34 +87,49 @@
       m = A.class.getDeclaredMethod("method3", int.class, int.class);
       m.invoke(a, 2, 2);
     } catch (Exception e) {
+      System.out.println("Unexpected: " + e);
     }
 
-    Class[] argumentTypes;
-    argumentTypes = new Class[2];
+    Class<?>[] argumentTypes;
+    argumentTypes = new Class<?>[2];
     argumentTypes[1] = int.class;
     argumentTypes[0] = int.class;
     argumentTypes[0] = String.class;
     argumentTypes[1] = String.class;
     m = A.class.getDeclaredMethod("method2", argumentTypes);
     m.invoke(a, "2", "3");
+    argumentTypes[0] = String.class;
+    argumentTypes[1] = String.class;
     m = A.class.getDeclaredMethod("method2", argumentTypes);
     m.invoke(a, "4", "5");
+    argumentTypes[0] = String.class;
+    argumentTypes[1] = String.class;
+    m = A.class.getDeclaredMethod("method2", (Class<?>[]) argumentTypes);
+    m.invoke(a, "5", "4");
+    argumentTypes[0] = String.class;
+    argumentTypes[1] = String.class;
+    m = A.class.getDeclaredMethod("method2", (Class<?>[]) (Object[]) argumentTypes);
+    m.invoke(a, "5", "4");
 
     argumentTypes[1] = int.class;
     argumentTypes[0] = int.class;
     m = A.class.getDeclaredMethod("method3", argumentTypes);
     m.invoke(a, 3, 3);
+    argumentTypes[1] = int.class;
+    argumentTypes[0] = int.class;
     m = A.class.getDeclaredMethod("method3", argumentTypes);
     m.invoke(a, 3, 4);
 
     try {
-      argumentTypes = new Class[2];
+      argumentTypes = new Class<?>[2];
       argumentTypes[1] = int.class;
       argumentTypes[0] = int.class;
       argumentTypes[0] = String.class;
       argumentTypes[1] = String.class;
       m = A.class.getDeclaredMethod("method2", argumentTypes);
       m.invoke(a, "2", "3");
+      argumentTypes[0] = String.class;
+      argumentTypes[1] = String.class;
       m = A.class.getDeclaredMethod("method2", argumentTypes);
       m.invoke(a, "4", "7");
 
@@ -109,9 +137,311 @@
       argumentTypes[0] = int.class;
       m = A.class.getDeclaredMethod("method3", argumentTypes);
       m.invoke(a, 3, 3);
+      argumentTypes[1] = int.class;
+      argumentTypes[0] = int.class;
       m = A.class.getDeclaredMethod("method3", argumentTypes);
       m.invoke(a, 3, 4);
     } catch (Exception e) {
+      System.out.println("Unexpected: " + e);
+    }
+  }
+}
+
+class MainNonConstArraySize {
+  public static void main(String[] args) throws Exception {
+    Method m;
+    m = A.class.getMethod("method0");
+    m.invoke(new A());
+
+    nonConstArraySize(0);
+  }
+
+  @NeverInline
+  static void nonConstArraySize(int argumentTypesSize) {
+    try {
+      A a = new A();
+
+      Method m;
+      Class<?>[] argumentTypes;
+      argumentTypes = new Class<?>[argumentTypesSize];
+      m = A.class.getDeclaredMethod("method0", argumentTypes);
+      m.invoke(a);
+    } catch (Exception e) {
+      // Prepend the 0 output to the exception name to make it easier to compare the result with
+      // the reference run.
+      System.out.print("0" + e.getClass().getCanonicalName());
+    }
+  }
+}
+
+class MainPhiValue {
+  public static void main(String[] args) throws Exception {
+    Method m;
+    m = A.class.getMethod("method0");
+    m.invoke(new A());
+    m = A.class.getMethod("method1", String.class);
+    m.invoke(new A(), "1");
+
+    try {
+      arrayIsPhi(true);
+      throw new Exception("Unexpected");
+    } catch (NoSuchMethodException e) {
+      // Expected.
+    }
+
+    try {
+      elementIsPhi(true);
+      throw new Exception("Unexpected");
+    } catch (NoSuchMethodException e) {
+      // Expected.
+    }
+
+    try {
+      elementIsPhiButDeterministic(true, "");
+      throw new Exception("Unexpected");
+    } catch (NoSuchMethodException e) {
+      // Expected.
+    }
+  }
+
+  @NeverInline
+  static void arrayIsPhi(boolean b) throws Exception {
+    A a = new A();
+
+    Method m;
+    Class<?>[] argumentTypes;
+    if (b) {
+      argumentTypes = new Class<?>[1];
+      argumentTypes[0] = String.class;
+    } else {
+      argumentTypes = new Class<?>[1];
+      argumentTypes[0] = int.class;
+    }
+    m = A.class.getDeclaredMethod("method1", argumentTypes);
+    m.invoke(a, "0");
+  }
+
+  @NeverInline
+  static void elementIsPhi(boolean b) throws Exception {
+    A a = new A();
+
+    Class<?> x;
+    x = b ? String.class : int.class;
+    Method m;
+    Class<?>[] argumentTypes = new Class<?>[1];
+    argumentTypes[0] = x;
+    m = A.class.getDeclaredMethod("method1", argumentTypes);
+    m.invoke(a, "0");
+  }
+
+  @NeverInline
+  static void elementIsPhiButDeterministic(boolean b, String arg) throws Exception {
+    A a = new A();
+
+    Class<?> x;
+    x = b ? String.class : arg.getClass();
+    Method m;
+    Class<?>[] argumentTypes = new Class<?>[1];
+    argumentTypes[0] = x;
+    m = A.class.getDeclaredMethod("method1", argumentTypes);
+    m.invoke(a, "0");
+  }
+}
+
+class AllPrimitiveTypes {
+  public void method(boolean b) {
+    System.out.print(b);
+  }
+
+  public void method(byte b) {
+    System.out.print(b);
+  }
+
+  public void method(char c) {
+    System.out.print(c);
+  }
+
+  public void method(short s) {
+    System.out.print(s);
+  }
+
+  public void method(int i) {
+    System.out.print(i);
+  }
+
+  public void method(long l) {
+    System.out.print(l);
+  }
+
+  public void method(float f) {
+    System.out.print(f);
+  }
+
+  public void method(double d) {
+    System.out.print(d);
+  }
+}
+
+class MainAllPrimitiveTypes {
+
+  public static void main(String[] args) throws Exception {
+    AllPrimitiveTypes a = new AllPrimitiveTypes();
+
+    Method m;
+    Class<?>[] argumentTypes;
+    argumentTypes = new Class<?>[1];
+    argumentTypes[0] = boolean.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, true);
+    argumentTypes[0] = byte.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, (byte) 0);
+    argumentTypes[0] = char.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 'a');
+    argumentTypes[0] = short.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, (short) 1);
+    argumentTypes[0] = int.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 2);
+    argumentTypes[0] = long.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 3L);
+    argumentTypes[0] = float.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 4.4f);
+    argumentTypes[0] = double.class;
+    m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 5.5d);
+
+    try {
+      argumentTypes = new Class<?>[1];
+      argumentTypes[0] = boolean.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, true);
+      argumentTypes[0] = byte.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, (byte) 0);
+      argumentTypes[0] = char.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 'a');
+      argumentTypes[0] = short.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, (short) 1);
+      argumentTypes[0] = int.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 2);
+      argumentTypes[0] = long.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 3L);
+      argumentTypes[0] = float.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 4.4f);
+      argumentTypes[0] = double.class;
+      m = AllPrimitiveTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 5.5d);
+    } catch (Exception e) {
+      System.out.println("Unexpected: " + e);
+    }
+  }
+}
+
+class AllBoxedTypes {
+  public void method(Boolean b) {
+    System.out.print(b);
+  }
+
+  public void method(Byte b) {
+    System.out.print(b);
+  }
+
+  public void method(Character c) {
+    System.out.print(c);
+  }
+
+  public void method(Short s) {
+    System.out.print(s);
+  }
+
+  public void method(Integer i) {
+    System.out.print(i);
+  }
+
+  public void method(Long l) {
+    System.out.print(l);
+  }
+
+  public void method(Float f) {
+    System.out.print(f);
+  }
+
+  public void method(Double d) {
+    System.out.print(d);
+  }
+}
+
+class MainAllBoxedTypes {
+
+  public static void main(String[] args) throws Exception {
+    AllBoxedTypes a = new AllBoxedTypes();
+
+    Method m;
+    Class<?>[] argumentTypes;
+    argumentTypes = new Class<?>[1];
+    argumentTypes[0] = Boolean.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, true);
+    argumentTypes[0] = Byte.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, (byte) 0);
+    argumentTypes[0] = Character.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 'a');
+    argumentTypes[0] = Short.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, (short) 1);
+    argumentTypes[0] = Integer.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 2);
+    argumentTypes[0] = Long.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 3L);
+    argumentTypes[0] = Float.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 4.4f);
+    argumentTypes[0] = Double.class;
+    m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+    m.invoke(a, 5.5d);
+
+    try {
+      argumentTypes = new Class<?>[1];
+      argumentTypes[0] = Boolean.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, true);
+      argumentTypes[0] = Byte.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, (byte) 0);
+      argumentTypes[0] = Character.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 'a');
+      argumentTypes[0] = Short.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, (short) 1);
+      argumentTypes[0] = Integer.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 2);
+      argumentTypes[0] = Long.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 3L);
+      argumentTypes[0] = Float.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 4.4f);
+      argumentTypes[0] = Double.class;
+      m = AllBoxedTypes.class.getDeclaredMethod("method", argumentTypes);
+      m.invoke(a, 5.5d);
+    } catch (Exception e) {
+      System.out.println("Unexpected: " + e);
     }
   }
 }
@@ -132,10 +462,12 @@
 
   @Test
   public void test() throws Exception {
+    Class<?> mainClass = MainTest.class;
     AndroidApp output =
         compileWithR8(
-            readClasses(A.class, Main.class), keepMainProguardConfiguration(Main.class), backend);
+            readClasses(A.class, mainClass), keepMainProguardConfiguration(mainClass), backend);
     CodeInspector inspector = new CodeInspector(output);
+
     assertThat(inspector.clazz(A.class).method("void", "method0", ImmutableList.of()), isRenamed());
     assertThat(
         inspector.clazz(A.class).method("void", "method1", ImmutableList.of("java.lang.String")),
@@ -146,6 +478,88 @@
             .method("void", "method2", ImmutableList.of("java.lang.String", "java.lang.String")),
         isRenamed());
 
-    assertEquals(runOnJava(Main.class), runOnVM(output, Main.class, backend));
+    assertEquals(runOnJava(mainClass), runOnVM(output, mainClass, backend));
+  }
+
+  @Test
+  public void testNonConstArraySize() throws Exception {
+    Class<?> mainClass = MainNonConstArraySize.class;
+    R8Command.Builder builder =
+        ToolHelper.prepareR8CommandBuilder(
+                readClasses(A.class, mainClass, NeverInline.class), emptyConsumer(backend))
+            .addLibraryFiles(runtimeJar(backend));
+    builder.addProguardConfiguration(
+        ImmutableList.of(keepMainProguardConfigurationWithInliningAnnotation(mainClass)),
+        Origin.unknown());
+    ToolHelper.allowTestProguardOptions(builder);
+    AndroidApp output = ToolHelper.runR8(builder.build());
+    CodeInspector inspector = new CodeInspector(output);
+
+    assertThat(inspector.clazz(A.class).method("void", "method0", ImmutableList.of()), isRenamed());
+
+    // The reference run on the Java VM will succeed, whereas the run on the R8 output will fail
+    // as in this test we fail to recognize the reflective call. To compare the output of the
+    // successful reference run append "java.lang.NoSuchMethodException" to it.
+    assertEquals(
+        runOnJava(mainClass) + "java.lang.NoSuchMethodException",
+        runOnVM(output, mainClass, backend));
+  }
+
+  @Test
+  public void testPhiValue() throws Exception {
+    Class<?> mainClass = MainPhiValue.class;
+    R8Command.Builder builder =
+        ToolHelper.prepareR8CommandBuilder(
+                readClasses(A.class, mainClass, NeverInline.class), emptyConsumer(backend))
+            .addLibraryFiles(runtimeJar(backend));
+    builder.addProguardConfiguration(
+        ImmutableList.of(keepMainProguardConfigurationWithInliningAnnotation(mainClass)),
+        Origin.unknown());
+    ToolHelper.allowTestProguardOptions(builder);
+    AndroidApp output = ToolHelper.runR8(builder.build(), o -> o.enableInlining = false);
+
+    runOnVM(output, mainClass, backend);
+  }
+
+  @Test
+  public void testAllPrimitiveTypes() throws Exception {
+    Class<?> mainClass = MainAllPrimitiveTypes.class;
+    AndroidApp output =
+        compileWithR8(
+            readClasses(AllPrimitiveTypes.class, mainClass),
+            keepMainProguardConfiguration(mainClass),
+            backend);
+
+    new CodeInspector(output)
+        .clazz(AllPrimitiveTypes.class)
+        .forAllMethods(
+            m -> {
+              if (!m.isInstanceInitializer()) {
+                assertThat(m, isRenamed());
+              }
+            });
+
+    assertEquals(runOnJava(mainClass), runOnVM(output, mainClass, backend));
+  }
+
+  @Test
+  public void testAllBoxedTypes() throws Exception {
+    Class<?> mainClass = MainAllBoxedTypes.class;
+    AndroidApp output =
+        compileWithR8(
+            readClasses(AllBoxedTypes.class, mainClass),
+            keepMainProguardConfiguration(mainClass),
+            backend);
+
+    new CodeInspector(output)
+        .clazz(AllBoxedTypes.class)
+        .forAllMethods(
+            m -> {
+              if (!m.isInstanceInitializer()) {
+                assertThat(m, isRenamed());
+              }
+            });
+
+    assertEquals(runOnJava(mainClass), runOnVM(output, mainClass, backend));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTest.java b/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTest.java
new file mode 100644
index 0000000..c3aa498
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTest.java
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.debug;
+
+public class ArraySimplificationLineNumberTest {
+
+  public String[] foo(boolean argument) {
+    String[] result;
+    if (argument) {
+      result = new String[2]; result[0] = "abc";
+      result[1] = "xyz";
+    } else {
+      result = new String[2]; result[0] = "abc";
+      result[1] = "xyz";
+    }
+    return result;
+  }
+
+  public static void main(String[] args) {
+    new ArraySimplificationLineNumberTest().foo(true);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTestRunner.java b/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTestRunner.java
new file mode 100644
index 0000000..308e8d7
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTestRunner.java
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.debug;
+
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.VmTestRunner;
+import com.android.tools.r8.VmTestRunner.IgnoreIfVmOlderThan;
+import java.util.Collections;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(VmTestRunner.class)
+public class ArraySimplificationLineNumberTestRunner extends DebugTestBase {
+
+  private static final Class CLASS = ArraySimplificationLineNumberTest.class;
+  private static final String FILE = CLASS.getSimpleName() + ".java";
+  private static final String NAME = CLASS.getCanonicalName();
+
+  @Test
+  @IgnoreIfVmOlderThan(Version.V6_0_1)
+  public void testHitOnEntryOnly() throws Throwable {
+    DebugTestConfig cf = new CfDebugTestConfig().addPaths(ToolHelper.getClassPathForTests());
+    DebugTestConfig d8 = new D8DebugTestConfig().compileAndAdd(
+        temp, Collections.singletonList(ToolHelper.getClassFileForTestClass(CLASS)));
+    DebugTestConfig d8NoLocals = new D8DebugTestConfig().compileAndAdd(
+        temp,
+        Collections.singletonList(ToolHelper.getClassFileForTestClass(CLASS)),
+        options -> options.testing.removeLocalsTable = true);
+
+    new DebugStreamComparator()
+        .add("CF", streamDebugTest(cf, NAME, NO_FILTER))
+        .add("D8", streamDebugTest(d8, NAME, ANDROID_FILTER))
+        .add("D8/nolocals", streamDebugTest(d8NoLocals, NAME, ANDROID_FILTER))
+        .setFilter(s -> s.getSourceFile().equals(FILE))
+        .setVerifyVariables(false)
+        .compare();
+  }
+}
diff --git a/tools/create_jctf_tests.py b/tools/create_jctf_tests.py
index 28dde99..b7b449d 100755
--- a/tools/create_jctf_tests.py
+++ b/tools/create_jctf_tests.py
@@ -130,7 +130,6 @@
 
     generate_test(class_name, 'd8', 'R8_AFTER_D8', relative_package)
     generate_test(class_name, 'r8', 'R8', relative_package)
-    generate_test(class_name, 'r8cf', 'R8CF', relative_package)
 
 
 if __name__ == '__main__':
diff --git a/tools/internal_test.py b/tools/internal_test.py
index 9b8c970..43785f7 100755
--- a/tools/internal_test.py
+++ b/tools/internal_test.py
@@ -72,6 +72,9 @@
   result.add_option('--continuous',
       help='Continuously run internal tests and post results to GCS.',
       default=False, action='store_true')
+  result.add_option('--print_logs',
+      help='Fetch logs from gcs and print them, takes the commit to print for.',
+      default=None)
   result.add_option('--bot',
       help='Run in bot mode, i.e., scheduling runs.',
       default=False, action='store_true')
@@ -174,6 +177,16 @@
       content = get_magic_file_content(magic, ignore_errors=True)
       log('%s content: %s' % (magic, content))
 
+def fetch_and_print_logs(hash):
+  gs_base = 'gs://%s' % get_sha_destination(hash)
+  listing = utils.ls_files_on_cloud_storage(gs_base).strip().split('\n')
+  for entry in listing:
+    if not entry.endswith('/status'): # Ignore the overall status file
+      for to_print in [EXITCODE, TIMED_OUT, STDERR, STDOUT]:
+        gs_location = '%s%s' % (entry, to_print)
+        value = utils.cat_file_on_cloud_storage(gs_location)
+        print('\n\n%s had value:\n%s' % (to_print, value))
+
 def run_bot():
   print_magic_file_state()
   # Ensure that there is nothing currently scheduled (broken/stopped run)
@@ -205,6 +218,7 @@
   delete_magic_file(TESTING_COMPLETE)
   log('Test status is: %s' % test_status)
   if test_status != '0':
+    fetch_and_print_logs(git_hash)
     return 1
 
 def run_continuously():
@@ -296,6 +310,8 @@
     run_continuously()
   elif options.bot:
     return run_bot()
+  elif options.print_logs:
+    return fetch_and_print_logs(options.print_logs)
   else:
     return run_once(options.archive)
 
diff --git a/tools/test.py b/tools/test.py
index b92c8dc..6c15ea5 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -100,6 +100,8 @@
 
 def Main():
   (options, args) = ParseOptions()
+  if 'BUILDBOT_BUILDERNAME' in os.environ:
+    gradle.RunGradle(['clean'])
 
   gradle_args = ['--stacktrace']
   # Set all necessary Gradle properties and options first.
diff --git a/tools/utils.py b/tools/utils.py
index 20ba093..3b52e6a 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -111,6 +111,11 @@
   PrintCmd(cmd)
   subprocess.check_call(cmd)
 
+def ls_files_on_cloud_storage(destination):
+  cmd = ['gsutil.py', 'ls', destination]
+  PrintCmd(cmd)
+  return subprocess.check_output(cmd)
+
 def cat_file_on_cloud_storage(destination, ignore_errors=False):
   cmd = ['gsutil.py', 'cat', destination]
   PrintCmd(cmd)