blob: 8064b1dac1442f94b90209509b8c654485a6f085 [file] [log] [blame]
Aart Bik2286da22018-03-22 10:50:22 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/**
18 * Functional tests for detecting abs.
19 */
20public class Main {
21
22 /// CHECK-START: int Main.abs1(int) instruction_simplifier$after_inlining (before)
23 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
24 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
25 /// CHECK-DAG: <<Cnd:z\d+>> GreaterThanOrEqual [<<Par>>,<<Zer>>]
26 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
27 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Neg>>,<<Par>>,<<Cnd>>]
28 /// CHECK-DAG: Return [<<Sel>>]
29 //
30 /// CHECK-START: int Main.abs1(int) instruction_simplifier$after_inlining (after)
31 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
32 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
33 /// CHECK-DAG: Return [<<Abs>>]
34 //
35 /// CHECK-START: int Main.abs1(int) instruction_simplifier$after_inlining (after)
36 /// CHECK-NOT: Select
37 public static int abs1(int a) {
38 return a < 0 ? -a : a;
39 }
40
41 /// CHECK-START: int Main.abs2(int) instruction_simplifier$after_inlining (before)
42 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
43 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
44 /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Par>>,<<Zer>>]
45 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
46 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Neg>>,<<Par>>,<<Cnd>>]
47 /// CHECK-DAG: Return [<<Sel>>]
48 //
49 /// CHECK-START: int Main.abs2(int) instruction_simplifier$after_inlining (after)
50 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
51 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
52 /// CHECK-DAG: Return [<<Abs>>]
53 //
54 /// CHECK-START: int Main.abs2(int) instruction_simplifier$after_inlining (after)
55 /// CHECK-NOT: Select
56 public static int abs2(int a) {
57 return a <= 0 ? -a : a;
58 }
59
60 /// CHECK-START: int Main.abs3(int) instruction_simplifier$after_inlining (before)
61 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
62 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
63 /// CHECK-DAG: <<Cnd:z\d+>> LessThanOrEqual [<<Par>>,<<Zer>>]
64 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
65 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
66 /// CHECK-DAG: Return [<<Sel>>]
67 //
68 /// CHECK-START: int Main.abs3(int) instruction_simplifier$after_inlining (after)
69 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
70 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
71 /// CHECK-DAG: Return [<<Abs>>]
72 //
73 /// CHECK-START: int Main.abs3(int) instruction_simplifier$after_inlining (after)
74 /// CHECK-NOT: Select
75 public static int abs3(int a) {
76 return a > 0 ? a : -a;
77 }
78
79 /// CHECK-START: int Main.abs4(int) instruction_simplifier$after_inlining (before)
80 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
81 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
82 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
83 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
84 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
85 /// CHECK-DAG: Return [<<Sel>>]
86 //
87 /// CHECK-START: int Main.abs4(int) instruction_simplifier$after_inlining (after)
88 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
89 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
90 /// CHECK-DAG: Return [<<Abs>>]
91 //
92 /// CHECK-START: int Main.abs4(int) instruction_simplifier$after_inlining (after)
93 /// CHECK-NOT: Select
94 public static int abs4(int a) {
95 return a >= 0 ? a : -a;
96 }
97
98 /// CHECK-START: int Main.abs5(short) instruction_simplifier$after_inlining (before)
99 /// CHECK-DAG: <<Par:s\d+>> ParameterValue
100 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
101 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
102 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
103 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
104 /// CHECK-DAG: Return [<<Sel>>]
105 //
106 /// CHECK-START: int Main.abs5(short) instruction_simplifier$after_inlining (after)
107 /// CHECK-DAG: <<Par:s\d+>> ParameterValue
108 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
109 /// CHECK-DAG: Return [<<Abs>>]
110 //
111 /// CHECK-START: int Main.abs5(short) instruction_simplifier$after_inlining (after)
112 /// CHECK-NOT: Select
113 public static int abs5(short a) {
114 return a >= 0 ? a : -a;
115 }
116
117 /// CHECK-START: int Main.abs6(byte) instruction_simplifier$after_inlining (before)
118 /// CHECK-DAG: <<Par:b\d+>> ParameterValue
119 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
120 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
121 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
122 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
123 /// CHECK-DAG: Return [<<Sel>>]
124 //
125 /// CHECK-START: int Main.abs6(byte) instruction_simplifier$after_inlining (after)
126 /// CHECK-DAG: <<Par:b\d+>> ParameterValue
127 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
128 /// CHECK-DAG: Return [<<Abs>>]
129 //
130 /// CHECK-START: int Main.abs6(byte) instruction_simplifier$after_inlining (after)
131 /// CHECK-NOT: Select
132 public static int abs6(byte a) {
133 return a >= 0 ? a : -a;
134 }
135
136 /// CHECK-START: long Main.abs7(long) instruction_simplifier$after_inlining (before)
137 /// CHECK-DAG: <<Par:j\d+>> ParameterValue
138 /// CHECK-DAG: <<Zer:j\d+>> LongConstant 0
139 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
140 /// CHECK-DAG: <<Neg:j\d+>> [<<Par>>]
141 /// CHECK-DAG: <<Sel:j\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
142 /// CHECK-DAG: Return [<<Sel>>]
143 //
144 /// CHECK-START: long Main.abs7(long) instruction_simplifier$after_inlining (after)
145 /// CHECK-DAG: <<Par:j\d+>> ParameterValue
146 /// CHECK-DAG: <<Abs:j\d+>> Abs [<<Par>>]
147 /// CHECK-DAG: Return [<<Abs>>]
148 //
149 /// CHECK-START: long Main.abs7(long) instruction_simplifier$after_inlining (after)
150 /// CHECK-NOT: Select
151 public static long abs7(long a) {
152 return a >= 0 ? a : -a;
153 }
154
155 public static void main(String[] args) {
156 expectEquals(10, abs1(-10));
157 expectEquals(20, abs1(20));
158 expectEquals(10, abs2(-10));
159 expectEquals(20, abs2(20));
160 expectEquals(10, abs3(-10));
161 expectEquals(20, abs3(20));
162 expectEquals(10, abs4(-10));
163 expectEquals(20, abs4(20));
164 expectEquals(10, abs4((short) -10));
165 expectEquals(20, abs4((short) 20));
166 expectEquals(10, abs6((byte) -10));
167 expectEquals(20, abs6((byte) 20));
168 expectEquals(10L, abs7(-10L));
169 expectEquals(20L, abs7(20L));
170 System.out.println("passed");
171 }
172
173 private static void expectEquals(int expected, int result) {
174 if (expected != result) {
175 throw new Error("Expected: " + expected + ", found: " + result);
176 }
177 }
178
179 private static void expectEquals(long expected, long result) {
180 if (expected != result) {
181 throw new Error("Expected: " + expected + ", found: " + result);
182 }
183 }
184}