Main.java revision b2bd1c5f9171f35fa5b71ada42d1a9e11189428d
146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil/* 246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* Copyright (C) 2015 The Android Open Source Project 346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* 446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* Licensed under the Apache License, Version 2.0 (the "License"); 546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* you may not use this file except in compliance with the License. 646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* You may obtain a copy of the License at 746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* 846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* http://www.apache.org/licenses/LICENSE-2.0 946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* 1046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* Unless required by applicable law or agreed to in writing, software 1146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* distributed under the License is distributed on an "AS IS" BASIS, 1246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* See the License for the specific language governing permissions and 1446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil* limitations under the License. 1546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil*/ 1646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 1746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdilpublic class Main { 1846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 1946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // Note #1: `javac` flips the conditions of If statements. 2046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // Note #2: In the optimizing compiler, the first input of Phi is always 2146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // the fall-through path, i.e. the false branch. 2246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 2346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil public static void assertBoolEquals(boolean expected, boolean result) { 2446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil if (expected != result) { 2546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil throw new Error("Expected: " + expected + ", found: " + result); 2646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil } 2746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil } 2846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 2946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil /* 3046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * Elementary test negating a boolean. Verifies that the condition is replaced, 3146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * blocks merged and empty branches removed. 3246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil */ 3346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 3446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (before) 3546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Param:z\d+]] ParameterValue 3646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const0:i\d+]] IntConstant 0 3746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const1:i\d+]] IntConstant 1 3846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[NotEq:z\d+]] NotEqual [ [[Param]] [[Const0]] ] 3946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: If [ [[NotEq]] ] 4046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Phi:i\d+]] Phi [ [[Const1]] [[Const0]] ] 4146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[Phi]] ] 4246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 4346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (before) 4446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK: Goto 4546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK: Goto 4646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK: Goto 4746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-NOT: Goto 4846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 4946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after) 5046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Param:z\d+]] ParameterValue 5146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const0:i\d+]] IntConstant 0 5246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Eq:z\d+]] Equal [ [[Param]] [[Const0]] ] 5346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[Eq]] ] 5446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 5546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after) 5646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-NOT: NotEqual 5746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-NOT: If 5846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-NOT: Phi 5946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 6046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after) 6146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK: Goto 6246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-NOT: Goto 6346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 6446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil public static boolean BooleanNot(boolean x) { 6546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil return !x; 6646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil } 6746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 6846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil /* 6946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * Program which only delegates the condition, i.e. returns 1 when True 7046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * and 0 when False. 7146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil */ 7246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 7346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.GreaterThan(int, int) boolean_simplifier (before) 7446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamX:i\d+]] ParameterValue 7546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamY:i\d+]] ParameterValue 7646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const0:i\d+]] IntConstant 0 7746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const1:i\d+]] IntConstant 1 7846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Cond:z\d+]] GreaterThan [ [[ParamX]] [[ParamY]] ] 7946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: If [ [[Cond]] ] 8046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Phi:i\d+]] Phi [ [[Const0]] [[Const1]] ] 8146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[Phi]] ] 8246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 8346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.GreaterThan(int, int) boolean_simplifier (after) 8446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamX:i\d+]] ParameterValue 8546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamY:i\d+]] ParameterValue 8646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const0:i\d+]] IntConstant 0 8746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const1:i\d+]] IntConstant 1 8846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Cond:z\d+]] GreaterThan [ [[ParamX]] [[ParamY]] ] 8946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[Cond]] ] 9046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 9146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil public static boolean GreaterThan(int x, int y) { 9246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil return (x <= y) ? false : true; 9346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil } 9446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 9546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil /* 9646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * Program which negates a condition, i.e. returns 0 when True 9746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * and 1 when False. 9846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil */ 9946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 10046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (before) 10146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamX:i\d+]] ParameterValue 10246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamY:i\d+]] ParameterValue 10346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const0:i\d+]] IntConstant 0 10446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const1:i\d+]] IntConstant 1 10546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Cond:z\d+]] GreaterThanOrEqual [ [[ParamX]] [[ParamY]] ] 10646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: If [ [[Cond]] ] 10746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Phi:i\d+]] Phi [ [[Const1]] [[Const0]] ] 10846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[Phi]] ] 10946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 11046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (after) 11146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamX:i\d+]] ParameterValue 11246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamY:i\d+]] ParameterValue 11346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const0:i\d+]] IntConstant 0 11446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const1:i\d+]] IntConstant 1 11546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Cond:z\d+]] LessThan [ [[ParamX]] [[ParamY]] ] 11646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[Cond]] ] 11746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 11846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil public static boolean LessThan(int x, int y) { 119b2bd1c5f9171f35fa5b71ada42d1a9e11189428dDavid Brazdil return (x < y) ? true : false; 12046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil } 12146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 12246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil /* 12346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * Program which further uses negated conditions. 12446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil * Note that Phis are discovered retrospectively. 12546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil */ 12646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 12746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.ValuesOrdered(int, int, int) boolean_simplifier (before) 12846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamX:i\d+]] ParameterValue 12946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamY:i\d+]] ParameterValue 13046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamZ:i\d+]] ParameterValue 13146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const0:i\d+]] IntConstant 0 13246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[Const1:i\d+]] IntConstant 1 13346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[CondXY:z\d+]] GreaterThan [ [[ParamX]] [[ParamY]] ] 13446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: If [ [[CondXY]] ] 13546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[CondYZ:z\d+]] GreaterThan [ [[ParamY]] [[ParamZ]] ] 13646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: If [ [[CondYZ]] ] 13746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[CondXYZ:z\d+]] NotEqual [ [[PhiXY:i\d+]] [[PhiYZ:i\d+]] ] 13846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: If [ [[CondXYZ]] ] 13946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[PhiXYZ:i\d+]] ] 14046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[PhiXY]] Phi [ [[Const1]] [[Const0]] ] 14146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[PhiYZ]] Phi [ [[Const1]] [[Const0]] ] 14246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[PhiXYZ]] Phi [ [[Const1]] [[Const0]] ] 14346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 14446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-START: boolean Main.ValuesOrdered(int, int, int) boolean_simplifier (after) 14546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamX:i\d+]] ParameterValue 14646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamY:i\d+]] ParameterValue 14746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[ParamZ:i\d+]] ParameterValue 14846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[CmpXY:z\d+]] LessThanOrEqual [ [[ParamX]] [[ParamY]] ] 14946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[CmpYZ:z\d+]] LessThanOrEqual [ [[ParamY]] [[ParamZ]] ] 15046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: [[CmpXYZ:z\d+]] Equal [ [[CmpXY]] [[CmpYZ]] ] 15146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil // CHECK-DAG: Return [ [[CmpXYZ]] ] 15246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 15346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil public static boolean ValuesOrdered(int x, int y, int z) { 15446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil return (x <= y) == (y <= z); 15546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil } 15646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil 15746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil public static void main(String[] args) { 15846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, BooleanNot(true)); 15946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(true, BooleanNot(false)); 16046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(true, GreaterThan(10, 5)); 16146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, GreaterThan(10, 10)); 16246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, GreaterThan(5, 10)); 16346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(true, LessThan(5, 10)); 16446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, LessThan(10, 10)); 16546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, LessThan(10, 5)); 16646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(true, ValuesOrdered(1, 3, 5)); 16746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(true, ValuesOrdered(5, 3, 1)); 16846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, ValuesOrdered(1, 3, 2)); 16946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, ValuesOrdered(2, 3, 1)); 17046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(true, ValuesOrdered(3, 3, 3)); 17146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(true, ValuesOrdered(3, 3, 5)); 17246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil assertBoolEquals(false, ValuesOrdered(5, 5, 3)); 17346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil } 17446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil} 175