nir: Add a pass for moving SPIR-V continue blocks to the ends of loops
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 19 Dec 2016 21:11:43 +0000 (13:11 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 23 Dec 2016 00:27:19 +0000 (16:27 -0800)
commit6d9f576b56e53e26315aa589c72f399dc29e9672
tree6df8f9dd89f4e254cc0aef4070ddb5eb6a1a44c9
parent1111a05f90e27e9820dd187be16ae41335db6838
nir: Add a pass for moving SPIR-V continue blocks to the ends of loops

When shaders come in from SPIR-V, we handle continue blocks by placing
the contents of the continue inside of a "if (!first_iteration)".  We do
this so that we can properly handle the fact that continues in SPIR-V
jump to the continue block at the end of the loop rather than jumping
directly to the top of the loop like they do in NIR.  In particular, the
increment step of a simple for loop ends up in the continue block.  This
pass looks for this case in loops that don't actually have any continues
and moves the continue contents to the end of the loop instead.  We need
this because loop unrolling doesn't work if the increment is inside of a
condition.

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/compiler/Makefile.sources
src/compiler/nir/nir.h
src/compiler/nir/nir_opt_if.c [new file with mode: 0644]