uniform half4 colorRed, colorGreen;

// Should return 5
const float kZero = 0;
float return_loop() {
    for (float i = kZero; i < 10; ++i) {
        if (i == 5) { return i; }
    }
    return 0;
}

// Should return 35
const float kTen = kZero + 10;
float continue_loop() {
    float sum = 0;
    for (float i = 0; i < kTen; ++i) {
        if (i < 5) { continue; }
        sum += i;
    }
    return sum;
}

// Should return 15
float break_loop() {
    float sum = 0;
    const float kOne = 1;
    for (float i = 0; i < 10; i += kOne) {
        if (i > 5) { break; }
        sum += i;
    }
    return sum;
}

// Should return a value close to zero
float float_loop() {
    float sum = 0;
    for (float i = 0.123; i < 0.6; i += 0.111) {
        sum += i;
    }
    return sum - 1.725;
}

bool loop_operator_le() {
    // These loops are inside-out and execute zero times.
    for (float i = 3; i <= 1; ++i) { return false; }
    for (float i = 3; i <= 1; --i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i <= 3; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 1, 2, 3);
}

bool loop_operator_lt() {
    // These loops are inside-out and execute zero times.
    for (float i = 4; i < 1; ++i) { return false; }
    for (float i = 4; i < 1; --i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i < 4; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 1, 2, 3);
}

bool loop_operator_ge() {
    // These loops are inside-out and execute zero times.
    for (float i = 1; i >= 3; ++i) { return false; }
    for (float i = 1; i >= 3; --i) { return false; }

    float4 result = float4(9);
    for (float i = 3; i >= 1; --i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 3, 2, 1);
}

bool loop_operator_gt() {
    // These loops are inside-out and execute zero times.
    for (float i = 0; i > 3; ++i) { return false; }
    for (float i = 0; i > 3; --i) { return false; }

    float4 result = float4(9);
    for (float i = 3; i > 0; --i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 3, 2, 1);
}

bool loop_operator_ne() {
    // This loop executes zero times.
    for (int i = 1; i != 1; ++i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i != 4; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 1, 2, 3);
}

bool loop_operator_eq() {
    // This loops mismatches and executes zero times.
    for (float i = 1; i == 2; ++i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i == 1; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 9, 9, 1);
}

half4 main(float2 xy) {
    return (return_loop() == 5 && continue_loop() == 35 &&
            break_loop() == 15 && abs(float_loop()) < 0.025 &&
            loop_operator_le() && loop_operator_lt() &&
            loop_operator_ge() && loop_operator_gt() &&
            loop_operator_eq() && loop_operator_ne()) ? colorGreen : colorRed;
}
