blob: c32d34aa6f242471116bf9b9d138b6394a85afeb [file] [log] [blame]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +00001/*
Roland Levillain6a92a032015-07-23 12:15:01 +01002 * Copyright (C) 2015 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 */
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000016
17public class Main {
18
David Brazdil0d13fee2015-04-17 14:52:19 +010019 public static void assertBooleanEquals(boolean expected, boolean result) {
20 if (expected != result) {
21 throw new Error("Expected: " + expected + ", found: " + result);
22 }
23 }
24
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000025 public static void assertIntEquals(int expected, int result) {
26 if (expected != result) {
27 throw new Error("Expected: " + expected + ", found: " + result);
28 }
29 }
30
31 public static void assertLongEquals(long expected, long result) {
32 if (expected != result) {
33 throw new Error("Expected: " + expected + ", found: " + result);
34 }
35 }
36
Nicolas Geoffray0d221842015-04-27 08:53:46 +000037 public static void assertFloatEquals(float expected, float result) {
38 if (expected != result) {
39 throw new Error("Expected: " + expected + ", found: " + result);
40 }
41 }
42
43 public static void assertDoubleEquals(double expected, double result) {
44 if (expected != result) {
45 throw new Error("Expected: " + expected + ", found: " + result);
46 }
47 }
48
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000049 /**
50 * Tiny programs exercising optimizations of arithmetic identities.
51 */
52
David Brazdila06d66a2015-05-28 11:14:54 +010053 /// CHECK-START: long Main.Add0(long) instruction_simplifier (before)
54 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
55 /// CHECK-DAG: <<Const0:j\d+>> LongConstant 0
56 /// CHECK-DAG: <<Add:j\d+>> Add [<<Const0>>,<<Arg>>]
57 /// CHECK-DAG: Return [<<Add>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000058
David Brazdila06d66a2015-05-28 11:14:54 +010059 /// CHECK-START: long Main.Add0(long) instruction_simplifier (after)
60 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
61 /// CHECK-DAG: Return [<<Arg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +010062
David Brazdila06d66a2015-05-28 11:14:54 +010063 /// CHECK-START: long Main.Add0(long) instruction_simplifier (after)
64 /// CHECK-NOT: Add
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000065
66 public static long Add0(long arg) {
67 return 0 + arg;
68 }
69
David Brazdila06d66a2015-05-28 11:14:54 +010070 /// CHECK-START: int Main.AndAllOnes(int) instruction_simplifier (before)
71 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
72 /// CHECK-DAG: <<ConstF:i\d+>> IntConstant -1
73 /// CHECK-DAG: <<And:i\d+>> And [<<Arg>>,<<ConstF>>]
74 /// CHECK-DAG: Return [<<And>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000075
David Brazdila06d66a2015-05-28 11:14:54 +010076 /// CHECK-START: int Main.AndAllOnes(int) instruction_simplifier (after)
77 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
78 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000079
David Brazdila06d66a2015-05-28 11:14:54 +010080 /// CHECK-START: int Main.AndAllOnes(int) instruction_simplifier (after)
81 /// CHECK-NOT: And
Alexandre Rames74417692015-04-09 15:21:41 +010082
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000083 public static int AndAllOnes(int arg) {
84 return arg & -1;
85 }
86
Vladimir Marko452c1b62015-09-25 14:44:17 +010087 /// CHECK-START: int Main.UShr28And15(int) instruction_simplifier (before)
88 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
89 /// CHECK-DAG: <<Const28:i\d+>> IntConstant 28
90 /// CHECK-DAG: <<Const15:i\d+>> IntConstant 15
91 /// CHECK-DAG: <<UShr:i\d+>> UShr [<<Arg>>,<<Const28>>]
92 /// CHECK-DAG: <<And:i\d+>> And [<<UShr>>,<<Const15>>]
93 /// CHECK-DAG: Return [<<And>>]
94
95 /// CHECK-START: int Main.UShr28And15(int) instruction_simplifier (after)
96 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
97 /// CHECK-DAG: <<Const28:i\d+>> IntConstant 28
98 /// CHECK-DAG: <<UShr:i\d+>> UShr [<<Arg>>,<<Const28>>]
99 /// CHECK-DAG: Return [<<UShr>>]
100
101 /// CHECK-START: int Main.UShr28And15(int) instruction_simplifier (after)
102 /// CHECK-NOT: And
103
104 public static int UShr28And15(int arg) {
105 return (arg >>> 28) & 15;
106 }
107
108 /// CHECK-START: long Main.UShr60And15(long) instruction_simplifier (before)
109 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
110 /// CHECK-DAG: <<Const60:i\d+>> IntConstant 60
111 /// CHECK-DAG: <<Const15:j\d+>> LongConstant 15
112 /// CHECK-DAG: <<UShr:j\d+>> UShr [<<Arg>>,<<Const60>>]
113 /// CHECK-DAG: <<And:j\d+>> And [<<UShr>>,<<Const15>>]
114 /// CHECK-DAG: Return [<<And>>]
115
116 /// CHECK-START: long Main.UShr60And15(long) instruction_simplifier (after)
117 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
118 /// CHECK-DAG: <<Const60:i\d+>> IntConstant 60
119 /// CHECK-DAG: <<UShr:j\d+>> UShr [<<Arg>>,<<Const60>>]
120 /// CHECK-DAG: Return [<<UShr>>]
121
122 /// CHECK-START: long Main.UShr60And15(long) instruction_simplifier (after)
123 /// CHECK-NOT: And
124
125 public static long UShr60And15(long arg) {
126 return (arg >>> 60) & 15;
127 }
128
129 /// CHECK-START: int Main.UShr28And7(int) instruction_simplifier (before)
130 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
131 /// CHECK-DAG: <<Const28:i\d+>> IntConstant 28
132 /// CHECK-DAG: <<Const7:i\d+>> IntConstant 7
133 /// CHECK-DAG: <<UShr:i\d+>> UShr [<<Arg>>,<<Const28>>]
134 /// CHECK-DAG: <<And:i\d+>> And [<<UShr>>,<<Const7>>]
135 /// CHECK-DAG: Return [<<And>>]
136
137 /// CHECK-START: int Main.UShr28And7(int) instruction_simplifier (after)
138 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
139 /// CHECK-DAG: <<Const28:i\d+>> IntConstant 28
140 /// CHECK-DAG: <<Const7:i\d+>> IntConstant 7
141 /// CHECK-DAG: <<UShr:i\d+>> UShr [<<Arg>>,<<Const28>>]
142 /// CHECK-DAG: <<And:i\d+>> And [<<UShr>>,<<Const7>>]
143 /// CHECK-DAG: Return [<<And>>]
144
145 public static int UShr28And7(int arg) {
146 return (arg >>> 28) & 7;
147 }
148
149 /// CHECK-START: long Main.UShr60And7(long) instruction_simplifier (before)
150 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
151 /// CHECK-DAG: <<Const60:i\d+>> IntConstant 60
152 /// CHECK-DAG: <<Const7:j\d+>> LongConstant 7
153 /// CHECK-DAG: <<UShr:j\d+>> UShr [<<Arg>>,<<Const60>>]
154 /// CHECK-DAG: <<And:j\d+>> And [<<UShr>>,<<Const7>>]
155 /// CHECK-DAG: Return [<<And>>]
156
157 /// CHECK-START: long Main.UShr60And7(long) instruction_simplifier (after)
158 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
159 /// CHECK-DAG: <<Const60:i\d+>> IntConstant 60
160 /// CHECK-DAG: <<Const7:j\d+>> LongConstant 7
161 /// CHECK-DAG: <<UShr:j\d+>> UShr [<<Arg>>,<<Const60>>]
162 /// CHECK-DAG: <<And:j\d+>> And [<<UShr>>,<<Const7>>]
163 /// CHECK-DAG: Return [<<And>>]
164
165 public static long UShr60And7(long arg) {
166 return (arg >>> 60) & 7;
167 }
168
169 /// CHECK-START: int Main.Shr24And255(int) instruction_simplifier (before)
170 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
171 /// CHECK-DAG: <<Const24:i\d+>> IntConstant 24
172 /// CHECK-DAG: <<Const255:i\d+>> IntConstant 255
173 /// CHECK-DAG: <<Shr:i\d+>> Shr [<<Arg>>,<<Const24>>]
174 /// CHECK-DAG: <<And:i\d+>> And [<<Shr>>,<<Const255>>]
175 /// CHECK-DAG: Return [<<And>>]
176
177 /// CHECK-START: int Main.Shr24And255(int) instruction_simplifier (after)
178 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
179 /// CHECK-DAG: <<Const24:i\d+>> IntConstant 24
180 /// CHECK-DAG: <<UShr:i\d+>> UShr [<<Arg>>,<<Const24>>]
181 /// CHECK-DAG: Return [<<UShr>>]
182
183 /// CHECK-START: int Main.Shr24And255(int) instruction_simplifier (after)
184 /// CHECK-NOT: Shr
185 /// CHECK-NOT: And
186
187 public static int Shr24And255(int arg) {
188 return (arg >> 24) & 255;
189 }
190
191 /// CHECK-START: long Main.Shr56And255(long) instruction_simplifier (before)
192 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
193 /// CHECK-DAG: <<Const56:i\d+>> IntConstant 56
194 /// CHECK-DAG: <<Const255:j\d+>> LongConstant 255
195 /// CHECK-DAG: <<Shr:j\d+>> Shr [<<Arg>>,<<Const56>>]
196 /// CHECK-DAG: <<And:j\d+>> And [<<Shr>>,<<Const255>>]
197 /// CHECK-DAG: Return [<<And>>]
198
199 /// CHECK-START: long Main.Shr56And255(long) instruction_simplifier (after)
200 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
201 /// CHECK-DAG: <<Const56:i\d+>> IntConstant 56
202 /// CHECK-DAG: <<UShr:j\d+>> UShr [<<Arg>>,<<Const56>>]
203 /// CHECK-DAG: Return [<<UShr>>]
204
205 /// CHECK-START: long Main.Shr56And255(long) instruction_simplifier (after)
206 /// CHECK-NOT: Shr
207 /// CHECK-NOT: And
208
209 public static long Shr56And255(long arg) {
210 return (arg >> 56) & 255;
211 }
212
213 /// CHECK-START: int Main.Shr24And127(int) instruction_simplifier (before)
214 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
215 /// CHECK-DAG: <<Const24:i\d+>> IntConstant 24
216 /// CHECK-DAG: <<Const127:i\d+>> IntConstant 127
217 /// CHECK-DAG: <<Shr:i\d+>> Shr [<<Arg>>,<<Const24>>]
218 /// CHECK-DAG: <<And:i\d+>> And [<<Shr>>,<<Const127>>]
219 /// CHECK-DAG: Return [<<And>>]
220
221 /// CHECK-START: int Main.Shr24And127(int) instruction_simplifier (after)
222 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
223 /// CHECK-DAG: <<Const24:i\d+>> IntConstant 24
224 /// CHECK-DAG: <<Const127:i\d+>> IntConstant 127
225 /// CHECK-DAG: <<Shr:i\d+>> Shr [<<Arg>>,<<Const24>>]
226 /// CHECK-DAG: <<And:i\d+>> And [<<Shr>>,<<Const127>>]
227 /// CHECK-DAG: Return [<<And>>]
228
229 public static int Shr24And127(int arg) {
230 return (arg >> 24) & 127;
231 }
232
233 /// CHECK-START: long Main.Shr56And127(long) instruction_simplifier (before)
234 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
235 /// CHECK-DAG: <<Const56:i\d+>> IntConstant 56
236 /// CHECK-DAG: <<Const127:j\d+>> LongConstant 127
237 /// CHECK-DAG: <<Shr:j\d+>> Shr [<<Arg>>,<<Const56>>]
238 /// CHECK-DAG: <<And:j\d+>> And [<<Shr>>,<<Const127>>]
239 /// CHECK-DAG: Return [<<And>>]
240
241 /// CHECK-START: long Main.Shr56And127(long) instruction_simplifier (after)
242 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
243 /// CHECK-DAG: <<Const56:i\d+>> IntConstant 56
244 /// CHECK-DAG: <<Const127:j\d+>> LongConstant 127
245 /// CHECK-DAG: <<Shr:j\d+>> Shr [<<Arg>>,<<Const56>>]
246 /// CHECK-DAG: <<And:j\d+>> And [<<Shr>>,<<Const127>>]
247 /// CHECK-DAG: Return [<<And>>]
248
249 public static long Shr56And127(long arg) {
250 return (arg >> 56) & 127;
251 }
252
David Brazdila06d66a2015-05-28 11:14:54 +0100253 /// CHECK-START: long Main.Div1(long) instruction_simplifier (before)
254 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
255 /// CHECK-DAG: <<Const1:j\d+>> LongConstant 1
256 /// CHECK-DAG: <<Div:j\d+>> Div [<<Arg>>,<<Const1>>]
257 /// CHECK-DAG: Return [<<Div>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000258
David Brazdila06d66a2015-05-28 11:14:54 +0100259 /// CHECK-START: long Main.Div1(long) instruction_simplifier (after)
260 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
261 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000262
David Brazdila06d66a2015-05-28 11:14:54 +0100263 /// CHECK-START: long Main.Div1(long) instruction_simplifier (after)
264 /// CHECK-NOT: Div
Alexandre Rames74417692015-04-09 15:21:41 +0100265
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000266 public static long Div1(long arg) {
267 return arg / 1;
268 }
269
David Brazdila06d66a2015-05-28 11:14:54 +0100270 /// CHECK-START: int Main.DivN1(int) instruction_simplifier (before)
271 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
272 /// CHECK-DAG: <<ConstN1:i\d+>> IntConstant -1
273 /// CHECK-DAG: <<Div:i\d+>> Div [<<Arg>>,<<ConstN1>>]
274 /// CHECK-DAG: Return [<<Div>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000275
David Brazdila06d66a2015-05-28 11:14:54 +0100276 /// CHECK-START: int Main.DivN1(int) instruction_simplifier (after)
277 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
278 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Arg>>]
279 /// CHECK-DAG: Return [<<Neg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000280
David Brazdila06d66a2015-05-28 11:14:54 +0100281 /// CHECK-START: int Main.DivN1(int) instruction_simplifier (after)
282 /// CHECK-NOT: Div
Alexandre Rames74417692015-04-09 15:21:41 +0100283
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000284 public static int DivN1(int arg) {
285 return arg / -1;
286 }
287
David Brazdila06d66a2015-05-28 11:14:54 +0100288 /// CHECK-START: long Main.Mul1(long) instruction_simplifier (before)
289 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
290 /// CHECK-DAG: <<Const1:j\d+>> LongConstant 1
291 /// CHECK-DAG: <<Mul:j\d+>> Mul [<<Arg>>,<<Const1>>]
292 /// CHECK-DAG: Return [<<Mul>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000293
David Brazdila06d66a2015-05-28 11:14:54 +0100294 /// CHECK-START: long Main.Mul1(long) instruction_simplifier (after)
295 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
296 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000297
David Brazdila06d66a2015-05-28 11:14:54 +0100298 /// CHECK-START: long Main.Mul1(long) instruction_simplifier (after)
299 /// CHECK-NOT: Mul
Alexandre Rames74417692015-04-09 15:21:41 +0100300
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000301 public static long Mul1(long arg) {
302 return arg * 1;
303 }
304
David Brazdila06d66a2015-05-28 11:14:54 +0100305 /// CHECK-START: int Main.MulN1(int) instruction_simplifier (before)
306 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
307 /// CHECK-DAG: <<ConstN1:i\d+>> IntConstant -1
308 /// CHECK-DAG: <<Mul:i\d+>> Mul [<<Arg>>,<<ConstN1>>]
309 /// CHECK-DAG: Return [<<Mul>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000310
David Brazdila06d66a2015-05-28 11:14:54 +0100311 /// CHECK-START: int Main.MulN1(int) instruction_simplifier (after)
312 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
313 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Arg>>]
314 /// CHECK-DAG: Return [<<Neg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000315
David Brazdila06d66a2015-05-28 11:14:54 +0100316 /// CHECK-START: int Main.MulN1(int) instruction_simplifier (after)
317 /// CHECK-NOT: Mul
Alexandre Rames74417692015-04-09 15:21:41 +0100318
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000319 public static int MulN1(int arg) {
320 return arg * -1;
321 }
322
David Brazdila06d66a2015-05-28 11:14:54 +0100323 /// CHECK-START: long Main.MulPowerOfTwo128(long) instruction_simplifier (before)
324 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
325 /// CHECK-DAG: <<Const128:j\d+>> LongConstant 128
326 /// CHECK-DAG: <<Mul:j\d+>> Mul [<<Arg>>,<<Const128>>]
327 /// CHECK-DAG: Return [<<Mul>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000328
David Brazdila06d66a2015-05-28 11:14:54 +0100329 /// CHECK-START: long Main.MulPowerOfTwo128(long) instruction_simplifier (after)
330 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
331 /// CHECK-DAG: <<Const7:i\d+>> IntConstant 7
332 /// CHECK-DAG: <<Shl:j\d+>> Shl [<<Arg>>,<<Const7>>]
333 /// CHECK-DAG: Return [<<Shl>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000334
David Brazdila06d66a2015-05-28 11:14:54 +0100335 /// CHECK-START: long Main.MulPowerOfTwo128(long) instruction_simplifier (after)
336 /// CHECK-NOT: Mul
Alexandre Rames74417692015-04-09 15:21:41 +0100337
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000338 public static long MulPowerOfTwo128(long arg) {
339 return arg * 128;
340 }
341
David Brazdila06d66a2015-05-28 11:14:54 +0100342 /// CHECK-START: int Main.Or0(int) instruction_simplifier (before)
343 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
344 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
345 /// CHECK-DAG: <<Or:i\d+>> Or [<<Arg>>,<<Const0>>]
346 /// CHECK-DAG: Return [<<Or>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000347
David Brazdila06d66a2015-05-28 11:14:54 +0100348 /// CHECK-START: int Main.Or0(int) instruction_simplifier (after)
349 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
350 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000351
David Brazdila06d66a2015-05-28 11:14:54 +0100352 /// CHECK-START: int Main.Or0(int) instruction_simplifier (after)
353 /// CHECK-NOT: Or
Alexandre Rames74417692015-04-09 15:21:41 +0100354
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000355 public static int Or0(int arg) {
356 return arg | 0;
357 }
358
David Brazdila06d66a2015-05-28 11:14:54 +0100359 /// CHECK-START: long Main.OrSame(long) instruction_simplifier (before)
360 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
361 /// CHECK-DAG: <<Or:j\d+>> Or [<<Arg>>,<<Arg>>]
362 /// CHECK-DAG: Return [<<Or>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000363
David Brazdila06d66a2015-05-28 11:14:54 +0100364 /// CHECK-START: long Main.OrSame(long) instruction_simplifier (after)
365 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
366 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000367
David Brazdila06d66a2015-05-28 11:14:54 +0100368 /// CHECK-START: long Main.OrSame(long) instruction_simplifier (after)
369 /// CHECK-NOT: Or
Alexandre Rames74417692015-04-09 15:21:41 +0100370
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000371 public static long OrSame(long arg) {
372 return arg | arg;
373 }
374
David Brazdila06d66a2015-05-28 11:14:54 +0100375 /// CHECK-START: int Main.Shl0(int) instruction_simplifier (before)
376 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
377 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
378 /// CHECK-DAG: <<Shl:i\d+>> Shl [<<Arg>>,<<Const0>>]
379 /// CHECK-DAG: Return [<<Shl>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000380
David Brazdila06d66a2015-05-28 11:14:54 +0100381 /// CHECK-START: int Main.Shl0(int) instruction_simplifier (after)
382 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
383 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000384
David Brazdila06d66a2015-05-28 11:14:54 +0100385 /// CHECK-START: int Main.Shl0(int) instruction_simplifier (after)
386 /// CHECK-NOT: Shl
Alexandre Rames74417692015-04-09 15:21:41 +0100387
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000388 public static int Shl0(int arg) {
389 return arg << 0;
390 }
391
David Brazdila06d66a2015-05-28 11:14:54 +0100392 /// CHECK-START: int Main.Shl1(int) instruction_simplifier (before)
393 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
394 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
395 /// CHECK-DAG: <<Shl:i\d+>> Shl [<<Arg>>,<<Const1>>]
396 /// CHECK-DAG: Return [<<Shl>>]
Mark Mendellba56d062015-05-05 21:34:03 -0400397
David Brazdila06d66a2015-05-28 11:14:54 +0100398 /// CHECK-START: int Main.Shl1(int) instruction_simplifier (after)
399 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
400 /// CHECK-DAG: <<Add:i\d+>> Add [<<Arg>>,<<Arg>>]
401 /// CHECK-DAG: Return [<<Add>>]
Mark Mendellba56d062015-05-05 21:34:03 -0400402
David Brazdila06d66a2015-05-28 11:14:54 +0100403 /// CHECK-START: int Main.Shl1(int) instruction_simplifier (after)
404 /// CHECK-NOT: Shl
Mark Mendellba56d062015-05-05 21:34:03 -0400405
406 public static int Shl1(int arg) {
407 return arg << 1;
408 }
409
David Brazdila06d66a2015-05-28 11:14:54 +0100410 /// CHECK-START: long Main.Shr0(long) instruction_simplifier (before)
411 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
412 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
413 /// CHECK-DAG: <<Shr:j\d+>> Shr [<<Arg>>,<<Const0>>]
414 /// CHECK-DAG: Return [<<Shr>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000415
David Brazdila06d66a2015-05-28 11:14:54 +0100416 /// CHECK-START: long Main.Shr0(long) instruction_simplifier (after)
417 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
418 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000419
David Brazdila06d66a2015-05-28 11:14:54 +0100420 /// CHECK-START: long Main.Shr0(long) instruction_simplifier (after)
421 /// CHECK-NOT: Shr
Alexandre Rames74417692015-04-09 15:21:41 +0100422
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000423 public static long Shr0(long arg) {
424 return arg >> 0;
425 }
426
David Brazdila06d66a2015-05-28 11:14:54 +0100427 /// CHECK-START: long Main.Sub0(long) instruction_simplifier (before)
428 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
429 /// CHECK-DAG: <<Const0:j\d+>> LongConstant 0
430 /// CHECK-DAG: <<Sub:j\d+>> Sub [<<Arg>>,<<Const0>>]
431 /// CHECK-DAG: Return [<<Sub>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000432
David Brazdila06d66a2015-05-28 11:14:54 +0100433 /// CHECK-START: long Main.Sub0(long) instruction_simplifier (after)
434 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
435 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000436
David Brazdila06d66a2015-05-28 11:14:54 +0100437 /// CHECK-START: long Main.Sub0(long) instruction_simplifier (after)
438 /// CHECK-NOT: Sub
Alexandre Rames74417692015-04-09 15:21:41 +0100439
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000440 public static long Sub0(long arg) {
441 return arg - 0;
442 }
443
David Brazdila06d66a2015-05-28 11:14:54 +0100444 /// CHECK-START: int Main.SubAliasNeg(int) instruction_simplifier (before)
445 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
446 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
447 /// CHECK-DAG: <<Sub:i\d+>> Sub [<<Const0>>,<<Arg>>]
448 /// CHECK-DAG: Return [<<Sub>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000449
David Brazdila06d66a2015-05-28 11:14:54 +0100450 /// CHECK-START: int Main.SubAliasNeg(int) instruction_simplifier (after)
451 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
452 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Arg>>]
453 /// CHECK-DAG: Return [<<Neg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000454
David Brazdila06d66a2015-05-28 11:14:54 +0100455 /// CHECK-START: int Main.SubAliasNeg(int) instruction_simplifier (after)
456 /// CHECK-NOT: Sub
Alexandre Rames74417692015-04-09 15:21:41 +0100457
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000458 public static int SubAliasNeg(int arg) {
459 return 0 - arg;
460 }
461
David Brazdila06d66a2015-05-28 11:14:54 +0100462 /// CHECK-START: long Main.UShr0(long) instruction_simplifier (before)
463 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
464 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
465 /// CHECK-DAG: <<UShr:j\d+>> UShr [<<Arg>>,<<Const0>>]
466 /// CHECK-DAG: Return [<<UShr>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000467
David Brazdila06d66a2015-05-28 11:14:54 +0100468 /// CHECK-START: long Main.UShr0(long) instruction_simplifier (after)
469 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
470 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000471
David Brazdila06d66a2015-05-28 11:14:54 +0100472 /// CHECK-START: long Main.UShr0(long) instruction_simplifier (after)
473 /// CHECK-NOT: UShr
Alexandre Rames74417692015-04-09 15:21:41 +0100474
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000475 public static long UShr0(long arg) {
476 return arg >>> 0;
477 }
478
David Brazdila06d66a2015-05-28 11:14:54 +0100479 /// CHECK-START: int Main.Xor0(int) instruction_simplifier (before)
480 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
481 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
482 /// CHECK-DAG: <<Xor:i\d+>> Xor [<<Arg>>,<<Const0>>]
483 /// CHECK-DAG: Return [<<Xor>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000484
David Brazdila06d66a2015-05-28 11:14:54 +0100485 /// CHECK-START: int Main.Xor0(int) instruction_simplifier (after)
486 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
487 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000488
David Brazdila06d66a2015-05-28 11:14:54 +0100489 /// CHECK-START: int Main.Xor0(int) instruction_simplifier (after)
490 /// CHECK-NOT: Xor
Alexandre Rames74417692015-04-09 15:21:41 +0100491
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000492 public static int Xor0(int arg) {
493 return arg ^ 0;
494 }
495
David Brazdila06d66a2015-05-28 11:14:54 +0100496 /// CHECK-START: int Main.XorAllOnes(int) instruction_simplifier (before)
497 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
498 /// CHECK-DAG: <<ConstF:i\d+>> IntConstant -1
499 /// CHECK-DAG: <<Xor:i\d+>> Xor [<<Arg>>,<<ConstF>>]
500 /// CHECK-DAG: Return [<<Xor>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000501
David Brazdila06d66a2015-05-28 11:14:54 +0100502 /// CHECK-START: int Main.XorAllOnes(int) instruction_simplifier (after)
503 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
504 /// CHECK-DAG: <<Not:i\d+>> Not [<<Arg>>]
505 /// CHECK-DAG: Return [<<Not>>]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000506
David Brazdila06d66a2015-05-28 11:14:54 +0100507 /// CHECK-START: int Main.XorAllOnes(int) instruction_simplifier (after)
508 /// CHECK-NOT: Xor
Alexandre Rames74417692015-04-09 15:21:41 +0100509
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000510 public static int XorAllOnes(int arg) {
511 return arg ^ -1;
512 }
513
Alexandre Rames188d4312015-04-09 18:30:21 +0100514 /**
515 * Test that addition or subtraction operation with both inputs negated are
516 * optimized to use a single negation after the operation.
517 * The transformation tested is implemented in
518 * `InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop`.
519 */
520
David Brazdila06d66a2015-05-28 11:14:54 +0100521 /// CHECK-START: int Main.AddNegs1(int, int) instruction_simplifier (before)
522 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
523 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
524 /// CHECK-DAG: <<Neg1:i\d+>> Neg [<<Arg1>>]
525 /// CHECK-DAG: <<Neg2:i\d+>> Neg [<<Arg2>>]
526 /// CHECK-DAG: <<Add:i\d+>> Add [<<Neg1>>,<<Neg2>>]
527 /// CHECK-DAG: Return [<<Add>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100528
David Brazdila06d66a2015-05-28 11:14:54 +0100529 /// CHECK-START: int Main.AddNegs1(int, int) instruction_simplifier (after)
530 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
531 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
532 /// CHECK-NOT: Neg
533 /// CHECK-DAG: <<Add:i\d+>> Add [<<Arg1>>,<<Arg2>>]
534 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Add>>]
535 /// CHECK-DAG: Return [<<Neg>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100536
537 public static int AddNegs1(int arg1, int arg2) {
538 return -arg1 + -arg2;
539 }
540
541 /**
542 * This is similar to the test-case AddNegs1, but the negations have
543 * multiple uses.
544 * The transformation tested is implemented in
545 * `InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop`.
546 * The current code won't perform the previous optimization. The
547 * transformations do not look at other uses of their inputs. As they don't
548 * know what will happen with other uses, they do not take the risk of
549 * increasing the register pressure by creating or extending live ranges.
550 */
551
David Brazdila06d66a2015-05-28 11:14:54 +0100552 /// CHECK-START: int Main.AddNegs2(int, int) instruction_simplifier (before)
553 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
554 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
555 /// CHECK-DAG: <<Neg1:i\d+>> Neg [<<Arg1>>]
556 /// CHECK-DAG: <<Neg2:i\d+>> Neg [<<Arg2>>]
557 /// CHECK-DAG: <<Add1:i\d+>> Add [<<Neg1>>,<<Neg2>>]
558 /// CHECK-DAG: <<Add2:i\d+>> Add [<<Neg1>>,<<Neg2>>]
559 /// CHECK-DAG: <<Or:i\d+>> Or [<<Add1>>,<<Add2>>]
560 /// CHECK-DAG: Return [<<Or>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100561
David Brazdila06d66a2015-05-28 11:14:54 +0100562 /// CHECK-START: int Main.AddNegs2(int, int) instruction_simplifier (after)
563 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
564 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
565 /// CHECK-DAG: <<Neg1:i\d+>> Neg [<<Arg1>>]
566 /// CHECK-DAG: <<Neg2:i\d+>> Neg [<<Arg2>>]
567 /// CHECK-DAG: <<Add1:i\d+>> Add [<<Neg1>>,<<Neg2>>]
568 /// CHECK-DAG: <<Add2:i\d+>> Add [<<Neg1>>,<<Neg2>>]
569 /// CHECK-NOT: Neg
570 /// CHECK-DAG: <<Or:i\d+>> Or [<<Add1>>,<<Add2>>]
571 /// CHECK-DAG: Return [<<Or>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100572
David Brazdila06d66a2015-05-28 11:14:54 +0100573 /// CHECK-START: int Main.AddNegs2(int, int) GVN (after)
574 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
575 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
576 /// CHECK-DAG: <<Neg1:i\d+>> Neg [<<Arg1>>]
577 /// CHECK-DAG: <<Neg2:i\d+>> Neg [<<Arg2>>]
578 /// CHECK-DAG: <<Add:i\d+>> Add [<<Neg1>>,<<Neg2>>]
579 /// CHECK-DAG: <<Or:i\d+>> Or [<<Add>>,<<Add>>]
580 /// CHECK-DAG: Return [<<Or>>]
Alexandre Ramesb2a58472015-04-17 14:35:18 +0100581
Alexandre Rames188d4312015-04-09 18:30:21 +0100582 public static int AddNegs2(int arg1, int arg2) {
583 int temp1 = -arg1;
584 int temp2 = -arg2;
585 return (temp1 + temp2) | (temp1 + temp2);
586 }
587
588 /**
589 * This follows test-cases AddNegs1 and AddNegs2.
590 * The transformation tested is implemented in
591 * `InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop`.
592 * The optimization should not happen if it moves an additional instruction in
593 * the loop.
594 */
595
David Brazdila06d66a2015-05-28 11:14:54 +0100596 /// CHECK-START: long Main.AddNegs3(long, long) instruction_simplifier (before)
597 // -------------- Arguments and initial negation operations.
598 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
599 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
600 /// CHECK-DAG: <<Neg1:j\d+>> Neg [<<Arg1>>]
601 /// CHECK-DAG: <<Neg2:j\d+>> Neg [<<Arg2>>]
602 /// CHECK: Goto
603 // -------------- Loop
604 /// CHECK: SuspendCheck
605 /// CHECK: <<Add:j\d+>> Add [<<Neg1>>,<<Neg2>>]
606 /// CHECK: Goto
Alexandre Rames188d4312015-04-09 18:30:21 +0100607
David Brazdila06d66a2015-05-28 11:14:54 +0100608 /// CHECK-START: long Main.AddNegs3(long, long) instruction_simplifier (after)
609 // -------------- Arguments and initial negation operations.
610 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
611 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
612 /// CHECK-DAG: <<Neg1:j\d+>> Neg [<<Arg1>>]
613 /// CHECK-DAG: <<Neg2:j\d+>> Neg [<<Arg2>>]
614 /// CHECK: Goto
615 // -------------- Loop
616 /// CHECK: SuspendCheck
617 /// CHECK: <<Add:j\d+>> Add [<<Neg1>>,<<Neg2>>]
618 /// CHECK-NOT: Neg
619 /// CHECK: Goto
Alexandre Rames188d4312015-04-09 18:30:21 +0100620
621 public static long AddNegs3(long arg1, long arg2) {
622 long res = 0;
623 long n_arg1 = -arg1;
624 long n_arg2 = -arg2;
625 for (long i = 0; i < 1; i++) {
626 res += n_arg1 + n_arg2 + i;
627 }
628 return res;
629 }
630
631 /**
632 * Test the simplification of an addition with a negated argument into a
633 * subtraction.
634 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitAdd`.
635 */
636
David Brazdila06d66a2015-05-28 11:14:54 +0100637 /// CHECK-START: long Main.AddNeg1(long, long) instruction_simplifier (before)
638 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
639 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
640 /// CHECK-DAG: <<Neg:j\d+>> Neg [<<Arg1>>]
641 /// CHECK-DAG: <<Add:j\d+>> Add [<<Neg>>,<<Arg2>>]
642 /// CHECK-DAG: Return [<<Add>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100643
David Brazdila06d66a2015-05-28 11:14:54 +0100644 /// CHECK-START: long Main.AddNeg1(long, long) instruction_simplifier (after)
645 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
646 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
647 /// CHECK-DAG: <<Sub:j\d+>> Sub [<<Arg2>>,<<Arg1>>]
648 /// CHECK-DAG: Return [<<Sub>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100649
David Brazdila06d66a2015-05-28 11:14:54 +0100650 /// CHECK-START: long Main.AddNeg1(long, long) instruction_simplifier (after)
651 /// CHECK-NOT: Neg
652 /// CHECK-NOT: Add
Alexandre Rames188d4312015-04-09 18:30:21 +0100653
654 public static long AddNeg1(long arg1, long arg2) {
655 return -arg1 + arg2;
656 }
657
658 /**
659 * This is similar to the test-case AddNeg1, but the negation has two uses.
660 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitAdd`.
661 * The current code won't perform the previous optimization. The
662 * transformations do not look at other uses of their inputs. As they don't
663 * know what will happen with other uses, they do not take the risk of
664 * increasing the register pressure by creating or extending live ranges.
665 */
666
David Brazdila06d66a2015-05-28 11:14:54 +0100667 /// CHECK-START: long Main.AddNeg2(long, long) instruction_simplifier (before)
668 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
669 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
670 /// CHECK-DAG: <<Neg:j\d+>> Neg [<<Arg2>>]
671 /// CHECK-DAG: <<Add1:j\d+>> Add [<<Arg1>>,<<Neg>>]
672 /// CHECK-DAG: <<Add2:j\d+>> Add [<<Arg1>>,<<Neg>>]
673 /// CHECK-DAG: <<Res:j\d+>> Or [<<Add1>>,<<Add2>>]
674 /// CHECK-DAG: Return [<<Res>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100675
David Brazdila06d66a2015-05-28 11:14:54 +0100676 /// CHECK-START: long Main.AddNeg2(long, long) instruction_simplifier (after)
677 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
678 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
679 /// CHECK-DAG: <<Neg:j\d+>> Neg [<<Arg2>>]
680 /// CHECK-DAG: <<Add1:j\d+>> Add [<<Arg1>>,<<Neg>>]
681 /// CHECK-DAG: <<Add2:j\d+>> Add [<<Arg1>>,<<Neg>>]
682 /// CHECK-DAG: <<Res:j\d+>> Or [<<Add1>>,<<Add2>>]
683 /// CHECK-DAG: Return [<<Res>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100684
David Brazdila06d66a2015-05-28 11:14:54 +0100685 /// CHECK-START: long Main.AddNeg2(long, long) instruction_simplifier (after)
686 /// CHECK-NOT: Sub
Alexandre Rames188d4312015-04-09 18:30:21 +0100687
688 public static long AddNeg2(long arg1, long arg2) {
689 long temp = -arg2;
690 return (arg1 + temp) | (arg1 + temp);
691 }
692
693 /**
694 * Test simplification of the `-(-var)` pattern.
695 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNeg`.
696 */
697
David Brazdila06d66a2015-05-28 11:14:54 +0100698 /// CHECK-START: long Main.NegNeg1(long) instruction_simplifier (before)
699 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
700 /// CHECK-DAG: <<Neg1:j\d+>> Neg [<<Arg>>]
701 /// CHECK-DAG: <<Neg2:j\d+>> Neg [<<Neg1>>]
702 /// CHECK-DAG: Return [<<Neg2>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100703
David Brazdila06d66a2015-05-28 11:14:54 +0100704 /// CHECK-START: long Main.NegNeg1(long) instruction_simplifier (after)
705 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
706 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100707
David Brazdila06d66a2015-05-28 11:14:54 +0100708 /// CHECK-START: long Main.NegNeg1(long) instruction_simplifier (after)
709 /// CHECK-NOT: Neg
Alexandre Rames188d4312015-04-09 18:30:21 +0100710
711 public static long NegNeg1(long arg) {
712 return -(-arg);
713 }
714
715 /**
716 * Test 'multi-step' simplification, where a first transformation yields a
717 * new simplification possibility for the current instruction.
718 * The transformations tested are implemented in `InstructionSimplifierVisitor::VisitNeg`
719 * and in `InstructionSimplifierVisitor::VisitAdd`.
720 */
721
David Brazdila06d66a2015-05-28 11:14:54 +0100722 /// CHECK-START: int Main.NegNeg2(int) instruction_simplifier (before)
723 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
724 /// CHECK-DAG: <<Neg1:i\d+>> Neg [<<Arg>>]
725 /// CHECK-DAG: <<Neg2:i\d+>> Neg [<<Neg1>>]
726 /// CHECK-DAG: <<Add:i\d+>> Add [<<Neg1>>,<<Neg2>>]
727 /// CHECK-DAG: Return [<<Add>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100728
David Brazdila06d66a2015-05-28 11:14:54 +0100729 /// CHECK-START: int Main.NegNeg2(int) instruction_simplifier (after)
730 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
731 /// CHECK-DAG: <<Sub:i\d+>> Sub [<<Arg>>,<<Arg>>]
732 /// CHECK-DAG: Return [<<Sub>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100733
David Brazdila06d66a2015-05-28 11:14:54 +0100734 /// CHECK-START: int Main.NegNeg2(int) instruction_simplifier (after)
735 /// CHECK-NOT: Neg
736 /// CHECK-NOT: Add
Alexandre Rames188d4312015-04-09 18:30:21 +0100737
David Brazdila06d66a2015-05-28 11:14:54 +0100738 /// CHECK-START: int Main.NegNeg2(int) constant_folding_after_inlining (after)
739 /// CHECK: <<Const0:i\d+>> IntConstant 0
740 /// CHECK-NOT: Neg
741 /// CHECK-NOT: Add
742 /// CHECK: Return [<<Const0>>]
Alexandre Ramesb2a58472015-04-17 14:35:18 +0100743
Alexandre Rames188d4312015-04-09 18:30:21 +0100744 public static int NegNeg2(int arg) {
745 int temp = -arg;
746 return temp + -temp;
747 }
748
749 /**
750 * Test another 'multi-step' simplification, where a first transformation
751 * yields a new simplification possibility for the current instruction.
752 * The transformations tested are implemented in `InstructionSimplifierVisitor::VisitNeg`
753 * and in `InstructionSimplifierVisitor::VisitSub`.
754 */
755
David Brazdila06d66a2015-05-28 11:14:54 +0100756 /// CHECK-START: long Main.NegNeg3(long) instruction_simplifier (before)
757 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
758 /// CHECK-DAG: <<Const0:j\d+>> LongConstant 0
759 /// CHECK-DAG: <<Neg:j\d+>> Neg [<<Arg>>]
760 /// CHECK-DAG: <<Sub:j\d+>> Sub [<<Const0>>,<<Neg>>]
761 /// CHECK-DAG: Return [<<Sub>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100762
David Brazdila06d66a2015-05-28 11:14:54 +0100763 /// CHECK-START: long Main.NegNeg3(long) instruction_simplifier (after)
764 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
765 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100766
David Brazdila06d66a2015-05-28 11:14:54 +0100767 /// CHECK-START: long Main.NegNeg3(long) instruction_simplifier (after)
768 /// CHECK-NOT: Neg
769 /// CHECK-NOT: Sub
Alexandre Rames188d4312015-04-09 18:30:21 +0100770
771 public static long NegNeg3(long arg) {
772 return 0 - -arg;
773 }
774
775 /**
776 * Test that a negated subtraction is simplified to a subtraction with its
777 * arguments reversed.
778 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNeg`.
779 */
780
David Brazdila06d66a2015-05-28 11:14:54 +0100781 /// CHECK-START: int Main.NegSub1(int, int) instruction_simplifier (before)
782 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
783 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
784 /// CHECK-DAG: <<Sub:i\d+>> Sub [<<Arg1>>,<<Arg2>>]
785 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Sub>>]
786 /// CHECK-DAG: Return [<<Neg>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100787
David Brazdila06d66a2015-05-28 11:14:54 +0100788 /// CHECK-START: int Main.NegSub1(int, int) instruction_simplifier (after)
789 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
790 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
791 /// CHECK-DAG: <<Sub:i\d+>> Sub [<<Arg2>>,<<Arg1>>]
792 /// CHECK-DAG: Return [<<Sub>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100793
David Brazdila06d66a2015-05-28 11:14:54 +0100794 /// CHECK-START: int Main.NegSub1(int, int) instruction_simplifier (after)
795 /// CHECK-NOT: Neg
Alexandre Rames188d4312015-04-09 18:30:21 +0100796
797 public static int NegSub1(int arg1, int arg2) {
798 return -(arg1 - arg2);
799 }
800
801 /**
802 * This is similar to the test-case NegSub1, but the subtraction has
803 * multiple uses.
804 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNeg`.
805 * The current code won't perform the previous optimization. The
806 * transformations do not look at other uses of their inputs. As they don't
807 * know what will happen with other uses, they do not take the risk of
808 * increasing the register pressure by creating or extending live ranges.
809 */
810
David Brazdila06d66a2015-05-28 11:14:54 +0100811 /// CHECK-START: int Main.NegSub2(int, int) instruction_simplifier (before)
812 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
813 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
814 /// CHECK-DAG: <<Sub:i\d+>> Sub [<<Arg1>>,<<Arg2>>]
815 /// CHECK-DAG: <<Neg1:i\d+>> Neg [<<Sub>>]
816 /// CHECK-DAG: <<Neg2:i\d+>> Neg [<<Sub>>]
817 /// CHECK-DAG: <<Or:i\d+>> Or [<<Neg1>>,<<Neg2>>]
818 /// CHECK-DAG: Return [<<Or>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100819
David Brazdila06d66a2015-05-28 11:14:54 +0100820 /// CHECK-START: int Main.NegSub2(int, int) instruction_simplifier (after)
821 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
822 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
823 /// CHECK-DAG: <<Sub:i\d+>> Sub [<<Arg1>>,<<Arg2>>]
824 /// CHECK-DAG: <<Neg1:i\d+>> Neg [<<Sub>>]
825 /// CHECK-DAG: <<Neg2:i\d+>> Neg [<<Sub>>]
826 /// CHECK-DAG: <<Or:i\d+>> Or [<<Neg1>>,<<Neg2>>]
827 /// CHECK-DAG: Return [<<Or>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100828
829 public static int NegSub2(int arg1, int arg2) {
830 int temp = arg1 - arg2;
831 return -temp | -temp;
832 }
833
834 /**
835 * Test simplification of the `~~var` pattern.
836 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNot`.
837 */
838
David Brazdila06d66a2015-05-28 11:14:54 +0100839 /// CHECK-START: long Main.NotNot1(long) instruction_simplifier (before)
840 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
841 /// CHECK-DAG: <<ConstF1:j\d+>> LongConstant -1
842 /// CHECK-DAG: <<Xor1:j\d+>> Xor [<<Arg>>,<<ConstF1>>]
843 /// CHECK-DAG: <<Xor2:j\d+>> Xor [<<Xor1>>,<<ConstF1>>]
844 /// CHECK-DAG: Return [<<Xor2>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100845
David Brazdila06d66a2015-05-28 11:14:54 +0100846 /// CHECK-START: long Main.NotNot1(long) instruction_simplifier (after)
847 /// CHECK-DAG: <<Arg:j\d+>> ParameterValue
848 /// CHECK-DAG: Return [<<Arg>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100849
David Brazdila06d66a2015-05-28 11:14:54 +0100850 /// CHECK-START: long Main.NotNot1(long) instruction_simplifier (after)
851 /// CHECK-NOT: Xor
Alexandre Rames188d4312015-04-09 18:30:21 +0100852
853 public static long NotNot1(long arg) {
854 return ~~arg;
855 }
856
David Brazdila06d66a2015-05-28 11:14:54 +0100857 /// CHECK-START: int Main.NotNot2(int) instruction_simplifier (before)
858 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
859 /// CHECK-DAG: <<ConstF1:i\d+>> IntConstant -1
860 /// CHECK-DAG: <<Xor1:i\d+>> Xor [<<Arg>>,<<ConstF1>>]
861 /// CHECK-DAG: <<Xor2:i\d+>> Xor [<<Xor1>>,<<ConstF1>>]
862 /// CHECK-DAG: <<Add:i\d+>> Add [<<Xor1>>,<<Xor2>>]
863 /// CHECK-DAG: Return [<<Add>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100864
David Brazdila06d66a2015-05-28 11:14:54 +0100865 /// CHECK-START: int Main.NotNot2(int) instruction_simplifier (after)
866 /// CHECK-DAG: <<Arg:i\d+>> ParameterValue
867 /// CHECK-DAG: <<Not:i\d+>> Not [<<Arg>>]
868 /// CHECK-DAG: <<Add:i\d+>> Add [<<Not>>,<<Arg>>]
869 /// CHECK-DAG: Return [<<Add>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100870
David Brazdila06d66a2015-05-28 11:14:54 +0100871 /// CHECK-START: int Main.NotNot2(int) instruction_simplifier (after)
872 /// CHECK-NOT: Xor
Alexandre Rames188d4312015-04-09 18:30:21 +0100873
874 public static int NotNot2(int arg) {
875 int temp = ~arg;
876 return temp + ~temp;
877 }
878
879 /**
880 * Test the simplification of a subtraction with a negated argument.
881 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitSub`.
882 */
883
David Brazdila06d66a2015-05-28 11:14:54 +0100884 /// CHECK-START: int Main.SubNeg1(int, int) instruction_simplifier (before)
885 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
886 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
887 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Arg1>>]
888 /// CHECK-DAG: <<Sub:i\d+>> Sub [<<Neg>>,<<Arg2>>]
889 /// CHECK-DAG: Return [<<Sub>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100890
David Brazdila06d66a2015-05-28 11:14:54 +0100891 /// CHECK-START: int Main.SubNeg1(int, int) instruction_simplifier (after)
892 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
893 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
894 /// CHECK-DAG: <<Add:i\d+>> Add [<<Arg1>>,<<Arg2>>]
895 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Add>>]
896 /// CHECK-DAG: Return [<<Neg>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100897
David Brazdila06d66a2015-05-28 11:14:54 +0100898 /// CHECK-START: int Main.SubNeg1(int, int) instruction_simplifier (after)
899 /// CHECK-NOT: Sub
Alexandre Rames188d4312015-04-09 18:30:21 +0100900
901 public static int SubNeg1(int arg1, int arg2) {
902 return -arg1 - arg2;
903 }
904
905 /**
906 * This is similar to the test-case SubNeg1, but the negation has
907 * multiple uses.
908 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitSub`.
909 * The current code won't perform the previous optimization. The
910 * transformations do not look at other uses of their inputs. As they don't
911 * know what will happen with other uses, they do not take the risk of
912 * increasing the register pressure by creating or extending live ranges.
913 */
914
David Brazdila06d66a2015-05-28 11:14:54 +0100915 /// CHECK-START: int Main.SubNeg2(int, int) instruction_simplifier (before)
916 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
917 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
918 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Arg1>>]
919 /// CHECK-DAG: <<Sub1:i\d+>> Sub [<<Neg>>,<<Arg2>>]
920 /// CHECK-DAG: <<Sub2:i\d+>> Sub [<<Neg>>,<<Arg2>>]
921 /// CHECK-DAG: <<Or:i\d+>> Or [<<Sub1>>,<<Sub2>>]
922 /// CHECK-DAG: Return [<<Or>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100923
David Brazdila06d66a2015-05-28 11:14:54 +0100924 /// CHECK-START: int Main.SubNeg2(int, int) instruction_simplifier (after)
925 /// CHECK-DAG: <<Arg1:i\d+>> ParameterValue
926 /// CHECK-DAG: <<Arg2:i\d+>> ParameterValue
927 /// CHECK-DAG: <<Neg:i\d+>> Neg [<<Arg1>>]
928 /// CHECK-DAG: <<Sub1:i\d+>> Sub [<<Neg>>,<<Arg2>>]
929 /// CHECK-DAG: <<Sub2:i\d+>> Sub [<<Neg>>,<<Arg2>>]
930 /// CHECK-DAG: <<Or:i\d+>> Or [<<Sub1>>,<<Sub2>>]
931 /// CHECK-DAG: Return [<<Or>>]
Alexandre Rames188d4312015-04-09 18:30:21 +0100932
David Brazdila06d66a2015-05-28 11:14:54 +0100933 /// CHECK-START: int Main.SubNeg2(int, int) instruction_simplifier (after)
934 /// CHECK-NOT: Add
Alexandre Rames188d4312015-04-09 18:30:21 +0100935
936 public static int SubNeg2(int arg1, int arg2) {
937 int temp = -arg1;
938 return (temp - arg2) | (temp - arg2);
939 }
940
941 /**
942 * This follows test-cases SubNeg1 and SubNeg2.
943 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitSub`.
944 * The optimization should not happen if it moves an additional instruction in
945 * the loop.
946 */
947
David Brazdila06d66a2015-05-28 11:14:54 +0100948 /// CHECK-START: long Main.SubNeg3(long, long) instruction_simplifier (before)
949 // -------------- Arguments and initial negation operation.
950 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
951 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
952 /// CHECK-DAG: <<Neg:j\d+>> Neg [<<Arg1>>]
953 /// CHECK: Goto
954 // -------------- Loop
955 /// CHECK: SuspendCheck
956 /// CHECK: <<Sub:j\d+>> Sub [<<Neg>>,<<Arg2>>]
957 /// CHECK: Goto
Alexandre Rames188d4312015-04-09 18:30:21 +0100958
David Brazdila06d66a2015-05-28 11:14:54 +0100959 /// CHECK-START: long Main.SubNeg3(long, long) instruction_simplifier (after)
960 // -------------- Arguments and initial negation operation.
961 /// CHECK-DAG: <<Arg1:j\d+>> ParameterValue
962 /// CHECK-DAG: <<Arg2:j\d+>> ParameterValue
963 /// CHECK-DAG: <<Neg:j\d+>> Neg [<<Arg1>>]
964 /// CHECK-DAG: Goto
965 // -------------- Loop
966 /// CHECK: SuspendCheck
967 /// CHECK: <<Sub:j\d+>> Sub [<<Neg>>,<<Arg2>>]
968 /// CHECK-NOT: Neg
969 /// CHECK: Goto
Alexandre Rames188d4312015-04-09 18:30:21 +0100970
971 public static long SubNeg3(long arg1, long arg2) {
972 long res = 0;
973 long temp = -arg1;
974 for (long i = 0; i < 1; i++) {
975 res += temp - arg2 - i;
976 }
977 return res;
978 }
979
David Brazdila06d66a2015-05-28 11:14:54 +0100980 /// CHECK-START: int Main.EqualTrueRhs(boolean) instruction_simplifier (before)
981 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
982 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
983 /// CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Const1>>]
984 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +0100985
David Brazdila06d66a2015-05-28 11:14:54 +0100986 /// CHECK-START: int Main.EqualTrueRhs(boolean) instruction_simplifier (after)
987 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
988 /// CHECK-DAG: If [<<Arg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +0100989
990 public static int EqualTrueRhs(boolean arg) {
991 return (arg != true) ? 3 : 5;
992 }
993
David Brazdila06d66a2015-05-28 11:14:54 +0100994 /// CHECK-START: int Main.EqualTrueLhs(boolean) instruction_simplifier (before)
995 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
996 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
997 /// CHECK-DAG: <<Cond:z\d+>> Equal [<<Const1>>,<<Arg>>]
998 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +0100999
David Brazdila06d66a2015-05-28 11:14:54 +01001000 /// CHECK-START: int Main.EqualTrueLhs(boolean) instruction_simplifier (after)
1001 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1002 /// CHECK-DAG: If [<<Arg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001003
1004 public static int EqualTrueLhs(boolean arg) {
1005 return (true != arg) ? 3 : 5;
1006 }
1007
David Brazdila06d66a2015-05-28 11:14:54 +01001008 /// CHECK-START: int Main.EqualFalseRhs(boolean) instruction_simplifier (before)
1009 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1010 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
1011 /// CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Const0>>]
1012 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001013
David Brazdila06d66a2015-05-28 11:14:54 +01001014 /// CHECK-START: int Main.EqualFalseRhs(boolean) instruction_simplifier (after)
1015 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1016 /// CHECK-DAG: <<NotArg:z\d+>> BooleanNot [<<Arg>>]
1017 /// CHECK-DAG: If [<<NotArg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001018
1019 public static int EqualFalseRhs(boolean arg) {
1020 return (arg != false) ? 3 : 5;
1021 }
1022
David Brazdila06d66a2015-05-28 11:14:54 +01001023 /// CHECK-START: int Main.EqualFalseLhs(boolean) instruction_simplifier (before)
1024 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1025 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
1026 /// CHECK-DAG: <<Cond:z\d+>> Equal [<<Const0>>,<<Arg>>]
1027 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001028
David Brazdila06d66a2015-05-28 11:14:54 +01001029 /// CHECK-START: int Main.EqualFalseLhs(boolean) instruction_simplifier (after)
1030 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1031 /// CHECK-DAG: <<NotArg:z\d+>> BooleanNot [<<Arg>>]
1032 /// CHECK-DAG: If [<<NotArg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001033
1034 public static int EqualFalseLhs(boolean arg) {
1035 return (false != arg) ? 3 : 5;
1036 }
1037
David Brazdila06d66a2015-05-28 11:14:54 +01001038 /// CHECK-START: int Main.NotEqualTrueRhs(boolean) instruction_simplifier (before)
1039 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1040 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
1041 /// CHECK-DAG: <<Cond:z\d+>> NotEqual [<<Arg>>,<<Const1>>]
1042 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001043
David Brazdila06d66a2015-05-28 11:14:54 +01001044 /// CHECK-START: int Main.NotEqualTrueRhs(boolean) instruction_simplifier (after)
1045 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1046 /// CHECK-DAG: <<NotArg:z\d+>> BooleanNot [<<Arg>>]
1047 /// CHECK-DAG: If [<<NotArg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001048
1049 public static int NotEqualTrueRhs(boolean arg) {
1050 return (arg == true) ? 3 : 5;
1051 }
1052
David Brazdila06d66a2015-05-28 11:14:54 +01001053 /// CHECK-START: int Main.NotEqualTrueLhs(boolean) instruction_simplifier (before)
1054 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1055 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
1056 /// CHECK-DAG: <<Cond:z\d+>> NotEqual [<<Const1>>,<<Arg>>]
1057 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001058
David Brazdila06d66a2015-05-28 11:14:54 +01001059 /// CHECK-START: int Main.NotEqualTrueLhs(boolean) instruction_simplifier (after)
1060 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1061 /// CHECK-DAG: <<NotArg:z\d+>> BooleanNot [<<Arg>>]
1062 /// CHECK-DAG: If [<<NotArg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001063
1064 public static int NotEqualTrueLhs(boolean arg) {
1065 return (true == arg) ? 3 : 5;
1066 }
1067
David Brazdila06d66a2015-05-28 11:14:54 +01001068 /// CHECK-START: int Main.NotEqualFalseRhs(boolean) instruction_simplifier (before)
1069 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1070 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
1071 /// CHECK-DAG: <<Cond:z\d+>> NotEqual [<<Arg>>,<<Const0>>]
1072 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001073
David Brazdila06d66a2015-05-28 11:14:54 +01001074 /// CHECK-START: int Main.NotEqualFalseRhs(boolean) instruction_simplifier (after)
1075 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1076 /// CHECK-DAG: If [<<Arg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001077
1078 public static int NotEqualFalseRhs(boolean arg) {
1079 return (arg == false) ? 3 : 5;
1080 }
1081
David Brazdila06d66a2015-05-28 11:14:54 +01001082 /// CHECK-START: int Main.NotEqualFalseLhs(boolean) instruction_simplifier (before)
1083 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1084 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
1085 /// CHECK-DAG: <<Cond:z\d+>> NotEqual [<<Const0>>,<<Arg>>]
1086 /// CHECK-DAG: If [<<Cond>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001087
David Brazdila06d66a2015-05-28 11:14:54 +01001088 /// CHECK-START: int Main.NotEqualFalseLhs(boolean) instruction_simplifier (after)
1089 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1090 /// CHECK-DAG: If [<<Arg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001091
1092 public static int NotEqualFalseLhs(boolean arg) {
1093 return (false == arg) ? 3 : 5;
1094 }
1095
David Brazdil1e9ec052015-06-22 10:26:45 +01001096 /// CHECK-START: boolean Main.EqualBoolVsIntConst(boolean) instruction_simplifier_after_bce (before)
1097 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1098 /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
1099 /// CHECK-DAG: <<BoolNot:z\d+>> BooleanNot [<<Arg>>]
1100 /// CHECK-DAG: <<Cond:z\d+>> Equal [<<BoolNot>>,<<Const2>>]
1101 /// CHECK-DAG: Return [<<Cond>>]
1102
1103 /// CHECK-START: boolean Main.EqualBoolVsIntConst(boolean) instruction_simplifier_after_bce (after)
1104 /// CHECK-DAG: <<False:i\d+>> IntConstant 0
1105 /// CHECK-DAG: Return [<<False>>]
1106
1107 public static boolean EqualBoolVsIntConst(boolean arg) {
1108 return (arg ? 0 : 1) == 2;
1109 }
1110
1111 /// CHECK-START: boolean Main.NotEqualBoolVsIntConst(boolean) instruction_simplifier_after_bce (before)
1112 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1113 /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
1114 /// CHECK-DAG: <<BoolNot:z\d+>> BooleanNot [<<Arg>>]
1115 /// CHECK-DAG: <<Cond:z\d+>> NotEqual [<<BoolNot>>,<<Const2>>]
1116 /// CHECK-DAG: Return [<<Cond>>]
1117
1118 /// CHECK-START: boolean Main.NotEqualBoolVsIntConst(boolean) instruction_simplifier_after_bce (after)
1119 /// CHECK-DAG: <<True:i\d+>> IntConstant 1
1120 /// CHECK-DAG: Return [<<True>>]
1121
1122 public static boolean NotEqualBoolVsIntConst(boolean arg) {
1123 return (arg ? 0 : 1) != 2;
1124 }
1125
David Brazdil0d13fee2015-04-17 14:52:19 +01001126 /*
1127 * Test simplification of double Boolean negation. Note that sometimes
1128 * both negations can be removed but we only expect the simplifier to
1129 * remove the second.
1130 */
1131
Nicolas Geoffrayb2bdfce2015-06-18 15:46:47 +01001132 /// CHECK-START: boolean Main.NotNotBool(boolean) instruction_simplifier_after_bce (before)
David Brazdila06d66a2015-05-28 11:14:54 +01001133 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1134 /// CHECK-DAG: <<NotArg:z\d+>> BooleanNot [<<Arg>>]
1135 /// CHECK-DAG: <<NotNotArg:z\d+>> BooleanNot [<<NotArg>>]
1136 /// CHECK-DAG: Return [<<NotNotArg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001137
Nicolas Geoffrayb2bdfce2015-06-18 15:46:47 +01001138 /// CHECK-START: boolean Main.NotNotBool(boolean) instruction_simplifier_after_bce (after)
David Brazdila06d66a2015-05-28 11:14:54 +01001139 /// CHECK-DAG: <<Arg:z\d+>> ParameterValue
1140 /// CHECK-DAG: BooleanNot [<<Arg>>]
1141 /// CHECK-DAG: Return [<<Arg>>]
David Brazdil0d13fee2015-04-17 14:52:19 +01001142
Nicolas Geoffrayb2bdfce2015-06-18 15:46:47 +01001143 /// CHECK-START: boolean Main.NotNotBool(boolean) instruction_simplifier_after_bce (after)
David Brazdila06d66a2015-05-28 11:14:54 +01001144 /// CHECK: BooleanNot
1145 /// CHECK-NOT: BooleanNot
David Brazdil0d13fee2015-04-17 14:52:19 +01001146
David Brazdil769c9e52015-04-27 13:54:09 +01001147 public static boolean NegateValue(boolean arg) {
1148 return !arg;
1149 }
1150
David Brazdil0d13fee2015-04-17 14:52:19 +01001151 public static boolean NotNotBool(boolean arg) {
David Brazdil769c9e52015-04-27 13:54:09 +01001152 return !(NegateValue(arg));
David Brazdil0d13fee2015-04-17 14:52:19 +01001153 }
1154
David Brazdila06d66a2015-05-28 11:14:54 +01001155 /// CHECK-START: float Main.Div2(float) instruction_simplifier (before)
1156 /// CHECK-DAG: <<Arg:f\d+>> ParameterValue
1157 /// CHECK-DAG: <<Const2:f\d+>> FloatConstant 2
1158 /// CHECK-DAG: <<Div:f\d+>> Div [<<Arg>>,<<Const2>>]
1159 /// CHECK-DAG: Return [<<Div>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001160
David Brazdila06d66a2015-05-28 11:14:54 +01001161 /// CHECK-START: float Main.Div2(float) instruction_simplifier (after)
1162 /// CHECK-DAG: <<Arg:f\d+>> ParameterValue
1163 /// CHECK-DAG: <<ConstP5:f\d+>> FloatConstant 0.5
1164 /// CHECK-DAG: <<Mul:f\d+>> Mul [<<Arg>>,<<ConstP5>>]
1165 /// CHECK-DAG: Return [<<Mul>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001166
David Brazdila06d66a2015-05-28 11:14:54 +01001167 /// CHECK-START: float Main.Div2(float) instruction_simplifier (after)
1168 /// CHECK-NOT: Div
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001169
1170 public static float Div2(float arg) {
1171 return arg / 2.0f;
1172 }
1173
David Brazdila06d66a2015-05-28 11:14:54 +01001174 /// CHECK-START: double Main.Div2(double) instruction_simplifier (before)
1175 /// CHECK-DAG: <<Arg:d\d+>> ParameterValue
1176 /// CHECK-DAG: <<Const2:d\d+>> DoubleConstant 2
1177 /// CHECK-DAG: <<Div:d\d+>> Div [<<Arg>>,<<Const2>>]
1178 /// CHECK-DAG: Return [<<Div>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001179
David Brazdila06d66a2015-05-28 11:14:54 +01001180 /// CHECK-START: double Main.Div2(double) instruction_simplifier (after)
1181 /// CHECK-DAG: <<Arg:d\d+>> ParameterValue
1182 /// CHECK-DAG: <<ConstP5:d\d+>> DoubleConstant 0.5
1183 /// CHECK-DAG: <<Mul:d\d+>> Mul [<<Arg>>,<<ConstP5>>]
1184 /// CHECK-DAG: Return [<<Mul>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001185
David Brazdila06d66a2015-05-28 11:14:54 +01001186 /// CHECK-START: double Main.Div2(double) instruction_simplifier (after)
1187 /// CHECK-NOT: Div
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001188 public static double Div2(double arg) {
1189 return arg / 2.0;
1190 }
1191
David Brazdila06d66a2015-05-28 11:14:54 +01001192 /// CHECK-START: float Main.DivMP25(float) instruction_simplifier (before)
1193 /// CHECK-DAG: <<Arg:f\d+>> ParameterValue
1194 /// CHECK-DAG: <<ConstMP25:f\d+>> FloatConstant -0.25
1195 /// CHECK-DAG: <<Div:f\d+>> Div [<<Arg>>,<<ConstMP25>>]
1196 /// CHECK-DAG: Return [<<Div>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001197
David Brazdila06d66a2015-05-28 11:14:54 +01001198 /// CHECK-START: float Main.DivMP25(float) instruction_simplifier (after)
1199 /// CHECK-DAG: <<Arg:f\d+>> ParameterValue
1200 /// CHECK-DAG: <<ConstM4:f\d+>> FloatConstant -4
1201 /// CHECK-DAG: <<Mul:f\d+>> Mul [<<Arg>>,<<ConstM4>>]
1202 /// CHECK-DAG: Return [<<Mul>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001203
David Brazdila06d66a2015-05-28 11:14:54 +01001204 /// CHECK-START: float Main.DivMP25(float) instruction_simplifier (after)
1205 /// CHECK-NOT: Div
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001206
1207 public static float DivMP25(float arg) {
1208 return arg / -0.25f;
1209 }
1210
David Brazdila06d66a2015-05-28 11:14:54 +01001211 /// CHECK-START: double Main.DivMP25(double) instruction_simplifier (before)
1212 /// CHECK-DAG: <<Arg:d\d+>> ParameterValue
1213 /// CHECK-DAG: <<ConstMP25:d\d+>> DoubleConstant -0.25
1214 /// CHECK-DAG: <<Div:d\d+>> Div [<<Arg>>,<<ConstMP25>>]
1215 /// CHECK-DAG: Return [<<Div>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001216
David Brazdila06d66a2015-05-28 11:14:54 +01001217 /// CHECK-START: double Main.DivMP25(double) instruction_simplifier (after)
1218 /// CHECK-DAG: <<Arg:d\d+>> ParameterValue
1219 /// CHECK-DAG: <<ConstM4:d\d+>> DoubleConstant -4
1220 /// CHECK-DAG: <<Mul:d\d+>> Mul [<<Arg>>,<<ConstM4>>]
1221 /// CHECK-DAG: Return [<<Mul>>]
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001222
David Brazdila06d66a2015-05-28 11:14:54 +01001223 /// CHECK-START: double Main.DivMP25(double) instruction_simplifier (after)
1224 /// CHECK-NOT: Div
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001225 public static double DivMP25(double arg) {
1226 return arg / -0.25f;
1227 }
1228
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +00001229 public static void main(String[] args) {
1230 int arg = 123456;
1231
1232 assertLongEquals(Add0(arg), arg);
1233 assertIntEquals(AndAllOnes(arg), arg);
1234 assertLongEquals(Div1(arg), arg);
1235 assertIntEquals(DivN1(arg), -arg);
1236 assertLongEquals(Mul1(arg), arg);
1237 assertIntEquals(MulN1(arg), -arg);
1238 assertLongEquals(MulPowerOfTwo128(arg), (128 * arg));
1239 assertIntEquals(Or0(arg), arg);
1240 assertLongEquals(OrSame(arg), arg);
1241 assertIntEquals(Shl0(arg), arg);
1242 assertLongEquals(Shr0(arg), arg);
1243 assertLongEquals(Sub0(arg), arg);
1244 assertIntEquals(SubAliasNeg(arg), -arg);
1245 assertLongEquals(UShr0(arg), arg);
1246 assertIntEquals(Xor0(arg), arg);
1247 assertIntEquals(XorAllOnes(arg), ~arg);
Alexandre Rames188d4312015-04-09 18:30:21 +01001248 assertIntEquals(AddNegs1(arg, arg + 1), -(arg + arg + 1));
1249 assertIntEquals(AddNegs2(arg, arg + 1), -(arg + arg + 1));
1250 assertLongEquals(AddNegs3(arg, arg + 1), -(2 * arg + 1));
1251 assertLongEquals(AddNeg1(arg, arg + 1), 1);
1252 assertLongEquals(AddNeg2(arg, arg + 1), -1);
1253 assertLongEquals(NegNeg1(arg), arg);
1254 assertIntEquals(NegNeg2(arg), 0);
1255 assertLongEquals(NegNeg3(arg), arg);
1256 assertIntEquals(NegSub1(arg, arg + 1), 1);
1257 assertIntEquals(NegSub2(arg, arg + 1), 1);
1258 assertLongEquals(NotNot1(arg), arg);
1259 assertIntEquals(NotNot2(arg), -1);
1260 assertIntEquals(SubNeg1(arg, arg + 1), -(arg + arg + 1));
1261 assertIntEquals(SubNeg2(arg, arg + 1), -(arg + arg + 1));
1262 assertLongEquals(SubNeg3(arg, arg + 1), -(2 * arg + 1));
David Brazdil0d13fee2015-04-17 14:52:19 +01001263 assertIntEquals(EqualTrueRhs(true), 5);
1264 assertIntEquals(EqualTrueLhs(true), 5);
1265 assertIntEquals(EqualFalseRhs(true), 3);
1266 assertIntEquals(EqualFalseLhs(true), 3);
1267 assertIntEquals(NotEqualTrueRhs(true), 3);
1268 assertIntEquals(NotEqualTrueLhs(true), 3);
1269 assertIntEquals(NotEqualFalseRhs(true), 5);
1270 assertIntEquals(NotEqualFalseLhs(true), 5);
1271 assertBooleanEquals(NotNotBool(true), true);
1272 assertBooleanEquals(NotNotBool(false), false);
Nicolas Geoffray0d221842015-04-27 08:53:46 +00001273 assertFloatEquals(Div2(100.0f), 50.0f);
1274 assertDoubleEquals(Div2(150.0), 75.0);
1275 assertFloatEquals(DivMP25(100.0f), -400.0f);
1276 assertDoubleEquals(DivMP25(150.0), -600.0);
Mark Mendellba56d062015-05-05 21:34:03 -04001277 assertLongEquals(Shl1(100), 200);
Vladimir Marko452c1b62015-09-25 14:44:17 +01001278 assertIntEquals(UShr28And15(0xc1234567), 0xc);
1279 assertLongEquals(UShr60And15(0xc123456787654321L), 0xcL);
1280 assertIntEquals(UShr28And7(0xc1234567), 0x4);
1281 assertLongEquals(UShr60And7(0xc123456787654321L), 0x4L);
1282 assertIntEquals(Shr24And255(0xc1234567), 0xc1);
1283 assertLongEquals(Shr56And255(0xc123456787654321L), 0xc1L);
1284 assertIntEquals(Shr24And127(0xc1234567), 0x41);
1285 assertLongEquals(Shr56And127(0xc123456787654321L), 0x41L);
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +00001286 }
1287}