vtn_fail("Invalid selection control");
}
+static void
+vtn_emit_ret_store(struct vtn_builder *b, struct vtn_block *block)
+{
+ if ((*block->branch & SpvOpCodeMask) != SpvOpReturnValue)
+ return;
+
+ vtn_fail_if(b->func->type->return_type->base_type == vtn_base_type_void,
+ "Return with a value from a function returning void");
+ struct vtn_ssa_value *src = vtn_ssa_value(b, block->branch[1]);
+ const struct glsl_type *ret_type =
+ glsl_get_bare_type(b->func->type->return_type->type);
+ nir_deref_instr *ret_deref =
+ nir_build_deref_cast(&b->nb, nir_load_param(&b->nb, 0),
+ nir_var_function_temp, ret_type, 0);
+ vtn_local_store(b, src, ret_deref, 0);
+}
+
static void
vtn_emit_cf_list_structured(struct vtn_builder *b, struct list_head *cf_list,
nir_variable *switch_fall_var,
nir_intrinsic_nop);
nir_builder_instr_insert(&b->nb, &block->end_nop->instr);
- if ((*block->branch & SpvOpCodeMask) == SpvOpReturnValue) {
- vtn_fail_if(b->func->type->return_type->base_type ==
- vtn_base_type_void,
- "Return with a value from a function returning void");
- struct vtn_ssa_value *src = vtn_ssa_value(b, block->branch[1]);
- const struct glsl_type *ret_type =
- glsl_get_bare_type(b->func->type->return_type->type);
- nir_deref_instr *ret_deref =
- nir_build_deref_cast(&b->nb, nir_load_param(&b->nb, 0),
- nir_var_function_temp, ret_type, 0);
- vtn_local_store(b, src, ret_deref, 0);
- }
+ vtn_emit_ret_store(b, block);
if (block->branch_type != vtn_branch_type_none) {
vtn_emit_branch(b, block->branch_type,