diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/458-checker-instruction-simplification/src/Main.java | 168 | ||||
| -rw-r--r-- | test/609-checker-x86-bounds-check/expected.txt | 1 | ||||
| -rw-r--r-- | test/609-checker-x86-bounds-check/info.txt | 1 | ||||
| -rw-r--r-- | test/609-checker-x86-bounds-check/src/Main.java | 88 |
4 files changed, 257 insertions, 1 deletions
diff --git a/test/458-checker-instruction-simplification/src/Main.java b/test/458-checker-instruction-simplification/src/Main.java index c717eaa85e..359d521ffc 100644 --- a/test/458-checker-instruction-simplification/src/Main.java +++ b/test/458-checker-instruction-simplification/src/Main.java @@ -1971,8 +1971,165 @@ public class Main { return (value >> temp) + temp; } -public static void main(String[] args) { + /// CHECK-START: int Main.$noinline$intAddSubSimplifyArg1(int, int) instruction_simplifier (before) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sum:i\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:i\d+>> Sub [<<Sum>>,<<X>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: int Main.$noinline$intAddSubSimplifyArg1(int, int) instruction_simplifier (after) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sum:i\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: Return [<<Y>>] + + public static int $noinline$intAddSubSimplifyArg1(int x, int y) { + if (doThrow) { throw new Error(); } + int sum = x + y; + return sum - x; + } + + /// CHECK-START: int Main.$noinline$intAddSubSimplifyArg2(int, int) instruction_simplifier (before) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sum:i\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:i\d+>> Sub [<<Sum>>,<<Y>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: int Main.$noinline$intAddSubSimplifyArg2(int, int) instruction_simplifier (after) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sum:i\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: Return [<<X>>] + + public static int $noinline$intAddSubSimplifyArg2(int x, int y) { + if (doThrow) { throw new Error(); } + int sum = x + y; + return sum - y; + } + + /// CHECK-START: int Main.$noinline$intSubAddSimplifyLeft(int, int) instruction_simplifier (before) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sub:i\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:i\d+>> Add [<<Sub>>,<<Y>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: int Main.$noinline$intSubAddSimplifyLeft(int, int) instruction_simplifier (after) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sub:i\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: Return [<<X>>] + + public static int $noinline$intSubAddSimplifyLeft(int x, int y) { + if (doThrow) { throw new Error(); } + int sub = x - y; + return sub + y; + } + + /// CHECK-START: int Main.$noinline$intSubAddSimplifyRight(int, int) instruction_simplifier (before) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sub:i\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:i\d+>> Add [<<Y>>,<<Sub>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: int Main.$noinline$intSubAddSimplifyRight(int, int) instruction_simplifier (after) + /// CHECK: <<X:i\d+>> ParameterValue + /// CHECK: <<Y:i\d+>> ParameterValue + /// CHECK-DAG: <<Sub:i\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: Return [<<X>>] + + public static int $noinline$intSubAddSimplifyRight(int x, int y) { + if (doThrow) { throw new Error(); } + int sub = x - y; + return y + sub; + } + + /// CHECK-START: float Main.$noinline$floatAddSubSimplifyArg1(float, float) instruction_simplifier (before) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sum:f\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Sub [<<Sum>>,<<X>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: float Main.$noinline$floatAddSubSimplifyArg1(float, float) instruction_simplifier (after) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sum:f\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Sub [<<Sum>>,<<X>>] + /// CHECK-DAG: Return [<<Res>>] + + public static float $noinline$floatAddSubSimplifyArg1(float x, float y) { + if (doThrow) { throw new Error(); } + float sum = x + y; + return sum - x; + } + + /// CHECK-START: float Main.$noinline$floatAddSubSimplifyArg2(float, float) instruction_simplifier (before) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sum:f\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Sub [<<Sum>>,<<Y>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: float Main.$noinline$floatAddSubSimplifyArg2(float, float) instruction_simplifier (after) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sum:f\d+>> Add [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Sub [<<Sum>>,<<Y>>] + /// CHECK-DAG: Return [<<Res>>] + + public static float $noinline$floatAddSubSimplifyArg2(float x, float y) { + if (doThrow) { throw new Error(); } + float sum = x + y; + return sum - y; + } + + /// CHECK-START: float Main.$noinline$floatSubAddSimplifyLeft(float, float) instruction_simplifier (before) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sub:f\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Add [<<Sub>>,<<Y>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: float Main.$noinline$floatSubAddSimplifyLeft(float, float) instruction_simplifier (after) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sub:f\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Add [<<Sub>>,<<Y>>] + /// CHECK-DAG: Return [<<Res>>] + + public static float $noinline$floatSubAddSimplifyLeft(float x, float y) { + if (doThrow) { throw new Error(); } + float sub = x - y; + return sub + y; + } + + /// CHECK-START: float Main.$noinline$floatSubAddSimplifyRight(float, float) instruction_simplifier (before) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sub:f\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Add [<<Y>>,<<Sub>>] + /// CHECK-DAG: Return [<<Res>>] + + /// CHECK-START: float Main.$noinline$floatSubAddSimplifyRight(float, float) instruction_simplifier (after) + /// CHECK: <<X:f\d+>> ParameterValue + /// CHECK: <<Y:f\d+>> ParameterValue + /// CHECK-DAG: <<Sub:f\d+>> Sub [<<X>>,<<Y>>] + /// CHECK-DAG: <<Res:f\d+>> Add [<<Y>>,<<Sub>>] + /// CHECK-DAG: Return [<<Res>>] + + public static float $noinline$floatSubAddSimplifyRight(float x, float y) { + if (doThrow) { throw new Error(); } + float sub = x - y; + return y + sub; + } + + public static void main(String[] args) { int arg = 123456; + float floatArg = 123456.125f; assertLongEquals(arg, $noinline$Add0(arg)); assertIntEquals(5, $noinline$AddAddSubAddConst(1)); @@ -2143,6 +2300,15 @@ public static void main(String[] args) { assertLongEquals(0xaf37bc048d159e24L, $noinline$longSmallerShiftMasking(0xabcdef0123456789L, 2 + 256)); assertIntEquals(0xfffd5e7c, $noinline$otherUseOfUnnecessaryShiftMasking(0xabcdef01, 13)); assertIntEquals(0xfffd5e7c, $noinline$otherUseOfUnnecessaryShiftMasking(0xabcdef01, 13 + 512)); + + assertIntEquals(654321, $noinline$intAddSubSimplifyArg1(arg, 654321)); + assertIntEquals(arg, $noinline$intAddSubSimplifyArg2(arg, 654321)); + assertIntEquals(arg, $noinline$intSubAddSimplifyLeft(arg, 654321)); + assertIntEquals(arg, $noinline$intSubAddSimplifyRight(arg, 654321)); + assertFloatEquals(654321.125f, $noinline$floatAddSubSimplifyArg1(floatArg, 654321.125f)); + assertFloatEquals(floatArg, $noinline$floatAddSubSimplifyArg2(floatArg, 654321.125f)); + assertFloatEquals(floatArg, $noinline$floatSubAddSimplifyLeft(floatArg, 654321.125f)); + assertFloatEquals(floatArg, $noinline$floatSubAddSimplifyRight(floatArg, 654321.125f)); } private static boolean $inline$true() { return true; } diff --git a/test/609-checker-x86-bounds-check/expected.txt b/test/609-checker-x86-bounds-check/expected.txt new file mode 100644 index 0000000000..b0aad4deb5 --- /dev/null +++ b/test/609-checker-x86-bounds-check/expected.txt @@ -0,0 +1 @@ +passed diff --git a/test/609-checker-x86-bounds-check/info.txt b/test/609-checker-x86-bounds-check/info.txt new file mode 100644 index 0000000000..c0f26d0d6c --- /dev/null +++ b/test/609-checker-x86-bounds-check/info.txt @@ -0,0 +1 @@ +Checker test that we combine ArrayLength and BoundsCheck on x86/x86_64. diff --git a/test/609-checker-x86-bounds-check/src/Main.java b/test/609-checker-x86-bounds-check/src/Main.java new file mode 100644 index 0000000000..bfc2be88f7 --- /dev/null +++ b/test/609-checker-x86-bounds-check/src/Main.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2016 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 { + + public static void main(String args[]) { + int[] array = new int[51]; + testArrayLengthBoundsCheckX86(array, 10); + + System.out.println("passed"); + } + + /// CHECK-START-X86: void Main.testArrayLengthBoundsCheckX86(int[], int) x86_memory_operand_generation (before) + /// CHECK-DAG: <<Array:l\d+>> ParameterValue + /// CHECK-DAG: <<Index:i\d+>> ParameterValue + /// CHECK-DAG: <<Value:i\d+>> IntConstant 9 + /// CHECK-DAG: <<CheckedArray:l\d+>> NullCheck [<<Array>>] + /// CHECK-DAG: <<Length:i\d+>> ArrayLength [<<CheckedArray>>] is_string_length:false loop:none + /// CHECK-DAG: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] + /// CHECK-DAG: <<ArraySet:v\d+>> ArraySet [<<CheckedArray>>,<<CheckedIndex>>,<<Value>>] + + /// CHECK-START-X86: void Main.testArrayLengthBoundsCheckX86(int[], int) x86_memory_operand_generation (after) + /// CHECK-DAG: <<Array:l\d+>> ParameterValue + /// CHECK-DAG: <<Index:i\d+>> ParameterValue + /// CHECK-DAG: <<Value:i\d+>> IntConstant 9 + /// CHECK-DAG: <<CheckedArray:l\d+>> NullCheck [<<Array>>] + /// CHECK-DAG: <<Length:i\d+>> ArrayLength [<<CheckedArray>>] is_string_length:false emitted_at_use:true loop:none + /// CHECK-DAG: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] + /// CHECK-DAG: <<ArraySet:v\d+>> ArraySet [<<CheckedArray>>,<<CheckedIndex>>,<<Value>>] + + /// CHECK-START-X86: void Main.testArrayLengthBoundsCheckX86(int[], int) disassembly (after) + /// CHECK-DAG: <<Array:l\d+>> ParameterValue + /// CHECK-DAG: <<Index:i\d+>> ParameterValue + /// CHECK-DAG: <<Value:i\d+>> IntConstant 9 + /// CHECK: <<CheckedArray:l\d+>> NullCheck [<<Array>>] + /// CHECK-NEXT: <<Length:i\d+>> ArrayLength [<<Array>>] is_string_length:false emitted_at_use:true loop:none + /// CHECK-NEXT: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] + /// CHECK-NEXT: cmp [<<BaseReg:\w+>> + 8], <<IndexReg:\w+>> + /// CHECK: <<ArraySet:v\d+>> ArraySet [<<Array>>,<<Index>>,<<Value>>] + /// CHECK-NEXT: mov [<<BaseReg>> + <<IndexReg>> * 4 + 12], 9 + + /// CHECK-START-X86_64: void Main.testArrayLengthBoundsCheckX86(int[], int) x86_memory_operand_generation (before) + /// CHECK-DAG: <<Array:l\d+>> ParameterValue + /// CHECK-DAG: <<Index:i\d+>> ParameterValue + /// CHECK-DAG: <<Value:i\d+>> IntConstant 9 + /// CHECK-DAG: <<CheckedArray:l\d+>> NullCheck [<<Array>>] + /// CHECK-DAG: <<Length:i\d+>> ArrayLength [<<CheckedArray>>] is_string_length:false loop:none + /// CHECK-DAG: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] + /// CHECK-DAG: <<ArraySet:v\d+>> ArraySet [<<CheckedArray>>,<<CheckedIndex>>,<<Value>>] + + /// CHECK-START-X86_64: void Main.testArrayLengthBoundsCheckX86(int[], int) x86_memory_operand_generation (after) + /// CHECK-DAG: <<Array:l\d+>> ParameterValue + /// CHECK-DAG: <<Index:i\d+>> ParameterValue + /// CHECK-DAG: <<Value:i\d+>> IntConstant 9 + /// CHECK-DAG: <<CheckedArray:l\d+>> NullCheck [<<Array>>] + /// CHECK-DAG: <<Length:i\d+>> ArrayLength [<<CheckedArray>>] is_string_length:false emitted_at_use:true loop:none + /// CHECK-DAG: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] + /// CHECK-DAG: <<ArraySet:v\d+>> ArraySet [<<CheckedArray>>,<<CheckedIndex>>,<<Value>>] + + // Test assumes parameter value is in lower 8 registers (it is passed in edx). + /// CHECK-START-X86_64: void Main.testArrayLengthBoundsCheckX86(int[], int) disassembly (after) + /// CHECK-DAG: <<Array:l\d+>> ParameterValue + /// CHECK-DAG: <<Index:i\d+>> ParameterValue + /// CHECK-DAG: <<Value:i\d+>> IntConstant 9 + /// CHECK: <<CheckedArray:l\d+>> NullCheck [<<Array>>] + /// CHECK-NEXT: <<Length:i\d+>> ArrayLength [<<Array>>] is_string_length:false emitted_at_use:true loop:none + /// CHECK-NEXT: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] + /// CHECK-NEXT: cmp [<<BaseReg:\w+>> + 8], e<<IndexReg:\w+>> + /// CHECK: <<ArraySet:v\d+>> ArraySet [<<Array>>,<<Index>>,<<Value>>] + /// CHECK-NEXT: mov [<<BaseReg>> + r<<IndexReg>> * 4 + 12], 9 + + static void testArrayLengthBoundsCheckX86(int[] array, int index) { + array[index] = 9; + } +} |