test: Modify 586-checker-null-array-get for javac/dx

Previously 1 of the methods were failing checker with javac/dx.
Move their old bytecode to a smali file to retain testing of those
optimizations.

Rewrite the checker tests in Main.java to use the javac/dx-generated
bytecode.

Test: art/test/run-test --64 --host --optimizing --build-with-javac-dx 586-checker-null-array-get
Bug: 62950048
Bug: 36902714
Change-Id: Ib320509422a358e116c24bb1b33442c0cf09ba25
diff --git a/test/586-checker-null-array-get/src/Main.java b/test/586-checker-null-array-get/src/Main.java
index 0ea7d34..09ebff1 100644
--- a/test/586-checker-null-array-get/src/Main.java
+++ b/test/586-checker-null-array-get/src/Main.java
@@ -14,6 +14,9 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+
 class Test1 {
   int[] iarr;
 }
@@ -29,6 +32,18 @@
   public static Test1 getNullTest1() { return null; }
   public static Test2 getNullTest2() { return null; }
 
+  public static void $noinline$runSmaliTest(String name) throws Throwable {
+    try {
+      Class<?> c = Class.forName("SmaliTests");
+      Method m = c.getMethod(name);
+      m.invoke(null);
+    } catch (InvocationTargetException ex) {
+      throw ex.getCause(); // re-raise expected exception.
+    } catch (Exception ex) {
+      throw new Error(ex);
+    }
+  }
+
   public static void main(String[] args) {
     try {
       foo();
@@ -43,6 +58,15 @@
       // Expected.
     }
     try {
+      $noinline$runSmaliTest("bar");
+      throw new Error("Expected NullPointerException");
+    } catch (NullPointerException e) {
+      // Expected.
+    } catch (Throwable t) {
+      throw new Error("Unexpected Throwable", t);
+    }
+
+    try {
       test1();
       throw new Error("Expected NullPointerException");
     } catch (NullPointerException e) {
@@ -62,7 +86,8 @@
 
   /// CHECK-START: void Main.bar() load_store_elimination (after)
   /// CHECK-DAG: <<Null:l\d+>>       NullConstant
-  /// CHECK-DAG: <<BoundType:l\d+>>  BoundType [<<Null>>]
+  /// CHECK-DAG: <<BoundFirst:l\d+>> BoundType [<<Null>>]
+  /// CHECK-DAG: <<BoundType:l\d+>>  BoundType [<<BoundFirst>>]
   /// CHECK-DAG: <<CheckL:l\d+>>     NullCheck [<<BoundType>>]
   /// CHECK-DAG: <<GetL0:l\d+>>      ArrayGet [<<CheckL>>,{{i\d+}}]
   /// CHECK-DAG: <<GetL1:l\d+>>      ArrayGet [<<CheckL>>,{{i\d+}}]