/*#pragma settings NoOptimize*/

uniform half4 colorGreen, colorRed;

bool flatten_compound_constructor() {
    int4 x = int4(int3(int2(1, 2), 3), 4);
    int4 y = int4(1, int3(2, int2(3, 4)));
    return x == y;
}

bool flatten_known_if() {
    int value;
    if (true) {
        value = 1;
    } else {
        value = 2;
    }
    return value == 1;
}

bool eliminate_empty_if_else() {
    bool check = false;
    if (check = !check /* assignment is intentional! */) {} else {}
    return check;
}

bool eliminate_empty_else() {
    bool check = true;
    if (check) { return true; } else {}
    return false;
}

bool flatten_matching_ternary() {
    bool check = true;
    return check ? true : true;
}

bool flatten_expr_without_side_effects() {
    bool check = true;
    check;
    return check;
}

bool eliminate_no_op_arithmetic() {
    // Constant-expression folding needs to work when all values are known, even if optimizations
    // are disabled.
    const int ONE = 1;
    int a1[ONE * 1];
    int a2[ONE + 0];

    // However, expressions with a known and an unknown shouldn't fold when optimizations are off.
    int x = ONE;
    x = x + 0;
    x *= 1;
    return x == 1;
}

bool flatten_switch() {
    switch (1) {
        case 0: return false;
        case 1: return true;
        case 2: return false;
    }
    return false;
}

half4 main(float2 coords) {
    return flatten_compound_constructor()
           && flatten_known_if()
           && eliminate_empty_if_else()
           && eliminate_empty_else()
           && flatten_matching_ternary()
           && flatten_expr_without_side_effects()
           && eliminate_no_op_arithmetic()
           && flatten_switch()
           ? colorGreen : colorRed;
}
