Mesa (master): nir: add complex_loop bool to loop info

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Aug 29 06:02:19 UTC 2018


Module: Mesa
Branch: master
Commit: 5a6b04d94bd2ec175d485b71e8ae815efd778a8a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5a6b04d94bd2ec175d485b71e8ae815efd778a8a

Author: Timothy Arceri <tarceri at itsqueeze.com>
Date:   Sat Jul  7 12:09:26 2018 +1000

nir: add complex_loop bool to loop info

In order to be sure loop_terminator_list is an accurate
representation of all the jumps in the loop we need to be sure we
didn't encounter any other complex behaviour such as continues,
nested breaks, etc during analysis.

This will be used in the following patch.

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

---

 src/compiler/nir/nir.h              | 6 ++++++
 src/compiler/nir/nir_loop_analyze.c | 8 ++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 009a6d6037..12cad6029c 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -1801,6 +1801,12 @@ typedef struct {
    /* Unroll the loop regardless of its size */
    bool force_unroll;
 
+   /* Does the loop contain complex loop terminators, continues or other
+    * complex behaviours? If this is true we can't rely on
+    * loop_terminator_list to be complete or accurate.
+    */
+   bool complex_loop;
+
    nir_loop_terminator *limiting_terminator;
 
    /* A list of loop_terminators terminating this loop. */
diff --git a/src/compiler/nir/nir_loop_analyze.c b/src/compiler/nir/nir_loop_analyze.c
index 5454b7691b..9c3fd2f286 100644
--- a/src/compiler/nir/nir_loop_analyze.c
+++ b/src/compiler/nir/nir_loop_analyze.c
@@ -317,15 +317,19 @@ find_loop_terminators(loop_info_state *state)
           * not find a loop terminator, but there is a break-statement then
           * we should return false so that we do not try to find trip-count
           */
-         if (!nir_is_trivial_loop_if(nif, break_blk))
+         if (!nir_is_trivial_loop_if(nif, break_blk)) {
+            state->loop->info->complex_loop = true;
             return false;
+         }
 
          /* Continue if the if contained no jumps at all */
          if (!break_blk)
             continue;
 
-         if (nif->condition.ssa->parent_instr->type == nir_instr_type_phi)
+         if (nif->condition.ssa->parent_instr->type == nir_instr_type_phi) {
+            state->loop->info->complex_loop = true;
             return false;
+         }
 
          nir_loop_terminator *terminator =
             rzalloc(state->loop->info, nir_loop_terminator);




More information about the mesa-commit mailing list