[Mesa-dev] [PATCH 14/21] nir/cf: clean up jumps when cleaning up CF nodes

Connor Abbott cwabbott0 at gmail.com
Tue Jul 21 19:54:28 PDT 2015


We may delete a control flow node which contains structured jumps to
other parts of the program. We need to remove the jump as a predecessor,
as well as remove any phi node sources which reference it. Right now,
the same problem exists for blocks that don't end in a jump instruction,
but with the new API it shouldn't be an issue, since blocks that don't
end in a jump must either point to another block in the same extracted
CF list or not point to anything at all.

Signed-off-by: Connor Abbott <connor.w.abbott at intel.com>
---
 src/glsl/nir/nir_control_flow.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/glsl/nir/nir_control_flow.c b/src/glsl/nir/nir_control_flow.c
index 5aab43b..91788ad 100644
--- a/src/glsl/nir/nir_control_flow.c
+++ b/src/glsl/nir/nir_control_flow.c
@@ -747,7 +747,10 @@ cleanup_cf_node(nir_cf_node *node, nir_function_impl *impl)
       nir_block *block = nir_cf_node_as_block(node);
       /* We need to walk the instructions and clean up defs/uses */
       nir_foreach_instr_safe(block, instr) {
-         if (instr->type != nir_instr_type_jump) {
+         if (instr->type == nir_instr_type_jump) {
+            nir_jump_type jump_type = nir_instr_as_jump(instr)->type;
+            unlink_jump(block, jump_type);
+         } else {
             nir_foreach_ssa_def(instr, replace_ssa_def_uses, impl);
             nir_instr_remove(instr);
          }
-- 
2.4.3



More information about the mesa-dev mailing list