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