nir: Remove deref chain support from analyze_loops
Note that this patch needs to come late in the series since this pass can be run after any pass that damages nir_metadata_loop_analysis. Acked-by: Rob Clark <robdclark@gmail.com> Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Acked-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
2db8784167
commit
9800b81ffb
|
@ -619,51 +619,6 @@ find_trip_count(loop_info_state *state)
|
||||||
state->loop->info->limiting_terminator = limiting_terminator;
|
state->loop->info->limiting_terminator = limiting_terminator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks if we should force the loop to be unrolled regardless of size
|
|
||||||
* due to array access heuristics.
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
force_unroll_array_access_var(loop_info_state *state, nir_shader *ns,
|
|
||||||
nir_deref_var *variable)
|
|
||||||
{
|
|
||||||
nir_deref *tail = &variable->deref;
|
|
||||||
|
|
||||||
while (tail->child != NULL) {
|
|
||||||
tail = tail->child;
|
|
||||||
|
|
||||||
if (tail->deref_type == nir_deref_type_array) {
|
|
||||||
|
|
||||||
nir_deref_array *deref_array = nir_deref_as_array(tail);
|
|
||||||
if (deref_array->deref_array_type != nir_deref_array_type_indirect)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
nir_loop_variable *array_index =
|
|
||||||
get_loop_var(deref_array->indirect.ssa, state);
|
|
||||||
|
|
||||||
if (array_index->type != basic_induction)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* If an array is indexed by a loop induction variable, and the
|
|
||||||
* array size is exactly the number of loop iterations, this is
|
|
||||||
* probably a simple for-loop trying to access each element in
|
|
||||||
* turn; the application may expect it to be unrolled.
|
|
||||||
*/
|
|
||||||
if (glsl_get_length(variable->deref.type) ==
|
|
||||||
state->loop->info->trip_count) {
|
|
||||||
state->loop->info->force_unroll = true;
|
|
||||||
return state->loop->info->force_unroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (variable->var->data.mode & state->indirect_mask) {
|
|
||||||
state->loop->info->force_unroll = true;
|
|
||||||
return state->loop->info->force_unroll;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
force_unroll_array_access(loop_info_state *state, nir_shader *ns,
|
force_unroll_array_access(loop_info_state *state, nir_shader *ns,
|
||||||
nir_deref_instr *deref)
|
nir_deref_instr *deref)
|
||||||
|
@ -708,17 +663,6 @@ force_unroll_heuristics(loop_info_state *state, nir_shader *ns,
|
||||||
/* Check for arrays variably-indexed by a loop induction variable.
|
/* Check for arrays variably-indexed by a loop induction variable.
|
||||||
* Unrolling the loop may convert that access into constant-indexing.
|
* Unrolling the loop may convert that access into constant-indexing.
|
||||||
*/
|
*/
|
||||||
if (intrin->intrinsic == nir_intrinsic_load_var ||
|
|
||||||
intrin->intrinsic == nir_intrinsic_store_var ||
|
|
||||||
intrin->intrinsic == nir_intrinsic_copy_var) {
|
|
||||||
unsigned num_vars =
|
|
||||||
nir_intrinsic_infos[intrin->intrinsic].num_variables;
|
|
||||||
for (unsigned i = 0; i < num_vars; i++) {
|
|
||||||
if (force_unroll_array_access_var(state, ns, intrin->variables[i]))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (intrin->intrinsic == nir_intrinsic_load_deref ||
|
if (intrin->intrinsic == nir_intrinsic_load_deref ||
|
||||||
intrin->intrinsic == nir_intrinsic_store_deref ||
|
intrin->intrinsic == nir_intrinsic_store_deref ||
|
||||||
intrin->intrinsic == nir_intrinsic_copy_deref) {
|
intrin->intrinsic == nir_intrinsic_copy_deref) {
|
||||||
|
|
Loading…
Reference in New Issue