#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();
}

