/*
* Copyright (C) 2015 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 {

  // Note #1: `javac` flips the conditions of If statements.
  // Note #2: In the optimizing compiler, the first input of Phi is always
  //          the fall-through path, i.e. the false branch.

  public static void assertBoolEquals(boolean expected, boolean result) {
    if (expected != result) {
      throw new Error("Expected: " + expected + ", found: " + result);
    }
  }

  public static void assertIntEquals(int expected, int result) {
    if (expected != result) {
      throw new Error("Expected: " + expected + ", found: " + result);
    }
  }

  /*
   * Elementary test negating a boolean. Verifies that blocks are merged and
   * empty branches removed.
   */

  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (before)
  // CHECK-DAG:     <<Param:z\d+>>    ParameterValue
  // CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
  // CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
  // CHECK-DAG:                       If [<<Param>>]
  // CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Const1>>,<<Const0>>]
  // CHECK-DAG:                       Return [<<Phi>>]

  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (before)
  // CHECK:                           Goto
  // CHECK:                           Goto
  // CHECK:                           Goto
  // CHECK-NOT:                       Goto

  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after)
  // CHECK-DAG:     <<Param:z\d+>>    ParameterValue
  // CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
  // CHECK-DAG:     <<NotParam:z\d+>> BooleanNot [<<Param>>]
  // CHECK-DAG:                       Return [<<NotParam>>]

  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after)
  // CHECK-NOT:                       If
  // CHECK-NOT:                       Phi

  // CHECK-START: boolean Main.BooleanNot(boolean) boolean_simplifier (after)
  // CHECK:                           Goto
  // CHECK-NOT:                       Goto

  public static boolean BooleanNot(boolean x) {
    return !x;
  }

  /*
   * Program which only delegates the condition, i.e. returns 1 when True
   * and 0 when False.
   */

  // CHECK-START: boolean Main.GreaterThan(int, int) boolean_simplifier (before)
  // CHECK-DAG:     <<ParamX:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamY:i\d+>>   ParameterValue
  // CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
  // CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
  // CHECK-DAG:     <<Cond:z\d+>>     GreaterThan [<<ParamX>>,<<ParamY>>]
  // CHECK-DAG:                       If [<<Cond>>]
  // CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Const0>>,<<Const1>>]
  // CHECK-DAG:                       Return [<<Phi>>]

  // CHECK-START: boolean Main.GreaterThan(int, int) boolean_simplifier (after)
  // CHECK-DAG:     <<ParamX:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamY:i\d+>>   ParameterValue
  // CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
  // CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
  // CHECK-DAG:     <<Cond:z\d+>>     GreaterThan [<<ParamX>>,<<ParamY>>]
  // CHECK-DAG:                       Return [<<Cond>>]

  public static boolean GreaterThan(int x, int y) {
    return (x <= y) ? false : true;
  }

  /*
   * Program which negates a condition, i.e. returns 0 when True
   * and 1 when False.
   */

  // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (before)
  // CHECK-DAG:     <<ParamX:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamY:i\d+>>   ParameterValue
  // CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
  // CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
  // CHECK-DAG:     <<Cond:z\d+>>     GreaterThanOrEqual [<<ParamX>>,<<ParamY>>]
  // CHECK-DAG:                       If [<<Cond>>]
  // CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Const1>>,<<Const0>>]
  // CHECK-DAG:                       Return [<<Phi>>]

  // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (after)
  // CHECK-DAG:     <<ParamX:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamY:i\d+>>   ParameterValue
  // CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
  // CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
  // CHECK-DAG:     <<Cond:z\d+>>     LessThan [<<ParamX>>,<<ParamY>>]
  // CHECK-DAG:                       Return [<<Cond>>]

  // CHECK-START: boolean Main.LessThan(int, int) boolean_simplifier (after)
  // CHECK-NOT:                       GreaterThanOrEqual

  public static boolean LessThan(int x, int y) {
    return (x < y) ? true : false;
  }

  /*
   * Program which further uses negated conditions.
   * Note that Phis are discovered retrospectively.
   */

  // CHECK-START: boolean Main.ValuesOrdered(int, int, int) boolean_simplifier (before)
  // CHECK-DAG:     <<ParamX:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamY:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamZ:i\d+>>   ParameterValue
  // CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
  // CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
  // CHECK-DAG:     <<CondXY:z\d+>>   GreaterThan [<<ParamX>>,<<ParamY>>]
  // CHECK-DAG:                       If [<<CondXY>>]
  // CHECK-DAG:     <<CondYZ:z\d+>>   GreaterThan [<<ParamY>>,<<ParamZ>>]
  // CHECK-DAG:                       If [<<CondYZ>>]
  // CHECK-DAG:     <<CondXYZ:z\d+>>  NotEqual [<<PhiXY:i\d+>>,<<PhiYZ:i\d+>>]
  // CHECK-DAG:                       If [<<CondXYZ>>]
  // CHECK-DAG:                       Return [<<PhiXYZ:i\d+>>]
  // CHECK-DAG:     <<PhiXY>>         Phi [<<Const1>>,<<Const0>>]
  // CHECK-DAG:     <<PhiYZ>>         Phi [<<Const1>>,<<Const0>>]
  // CHECK-DAG:     <<PhiXYZ>>        Phi [<<Const1>>,<<Const0>>]

  // CHECK-START: boolean Main.ValuesOrdered(int, int, int) boolean_simplifier (after)
  // CHECK-DAG:     <<ParamX:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamY:i\d+>>   ParameterValue
  // CHECK-DAG:     <<ParamZ:i\d+>>   ParameterValue
  // CHECK-DAG:     <<CmpXY:z\d+>>    LessThanOrEqual [<<ParamX>>,<<ParamY>>]
  // CHECK-DAG:     <<CmpYZ:z\d+>>    LessThanOrEqual [<<ParamY>>,<<ParamZ>>]
  // CHECK-DAG:     <<CmpXYZ:z\d+>>   Equal [<<CmpXY>>,<<CmpYZ>>]
  // CHECK-DAG:                       Return [<<CmpXYZ>>]

  public static boolean ValuesOrdered(int x, int y, int z) {
    return (x <= y) == (y <= z);
  }

  // CHECK-START: int Main.NegatedCondition(boolean) boolean_simplifier (before)
  // CHECK-DAG:     <<Param:z\d+>>    ParameterValue
  // CHECK-DAG:     <<Const42:i\d+>>  IntConstant 42
  // CHECK-DAG:     <<Const43:i\d+>>  IntConstant 43
  // CHECK-DAG:     <<NotParam:z\d+>> BooleanNot [<<Param>>]
  // CHECK-DAG:                       If [<<NotParam>>]
  // CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Const42>>,<<Const43>>]
  // CHECK-DAG:                       Return [<<Phi>>]

  // CHECK-START: int Main.NegatedCondition(boolean) boolean_simplifier (after)
  // CHECK-DAG:     <<Param:z\d+>>    ParameterValue
  // CHECK-DAG:     <<Const42:i\d+>>  IntConstant 42
  // CHECK-DAG:     <<Const43:i\d+>>  IntConstant 43
  // CHECK-DAG:                       If [<<Param>>]
  // CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Const42>>,<<Const43>>]
  // CHECK-DAG:                       Return [<<Phi>>]

  // Note: The fact that branches are swapped is verified by running the test.

  // CHECK-START: int Main.NegatedCondition(boolean) boolean_simplifier (after)
  // CHECK-NOT:                       BooleanNot

  public static int NegatedCondition(boolean x) {
    if (x != false) {
      return 42;
    } else {
      return 43;
    }
  }

  public static void main(String[] args) {
    assertBoolEquals(false, BooleanNot(true));
    assertBoolEquals(true, BooleanNot(false));
    assertBoolEquals(true, GreaterThan(10, 5));
    assertBoolEquals(false, GreaterThan(10, 10));
    assertBoolEquals(false, GreaterThan(5, 10));
    assertBoolEquals(true, LessThan(5, 10));
    assertBoolEquals(false, LessThan(10, 10));
    assertBoolEquals(false, LessThan(10, 5));
    assertBoolEquals(true, ValuesOrdered(1, 3, 5));
    assertBoolEquals(true, ValuesOrdered(5, 3, 1));
    assertBoolEquals(false, ValuesOrdered(1, 3, 2));
    assertBoolEquals(false, ValuesOrdered(2, 3, 1));
    assertBoolEquals(true, ValuesOrdered(3, 3, 3));
    assertBoolEquals(true, ValuesOrdered(3, 3, 5));
    assertBoolEquals(false, ValuesOrdered(5, 5, 3));
    assertIntEquals(42, NegatedCondition(true));
    assertIntEquals(43, NegatedCondition(false));
  }
}
