+
+ if (NIR_LOWER_GOTO_IFS_DEBUG) {
+ printf("outside(%u) = ", block->index);
+ print_block_set(outside);
+ printf("reach(%u) = ", block->index);
+ print_block_set(reach);
+ }
+}
+
+static struct path_fork *
+select_fork_recur(struct nir_block **blocks, unsigned start, unsigned end,
+ nir_function_impl *impl, bool need_var, void *mem_ctx)
+{
+ if (start == end - 1)
+ return NULL;
+
+ struct path_fork *fork = ralloc(mem_ctx, struct path_fork);
+ fork->is_var = need_var;
+ if (need_var)
+ fork->path_var = nir_local_variable_create(impl, glsl_bool_type(),
+ "path_select");
+
+ unsigned mid = start + (end - start) / 2;
+
+ fork->paths[0].reachable = _mesa_pointer_set_create(fork);
+ for (unsigned i = start; i < mid; i++)
+ _mesa_set_add(fork->paths[0].reachable, blocks[i]);
+ fork->paths[0].fork =
+ select_fork_recur(blocks, start, mid, impl, need_var, mem_ctx);
+
+ fork->paths[1].reachable = _mesa_pointer_set_create(fork);
+ for (unsigned i = mid; i < end; i++)
+ _mesa_set_add(fork->paths[1].reachable, blocks[i]);
+ fork->paths[1].fork =
+ select_fork_recur(blocks, mid, end, impl, need_var, mem_ctx);
+
+ return fork;