nir: store the results of divergence analysis on loops
authorArcady Goldmints-Orlov <agoldmints@igalia.com>
Thu, 24 Dec 2020 16:23:33 +0000 (10:23 -0600)
committerMarge Bot <eric+marge@anholt.net>
Mon, 1 Feb 2021 08:11:48 +0000 (08:11 +0000)
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7726>

src/compiler/nir/nir.c
src/compiler/nir/nir.h
src/compiler/nir/nir_divergence_analysis.c

index 7f63cc4..176d9c1 100644 (file)
@@ -465,6 +465,8 @@ nir_loop_create(nir_shader *shader)
    nir_loop *loop = rzalloc(shader, nir_loop);
 
    cf_init(&loop->cf_node, nir_cf_node_loop);
+   /* Assume that loops are divergent until proven otherwise */
+   loop->divergent = true;
 
    nir_block *body = nir_block_create(shader);
    exec_list_make_empty(&loop->body);
index 0326725..5d8de70 100644 (file)
@@ -2783,6 +2783,7 @@ typedef struct {
    nir_loop_info *info;
    nir_loop_control control;
    bool partially_unrolled;
+   bool divergent;
 } nir_loop;
 
 /**
index a859baa..7c0fc12 100644 (file)
@@ -890,6 +890,8 @@ visit_loop(nir_loop *loop, struct divergence_state *state)
                                       loop_state.divergent_loop_break);
    }
 
+   loop->divergent = (loop_state.divergent_loop_break || loop_state.divergent_loop_continue);
+
    return progress;
 }