mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
nir: Add an options parameter to deref_instr_has_complex_use
Reviewed-by: Kristian H. Kristensen <hoegsberg@gmail.com> Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com> (1.5 years later) Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13166>
This commit is contained in:
parent
d6123460fd
commit
dc85065944
6 changed files with 25 additions and 8 deletions
|
|
@ -1686,7 +1686,14 @@ nir_deref_instr_get_variable(const nir_deref_instr *instr)
|
|||
|
||||
bool nir_deref_instr_has_indirect(nir_deref_instr *instr);
|
||||
bool nir_deref_instr_is_known_out_of_bounds(nir_deref_instr *instr);
|
||||
bool nir_deref_instr_has_complex_use(nir_deref_instr *instr);
|
||||
|
||||
typedef enum {
|
||||
nir_deref_instr_has_complex_use_allow_memcpy_src = (1 << 0),
|
||||
nir_deref_instr_has_complex_use_allow_memcpy_dst = (1 << 1),
|
||||
} nir_deref_instr_has_complex_use_options;
|
||||
|
||||
bool nir_deref_instr_has_complex_use(nir_deref_instr *instr,
|
||||
nir_deref_instr_has_complex_use_options opts);
|
||||
|
||||
bool nir_deref_instr_remove_if_unused(nir_deref_instr *instr);
|
||||
|
||||
|
|
|
|||
|
|
@ -154,7 +154,8 @@ nir_deref_instr_is_known_out_of_bounds(nir_deref_instr *instr)
|
|||
}
|
||||
|
||||
bool
|
||||
nir_deref_instr_has_complex_use(nir_deref_instr *deref)
|
||||
nir_deref_instr_has_complex_use(nir_deref_instr *deref,
|
||||
nir_deref_instr_has_complex_use_options opts)
|
||||
{
|
||||
nir_foreach_use(use_src, &deref->dest.ssa) {
|
||||
nir_instr *use_instr = use_src->parent_instr;
|
||||
|
|
@ -184,7 +185,7 @@ nir_deref_instr_has_complex_use(nir_deref_instr *deref)
|
|||
use_deref->deref_type != nir_deref_type_array)
|
||||
return true;
|
||||
|
||||
if (nir_deref_instr_has_complex_use(use_deref))
|
||||
if (nir_deref_instr_has_complex_use(use_deref, opts))
|
||||
return true;
|
||||
|
||||
continue;
|
||||
|
|
@ -214,6 +215,15 @@ nir_deref_instr_has_complex_use(nir_deref_instr *deref)
|
|||
continue;
|
||||
return true;
|
||||
|
||||
case nir_intrinsic_memcpy_deref:
|
||||
if (use_src == &use_intrin->src[0] &&
|
||||
(opts & nir_deref_instr_has_complex_use_allow_memcpy_dst))
|
||||
continue;
|
||||
if (use_src == &use_intrin->src[1] &&
|
||||
(opts & nir_deref_instr_has_complex_use_allow_memcpy_src))
|
||||
continue;
|
||||
return true;
|
||||
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -273,7 +273,7 @@ nir_lower_const_arrays_to_uniforms(nir_shader *shader,
|
|||
nir_deref_instr *deref = nir_instr_as_deref(instr);
|
||||
if (deref->deref_type == nir_deref_type_var &&
|
||||
deref->var->data.mode == nir_var_function_temp &&
|
||||
nir_deref_instr_has_complex_use(deref))
|
||||
nir_deref_instr_has_complex_use(deref, 0))
|
||||
var_infos[deref->var->index].is_constant = false;
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -460,7 +460,7 @@ register_variable_uses(nir_function_impl *impl,
|
|||
nir_deref_instr *deref = nir_instr_as_deref(instr);
|
||||
|
||||
if (deref->deref_type == nir_deref_type_var &&
|
||||
nir_deref_instr_has_complex_use(deref))
|
||||
nir_deref_instr_has_complex_use(deref, 0))
|
||||
register_complex_use(deref, state);
|
||||
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ nir_opt_large_constants(nir_shader *shader,
|
|||
nir_deref_instr *deref = nir_instr_as_deref(instr);
|
||||
if (deref->deref_type == nir_deref_type_var &&
|
||||
deref->var->data.mode == nir_var_function_temp &&
|
||||
nir_deref_instr_has_complex_use(deref))
|
||||
nir_deref_instr_has_complex_use(deref, 0))
|
||||
var_infos[deref->var->index].is_constant = false;
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ get_complex_used_vars(nir_shader *shader, void *mem_ctx)
|
|||
* nir_deref_instr_has_complex_use is recursive.
|
||||
*/
|
||||
if (deref->deref_type == nir_deref_type_var &&
|
||||
nir_deref_instr_has_complex_use(deref))
|
||||
nir_deref_instr_has_complex_use(deref, 0))
|
||||
_mesa_set_add(complex_vars, deref->var);
|
||||
}
|
||||
}
|
||||
|
|
@ -1044,7 +1044,7 @@ mark_deref_if_complex(nir_deref_instr *deref,
|
|||
if (!(deref->var->data.mode & modes))
|
||||
return;
|
||||
|
||||
if (!nir_deref_instr_has_complex_use(deref))
|
||||
if (!nir_deref_instr_has_complex_use(deref, 0))
|
||||
return;
|
||||
|
||||
struct vec_var_usage *usage =
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue