summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alan Leung <acleung@google.com> 2017-09-08 14:44:24 -0700
committer Alan Leung <acleung@google.com> 2017-10-16 23:59:02 -0700
commit213f857ab772e32baaaac378551e2ddf1e2c151c (patch)
tree8c091e70ec1d1923bdf9d8bba400c4b69441aef3
parentea7638349dd23dfdd6ee0c2e45a63faa653962e3 (diff)
Make checker-null-array-get less dexer sensitive.
Bug: 65168732 Test: art/test/run-test ... 586-checker-null-array-get Change-Id: Icc4f9e899e494aa0db11a10e7570d496c256e356
-rwxr-xr-xtest/586-checker-null-array-get/build3
-rw-r--r--test/586-checker-null-array-get/smali/SmaliTests.smali71
-rw-r--r--test/586-checker-null-array-get/src/Main.java13
3 files changed, 81 insertions, 6 deletions
diff --git a/test/586-checker-null-array-get/build b/test/586-checker-null-array-get/build
index 3721955670..49292c9ac1 100755
--- a/test/586-checker-null-array-get/build
+++ b/test/586-checker-null-array-get/build
@@ -20,7 +20,4 @@ export USE_JACK=false
# 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 f58af360fc..04da2d2988 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 09ebff16c2..de9429fd8b 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 @@ public class Main {
} 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 @@ public class Main {
/// 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+}}]