xref: /aosp_15_r20/external/skia/resources/sksl/shared/Optimizations.sksl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker/*#pragma settings NoOptimize*/
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen, colorRed;
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerbool flatten_compound_constructor() {
6*c8dee2aaSAndroid Build Coastguard Worker    int4 x = int4(int3(int2(1, 2), 3), 4);
7*c8dee2aaSAndroid Build Coastguard Worker    int4 y = int4(1, int3(2, int2(3, 4)));
8*c8dee2aaSAndroid Build Coastguard Worker    return x == y;
9*c8dee2aaSAndroid Build Coastguard Worker}
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Workerbool flatten_known_if() {
12*c8dee2aaSAndroid Build Coastguard Worker    int value;
13*c8dee2aaSAndroid Build Coastguard Worker    if (true) {
14*c8dee2aaSAndroid Build Coastguard Worker        value = 1;
15*c8dee2aaSAndroid Build Coastguard Worker    } else {
16*c8dee2aaSAndroid Build Coastguard Worker        value = 2;
17*c8dee2aaSAndroid Build Coastguard Worker    }
18*c8dee2aaSAndroid Build Coastguard Worker    return value == 1;
19*c8dee2aaSAndroid Build Coastguard Worker}
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard Workerbool eliminate_empty_if_else() {
22*c8dee2aaSAndroid Build Coastguard Worker    bool check = false;
23*c8dee2aaSAndroid Build Coastguard Worker    if (check = !check /* assignment is intentional! */) {} else {}
24*c8dee2aaSAndroid Build Coastguard Worker    return check;
25*c8dee2aaSAndroid Build Coastguard Worker}
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Workerbool eliminate_empty_else() {
28*c8dee2aaSAndroid Build Coastguard Worker    bool check = true;
29*c8dee2aaSAndroid Build Coastguard Worker    if (check) { return true; } else {}
30*c8dee2aaSAndroid Build Coastguard Worker    return false;
31*c8dee2aaSAndroid Build Coastguard Worker}
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Workerbool flatten_matching_ternary() {
34*c8dee2aaSAndroid Build Coastguard Worker    bool check = true;
35*c8dee2aaSAndroid Build Coastguard Worker    return check ? true : true;
36*c8dee2aaSAndroid Build Coastguard Worker}
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Workerbool flatten_expr_without_side_effects() {
39*c8dee2aaSAndroid Build Coastguard Worker    bool check = true;
40*c8dee2aaSAndroid Build Coastguard Worker    check;
41*c8dee2aaSAndroid Build Coastguard Worker    return check;
42*c8dee2aaSAndroid Build Coastguard Worker}
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Workerbool eliminate_no_op_arithmetic() {
45*c8dee2aaSAndroid Build Coastguard Worker    // Constant-expression folding needs to work when all values are known, even if optimizations
46*c8dee2aaSAndroid Build Coastguard Worker    // are disabled.
47*c8dee2aaSAndroid Build Coastguard Worker    const int ONE = 1;
48*c8dee2aaSAndroid Build Coastguard Worker    int a1[ONE * 1];
49*c8dee2aaSAndroid Build Coastguard Worker    int a2[ONE + 0];
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Worker    // However, expressions with a known and an unknown shouldn't fold when optimizations are off.
52*c8dee2aaSAndroid Build Coastguard Worker    int x = ONE;
53*c8dee2aaSAndroid Build Coastguard Worker    x = x + 0;
54*c8dee2aaSAndroid Build Coastguard Worker    x *= 1;
55*c8dee2aaSAndroid Build Coastguard Worker    return x == 1;
56*c8dee2aaSAndroid Build Coastguard Worker}
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard Workerbool flatten_switch() {
59*c8dee2aaSAndroid Build Coastguard Worker    switch (1) {
60*c8dee2aaSAndroid Build Coastguard Worker        case 0: return false;
61*c8dee2aaSAndroid Build Coastguard Worker        case 1: return true;
62*c8dee2aaSAndroid Build Coastguard Worker        case 2: return false;
63*c8dee2aaSAndroid Build Coastguard Worker    }
64*c8dee2aaSAndroid Build Coastguard Worker    return false;
65*c8dee2aaSAndroid Build Coastguard Worker}
66*c8dee2aaSAndroid Build Coastguard Worker
67*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) {
68*c8dee2aaSAndroid Build Coastguard Worker    return flatten_compound_constructor()
69*c8dee2aaSAndroid Build Coastguard Worker           && flatten_known_if()
70*c8dee2aaSAndroid Build Coastguard Worker           && eliminate_empty_if_else()
71*c8dee2aaSAndroid Build Coastguard Worker           && eliminate_empty_else()
72*c8dee2aaSAndroid Build Coastguard Worker           && flatten_matching_ternary()
73*c8dee2aaSAndroid Build Coastguard Worker           && flatten_expr_without_side_effects()
74*c8dee2aaSAndroid Build Coastguard Worker           && eliminate_no_op_arithmetic()
75*c8dee2aaSAndroid Build Coastguard Worker           && flatten_switch()
76*c8dee2aaSAndroid Build Coastguard Worker           ? colorGreen : colorRed;
77*c8dee2aaSAndroid Build Coastguard Worker}
78