blob: 65be6cb4c473bb27c3f48f38e8baaaef5d140232 [file] [log] [blame]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +00001/*
2* 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*/
16
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
37 /**
38 * Tiny programs exercising optimizations of arithmetic identities.
39 */
40
41 // CHECK-START: long Main.Add0(long) instruction_simplifier (before)
42 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
43 // CHECK-DAG: [[Const0:j\d+]] LongConstant 0
44 // CHECK-DAG: [[Add:j\d+]] Add [ [[Const0]] [[Arg]] ]
45 // CHECK-DAG: Return [ [[Add]] ]
46
47 // CHECK-START: long Main.Add0(long) instruction_simplifier (after)
48 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000049 // CHECK-DAG: Return [ [[Arg]] ]
David Brazdil0d13fee2015-04-17 14:52:19 +010050
Alexandre Rames74417692015-04-09 15:21:41 +010051 // CHECK-START: long Main.Add0(long) instruction_simplifier (after)
52 // CHECK-NOT: Add
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000053
54 public static long Add0(long arg) {
55 return 0 + arg;
56 }
57
58 // CHECK-START: int Main.AndAllOnes(int) instruction_simplifier (before)
59 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
60 // CHECK-DAG: [[ConstF:i\d+]] IntConstant -1
61 // CHECK-DAG: [[And:i\d+]] And [ [[Arg]] [[ConstF]] ]
62 // CHECK-DAG: Return [ [[And]] ]
63
64 // CHECK-START: int Main.AndAllOnes(int) instruction_simplifier (after)
65 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000066 // CHECK-DAG: Return [ [[Arg]] ]
67
Alexandre Rames74417692015-04-09 15:21:41 +010068 // CHECK-START: int Main.AndAllOnes(int) instruction_simplifier (after)
69 // CHECK-NOT: And
70
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000071 public static int AndAllOnes(int arg) {
72 return arg & -1;
73 }
74
75 // CHECK-START: long Main.Div1(long) instruction_simplifier (before)
76 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
77 // CHECK-DAG: [[Const1:j\d+]] LongConstant 1
78 // CHECK-DAG: [[Div:j\d+]] Div [ [[Arg]] [[Const1]] ]
79 // CHECK-DAG: Return [ [[Div]] ]
80
81 // CHECK-START: long Main.Div1(long) instruction_simplifier (after)
82 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000083 // CHECK-DAG: Return [ [[Arg]] ]
84
Alexandre Rames74417692015-04-09 15:21:41 +010085 // CHECK-START: long Main.Div1(long) instruction_simplifier (after)
86 // CHECK-NOT: Div
87
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +000088 public static long Div1(long arg) {
89 return arg / 1;
90 }
91
92 // CHECK-START: int Main.DivN1(int) instruction_simplifier (before)
93 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
94 // CHECK-DAG: [[ConstN1:i\d+]] IntConstant -1
95 // CHECK-DAG: [[Div:i\d+]] Div [ [[Arg]] [[ConstN1]] ]
96 // CHECK-DAG: Return [ [[Div]] ]
97
98 // CHECK-START: int Main.DivN1(int) instruction_simplifier (after)
99 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
100 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Arg]] ]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000101 // CHECK-DAG: Return [ [[Neg]] ]
102
Alexandre Rames74417692015-04-09 15:21:41 +0100103 // CHECK-START: int Main.DivN1(int) instruction_simplifier (after)
104 // CHECK-NOT: Div
105
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000106 public static int DivN1(int arg) {
107 return arg / -1;
108 }
109
110 // CHECK-START: long Main.Mul1(long) instruction_simplifier (before)
111 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
112 // CHECK-DAG: [[Const1:j\d+]] LongConstant 1
113 // CHECK-DAG: [[Mul:j\d+]] Mul [ [[Arg]] [[Const1]] ]
114 // CHECK-DAG: Return [ [[Mul]] ]
115
116 // CHECK-START: long Main.Mul1(long) instruction_simplifier (after)
117 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000118 // CHECK-DAG: Return [ [[Arg]] ]
119
Alexandre Rames74417692015-04-09 15:21:41 +0100120 // CHECK-START: long Main.Mul1(long) instruction_simplifier (after)
121 // CHECK-NOT: Mul
122
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000123 public static long Mul1(long arg) {
124 return arg * 1;
125 }
126
127 // CHECK-START: int Main.MulN1(int) instruction_simplifier (before)
128 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
129 // CHECK-DAG: [[ConstN1:i\d+]] IntConstant -1
130 // CHECK-DAG: [[Mul:i\d+]] Mul [ [[Arg]] [[ConstN1]] ]
131 // CHECK-DAG: Return [ [[Mul]] ]
132
133 // CHECK-START: int Main.MulN1(int) instruction_simplifier (after)
134 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
135 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Arg]] ]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000136 // CHECK-DAG: Return [ [[Neg]] ]
137
Alexandre Rames74417692015-04-09 15:21:41 +0100138 // CHECK-START: int Main.MulN1(int) instruction_simplifier (after)
139 // CHECK-NOT: Mul
140
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000141 public static int MulN1(int arg) {
142 return arg * -1;
143 }
144
145 // CHECK-START: long Main.MulPowerOfTwo128(long) instruction_simplifier (before)
146 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
147 // CHECK-DAG: [[Const128:j\d+]] LongConstant 128
148 // CHECK-DAG: [[Mul:j\d+]] Mul [ [[Arg]] [[Const128]] ]
149 // CHECK-DAG: Return [ [[Mul]] ]
150
151 // CHECK-START: long Main.MulPowerOfTwo128(long) instruction_simplifier (after)
152 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
153 // CHECK-DAG: [[Const7:i\d+]] IntConstant 7
154 // CHECK-DAG: [[Shl:j\d+]] Shl [ [[Arg]] [[Const7]] ]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000155 // CHECK-DAG: Return [ [[Shl]] ]
156
Alexandre Rames74417692015-04-09 15:21:41 +0100157 // CHECK-START: long Main.MulPowerOfTwo128(long) instruction_simplifier (after)
158 // CHECK-NOT: Mul
159
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000160 public static long MulPowerOfTwo128(long arg) {
161 return arg * 128;
162 }
163
164 // CHECK-START: int Main.Or0(int) instruction_simplifier (before)
165 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
166 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
167 // CHECK-DAG: [[Or:i\d+]] Or [ [[Arg]] [[Const0]] ]
168 // CHECK-DAG: Return [ [[Or]] ]
169
170 // CHECK-START: int Main.Or0(int) instruction_simplifier (after)
171 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000172 // CHECK-DAG: Return [ [[Arg]] ]
173
Alexandre Rames74417692015-04-09 15:21:41 +0100174 // CHECK-START: int Main.Or0(int) instruction_simplifier (after)
175 // CHECK-NOT: Or
176
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000177 public static int Or0(int arg) {
178 return arg | 0;
179 }
180
181 // CHECK-START: long Main.OrSame(long) instruction_simplifier (before)
182 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
183 // CHECK-DAG: [[Or:j\d+]] Or [ [[Arg]] [[Arg]] ]
184 // CHECK-DAG: Return [ [[Or]] ]
185
186 // CHECK-START: long Main.OrSame(long) instruction_simplifier (after)
187 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000188 // CHECK-DAG: Return [ [[Arg]] ]
189
Alexandre Rames74417692015-04-09 15:21:41 +0100190 // CHECK-START: long Main.OrSame(long) instruction_simplifier (after)
191 // CHECK-NOT: Or
192
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000193 public static long OrSame(long arg) {
194 return arg | arg;
195 }
196
197 // CHECK-START: int Main.Shl0(int) instruction_simplifier (before)
198 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
199 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
200 // CHECK-DAG: [[Shl:i\d+]] Shl [ [[Arg]] [[Const0]] ]
201 // CHECK-DAG: Return [ [[Shl]] ]
202
203 // CHECK-START: int Main.Shl0(int) instruction_simplifier (after)
204 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000205 // CHECK-DAG: Return [ [[Arg]] ]
206
Alexandre Rames74417692015-04-09 15:21:41 +0100207 // CHECK-START: int Main.Shl0(int) instruction_simplifier (after)
208 // CHECK-NOT: Shl
209
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000210 public static int Shl0(int arg) {
211 return arg << 0;
212 }
213
214 // CHECK-START: long Main.Shr0(long) instruction_simplifier (before)
215 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
216 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
217 // CHECK-DAG: [[Shr:j\d+]] Shr [ [[Arg]] [[Const0]] ]
218 // CHECK-DAG: Return [ [[Shr]] ]
219
220 // CHECK-START: long Main.Shr0(long) instruction_simplifier (after)
221 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000222 // CHECK-DAG: Return [ [[Arg]] ]
223
Alexandre Rames74417692015-04-09 15:21:41 +0100224 // CHECK-START: long Main.Shr0(long) instruction_simplifier (after)
225 // CHECK-NOT: Shr
226
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000227 public static long Shr0(long arg) {
228 return arg >> 0;
229 }
230
231 // CHECK-START: long Main.Sub0(long) instruction_simplifier (before)
232 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
233 // CHECK-DAG: [[Const0:j\d+]] LongConstant 0
234 // CHECK-DAG: [[Sub:j\d+]] Sub [ [[Arg]] [[Const0]] ]
235 // CHECK-DAG: Return [ [[Sub]] ]
236
237 // CHECK-START: long Main.Sub0(long) instruction_simplifier (after)
238 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000239 // CHECK-DAG: Return [ [[Arg]] ]
240
Alexandre Rames74417692015-04-09 15:21:41 +0100241 // CHECK-START: long Main.Sub0(long) instruction_simplifier (after)
242 // CHECK-NOT: Sub
243
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000244 public static long Sub0(long arg) {
245 return arg - 0;
246 }
247
248 // CHECK-START: int Main.SubAliasNeg(int) instruction_simplifier (before)
249 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
250 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
251 // CHECK-DAG: [[Sub:i\d+]] Sub [ [[Const0]] [[Arg]] ]
252 // CHECK-DAG: Return [ [[Sub]] ]
253
254 // CHECK-START: int Main.SubAliasNeg(int) instruction_simplifier (after)
255 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
256 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Arg]] ]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000257 // CHECK-DAG: Return [ [[Neg]] ]
258
Alexandre Rames74417692015-04-09 15:21:41 +0100259 // CHECK-START: int Main.SubAliasNeg(int) instruction_simplifier (after)
260 // CHECK-NOT: Sub
261
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000262 public static int SubAliasNeg(int arg) {
263 return 0 - arg;
264 }
265
266 // CHECK-START: long Main.UShr0(long) instruction_simplifier (before)
267 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
268 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
269 // CHECK-DAG: [[UShr:j\d+]] UShr [ [[Arg]] [[Const0]] ]
270 // CHECK-DAG: Return [ [[UShr]] ]
271
272 // CHECK-START: long Main.UShr0(long) instruction_simplifier (after)
273 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000274 // CHECK-DAG: Return [ [[Arg]] ]
275
Alexandre Rames74417692015-04-09 15:21:41 +0100276 // CHECK-START: long Main.UShr0(long) instruction_simplifier (after)
277 // CHECK-NOT: UShr
278
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000279 public static long UShr0(long arg) {
280 return arg >>> 0;
281 }
282
283 // CHECK-START: int Main.Xor0(int) instruction_simplifier (before)
284 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
285 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
286 // CHECK-DAG: [[Xor:i\d+]] Xor [ [[Arg]] [[Const0]] ]
287 // CHECK-DAG: Return [ [[Xor]] ]
288
289 // CHECK-START: int Main.Xor0(int) instruction_simplifier (after)
290 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000291 // CHECK-DAG: Return [ [[Arg]] ]
292
Alexandre Rames74417692015-04-09 15:21:41 +0100293 // CHECK-START: int Main.Xor0(int) instruction_simplifier (after)
294 // CHECK-NOT: Xor
295
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000296 public static int Xor0(int arg) {
297 return arg ^ 0;
298 }
299
300 // CHECK-START: int Main.XorAllOnes(int) instruction_simplifier (before)
301 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
302 // CHECK-DAG: [[ConstF:i\d+]] IntConstant -1
303 // CHECK-DAG: [[Xor:i\d+]] Xor [ [[Arg]] [[ConstF]] ]
304 // CHECK-DAG: Return [ [[Xor]] ]
305
306 // CHECK-START: int Main.XorAllOnes(int) instruction_simplifier (after)
307 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
308 // CHECK-DAG: [[Not:i\d+]] Not [ [[Arg]] ]
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000309 // CHECK-DAG: Return [ [[Not]] ]
310
Alexandre Rames74417692015-04-09 15:21:41 +0100311 // CHECK-START: int Main.XorAllOnes(int) instruction_simplifier (after)
312 // CHECK-NOT: Xor
313
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000314 public static int XorAllOnes(int arg) {
315 return arg ^ -1;
316 }
317
Alexandre Rames188d4312015-04-09 18:30:21 +0100318 /**
319 * Test that addition or subtraction operation with both inputs negated are
320 * optimized to use a single negation after the operation.
321 * The transformation tested is implemented in
322 * `InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop`.
323 */
324
325 // CHECK-START: int Main.AddNegs1(int, int) instruction_simplifier (before)
326 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
327 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
328 // CHECK-DAG: [[Neg1:i\d+]] Neg [ [[Arg1]] ]
329 // CHECK-DAG: [[Neg2:i\d+]] Neg [ [[Arg2]] ]
330 // CHECK-DAG: [[Add:i\d+]] Add [ [[Neg1]] [[Neg2]] ]
331 // CHECK-DAG: Return [ [[Add]] ]
332
333 // CHECK-START: int Main.AddNegs1(int, int) instruction_simplifier (after)
334 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
335 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
336 // CHECK-NOT: Neg
337 // CHECK-DAG: [[Add:i\d+]] Add [ [[Arg1]] [[Arg2]] ]
338 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Add]] ]
339 // CHECK-DAG: Return [ [[Neg]] ]
340
341 public static int AddNegs1(int arg1, int arg2) {
342 return -arg1 + -arg2;
343 }
344
345 /**
346 * This is similar to the test-case AddNegs1, but the negations have
347 * multiple uses.
348 * The transformation tested is implemented in
349 * `InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop`.
350 * The current code won't perform the previous optimization. The
351 * transformations do not look at other uses of their inputs. As they don't
352 * know what will happen with other uses, they do not take the risk of
353 * increasing the register pressure by creating or extending live ranges.
354 */
355
356 // CHECK-START: int Main.AddNegs2(int, int) instruction_simplifier (before)
357 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
358 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
359 // CHECK-DAG: [[Neg1:i\d+]] Neg [ [[Arg1]] ]
360 // CHECK-DAG: [[Neg2:i\d+]] Neg [ [[Arg2]] ]
361 // CHECK-DAG: [[Add1:i\d+]] Add [ [[Neg1]] [[Neg2]] ]
362 // CHECK-DAG: [[Add2:i\d+]] Add [ [[Neg1]] [[Neg2]] ]
363 // CHECK-DAG: [[Or:i\d+]] Or [ [[Add1]] [[Add2]] ]
364 // CHECK-DAG: Return [ [[Or]] ]
365
366 // CHECK-START: int Main.AddNegs2(int, int) instruction_simplifier (after)
367 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
368 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
369 // CHECK-DAG: [[Neg1:i\d+]] Neg [ [[Arg1]] ]
370 // CHECK-DAG: [[Neg2:i\d+]] Neg [ [[Arg2]] ]
371 // CHECK-DAG: [[Add1:i\d+]] Add [ [[Neg1]] [[Neg2]] ]
372 // CHECK-DAG: [[Add2:i\d+]] Add [ [[Neg1]] [[Neg2]] ]
373 // CHECK-NOT: Neg
374 // CHECK-DAG: [[Or:i\d+]] Or [ [[Add1]] [[Add2]] ]
375 // CHECK-DAG: Return [ [[Or]] ]
376
377 public static int AddNegs2(int arg1, int arg2) {
378 int temp1 = -arg1;
379 int temp2 = -arg2;
380 return (temp1 + temp2) | (temp1 + temp2);
381 }
382
383 /**
384 * This follows test-cases AddNegs1 and AddNegs2.
385 * The transformation tested is implemented in
386 * `InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop`.
387 * The optimization should not happen if it moves an additional instruction in
388 * the loop.
389 */
390
391 // CHECK-START: long Main.AddNegs3(long, long) instruction_simplifier (before)
392 // -------------- Arguments and initial negation operations.
393 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
394 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
395 // CHECK-DAG: [[Neg1:j\d+]] Neg [ [[Arg1]] ]
396 // CHECK-DAG: [[Neg2:j\d+]] Neg [ [[Arg2]] ]
397 // CHECK: Goto
398 // -------------- Loop
399 // CHECK: SuspendCheck
400 // CHECK: [[Add:j\d+]] Add [ [[Neg1]] [[Neg2]] ]
401 // CHECK: Goto
402
403 // CHECK-START: long Main.AddNegs3(long, long) instruction_simplifier (after)
404 // -------------- Arguments and initial negation operations.
405 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
406 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
407 // CHECK-DAG: [[Neg1:j\d+]] Neg [ [[Arg1]] ]
408 // CHECK-DAG: [[Neg2:j\d+]] Neg [ [[Arg2]] ]
409 // CHECK: Goto
410 // -------------- Loop
411 // CHECK: SuspendCheck
412 // CHECK: [[Add:j\d+]] Add [ [[Neg1]] [[Neg2]] ]
413 // CHECK-NOT: Neg
414 // CHECK: Goto
415
416 public static long AddNegs3(long arg1, long arg2) {
417 long res = 0;
418 long n_arg1 = -arg1;
419 long n_arg2 = -arg2;
420 for (long i = 0; i < 1; i++) {
421 res += n_arg1 + n_arg2 + i;
422 }
423 return res;
424 }
425
426 /**
427 * Test the simplification of an addition with a negated argument into a
428 * subtraction.
429 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitAdd`.
430 */
431
432 // CHECK-START: long Main.AddNeg1(long, long) instruction_simplifier (before)
433 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
434 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
435 // CHECK-DAG: [[Neg:j\d+]] Neg [ [[Arg1]] ]
436 // CHECK-DAG: [[Add:j\d+]] Add [ [[Neg]] [[Arg2]] ]
437 // CHECK-DAG: Return [ [[Add]] ]
438
439 // CHECK-START: long Main.AddNeg1(long, long) instruction_simplifier (after)
440 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
441 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
442 // CHECK-DAG: [[Sub:j\d+]] Sub [ [[Arg2]] [[Arg1]] ]
443 // CHECK-DAG: Return [ [[Sub]] ]
444
445 // CHECK-START: long Main.AddNeg1(long, long) instruction_simplifier (after)
446 // CHECK-NOT: Neg
447 // CHECK-NOT: Add
448
449 public static long AddNeg1(long arg1, long arg2) {
450 return -arg1 + arg2;
451 }
452
453 /**
454 * This is similar to the test-case AddNeg1, but the negation has two uses.
455 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitAdd`.
456 * The current code won't perform the previous optimization. The
457 * transformations do not look at other uses of their inputs. As they don't
458 * know what will happen with other uses, they do not take the risk of
459 * increasing the register pressure by creating or extending live ranges.
460 */
461
462 // CHECK-START: long Main.AddNeg2(long, long) instruction_simplifier (before)
463 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
464 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
465 // CHECK-DAG: [[Neg:j\d+]] Neg [ [[Arg2]] ]
466 // CHECK-DAG: [[Add1:j\d+]] Add [ [[Arg1]] [[Neg]] ]
467 // CHECK-DAG: [[Add2:j\d+]] Add [ [[Arg1]] [[Neg]] ]
468 // CHECK-DAG: [[Res:j\d+]] Or [ [[Add1]] [[Add2]] ]
469 // CHECK-DAG: Return [ [[Res]] ]
470
471 // CHECK-START: long Main.AddNeg2(long, long) instruction_simplifier (after)
472 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
473 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
474 // CHECK-DAG: [[Neg:j\d+]] Neg [ [[Arg2]] ]
475 // CHECK-DAG: [[Add1:j\d+]] Add [ [[Arg1]] [[Neg]] ]
476 // CHECK-DAG: [[Add2:j\d+]] Add [ [[Arg1]] [[Neg]] ]
477 // CHECK-DAG: [[Res:j\d+]] Or [ [[Add1]] [[Add2]] ]
478 // CHECK-DAG: Return [ [[Res]] ]
479
480 // CHECK-START: long Main.AddNeg2(long, long) instruction_simplifier (after)
481 // CHECK-NOT: Sub
482
483 public static long AddNeg2(long arg1, long arg2) {
484 long temp = -arg2;
485 return (arg1 + temp) | (arg1 + temp);
486 }
487
488 /**
489 * Test simplification of the `-(-var)` pattern.
490 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNeg`.
491 */
492
493 // CHECK-START: long Main.NegNeg1(long) instruction_simplifier (before)
494 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
495 // CHECK-DAG: [[Neg1:j\d+]] Neg [ [[Arg]] ]
496 // CHECK-DAG: [[Neg2:j\d+]] Neg [ [[Neg1]] ]
497 // CHECK-DAG: Return [ [[Neg2]] ]
498
499 // CHECK-START: long Main.NegNeg1(long) instruction_simplifier (after)
500 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
501 // CHECK-DAG: Return [ [[Arg]] ]
502
503 // CHECK-START: long Main.NegNeg1(long) instruction_simplifier (after)
504 // CHECK-NOT: Neg
505
506 public static long NegNeg1(long arg) {
507 return -(-arg);
508 }
509
510 /**
511 * Test 'multi-step' simplification, where a first transformation yields a
512 * new simplification possibility for the current instruction.
513 * The transformations tested are implemented in `InstructionSimplifierVisitor::VisitNeg`
514 * and in `InstructionSimplifierVisitor::VisitAdd`.
515 */
516
517 // CHECK-START: int Main.NegNeg2(int) instruction_simplifier (before)
518 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
519 // CHECK-DAG: [[Neg1:i\d+]] Neg [ [[Arg]] ]
520 // CHECK-DAG: [[Neg2:i\d+]] Neg [ [[Neg1]] ]
521 // CHECK-DAG: [[Add:i\d+]] Add [ [[Neg1]] [[Neg2]] ]
522 // CHECK-DAG: Return [ [[Add]] ]
523
524 // CHECK-START: int Main.NegNeg2(int) instruction_simplifier (after)
525 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
526 // CHECK-DAG: [[Sub:i\d+]] Sub [ [[Arg]] [[Arg]] ]
527 // CHECK-DAG: Return [ [[Sub]] ]
528
529 // CHECK-START: int Main.NegNeg2(int) instruction_simplifier (after)
530 // CHECK-NOT: Neg
531 // CHECK-NOT: Add
532
533 public static int NegNeg2(int arg) {
534 int temp = -arg;
535 return temp + -temp;
536 }
537
538 /**
539 * Test another 'multi-step' simplification, where a first transformation
540 * yields a new simplification possibility for the current instruction.
541 * The transformations tested are implemented in `InstructionSimplifierVisitor::VisitNeg`
542 * and in `InstructionSimplifierVisitor::VisitSub`.
543 */
544
545 // CHECK-START: long Main.NegNeg3(long) instruction_simplifier (before)
546 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
547 // CHECK-DAG: [[Const0:j\d+]] LongConstant 0
548 // CHECK-DAG: [[Neg:j\d+]] Neg [ [[Arg]] ]
549 // CHECK-DAG: [[Sub:j\d+]] Sub [ [[Const0]] [[Neg]] ]
550 // CHECK-DAG: Return [ [[Sub]] ]
551
552 // CHECK-START: long Main.NegNeg3(long) instruction_simplifier (after)
553 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
554 // CHECK-DAG: Return [ [[Arg]] ]
555
556 // CHECK-START: long Main.NegNeg3(long) instruction_simplifier (after)
557 // CHECK-NOT: Neg
558 // CHECK-NOT: Sub
559
560 public static long NegNeg3(long arg) {
561 return 0 - -arg;
562 }
563
564 /**
565 * Test that a negated subtraction is simplified to a subtraction with its
566 * arguments reversed.
567 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNeg`.
568 */
569
570 // CHECK-START: int Main.NegSub1(int, int) instruction_simplifier (before)
571 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
572 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
573 // CHECK-DAG: [[Sub:i\d+]] Sub [ [[Arg1]] [[Arg2]] ]
574 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Sub]] ]
575 // CHECK-DAG: Return [ [[Neg]] ]
576
577 // CHECK-START: int Main.NegSub1(int, int) instruction_simplifier (after)
578 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
579 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
580 // CHECK-DAG: [[Sub:i\d+]] Sub [ [[Arg2]] [[Arg1]] ]
581 // CHECK-DAG: Return [ [[Sub]] ]
582
583 // CHECK-START: int Main.NegSub1(int, int) instruction_simplifier (after)
584 // CHECK-NOT: Neg
585
586 public static int NegSub1(int arg1, int arg2) {
587 return -(arg1 - arg2);
588 }
589
590 /**
591 * This is similar to the test-case NegSub1, but the subtraction has
592 * multiple uses.
593 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNeg`.
594 * The current code won't perform the previous optimization. The
595 * transformations do not look at other uses of their inputs. As they don't
596 * know what will happen with other uses, they do not take the risk of
597 * increasing the register pressure by creating or extending live ranges.
598 */
599
600 // CHECK-START: int Main.NegSub2(int, int) instruction_simplifier (before)
601 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
602 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
603 // CHECK-DAG: [[Sub:i\d+]] Sub [ [[Arg1]] [[Arg2]] ]
604 // CHECK-DAG: [[Neg1:i\d+]] Neg [ [[Sub]] ]
605 // CHECK-DAG: [[Neg2:i\d+]] Neg [ [[Sub]] ]
606 // CHECK-DAG: [[Or:i\d+]] Or [ [[Neg1]] [[Neg2]] ]
607 // CHECK-DAG: Return [ [[Or]] ]
608
609 // CHECK-START: int Main.NegSub2(int, int) instruction_simplifier (after)
610 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
611 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
612 // CHECK-DAG: [[Sub:i\d+]] Sub [ [[Arg1]] [[Arg2]] ]
613 // CHECK-DAG: [[Neg1:i\d+]] Neg [ [[Sub]] ]
614 // CHECK-DAG: [[Neg2:i\d+]] Neg [ [[Sub]] ]
615 // CHECK-DAG: [[Or:i\d+]] Or [ [[Neg1]] [[Neg2]] ]
616 // CHECK-DAG: Return [ [[Or]] ]
617
618 public static int NegSub2(int arg1, int arg2) {
619 int temp = arg1 - arg2;
620 return -temp | -temp;
621 }
622
623 /**
624 * Test simplification of the `~~var` pattern.
625 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNot`.
626 */
627
628 // CHECK-START: long Main.NotNot1(long) instruction_simplifier (before)
629 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
630 // CHECK-DAG: [[ConstF1:j\d+]] LongConstant -1
631 // CHECK-DAG: [[Xor1:j\d+]] Xor [ [[Arg]] [[ConstF1]] ]
632 // CHECK-DAG: [[Xor2:j\d+]] Xor [ [[Xor1]] [[ConstF1]] ]
633 // CHECK-DAG: Return [ [[Xor2]] ]
634
635 // CHECK-START: long Main.NotNot1(long) instruction_simplifier (after)
636 // CHECK-DAG: [[Arg:j\d+]] ParameterValue
637 // CHECK-DAG: Return [ [[Arg]] ]
638
639 // CHECK-START: long Main.NotNot1(long) instruction_simplifier (after)
640 // CHECK-NOT: Xor
641
642 public static long NotNot1(long arg) {
643 return ~~arg;
644 }
645
646 // CHECK-START: int Main.NotNot2(int) instruction_simplifier (before)
647 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
648 // CHECK-DAG: [[ConstF1:i\d+]] IntConstant -1
649 // CHECK-DAG: [[Xor1:i\d+]] Xor [ [[Arg]] [[ConstF1]] ]
650 // CHECK-DAG: [[Xor2:i\d+]] Xor [ [[Xor1]] [[ConstF1]] ]
651 // CHECK-DAG: [[Add:i\d+]] Add [ [[Xor1]] [[Xor2]] ]
652 // CHECK-DAG: Return [ [[Add]] ]
653
654 // CHECK-START: int Main.NotNot2(int) instruction_simplifier (after)
655 // CHECK-DAG: [[Arg:i\d+]] ParameterValue
656 // CHECK-DAG: [[Not:i\d+]] Not [ [[Arg]] ]
657 // CHECK-DAG: [[Add:i\d+]] Add [ [[Not]] [[Arg]] ]
658 // CHECK-DAG: Return [ [[Add]] ]
659
660 // CHECK-START: int Main.NotNot2(int) instruction_simplifier (after)
661 // CHECK-NOT: Xor
662
663 public static int NotNot2(int arg) {
664 int temp = ~arg;
665 return temp + ~temp;
666 }
667
668 /**
669 * Test the simplification of a subtraction with a negated argument.
670 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitSub`.
671 */
672
673 // CHECK-START: int Main.SubNeg1(int, int) instruction_simplifier (before)
674 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
675 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
676 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Arg1]] ]
677 // CHECK-DAG: [[Sub:i\d+]] Sub [ [[Neg]] [[Arg2]] ]
678 // CHECK-DAG: Return [ [[Sub]] ]
679
680 // CHECK-START: int Main.SubNeg1(int, int) instruction_simplifier (after)
681 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
682 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
683 // CHECK-DAG: [[Add:i\d+]] Add [ [[Arg1]] [[Arg2]] ]
684 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Add]] ]
685 // CHECK-DAG: Return [ [[Neg]] ]
686
687 // CHECK-START: int Main.SubNeg1(int, int) instruction_simplifier (after)
688 // CHECK-NOT: Sub
689
690 public static int SubNeg1(int arg1, int arg2) {
691 return -arg1 - arg2;
692 }
693
694 /**
695 * This is similar to the test-case SubNeg1, but the negation has
696 * multiple uses.
697 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitSub`.
698 * The current code won't perform the previous optimization. The
699 * transformations do not look at other uses of their inputs. As they don't
700 * know what will happen with other uses, they do not take the risk of
701 * increasing the register pressure by creating or extending live ranges.
702 */
703
704 // CHECK-START: int Main.SubNeg2(int, int) instruction_simplifier (before)
705 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
706 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
707 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Arg1]] ]
708 // CHECK-DAG: [[Sub1:i\d+]] Sub [ [[Neg]] [[Arg2]] ]
709 // CHECK-DAG: [[Sub2:i\d+]] Sub [ [[Neg]] [[Arg2]] ]
710 // CHECK-DAG: [[Or:i\d+]] Or [ [[Sub1]] [[Sub2]] ]
711 // CHECK-DAG: Return [ [[Or]] ]
712
713 // CHECK-START: int Main.SubNeg2(int, int) instruction_simplifier (after)
714 // CHECK-DAG: [[Arg1:i\d+]] ParameterValue
715 // CHECK-DAG: [[Arg2:i\d+]] ParameterValue
716 // CHECK-DAG: [[Neg:i\d+]] Neg [ [[Arg1]] ]
717 // CHECK-DAG: [[Sub1:i\d+]] Sub [ [[Neg]] [[Arg2]] ]
718 // CHECK-DAG: [[Sub2:i\d+]] Sub [ [[Neg]] [[Arg2]] ]
719 // CHECK-DAG: [[Or:i\d+]] Or [ [[Sub1]] [[Sub2]] ]
720 // CHECK-DAG: Return [ [[Or]] ]
721
722 // CHECK-START: int Main.SubNeg2(int, int) instruction_simplifier (after)
723 // CHECK-NOT: Add
724
725 public static int SubNeg2(int arg1, int arg2) {
726 int temp = -arg1;
727 return (temp - arg2) | (temp - arg2);
728 }
729
730 /**
731 * This follows test-cases SubNeg1 and SubNeg2.
732 * The transformation tested is implemented in `InstructionSimplifierVisitor::VisitSub`.
733 * The optimization should not happen if it moves an additional instruction in
734 * the loop.
735 */
736
737 // CHECK-START: long Main.SubNeg3(long, long) instruction_simplifier (before)
738 // -------------- Arguments and initial negation operation.
739 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
740 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
741 // CHECK-DAG: [[Neg:j\d+]] Neg [ [[Arg1]] ]
742 // CHECK: Goto
743 // -------------- Loop
744 // CHECK: SuspendCheck
745 // CHECK: [[Sub:j\d+]] Sub [ [[Neg]] [[Arg2]] ]
746 // CHECK: Goto
747
748 // CHECK-START: long Main.SubNeg3(long, long) instruction_simplifier (after)
749 // -------------- Arguments and initial negation operation.
750 // CHECK-DAG: [[Arg1:j\d+]] ParameterValue
751 // CHECK-DAG: [[Arg2:j\d+]] ParameterValue
752 // CHECK-DAG: [[Neg:j\d+]] Neg [ [[Arg1]] ]
753 // CHECK-DAG: Goto
754 // -------------- Loop
755 // CHECK: SuspendCheck
756 // CHECK: [[Sub:j\d+]] Sub [ [[Neg]] [[Arg2]] ]
757 // CHECK-NOT: Neg
758 // CHECK: Goto
759
760 public static long SubNeg3(long arg1, long arg2) {
761 long res = 0;
762 long temp = -arg1;
763 for (long i = 0; i < 1; i++) {
764 res += temp - arg2 - i;
765 }
766 return res;
767 }
768
David Brazdil0d13fee2015-04-17 14:52:19 +0100769 // CHECK-START: int Main.EqualTrueRhs(boolean) instruction_simplifier (before)
770 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
771 // CHECK-DAG: [[Const1:i\d+]] IntConstant 1
772 // CHECK-DAG: [[Cond:z\d+]] Equal [ [[Arg]] [[Const1]] ]
773 // CHECK-DAG: If [ [[Cond]] ]
774
775 // CHECK-START: int Main.EqualTrueRhs(boolean) instruction_simplifier (after)
776 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
777 // CHECK-DAG: If [ [[Arg]] ]
778
779 public static int EqualTrueRhs(boolean arg) {
780 return (arg != true) ? 3 : 5;
781 }
782
783 // CHECK-START: int Main.EqualTrueLhs(boolean) instruction_simplifier (before)
784 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
785 // CHECK-DAG: [[Const1:i\d+]] IntConstant 1
786 // CHECK-DAG: [[Cond:z\d+]] Equal [ [[Const1]] [[Arg]] ]
787 // CHECK-DAG: If [ [[Cond]] ]
788
789 // CHECK-START: int Main.EqualTrueLhs(boolean) instruction_simplifier (after)
790 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
791 // CHECK-DAG: If [ [[Arg]] ]
792
793 public static int EqualTrueLhs(boolean arg) {
794 return (true != arg) ? 3 : 5;
795 }
796
797 // CHECK-START: int Main.EqualFalseRhs(boolean) instruction_simplifier (before)
798 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
799 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
800 // CHECK-DAG: [[Cond:z\d+]] Equal [ [[Arg]] [[Const0]] ]
801 // CHECK-DAG: If [ [[Cond]] ]
802
803 // CHECK-START: int Main.EqualFalseRhs(boolean) instruction_simplifier (after)
804 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
805 // CHECK-DAG: [[NotArg:z\d+]] BooleanNot [ [[Arg]] ]
806 // CHECK-DAG: If [ [[NotArg]] ]
807
808 public static int EqualFalseRhs(boolean arg) {
809 return (arg != false) ? 3 : 5;
810 }
811
812 // CHECK-START: int Main.EqualFalseLhs(boolean) instruction_simplifier (before)
813 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
814 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
815 // CHECK-DAG: [[Cond:z\d+]] Equal [ [[Const0]] [[Arg]] ]
816 // CHECK-DAG: If [ [[Cond]] ]
817
818 // CHECK-START: int Main.EqualFalseLhs(boolean) instruction_simplifier (after)
819 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
820 // CHECK-DAG: [[NotArg:z\d+]] BooleanNot [ [[Arg]] ]
821 // CHECK-DAG: If [ [[NotArg]] ]
822
823 public static int EqualFalseLhs(boolean arg) {
824 return (false != arg) ? 3 : 5;
825 }
826
827 // CHECK-START: int Main.NotEqualTrueRhs(boolean) instruction_simplifier (before)
828 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
829 // CHECK-DAG: [[Const1:i\d+]] IntConstant 1
830 // CHECK-DAG: [[Cond:z\d+]] NotEqual [ [[Arg]] [[Const1]] ]
831 // CHECK-DAG: If [ [[Cond]] ]
832
833 // CHECK-START: int Main.NotEqualTrueRhs(boolean) instruction_simplifier (after)
834 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
835 // CHECK-DAG: [[NotArg:z\d+]] BooleanNot [ [[Arg]] ]
836 // CHECK-DAG: If [ [[NotArg]] ]
837
838 public static int NotEqualTrueRhs(boolean arg) {
839 return (arg == true) ? 3 : 5;
840 }
841
842 // CHECK-START: int Main.NotEqualTrueLhs(boolean) instruction_simplifier (before)
843 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
844 // CHECK-DAG: [[Const1:i\d+]] IntConstant 1
845 // CHECK-DAG: [[Cond:z\d+]] NotEqual [ [[Const1]] [[Arg]] ]
846 // CHECK-DAG: If [ [[Cond]] ]
847
848 // CHECK-START: int Main.NotEqualTrueLhs(boolean) instruction_simplifier (after)
849 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
850 // CHECK-DAG: [[NotArg:z\d+]] BooleanNot [ [[Arg]] ]
851 // CHECK-DAG: If [ [[NotArg]] ]
852
853 public static int NotEqualTrueLhs(boolean arg) {
854 return (true == arg) ? 3 : 5;
855 }
856
857 // CHECK-START: int Main.NotEqualFalseRhs(boolean) instruction_simplifier (before)
858 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
859 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
860 // CHECK-DAG: [[Cond:z\d+]] NotEqual [ [[Arg]] [[Const0]] ]
861 // CHECK-DAG: If [ [[Cond]] ]
862
863 // CHECK-START: int Main.NotEqualFalseRhs(boolean) instruction_simplifier (after)
864 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
865 // CHECK-DAG: If [ [[Arg]] ]
866
867 public static int NotEqualFalseRhs(boolean arg) {
868 return (arg == false) ? 3 : 5;
869 }
870
871 // CHECK-START: int Main.NotEqualFalseLhs(boolean) instruction_simplifier (before)
872 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
873 // CHECK-DAG: [[Const0:i\d+]] IntConstant 0
874 // CHECK-DAG: [[Cond:z\d+]] NotEqual [ [[Const0]] [[Arg]] ]
875 // CHECK-DAG: If [ [[Cond]] ]
876
877 // CHECK-START: int Main.NotEqualFalseLhs(boolean) instruction_simplifier (after)
878 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
879 // CHECK-DAG: If [ [[Arg]] ]
880
881 public static int NotEqualFalseLhs(boolean arg) {
882 return (false == arg) ? 3 : 5;
883 }
884
885 /*
886 * Test simplification of double Boolean negation. Note that sometimes
887 * both negations can be removed but we only expect the simplifier to
888 * remove the second.
889 */
890
891 // CHECK-START: boolean Main.NotNotBool(boolean) instruction_simplifier_after_types (before)
892 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
893 // CHECK-DAG: [[NotArg:z\d+]] BooleanNot [ [[Arg]] ]
894 // CHECK-DAG: [[NotNotArg:z\d+]] BooleanNot [ [[NotArg]] ]
895 // CHECK-DAG: Return [ [[NotNotArg]] ]
896
897 // CHECK-START: boolean Main.NotNotBool(boolean) instruction_simplifier_after_types (after)
898 // CHECK-DAG: [[Arg:z\d+]] ParameterValue
899 // CHECK-DAG: BooleanNot [ [[Arg]] ]
900 // CHECK-DAG: Return [ [[Arg]] ]
901
902 // CHECK-START: boolean Main.NotNotBool(boolean) instruction_simplifier_after_types (after)
903 // CHECK: BooleanNot
904 // CHECK-NOT: BooleanNot
905
906 public static boolean NotNotBool(boolean arg) {
907 return !(!arg);
908 }
909
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000910 public static void main(String[] args) {
911 int arg = 123456;
912
913 assertLongEquals(Add0(arg), arg);
914 assertIntEquals(AndAllOnes(arg), arg);
915 assertLongEquals(Div1(arg), arg);
916 assertIntEquals(DivN1(arg), -arg);
917 assertLongEquals(Mul1(arg), arg);
918 assertIntEquals(MulN1(arg), -arg);
919 assertLongEquals(MulPowerOfTwo128(arg), (128 * arg));
920 assertIntEquals(Or0(arg), arg);
921 assertLongEquals(OrSame(arg), arg);
922 assertIntEquals(Shl0(arg), arg);
923 assertLongEquals(Shr0(arg), arg);
924 assertLongEquals(Sub0(arg), arg);
925 assertIntEquals(SubAliasNeg(arg), -arg);
926 assertLongEquals(UShr0(arg), arg);
927 assertIntEquals(Xor0(arg), arg);
928 assertIntEquals(XorAllOnes(arg), ~arg);
Alexandre Rames188d4312015-04-09 18:30:21 +0100929 assertIntEquals(AddNegs1(arg, arg + 1), -(arg + arg + 1));
930 assertIntEquals(AddNegs2(arg, arg + 1), -(arg + arg + 1));
931 assertLongEquals(AddNegs3(arg, arg + 1), -(2 * arg + 1));
932 assertLongEquals(AddNeg1(arg, arg + 1), 1);
933 assertLongEquals(AddNeg2(arg, arg + 1), -1);
934 assertLongEquals(NegNeg1(arg), arg);
935 assertIntEquals(NegNeg2(arg), 0);
936 assertLongEquals(NegNeg3(arg), arg);
937 assertIntEquals(NegSub1(arg, arg + 1), 1);
938 assertIntEquals(NegSub2(arg, arg + 1), 1);
939 assertLongEquals(NotNot1(arg), arg);
940 assertIntEquals(NotNot2(arg), -1);
941 assertIntEquals(SubNeg1(arg, arg + 1), -(arg + arg + 1));
942 assertIntEquals(SubNeg2(arg, arg + 1), -(arg + arg + 1));
943 assertLongEquals(SubNeg3(arg, arg + 1), -(2 * arg + 1));
David Brazdil0d13fee2015-04-17 14:52:19 +0100944
945 assertIntEquals(EqualTrueRhs(true), 5);
946 assertIntEquals(EqualTrueLhs(true), 5);
947 assertIntEquals(EqualFalseRhs(true), 3);
948 assertIntEquals(EqualFalseLhs(true), 3);
949 assertIntEquals(NotEqualTrueRhs(true), 3);
950 assertIntEquals(NotEqualTrueLhs(true), 3);
951 assertIntEquals(NotEqualFalseRhs(true), 5);
952 assertIntEquals(NotEqualFalseLhs(true), 5);
953 assertBooleanEquals(NotNotBool(true), true);
954 assertBooleanEquals(NotNotBool(false), false);
Alexandre Ramesb2fd7bc2015-03-11 16:48:16 +0000955 }
956}