| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| public class Main { |
| |
| public static void doNothing(boolean b) { |
| System.out.println("In do nothing."); |
| } |
| |
| public static void inIf() { |
| System.out.println("In if."); |
| } |
| |
| public static int bar() { |
| return 42; |
| } |
| |
| public static int foo1() { |
| int b = bar(); |
| doNothing(b == 42); |
| // This second `b == 42` will be GVN'ed away. |
| if (b == 42) { |
| inIf(); |
| return b; |
| } |
| return 0; |
| } |
| |
| public static int foo2() { |
| int b = bar(); |
| doNothing(b == 41); |
| // This second `b == 41` will be GVN'ed away. |
| if (b == 41) { |
| inIf(); |
| return 0; |
| } |
| return b; |
| } |
| |
| public static boolean $noinline$intEq0(int x) { |
| return x == 0; |
| } |
| |
| public static boolean $noinline$intNe0(int x) { |
| return x != 0; |
| } |
| |
| public static boolean $noinline$longEq0(long x) { |
| return x == 0; |
| } |
| |
| public static boolean $noinline$longNe0(long x) { |
| return x != 0; |
| } |
| |
| public static boolean $noinline$longEqCst(long x) { |
| return x == 0x0123456789ABCDEFL; |
| } |
| |
| public static boolean $noinline$longNeCst(long x) { |
| return x != 0x0123456789ABCDEFL; |
| } |
| |
| public static void assertEqual(boolean expected, boolean actual) { |
| if (expected != actual) { |
| throw new Error("Assertion failed: " + expected + " != " + actual); |
| } |
| } |
| |
| // The purpose of this method is to test code generation for a materialized |
| // HCondition that is not equality or inequality, and that has one boolean |
| // input. That can't be done directly, so we have to rely on the instruction |
| // simplifier to transform the control-flow graph appropriately. |
| public static boolean $noinline$booleanCondition(boolean in) { |
| int value = in ? 1 : 0; |
| |
| // Calling a non-inlineable method that uses `value` as well prevents a |
| // transformation of the return value into `false`. |
| $noinline$intNe0(value); |
| return value > 127; |
| } |
| |
| public static void main(String[] args) { |
| System.out.println("foo1"); |
| int res = foo1(); |
| if (res != 42) { |
| throw new Error("Unexpected return value for foo1: " + res + ", expected 42."); |
| } |
| |
| System.out.println("foo2"); |
| res = foo2(); |
| if (res != 42) { |
| throw new Error("Unexpected return value for foo2: " + res + ", expected 42."); |
| } |
| |
| assertEqual($noinline$booleanCondition(false), false); |
| assertEqual($noinline$booleanCondition(true), false); |
| |
| int[] int_inputs = {0, 1, -1, Integer.MIN_VALUE, Integer.MAX_VALUE, 42, -9000}; |
| long[] long_inputs = { |
| 0L, 1L, -1L, Long.MIN_VALUE, Long.MAX_VALUE, 0x100000000L, |
| 0x100000001L, -9000L, 0x0123456789ABCDEFL}; |
| |
| boolean[] int_eq_0_expected = {true, false, false, false, false, false, false}; |
| |
| for (int i = 0; i < int_inputs.length; i++) { |
| assertEqual(int_eq_0_expected[i], $noinline$intEq0(int_inputs[i])); |
| } |
| |
| boolean[] int_ne_0_expected = {false, true, true, true, true, true, true}; |
| |
| for (int i = 0; i < int_inputs.length; i++) { |
| assertEqual(int_ne_0_expected[i], $noinline$intNe0(int_inputs[i])); |
| } |
| |
| boolean[] long_eq_0_expected = {true, false, false, false, false, false, false, false, false}; |
| |
| for (int i = 0; i < long_inputs.length; i++) { |
| assertEqual(long_eq_0_expected[i], $noinline$longEq0(long_inputs[i])); |
| } |
| |
| boolean[] long_ne_0_expected = {false, true, true, true, true, true, true, true, true}; |
| |
| for (int i = 0; i < long_inputs.length; i++) { |
| assertEqual(long_ne_0_expected[i], $noinline$longNe0(long_inputs[i])); |
| } |
| |
| boolean[] long_eq_cst_expected = {false, false, false, false, false, false, false, false, true}; |
| |
| for (int i = 0; i < long_inputs.length; i++) { |
| assertEqual(long_eq_cst_expected[i], $noinline$longEqCst(long_inputs[i])); |
| } |
| |
| boolean[] long_ne_cst_expected = {true, true, true, true, true, true, true, true, false}; |
| |
| for (int i = 0; i < long_inputs.length; i++) { |
| assertEqual(long_ne_cst_expected[i], $noinline$longNeCst(long_inputs[i])); |
| } |
| } |
| } |