summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorMingyao Yang <mingyao@google.com>2015-04-01 14:03:04 -0700
committerMingyao Yang <mingyao@google.com>2015-04-01 14:05:13 -0700
commitd43b3ac88cd46b8815890188c9c2b9a3f1564648 (patch)
tree6c599c3f40d57e92786bd7f41c0541d9eaa2643b /test
parenta109632b240f3c9355ca95500f6f48e4478e3c51 (diff)
downloadart-d43b3ac88cd46b8815890188c9c2b9a3f1564648.zip
art-d43b3ac88cd46b8815890188c9c2b9a3f1564648.tar.gz
art-d43b3ac88cd46b8815890188c9c2b9a3f1564648.tar.bz2
Revert "Revert "Deoptimization-based bce.""
This reverts commit 0ba627337274ccfb8c9cb9bf23fffb1e1b9d1430. Change-Id: I1ca10d15bbb49897a0cf541ab160431ec180a006
Diffstat (limited to 'test')
-rw-r--r--test/449-checker-bce/expected.txt1
-rw-r--r--test/449-checker-bce/src/Main.java148
2 files changed, 144 insertions, 5 deletions
diff --git a/test/449-checker-bce/expected.txt b/test/449-checker-bce/expected.txt
index e69de29..29d6383 100644
--- a/test/449-checker-bce/expected.txt
+++ b/test/449-checker-bce/expected.txt
@@ -0,0 +1 @@
+100
diff --git a/test/449-checker-bce/src/Main.java b/test/449-checker-bce/src/Main.java
index 30aa870..17039a3 100644
--- a/test/449-checker-bce/src/Main.java
+++ b/test/449-checker-bce/src/Main.java
@@ -108,29 +108,147 @@ public class Main {
}
- // CHECK-START: void Main.constantIndexing(int[]) BCE (before)
+ // CHECK-START: void Main.constantIndexing1(int[]) BCE (before)
// CHECK: BoundsCheck
// CHECK: ArraySet
// CHECK: BoundsCheck
// CHECK: ArraySet
+
+ // CHECK-START: void Main.constantIndexing1(int[]) BCE (after)
+ // CHECK-NOT: Deoptimize
// CHECK: BoundsCheck
// CHECK: ArraySet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
- // CHECK-START: void Main.constantIndexing(int[]) BCE (after)
+ static void constantIndexing1(int[] array) {
+ array[5] = 1;
+ array[4] = 1;
+ }
+
+
+ // CHECK-START: void Main.constantIndexing2(int[]) BCE (before)
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
// CHECK: BoundsCheck
// CHECK: ArraySet
+
+ // CHECK-START: void Main.constantIndexing2(int[]) BCE (after)
+ // CHECK: LessThanOrEqual
+ // CHECK: Deoptimize
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
// CHECK-NOT: BoundsCheck
// CHECK: ArraySet
// CHECK: BoundsCheck
// CHECK: ArraySet
- static void constantIndexing(int[] array) {
- array[5] = 1;
+ static void constantIndexing2(int[] array) {
+ array[1] = 1;
+ array[2] = 1;
+ array[3] = 1;
array[4] = 1;
- array[6] = 1;
+ array[-1] = 1;
+ }
+
+
+ // CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (before)
+ // CHECK: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+
+ // CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (after)
+ // CHECK: LessThanOrEqual
+ // CHECK: Deoptimize
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK: LessThanOrEqual
+ // CHECK: Deoptimize
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArrayGet
+ // CHECK-NOT: BoundsCheck
+ // CHECK: ArraySet
+
+ static int[] constantIndexing3(int[] array1, int[] array2, boolean copy) {
+ if (!copy) {
+ return array1;
+ }
+ array2[0] = array1[0];
+ array2[1] = array1[1];
+ array2[2] = array1[2];
+ array2[3] = array1[3];
+ return array2;
+ }
+
+
+ // CHECK-START: void Main.constantIndexing4(int[]) BCE (before)
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+
+ // CHECK-START: void Main.constantIndexing4(int[]) BCE (after)
+ // CHECK-NOT: LessThanOrEqual
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+
+ // There is only one array access. It's not beneficial
+ // to create a compare with deoptimization instruction.
+ static void constantIndexing4(int[] array) {
+ array[0] = 1;
}
+ // CHECK-START: void Main.constantIndexing5(int[]) BCE (before)
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+
+ // CHECK-START: void Main.constantIndexing5(int[]) BCE (after)
+ // CHECK-NOT: Deoptimize
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+ // CHECK: BoundsCheck
+ // CHECK: ArraySet
+
+ static void constantIndexing5(int[] array) {
+ // We don't apply the deoptimization for very large constant index
+ // since it's likely to be an anomaly and will throw AIOOBE.
+ array[Integer.MAX_VALUE - 1000] = 1;
+ array[Integer.MAX_VALUE - 999] = 1;
+ array[Integer.MAX_VALUE - 998] = 1;
+ }
+
// CHECK-START: void Main.loopPattern1(int[]) BCE (before)
// CHECK: BoundsCheck
// CHECK: ArraySet
@@ -479,6 +597,21 @@ public class Main {
}
+ static int foo() {
+ try {
+ // This will cause AIOOBE.
+ constantIndexing2(new int[3]);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return 99;
+ }
+ return 0;
+ }
+
+
+ // Make sure this method is compiled with optimizing.
+ // CHECK-START: void Main.main(java.lang.String[]) register (after)
+ // CHECK: ParallelMove
+
public static void main(String[] args) {
sieve(20);
@@ -507,5 +640,10 @@ public class Main {
if (!isPyramid(array)) {
System.out.println("pyramid3 failed!");
}
+
+ // Make sure this value is kept after deoptimization.
+ int i = 1;
+ System.out.println(foo() + i);
}
+
}