Oh yeah, modern optimization techniques definitely improve performance because you’re going to run into fewer occasions where both sides are processed, but there will still be occasions where both sides are processed. It’s not as simple as saying an if statement in a shader is going to degrade performance, it depends on the shader. If different paths are being taken for every other pixel then it’s probably safe to assume that the if statement is unnecessary, but if you have large swaths of pixels taking one path and large swaths taking another path then the if statement should save you some time. In the latter both paths are likely to be processed only for blocks of pixels that border the cut off point where the path changes.
Of course this depends on the GPU because they don’t all use the same optimization techniques. I’m not sure to what degree mobile GPUs use optimization either, they tend to be a little behind the curve in other areas.
I think the size of the pixel block processed depends on the number of cores in the GPU. So let’s say you have a shader where the path in an if statement changes every 8 pixels vertically and horizontally. On an 8 core GPU this will be optimized so there’s no penalty and a 4 core GPU will also optimize this out, but a 6 core GPU will not.
Then, of course, regardless of the number of cores the optimization is going to change depending on how the shader is rendered on the screen. If it’s far away in a non-parallel view-mode then the path might change every 3 pixels or every 2 pixels. So it’s going to render faster and slower depending on where and how it’s displayed on the screen.