diff options
Diffstat (limited to 'test/458-checker-riscv64-shift-add/src/Main.java')
-rw-r--r-- | test/458-checker-riscv64-shift-add/src/Main.java | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/test/458-checker-riscv64-shift-add/src/Main.java b/test/458-checker-riscv64-shift-add/src/Main.java new file mode 100644 index 0000000000..b78b9551b8 --- /dev/null +++ b/test/458-checker-riscv64-shift-add/src/Main.java @@ -0,0 +1,275 @@ +/* + * Copyright (C) 2024 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 assertIntEquals(int expected, int result) { + if (expected != result) { + throw new Error("Expected: " + expected + ", found: " + result); + } + } + + public static void assertLongEquals(long expected, long result) { + if (expected != result) { + throw new Error("Expected: " + expected + ", found: " + result); + } + } + + /// CHECK-START-RISCV64: int Main.$noinline$intRiscvShift1Add(int, int) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:i\d+>> ParameterValue + /// CHECK: <<B:i\d+>> ParameterValue + /// CHECK: <<One:i\d+>> IntConstant 1 + /// CHECK: <<Shift:i\d+>> Shl [<<A>>,<<One>>] + /// CHECK: <<Add:i\d+>> Add [<<B>>,<<Shift>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: int Main.$noinline$intRiscvShift1Add(int, int) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Riscv64ShiftAdd + + public static int $noinline$intRiscvShift1Add(int a, int b) { + return (a << 1) + b; + } + + /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:i\d+>> ParameterValue + /// CHECK: <<One:i\d+>> IntConstant 1 + /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<One>>] + /// CHECK: <<Convert:j\d+>> TypeConversion [<<B>>] + /// CHECK: <<Add:j\d+>> Add [<<Shift>>,<<Convert>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (after) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:i\d+>> ParameterValue + /// CHECK: <<Convert:j\d+>> TypeConversion [<<B>>] + /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<Convert>>] distance:1 + + /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Shl + + /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longIntRiscvShift1Add(long a, int b) { + return (a << 1) + b; + } + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<One:i\d+>> IntConstant 1 + /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<One>>] + /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:1 + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Shl + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longRiscvShift1Add(long a, long b) { + return (a << 1) + b; + } + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<Two:i\d+>> IntConstant 2 + /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<Two>>] + /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:2 + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Shl + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longRiscvShift2Add(long a, long b) { + return (a << 2) + b; + } + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<Three:i\d+>> IntConstant 3 + /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<Three>>] + /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:3 + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Shl + + /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longRiscvShift3Add(long a, long b) { + return (a << 3) + b; + } + + /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<Three:i\d+>> IntConstant 3 + /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<Three>>] + /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:3 + + /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Shl + + /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longReverseRiscvShift3Add(long a, long b) { + return b + (a << 3); + } + + /// CHECK-START-RISCV64: long Main.$noinline$longRightShift(long, long) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<Four:i\d+>> IntConstant 4 + /// CHECK: <<One:i\d+>> IntConstant 1 + /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<Four>>] + /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<One>>] + /// CHECK: <<Add:j\d+>> Add [<<Shift1>>,<<Shift2>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longRightShift(long, long) instruction_simplifier_riscv64 (after) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<Four:i\d+>> IntConstant 4 + /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<Four>>] + /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<B>>,<<Shift1>>] distance:1 + + /// CHECK-START-RISCV64: long Main.$noinline$longRightShift(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longRightShift(long a, long b) { + return (a << 4) + (b << 1); + } + + /// CHECK-START-RISCV64: long Main.$noinline$longLeftShift(long, long) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<One:i\d+>> IntConstant 1 + /// CHECK: <<Four:i\d+>> IntConstant 4 + /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<One>>] + /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<Four>>] + /// CHECK: <<Add:j\d+>> Add [<<Shift1>>,<<Shift2>>] + /// CHECK: <<Return:v\d+>> Return [<<Add>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longLeftShift(long, long) instruction_simplifier_riscv64 (after) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<Four:i\d+>> IntConstant 4 + /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<Four>>] + /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<Shift2>>] distance:1 + + /// CHECK-START-RISCV64: long Main.$noinline$longLeftShift(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longLeftShift(long a, long b) { + return (a << 1) + (b << 4); + } + + /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (before) + /// CHECK: <<A:j\d+>> ParameterValue + /// CHECK: <<B:j\d+>> ParameterValue + /// CHECK: <<One:i\d+>> IntConstant 1 + /// CHECK: <<Two:i\d+>> IntConstant 2 + /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<One>>] + /// CHECK: <<Add1:j\d+>> Add [<<B>>,<<Shift1>>] + /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<Two>>] + /// CHECK: <<Add2:j\d+>> Add [<<A>>,<<Shift2>>] + /// CHECK: <<Xor:j\d+>> Xor [<<Add1>>,<<Add2>>] + + /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-DAG: <<ShiftAdd1:j\d+>> Riscv64ShiftAdd distance:1 + /// CHECK-DAG: <<ShiftAdd2:j\d+>> Riscv64ShiftAdd distance:2 + + /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Shl + + /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (after) + /// CHECK-NOT: Add + + public static long $noinline$longTwoSimplifications(long a, long b) { + long x = b + (a << 1); + long y = a + (b << 2); + return x ^ y; + } + + public static void main(String[] args) { + assertIntEquals(0, $noinline$intRiscvShift1Add(0, 0)); + + assertLongEquals(-3L, $noinline$longIntRiscvShift1Add(-1L, -1)); + assertLongEquals(3L, $noinline$longIntRiscvShift1Add(1L, 1)); + + assertLongEquals(-3L, $noinline$longRiscvShift1Add(-1L, -1L)); + assertLongEquals(-1L, $noinline$longRiscvShift1Add(0L, -1L)); + assertLongEquals(-2L, $noinline$longRiscvShift1Add(-1L, 0L)); + assertLongEquals(0L, $noinline$longRiscvShift1Add(0L, 0L)); + assertLongEquals(1L, $noinline$longRiscvShift1Add(0L, 1L)); + assertLongEquals(2L, $noinline$longRiscvShift1Add(1L, 0L)); + assertLongEquals(3L, $noinline$longRiscvShift1Add(1L, 1L)); + + assertLongEquals(-1L, $noinline$longRiscvShift1Add(Long.MAX_VALUE, 1L)); + + assertLongEquals(0L, $noinline$longRiscvShift2Add(0L, 0L)); + assertLongEquals(1L, $noinline$longRiscvShift2Add(0L, 1L)); + assertLongEquals(4L, $noinline$longRiscvShift2Add(1L, 0L)); + assertLongEquals(5L, $noinline$longRiscvShift2Add(1L, 1L)); + + assertLongEquals(0L, $noinline$longRiscvShift3Add(0L, 0L)); + assertLongEquals(0L, $noinline$longReverseRiscvShift3Add(0L, 0L)); + assertLongEquals(1L, $noinline$longRiscvShift3Add(0L, 1L)); + assertLongEquals(1L, $noinline$longReverseRiscvShift3Add(0L, 1L)); + assertLongEquals(8L, $noinline$longRiscvShift3Add(1L, 0L)); + assertLongEquals(8L, $noinline$longReverseRiscvShift3Add(1L, 0L)); + assertLongEquals(9L, $noinline$longRiscvShift3Add(1L, 1L)); + assertLongEquals(9L, $noinline$longReverseRiscvShift3Add(1L, 1L)); + + assertLongEquals(2L, $noinline$longRightShift(0L, 1L)); + assertLongEquals(4L, $noinline$longRightShift(0L, 2L)); + + assertLongEquals(2L, $noinline$longLeftShift(1L, 0L)); + assertLongEquals(4L, $noinline$longLeftShift(2L, 0L)); + + assertLongEquals(6L, $noinline$longTwoSimplifications(1L, 1L)); + } +} |