xref: /aosp_15_r20/external/skia/resources/sksl/folding/ShortCircuitBoolFolding.rts (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1uniform half4 colorRed, colorGreen;
2uniform half  unknownInput;
3
4bool test() {
5    bool expr = unknownInput > 0;
6
7    int ok = 0, bad = 0;
8
9    // Test boolean short-circuiting with constants on the left side.
10    if (true  && expr) { ++ok; } else { ++bad; } // -> (expr)
11    if (false && expr) { ++bad; } else { ++ok; } // -> (false) -> block removed
12    if (true  ^^ expr) { ++bad; } else { ++ok; } // -> unchanged
13    if (false ^^ expr) { ++ok; } else { ++bad; } // -> (expr)
14    if (true  || expr) { ++ok; } else { ++bad; } // -> (true)
15    if (false || expr) { ++ok; } else { ++bad; } // -> (expr)
16    if (true  == expr) { ++ok; } else { ++bad; } // -> (expr)
17    if (false == expr) { ++bad; } else { ++ok; } // -> unchanged
18    if (true  != expr) { ++bad; } else { ++ok; } // -> unchanged
19    if (false != expr) { ++ok; } else { ++bad; } // -> (expr)
20
21    // Test boolean short-circuiting with constants on the right side.
22    if (expr && true ) { ++ok; } else { ++bad; } // -> (expr)
23    if (expr && false) { ++bad; } else { ++ok; } // -> (false) -> block removed
24    if (expr ^^ true ) { ++bad; } else { ++ok; } // -> unchanged
25    if (expr ^^ false) { ++ok; } else { ++bad; } // -> (expr)
26    if (expr || true ) { ++ok; } else { ++bad; } // -> (true)
27    if (expr || false) { ++ok; } else { ++bad; } // -> (expr)
28    if (expr == true ) { ++ok; } else { ++bad; } // -> (expr)
29    if (expr == false) { ++bad; } else { ++ok; } // -> unchanged
30    if (expr != true ) { ++bad; } else { ++ok; } // -> unchanged
31    if (expr != false) { ++ok; } else { ++bad; } // -> (expr)
32
33    // Test that side-effects in the left-side expression prevent right-side expr elimination.
34    float a = unknownInput + 2, b = unknownInput * 2;
35
36    true || bool(a = b);                         // -> true
37    if (a == b) { ++bad; } else { ++ok; }
38
39    bool(a = b) || true;                         // -> unchanged
40    if (a == b) { ++ok; } else { ++bad; }
41
42    return ok == 22 && bad == 0;
43}
44
45half4 main(float2 coords) {
46    return test() ? colorGreen : colorRed;
47}
48