summaryrefslogtreecommitdiff
path: root/test/2265-checker-select-binary-unary/src/Main.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/2265-checker-select-binary-unary/src/Main.java')
-rw-r--r--test/2265-checker-select-binary-unary/src/Main.java145
1 files changed, 145 insertions, 0 deletions
diff --git a/test/2265-checker-select-binary-unary/src/Main.java b/test/2265-checker-select-binary-unary/src/Main.java
new file mode 100644
index 0000000000..33734fc4d6
--- /dev/null
+++ b/test/2265-checker-select-binary-unary/src/Main.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+import java.lang.reflect.Method;
+
+public class Main {
+ public static void main(String[] args) throws Throwable {
+ assertLongEquals(11L, $noinline$testIntToLong(0, 1));
+ assertLongEquals(12L, $noinline$testIntToLong(1, 0));
+
+ assertFloatEquals(11f, $noinline$testIntToFloat(0, 1));
+ assertFloatEquals(12f, $noinline$testIntToFloat(1, 0));
+
+ assertIntEquals(11, $noinline$testIntToByte(0, 1));
+ assertIntEquals(12, $noinline$testIntToByte(1, 0));
+
+ assertIntEquals(11, $noinline$testLongToInt(0, 1));
+ assertIntEquals(12, $noinline$testLongToInt(1, 0));
+ }
+
+ /// CHECK-START: long Main.$noinline$testIntToLong(int, int) select_generator (after)
+ /// CHECK: <<Const10:j\d+>> LongConstant 10
+ /// CHECK: <<Const1:i\d+>> IntConstant 1
+ /// CHECK: <<Const2:i\d+>> IntConstant 2
+ /// CHECK: <<Sel:i\d+>> Select [<<Const1>>,<<Const2>>,<<Condition:z\d+>>]
+ /// CHECK: <<Type:j\d+>> TypeConversion [<<Sel>>]
+ /// CHECK: Add [<<Type>>,<<Const10>>]
+
+ /// CHECK-START: long Main.$noinline$testIntToLong(int, int) constant_folding$after_gvn (after)
+ /// CHECK: <<Const11:j\d+>> LongConstant 11
+ /// CHECK: <<Const12:j\d+>> LongConstant 12
+ /// CHECK: Select [<<Const11>>,<<Const12>>,<<Condition:z\d+>>]
+
+ /// CHECK-START: long Main.$noinline$testIntToLong(int, int) constant_folding$after_gvn (after)
+ /// CHECK-NOT: TypeConversion
+ /// CHECK-NOT: Add
+ private static long $noinline$testIntToLong(int a, int b) {
+ long result = 10;
+ int c = 1;
+ int d = 2;
+ return result + (a < b ? c : d);
+ }
+
+ /// CHECK-START: float Main.$noinline$testIntToFloat(int, int) select_generator (after)
+ /// CHECK: <<Const10:f\d+>> FloatConstant 10
+ /// CHECK: <<Const1:i\d+>> IntConstant 1
+ /// CHECK: <<Const2:i\d+>> IntConstant 2
+ /// CHECK: <<Sel:i\d+>> Select [<<Const1>>,<<Const2>>,<<Condition:z\d+>>]
+ /// CHECK: <<Type:f\d+>> TypeConversion [<<Sel>>]
+ /// CHECK: Add [<<Type>>,<<Const10>>]
+
+ /// CHECK-START: float Main.$noinline$testIntToFloat(int, int) constant_folding$after_gvn (after)
+ /// CHECK: <<Const11:f\d+>> FloatConstant 11
+ /// CHECK: <<Const12:f\d+>> FloatConstant 12
+ /// CHECK: Select [<<Const11>>,<<Const12>>,<<Condition:z\d+>>]
+
+ /// CHECK-START: float Main.$noinline$testIntToFloat(int, int) constant_folding$after_gvn (after)
+ /// CHECK-NOT: TypeConversion
+ /// CHECK-NOT: Add
+ private static float $noinline$testIntToFloat(int a, int b) {
+ float result = 10;
+ int c = 1;
+ int d = 2;
+ return result + (a < b ? c : d);
+ }
+
+ /// CHECK-START: byte Main.$noinline$testIntToByte(int, int) select_generator (after)
+ /// CHECK: <<Const10:i\d+>> IntConstant 10
+ /// CHECK: <<Const257:i\d+>> IntConstant 257
+ /// CHECK: <<Const258:i\d+>> IntConstant 258
+ /// CHECK: <<Sel:i\d+>> Select [<<Const257>>,<<Const258>>,<<Condition:z\d+>>]
+ /// CHECK: <<Type:b\d+>> TypeConversion [<<Sel>>]
+ /// CHECK: Add [<<Type>>,<<Const10>>]
+
+ /// CHECK-START: byte Main.$noinline$testIntToByte(int, int) constant_folding$after_gvn (after)
+ /// CHECK: <<Const11:i\d+>> IntConstant 11
+ /// CHECK: <<Const12:i\d+>> IntConstant 12
+ /// CHECK: Select [<<Const11>>,<<Const12>>,<<Condition:z\d+>>]
+
+ /// CHECK-START: byte Main.$noinline$testIntToByte(int, int) constant_folding$after_gvn (after)
+ /// CHECK-NOT: TypeConversion
+ /// CHECK-NOT: Add
+ private static byte $noinline$testIntToByte(int a, int b) {
+ byte result = 10;
+ int c = 257; // equal to 1 in byte
+ int d = 258; // equal to 2 in byte
+ // Due to `+` operating in ints, we need to do an extra cast. We can optimize away both type
+ // conversions.
+ return (byte) (result + (byte) (a < b ? c : d));
+ }
+
+ /// CHECK-START: int Main.$noinline$testLongToInt(int, int) select_generator (after)
+ /// CHECK: <<Const10:i\d+>> IntConstant 10
+ /// CHECK: <<Const1:j\d+>> LongConstant 4294967297
+ /// CHECK: <<Const2:j\d+>> LongConstant 4294967298
+ /// CHECK: <<Sel:j\d+>> Select [<<Const1>>,<<Const2>>,<<Condition:z\d+>>]
+ /// CHECK: <<Type:i\d+>> TypeConversion [<<Sel>>]
+ /// CHECK: Add [<<Type>>,<<Const10>>]
+
+ /// CHECK-START: int Main.$noinline$testLongToInt(int, int) constant_folding$after_gvn (after)
+ /// CHECK: <<Const11:i\d+>> IntConstant 11
+ /// CHECK: <<Const12:i\d+>> IntConstant 12
+ /// CHECK: Select [<<Const11>>,<<Const12>>,<<Condition:z\d+>>]
+
+ /// CHECK-START: int Main.$noinline$testLongToInt(int, int) constant_folding$after_gvn (after)
+ /// CHECK-NOT: TypeConversion
+ /// CHECK-NOT: Add
+ private static int $noinline$testLongToInt(int a, int b) {
+ int result = 10;
+ long c = (1L << 32) + 1L; // Will be 1, when cast to int
+ long d = (1L << 32) + 2L; // Will be 2, when cast to int
+ return result + (int) (a < b ? c : d);
+ }
+
+ private static void assertIntEquals(int expected, int actual) {
+ if (expected != actual) {
+ throw new AssertionError("Expected " + expected + " got " + actual);
+ }
+ }
+
+ private static void assertLongEquals(long expected, long actual) {
+ if (expected != actual) {
+ throw new AssertionError("Expected " + expected + " got " + actual);
+ }
+ }
+
+ private static void assertFloatEquals(float expected, float actual) {
+ if (expected != actual) {
+ throw new AssertionError("Expected " + expected + " got " + actual);
+ }
+ }
+}