| uniform half4 colorRed, colorGreen; |
| |
| int globalValue = 0; |
| |
| noinline int side_effecting(int value) { |
| globalValue++; |
| return value; |
| } |
| |
| bool test() { |
| const int x [3] = int[3](1, 2, 3); |
| const int xx[3] = int[3](1, 2, 3); |
| const int y [3] = int[3](1, 2, 4); |
| |
| const int z = x[0] - y[0]; |
| const int a [x[z]] = int[1](1); |
| const int b [x[x[z]]] = int[2](1, 2); |
| const int c [x[x[x[z]]]] = int[3](1, 2, 3); |
| |
| // Arrays with elements lacking side-effects can be optimized. |
| int two = 2; |
| int flatten0 = (int[3](x[0], two, 3))[0]; |
| int flatten1 = (int[3](x[0], two, 3))[1]; |
| int flatten2 = (int[3](x[0], two, 3))[2]; |
| |
| // Arrays with elements that have side-effects are not eligible for optimization. |
| int noFlatten0 = (int[3](--two, side_effecting(2), 3))[0]; |
| int noFlatten1 = (int[3](side_effecting(1), 2, 3))[1]; |
| int noFlatten2 = (int[3](1, ++two, 3))[2]; |
| |
| return (x == xx) && !(x != xx) && (x != y) && !(x == y) && |
| (x[0] == y[0]) && (c == x) && |
| (flatten0 == noFlatten0) && (flatten1 == noFlatten1) && (flatten2 == noFlatten2); |
| } |
| |
| half4 main(float2 coords) { |
| return test() ? colorGreen : colorRed; |
| } |
| |