Mesa (master): nir/lower_goto_ifs: Always include level dom_frontiers in prev_frontier

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Sep 30 17:01:59 UTC 2020


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Wed Sep 23 15:54:08 2020 -0500

nir/lower_goto_ifs: Always include level dom_frontiers in prev_frontier

When we come in from some other level or from the parent, we need to
ensure that the reach set is in prev_frontier but we also need to
consider the dominance frontier of our level.  Otherwise, we may end up
leaving out possible blocks when computing the reach of a level.

Acked-by: Karol Herbst <kherbst at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6750>

---

 src/compiler/nir/nir_lower_goto_ifs.c | 32 ++++++++++++--------------------
 1 file changed, 12 insertions(+), 20 deletions(-)

diff --git a/src/compiler/nir/nir_lower_goto_ifs.c b/src/compiler/nir/nir_lower_goto_ifs.c
index 9b842a95136..f5532e0e356 100644
--- a/src/compiler/nir/nir_lower_goto_ifs.c
+++ b/src/compiler/nir/nir_lower_goto_ifs.c
@@ -738,28 +738,20 @@ organize_levels(struct list_head *levels, struct set *children,
 
       struct set *prev_frontier = NULL;
       if (!prev_level) {
-         prev_frontier = reach;
+         prev_frontier = _mesa_set_clone(reach, curr_level);
       } else if (prev_level->irreducible) {
-         prev_frontier = prev_level->reach;
-      } else {
-         set_foreach(curr_level->blocks, blocks_entry) {
-            nir_block *level_block = (nir_block *) blocks_entry->key;
-            if (curr_level->blocks->entries == 1) {
-               /* If we only have one block, there's no union operation and we
-                * can just use the one from the one block.
-                */
-               prev_frontier = level_block->dom_frontier;
-               break;
-            }
+         prev_frontier = _mesa_set_clone(prev_level->reach, curr_level);
+      }
 
-            if (prev_frontier == NULL) {
-               prev_frontier =
-                  _mesa_set_clone(level_block->dom_frontier, prev_level);
-            } else {
-               set_foreach(level_block->dom_frontier, entry)
-                  _mesa_set_add_pre_hashed(prev_frontier, entry->hash,
-                                           entry->key);
-            }
+      set_foreach(curr_level->blocks, blocks_entry) {
+         nir_block *level_block = (nir_block *) blocks_entry->key;
+         if (prev_frontier == NULL) {
+            prev_frontier =
+               _mesa_set_clone(level_block->dom_frontier, curr_level);
+         } else {
+            set_foreach(level_block->dom_frontier, entry)
+               _mesa_set_add_pre_hashed(prev_frontier, entry->hash,
+                                        entry->key);
          }
       }
 



More information about the mesa-commit mailing list