From 57c9fc3cbaf59320d397df840d3004a58335aa04 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 23 Sep 2020 15:54:08 -0500 Subject: [PATCH] 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 Part-of: --- 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); } }