| #version 310 es |
| layout(local_size_x = 1) in; |
| |
| layout(std430, binding = 0) buffer SSBO |
| { |
| float data; |
| }; |
| |
| void test() |
| { |
| // Test that variables local to a scope stay local. |
| if (data != 0.0) |
| { |
| float tmp = 10.0; |
| data = tmp; |
| } |
| else |
| { |
| float tmp = 15.0; |
| data = tmp; |
| } |
| |
| // Test that variable access propagates up to dominator |
| if (data != 0.0) |
| { |
| float e; |
| if (data != 5.0) |
| { |
| if (data != 6.0) |
| e = 10.0; |
| } |
| else |
| e = 20.0; |
| } |
| |
| // Test that variables local to a switch block stay local. |
| switch (int(data)) |
| { |
| case 0: |
| { |
| float tmp = 20.0; |
| data = tmp; |
| break; |
| } |
| |
| case 1: |
| { |
| float tmp = 30.0; |
| data = tmp; |
| break; |
| } |
| } |
| |
| // Check that multibranches propagate up to dominator. |
| float f; |
| switch (int(data)) |
| { |
| case 0: |
| { |
| f = 30.0; |
| break; |
| } |
| |
| case 1: |
| { |
| f = 40.0; |
| break; |
| } |
| } |
| |
| // Check that loops work. |
| // Interesting case here is propagating variable access from the continue block. |
| float h; |
| for (int i = 0; i < 20; i++, h += 10.0) |
| ; |
| data = h; |
| |
| // Do the same with do-while, gotta test all the hard cases. |
| float m; |
| do |
| { |
| } while (m != 20.0); |
| data = m; |
| } |
| |
| void main() |
| { |
| // Test that we do the CFG analysis for all functions. |
| test(); |
| } |
| |