summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2015-12-18 11:27:00 -0800
committerJason Ekstrand <jason.ekstrand@intel.com>2015-12-23 13:49:56 -0800
commit86772c24885be27a7fa9473c471a8eaff54b2ee9 (patch)
tree428de45a850eb3ec90e6684fbe4764df52f81547 /src/glsl
parent1749e667ea38ec539d29c92c08f94738afcb91ad (diff)
downloadexternal_mesa3d-86772c24885be27a7fa9473c471a8eaff54b2ee9.zip
external_mesa3d-86772c24885be27a7fa9473c471a8eaff54b2ee9.tar.gz
external_mesa3d-86772c24885be27a7fa9473c471a8eaff54b2ee9.tar.bz2
nir/control_flow: Handle relinking top-level blocks
This can happen if a function ends in a return instruction and you remove the return.
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/nir/nir_control_flow.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/glsl/nir/nir_control_flow.c b/src/glsl/nir/nir_control_flow.c
index 96395a4..ecd9cbd 100644
--- a/src/glsl/nir/nir_control_flow.c
+++ b/src/glsl/nir/nir_control_flow.c
@@ -336,8 +336,7 @@ block_add_normal_succs(nir_block *block)
nir_block *next_block = nir_cf_node_as_block(next);
link_blocks(block, next_block, NULL);
- } else {
- assert(parent->type == nir_cf_node_loop);
+ } else if (parent->type == nir_cf_node_loop) {
nir_loop *loop = nir_cf_node_as_loop(parent);
nir_cf_node *head = nir_loop_first_cf_node(loop);
@@ -346,6 +345,10 @@ block_add_normal_succs(nir_block *block)
link_blocks(block, head_block, NULL);
insert_phi_undef(head_block, block);
+ } else {
+ assert(parent->type == nir_cf_node_function);
+ nir_function_impl *impl = nir_cf_node_as_function(parent);
+ link_blocks(block, impl->end_block, NULL);
}
} else {
nir_cf_node *next = nir_cf_node_next(&block->cf_node);