Make checker-null-array-get less dexer sensitive.

Bug: 65168732
Test: art/test/run-test ... 586-checker-null-array-get
Change-Id: Icc4f9e899e494aa0db11a10e7570d496c256e356
diff --git a/test/586-checker-null-array-get/build b/test/586-checker-null-array-get/build
index 3721955..49292c9 100755
--- a/test/586-checker-null-array-get/build
+++ b/test/586-checker-null-array-get/build
@@ -20,7 +20,4 @@
 # Also disable desugar because it is missing in jack platform builds.
 export DESUGAR=false
 
-# See b/65168732
-export USE_D8=false
-
 ./default-build "$@"
diff --git a/test/586-checker-null-array-get/smali/SmaliTests.smali b/test/586-checker-null-array-get/smali/SmaliTests.smali
index f58af36..04da2d2 100644
--- a/test/586-checker-null-array-get/smali/SmaliTests.smali
+++ b/test/586-checker-null-array-get/smali/SmaliTests.smali
@@ -80,6 +80,77 @@
     return-void
 .end method
 
+#   This is indentical to bar() except that it has two check-casts
+#   that DX tends to generate.
+
+##  CHECK-START: void SmaliTests.bar2() load_store_elimination (after)
+##  CHECK-DAG: <<Null:l\d+>>       NullConstant
+##  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+}}]
+##  CHECK-DAG: <<GetL2:l\d+>>      ArrayGet [<<CheckL>>,{{i\d+}}]
+##  CHECK-DAG: <<GetL3:l\d+>>      ArrayGet [<<CheckL>>,{{i\d+}}]
+##  CHECK-DAG: <<CheckJ:l\d+>>     NullCheck [<<Null>>]
+##  CHECK-DAG: <<GetJ0:j\d+>>      ArrayGet [<<CheckJ>>,{{i\d+}}]
+##  CHECK-DAG: <<GetJ1:j\d+>>      ArrayGet [<<CheckJ>>,{{i\d+}}]
+##  CHECK-DAG: <<GetJ2:j\d+>>      ArrayGet [<<CheckJ>>,{{i\d+}}]
+##  CHECK-DAG: <<GetJ3:j\d+>>      ArrayGet [<<CheckJ>>,{{i\d+}}]
+.method public static bar2()V
+    .registers 7
+
+    .prologue
+    const/4 v6, 0x3
+    const/4 v5, 0x2
+    const/4 v4, 0x1
+    const/4 v3, 0x0
+
+    # We create multiple accesses that will lead the bounds check
+    # elimination pass to add a HDeoptimize. Not having the bounds check helped
+    # the load store elimination think it could merge two ArrayGet with different
+    # types.
+
+    # String[] array = (String[])getNull();
+    invoke-static {}, LMain;->getNull()Ljava/lang/Object;
+    move-result-object v2
+    check-cast v2, [Ljava/lang/String;
+
+    move-object v0, v2
+    check-cast v0, [Ljava/lang/String;
+
+    # objectField = array[0];
+    aget-object v2, v0, v3
+    sput-object v2, LMain;->objectField:Ljava/lang/Object;
+    # objectField = array[1];
+    aget-object v2, v0, v4
+    sput-object v2, LMain;->objectField:Ljava/lang/Object;
+    # objectField = array[2];
+    aget-object v2, v0, v5
+    sput-object v2, LMain;->objectField:Ljava/lang/Object;
+    # objectField = array[3];
+    aget-object v2, v0, v6
+    sput-object v2, LMain;->objectField:Ljava/lang/Object;
+
+    # long[] longArray = getLongArray();
+    invoke-static {}, LMain;->getLongArray()[J
+    move-result-object v1
+
+    # longField = longArray[0];
+    aget-wide v2, v1, v3
+    sput-wide v2, LMain;->longField:J
+    # longField = longArray[1];
+    aget-wide v2, v1, v4
+    sput-wide v2, LMain;->longField:J
+    # longField = longArray[2];
+    aget-wide v2, v1, v5
+    sput-wide v2, LMain;->longField:J
+    # longField = longArray[3];
+    aget-wide v2, v1, v6
+    sput-wide v2, LMain;->longField:J
+
+    return-void
+.end method
 
 # static fields
 .field static doThrow:Z # boolean
diff --git a/test/586-checker-null-array-get/src/Main.java b/test/586-checker-null-array-get/src/Main.java
index 09ebff1..de9429f 100644
--- a/test/586-checker-null-array-get/src/Main.java
+++ b/test/586-checker-null-array-get/src/Main.java
@@ -65,6 +65,14 @@
     } catch (Throwable t) {
       throw new Error("Unexpected Throwable", t);
     }
+    try {
+      $noinline$runSmaliTest("bar2");
+      throw new Error("Expected NullPointerException");
+    } catch (NullPointerException e) {
+      // Expected.
+    } catch (Throwable t) {
+      throw new Error("Unexpected Throwable", t);
+    }
 
     try {
       test1();
@@ -86,9 +94,8 @@
 
   /// CHECK-START: void Main.bar() load_store_elimination (after)
   /// CHECK-DAG: <<Null:l\d+>>       NullConstant
-  /// CHECK-DAG: <<BoundFirst:l\d+>> BoundType [<<Null>>]
-  /// CHECK-DAG: <<BoundType:l\d+>>  BoundType [<<BoundFirst>>]
-  /// CHECK-DAG: <<CheckL:l\d+>>     NullCheck [<<BoundType>>]
+  /// CHECK-DAG:                     BoundType [<<Null>>]
+  /// CHECK-DAG: <<CheckL:l\d+>>     NullCheck
   /// CHECK-DAG: <<GetL0:l\d+>>      ArrayGet [<<CheckL>>,{{i\d+}}]
   /// CHECK-DAG: <<GetL1:l\d+>>      ArrayGet [<<CheckL>>,{{i\d+}}]
   /// CHECK-DAG: <<GetL2:l\d+>>      ArrayGet [<<CheckL>>,{{i\d+}}]