uniform half4 colorRed, colorGreen;

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

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

// Should return 15
float break_loop() {
    float sum = 0;
    for (float i = 0; i < 10; ++i) {
        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;
}
