pan/bi: Cull unnecessary edges on the CF graph
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 2 Oct 2020 17:06:54 +0000 (13:06 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sat, 10 Oct 2020 20:53:09 +0000 (16:53 -0400)
If a block ends in an unconditional jump, we don't need to record a
fallthrough successor as well, since it's unreachable.

Likely harmless but makes the IR harder to parse with messy CF graphs.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7081>

src/panfrost/bifrost/bifrost_compile.c
src/panfrost/util/pan_ir.c
src/panfrost/util/pan_ir.h

index 203dc56..25a6bb6 100644 (file)
@@ -72,6 +72,7 @@ emit_jump(bi_context *ctx, nir_jump_instr *instr)
         }
 
         pan_block_add_successor(&ctx->current_block->base, &branch->branch_target->base);
+        ctx->current_block->base.unconditional_jumps = true;
 }
 
 static bi_instruction
index 4fdb9eb..a58fa63 100644 (file)
@@ -81,6 +81,10 @@ pan_block_add_successor(pan_block *block, pan_block *successor)
         assert(block);
         assert(successor);
 
+        /* Cull impossible edges */
+        if (block->unconditional_jumps)
+                return;
+
         for (unsigned i = 0; i < ARRAY_SIZE(block->successors); ++i) {
                 if (block->successors[i]) {
                        if (block->successors[i] == successor)
index f916d40..dec35bc 100644 (file)
@@ -129,6 +129,7 @@ typedef struct pan_block {
         /* Control flow graph */
         struct pan_block *successors[2];
         struct set *predecessors;
+        bool unconditional_jumps;
 
         /* In liveness analysis, these are live masks (per-component) for
          * indices for the block. Scalar compilers have the luxury of using