[Mesa-dev] [PATCH] nir/gcm: Rework the schedule late loop
Matt Turner
mattst88 at gmail.com
Thu Jan 12 20:38:12 UTC 2017
On Thu, Dec 1, 2016 at 1:51 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> This fixes a bug in code motion that occurred when the best block is the
> same as the schedule early block. In this case, because we're checking
> (lca != def->parent_instr->block) at the top of the loop, we never get to
> the check for loop depth so we wouldn't move it out of the loop. This
> commit reworks the loop to be a simple for loop up the dominator chain and
> we place the (lca != def->parent_instr->block) check at the end of the
> loop.
> ---
> src/compiler/nir/nir_opt_gcm.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/src/compiler/nir/nir_opt_gcm.c b/src/compiler/nir/nir_opt_gcm.c
> index 77eb8e6..9d7f59c 100644
> --- a/src/compiler/nir/nir_opt_gcm.c
> +++ b/src/compiler/nir/nir_opt_gcm.c
> @@ -326,12 +326,13 @@ gcm_schedule_late_def(nir_ssa_def *def, void *void_state)
> * as far outside loops as we can get.
In this comment, the first line says "know" instead of "now". Please
fix that while we're here.
> */
> nir_block *best = lca;
> - while (lca != def->parent_instr->block) {
> - assert(lca);
> - if (state->blocks[lca->index].loop_depth <
> + for (nir_block *block = lca; block != NULL; block = block->imm_dom) {
> + if (state->blocks[block->index].loop_depth <
> state->blocks[best->index].loop_depth)
> - best = lca;
> - lca = lca->imm_dom;
> + best = block;
> +
> + if (block == def->parent_instr->block)
> + break;
> }
I had to come up with an example and walk through it to understand the
issue, but I now understand and agree that this is the correct fix.
This patch is
Reviewed-by: Matt Turner <mattst88 at gmail.com>
More information about the mesa-dev
mailing list