nir/spirv/cfg: Use a nop intrinsic for tagging the ends of blocks
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 16 Sep 2016 04:12:34 +0000 (21:12 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 3 Oct 2016 23:17:12 +0000 (16:17 -0700)
commit6ffbfc760da14fc710a05438b9fd9eff034128da
treed0d2f0d3f98c7a3a13e53e67d38426b2a520732b
parent7697b4b98b155c818811709becdb408772371538
nir/spirv/cfg: Use a nop intrinsic for tagging the ends of blocks

Previously, we were saving off the last nir_block in a vtn_block before
moving on so that we could find the nir_block again when it came time to
handle phi sources.  Unfortunately, NIR's control flow modification code is
inconsistent when it comes to how it splits blocks so the block pointer we
saved off may point to a block somewhere else in the shader by the time we
get around to handling phi sources.  In order to get around this, we insert
a nop instruction and use that as the logical end of our block.  Since the
control flow manipulation code respects instructions, the nop will keeps
its place like any other instruction and we can easily find the end of our
block when we need it.

This fixes a bug triggered by a couple of vkQuake shaders.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97233
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
Tested-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/spirv/vtn_cfg.c
src/compiler/spirv/vtn_private.h