Main.java revision 0d13fee6f4330cc9cb100c43135490a34c11d7a5
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  /*
300d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil   * Elementary test negating a boolean. Verifies that blocks are merged and
310d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil   * 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
380d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil  // CHECK-DAG:                       If [ [[Param]] ]
3946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Phi:i\d+]]      Phi [ [[Const1]] [[Const0]] ]
4046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       Return [ [[Phi]] ]
4146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
4246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (before)
4346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK:                           Goto
4446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK:                           Goto
4546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK:                           Goto
4646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-NOT:                       Goto
4746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
4846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after)
4946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Param:z\d+]]    ParameterValue
5046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const0:i\d+]]   IntConstant 0
510d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil  // CHECK-DAG:     [[NotParam:z\d+]] BooleanNot [ [[Param]] ]
520d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil  // CHECK-DAG:                       Return [ [[NotParam]] ]
5346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
5446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after)
5546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-NOT:                       If
5646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-NOT:                       Phi
5746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
5846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after)
5946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK:                           Goto
6046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-NOT:                       Goto
6146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
6246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  public static boolean BooleanNot(boolean x) {
6346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    return !x;
6446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  }
6546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
6646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  /*
6746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   * Program which only delegates the condition, i.e. returns 1 when True
6846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   * and 0 when False.
6946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   */
7046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
7146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.GreaterThan(int, int) boolean_simplifier (before)
7246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamX:i\d+]]   ParameterValue
7346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamY:i\d+]]   ParameterValue
7446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const0:i\d+]]   IntConstant 0
7546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const1:i\d+]]   IntConstant 1
7646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Cond:z\d+]]     GreaterThan [ [[ParamX]] [[ParamY]] ]
7746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       If [ [[Cond]] ]
7846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Phi:i\d+]]      Phi [ [[Const0]] [[Const1]] ]
7946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       Return [ [[Phi]] ]
8046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
8146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.GreaterThan(int, int) boolean_simplifier (after)
8246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamX:i\d+]]   ParameterValue
8346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamY:i\d+]]   ParameterValue
8446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const0:i\d+]]   IntConstant 0
8546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const1:i\d+]]   IntConstant 1
8646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Cond:z\d+]]     GreaterThan [ [[ParamX]] [[ParamY]] ]
8746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       Return [ [[Cond]] ]
8846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
8946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  public static boolean GreaterThan(int x, int y) {
9046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    return (x <= y) ? false : true;
9146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  }
9246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
9346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  /*
9446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   * Program which negates a condition, i.e. returns 0 when True
9546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   * and 1 when False.
9646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   */
9746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
9846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (before)
9946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamX:i\d+]]   ParameterValue
10046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamY:i\d+]]   ParameterValue
10146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const0:i\d+]]   IntConstant 0
10246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const1:i\d+]]   IntConstant 1
10346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Cond:z\d+]]     GreaterThanOrEqual [ [[ParamX]] [[ParamY]] ]
10446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       If [ [[Cond]] ]
10546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Phi:i\d+]]      Phi [ [[Const1]] [[Const0]] ]
10646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       Return [ [[Phi]] ]
10746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
10846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (after)
10946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamX:i\d+]]   ParameterValue
11046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamY:i\d+]]   ParameterValue
11146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const0:i\d+]]   IntConstant 0
11246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const1:i\d+]]   IntConstant 1
11346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Cond:z\d+]]     LessThan [ [[ParamX]] [[ParamY]] ]
11446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       Return [ [[Cond]] ]
11546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
1160d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil  // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (after)
1170d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil  // CHECK-NOT:                       GreaterThanOrEqual
1180d13fee6f4330cc9cb100c43135490a34c11d7a5David Brazdil
11946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  public static boolean LessThan(int x, int y) {
120b2bd1c5f9171f35fa5b71ada42d1a9e11189428dDavid Brazdil    return (x < y) ? true : false;
12146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  }
12246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
12346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  /*
12446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   * Program which further uses negated conditions.
12546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   * Note that Phis are discovered retrospectively.
12646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil   */
12746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
12846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.ValuesOrdered(int, int, int) boolean_simplifier (before)
12946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamX:i\d+]]   ParameterValue
13046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamY:i\d+]]   ParameterValue
13146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamZ:i\d+]]   ParameterValue
13246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const0:i\d+]]   IntConstant 0
13346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[Const1:i\d+]]   IntConstant 1
13446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[CondXY:z\d+]]   GreaterThan [ [[ParamX]] [[ParamY]] ]
13546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       If [ [[CondXY]] ]
13646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[CondYZ:z\d+]]   GreaterThan [ [[ParamY]] [[ParamZ]] ]
13746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       If [ [[CondYZ]] ]
13846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[CondXYZ:z\d+]]  NotEqual [ [[PhiXY:i\d+]] [[PhiYZ:i\d+]] ]
13946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       If [ [[CondXYZ]] ]
14046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       Return [ [[PhiXYZ:i\d+]] ]
14146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[PhiXY]]         Phi [ [[Const1]] [[Const0]] ]
14246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[PhiYZ]]         Phi [ [[Const1]] [[Const0]] ]
14346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[PhiXYZ]]        Phi [ [[Const1]] [[Const0]] ]
14446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
14546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-START: boolean Main.ValuesOrdered(int, int, int) boolean_simplifier (after)
14646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamX:i\d+]]   ParameterValue
14746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamY:i\d+]]   ParameterValue
14846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[ParamZ:i\d+]]   ParameterValue
14946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[CmpXY:z\d+]]    LessThanOrEqual [ [[ParamX]] [[ParamY]] ]
15046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[CmpYZ:z\d+]]    LessThanOrEqual [ [[ParamY]] [[ParamZ]] ]
15146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:     [[CmpXYZ:z\d+]]   Equal [ [[CmpXY]] [[CmpYZ]] ]
15246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  // CHECK-DAG:                       Return [ [[CmpXYZ]] ]
15346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
15446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  public static boolean ValuesOrdered(int x, int y, int z) {
15546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    return (x <= y) == (y <= z);
15646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  }
15746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil
15846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  public static void main(String[] args) {
15946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, BooleanNot(true));
16046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(true, BooleanNot(false));
16146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(true, GreaterThan(10, 5));
16246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, GreaterThan(10, 10));
16346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, GreaterThan(5, 10));
16446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(true, LessThan(5, 10));
16546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, LessThan(10, 10));
16646e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, LessThan(10, 5));
16746e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(true, ValuesOrdered(1, 3, 5));
16846e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(true, ValuesOrdered(5, 3, 1));
16946e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, ValuesOrdered(1, 3, 2));
17046e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, ValuesOrdered(2, 3, 1));
17146e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(true, ValuesOrdered(3, 3, 3));
17246e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(true, ValuesOrdered(3, 3, 5));
17346e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil    assertBoolEquals(false, ValuesOrdered(5, 5, 3));
17446e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil  }
17546e2a3915aa68c77426b71e95b9f3658250646b7David Brazdil}
176