diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/641-checker-arraycopy/build | 24 | ||||
-rw-r--r-- | test/641-checker-arraycopy/expected.txt | 0 | ||||
-rw-r--r-- | test/641-checker-arraycopy/info.txt | 2 | ||||
-rw-r--r-- | test/641-checker-arraycopy/src/Main.java | 83 |
4 files changed, 109 insertions, 0 deletions
diff --git a/test/641-checker-arraycopy/build b/test/641-checker-arraycopy/build new file mode 100644 index 0000000000..9abc61897a --- /dev/null +++ b/test/641-checker-arraycopy/build @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Copyright 2017 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# make us exit on a failure +set -e + +# Don't use jack for this test, to ensure we don't use +# the typed System.arraycopy versions directly. +export USE_JACK=false + +./default-build diff --git a/test/641-checker-arraycopy/expected.txt b/test/641-checker-arraycopy/expected.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/641-checker-arraycopy/expected.txt diff --git a/test/641-checker-arraycopy/info.txt b/test/641-checker-arraycopy/info.txt new file mode 100644 index 0000000000..1a1111e145 --- /dev/null +++ b/test/641-checker-arraycopy/info.txt @@ -0,0 +1,2 @@ +Checker test for testing the arraycopy optimization in +instruction simplifier. diff --git a/test/641-checker-arraycopy/src/Main.java b/test/641-checker-arraycopy/src/Main.java new file mode 100644 index 0000000000..f0fcf28d23 --- /dev/null +++ b/test/641-checker-arraycopy/src/Main.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class Main { + + // Note that this is testing we haven't intrinsified the byte[] arraycopy version. + // Once we eventually start doing it, we will need to re-adjust this test. + + /// CHECK-START-X86: void Main.typedCopy(java.lang.Object, byte[]) disassembly (after) + /// CHECK: InvokeStaticOrDirect method_name:java.lang.System.arraycopy intrinsic:SystemArrayCopy + /// CHECK-NOT: call + /// CHECK: InvokeStaticOrDirect method_name:java.lang.System.arraycopy intrinsic:SystemArrayCopy + /// CHECK: call + /// CHECK: ReturnVoid + public static void typedCopy(Object o, byte[] foo) { + System.arraycopy(o, 1, o, 0, 1); + System.arraycopy(foo, 1, foo, 0, 1); + } + + public static void untypedCopy(Object o, Object foo) { + System.arraycopy(o, 1, o, 0, 1); + System.arraycopy(foo, 1, foo, 0, 1); + } + + // Test that we still do the optimization after inlining. + + /// CHECK-START-X86: void Main.untypedCopyCaller(java.lang.Object, byte[]) disassembly (after) + /// CHECK: InvokeStaticOrDirect method_name:java.lang.System.arraycopy intrinsic:SystemArrayCopy + /// CHECK-NOT: call + /// CHECK: InvokeStaticOrDirect method_name:java.lang.System.arraycopy intrinsic:SystemArrayCopy + /// CHECK: call + /// CHECK: ReturnVoid + public static void untypedCopyCaller(Object o, byte[] array) { + untypedCopy(o, array); + } + + public static void assertEquals(Object one, Object two) { + if (one != two) { + throw new Error("Expected " + one + ", got " + two); + } + } + + public static void main(String[] args) { + // Simple sanity checks. + byte[] a = new byte[2]; + Object[] o = new Object[2]; + + o[0] = a; + o[1] = o; + a[0] = 1; + a[1] = 2; + + untypedCopyCaller(o, a); + assertEquals(o[0], o); + assertEquals(o[1], o); + assertEquals(a[0], (byte)2); + assertEquals(a[1], (byte)2); + + o[0] = a; + o[1] = o; + a[0] = 1; + a[1] = 2; + + typedCopy(o, a); + assertEquals(o[0], o); + assertEquals(o[1], o); + assertEquals(a[0], (byte)2); + assertEquals(a[1], (byte)2); + } +} |