diff options
author | 2017-09-08 14:44:24 -0700 | |
---|---|---|
committer | 2017-10-16 23:59:02 -0700 | |
commit | 213f857ab772e32baaaac378551e2ddf1e2c151c (patch) | |
tree | 8c091e70ec1d1923bdf9d8bba400c4b69441aef3 | |
parent | ea7638349dd23dfdd6ee0c2e45a63faa653962e3 (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-x | test/586-checker-null-array-get/build | 3 | ||||
-rw-r--r-- | test/586-checker-null-array-get/smali/SmaliTests.smali | 71 | ||||
-rw-r--r-- | test/586-checker-null-array-get/src/Main.java | 13 |
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+}}] |