* all means we need to keep it alive.
*/
assert(deref->mode == deref->var->data.mode);
- if (!(deref->mode & (nir_var_function | nir_var_shader_temp | nir_var_shared)) ||
+ if (!(deref->mode & (nir_var_function_temp | nir_var_shader_temp | nir_var_mem_shared)) ||
deref_used_for_not_store(deref))
_mesa_set_add(live, deref->var);
}
}
static bool
-remove_dead_vars(struct exec_list *var_list, struct set *live)
+remove_dead_vars(struct exec_list *var_list, nir_variable_mode modes,
+ struct set *live, bool (*can_remove_var)(nir_variable *var))
{
bool progress = false;
- foreach_list_typed_safe(nir_variable, var, node, var_list) {
+ nir_foreach_variable_in_list_safe(var, var_list) {
+ if (!(var->data.mode & modes))
+ continue;
+
+ if (can_remove_var && !can_remove_var(var))
+ continue;
+
struct set_entry *entry = _mesa_set_search(live, var);
if (entry == NULL) {
/* Mark this variable as used by setting the mode to 0 */
}
bool
-nir_remove_dead_variables(nir_shader *shader, nir_variable_mode modes)
+nir_remove_dead_variables(nir_shader *shader, nir_variable_mode modes,
+ bool (*can_remove_var)(nir_variable *var))
{
bool progress = false;
struct set *live = _mesa_pointer_set_create(NULL);
add_var_use_shader(shader, live, modes);
- if (modes & nir_var_uniform)
- progress = remove_dead_vars(&shader->uniforms, live) || progress;
-
- if (modes & nir_var_shader_in)
- progress = remove_dead_vars(&shader->inputs, live) || progress;
-
- if (modes & nir_var_shader_out)
- progress = remove_dead_vars(&shader->outputs, live) || progress;
-
- if (modes & nir_var_shader_temp)
- progress = remove_dead_vars(&shader->globals, live) || progress;
-
- if (modes & nir_var_system_value)
- progress = remove_dead_vars(&shader->system_values, live) || progress;
-
- if (modes & nir_var_shared)
- progress = remove_dead_vars(&shader->shared, live) || progress;
+ if (modes & ~nir_var_function_temp) {
+ progress = remove_dead_vars(&shader->variables, modes,
+ live, can_remove_var) || progress;
+ }
- if (modes & nir_var_function) {
+ if (modes & nir_var_function_temp) {
nir_foreach_function(function, shader) {
if (function->impl) {
- if (remove_dead_vars(&function->impl->locals, live))
+ if (remove_dead_vars(&function->impl->locals,
+ nir_var_function_temp,
+ live, can_remove_var))
progress = true;
}
}
}
- if (progress) {
- remove_dead_var_writes(shader, live);
+ nir_foreach_function(function, shader) {
+ if (!function->impl)
+ continue;
- nir_foreach_function(function, shader) {
- if (function->impl) {
- nir_metadata_preserve(function->impl, nir_metadata_block_index |
- nir_metadata_dominance);
- }
+ if (progress) {
+ remove_dead_var_writes(shader, live);
+ nir_metadata_preserve(function->impl, nir_metadata_block_index |
+ nir_metadata_dominance);
+ } else {
+ nir_metadata_preserve(function->impl, nir_metadata_all);
}
}