From 076838ef0cba3bffd8d89a02146c2fcf18c30871 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 19 Jul 2019 12:11:09 -0700 Subject: [PATCH] panfrost/midgard: Check write-before-read in liveness analysis If we write to an index before reading it, the old copy we're checking liveness for isn't live in this block, even if it does get read later. Fixes abnormally high register pressure in shaders with loops. Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/midgard_liveness.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/panfrost/midgard/midgard_liveness.c b/src/panfrost/midgard/midgard_liveness.c index a18d8b9f8ad..899c8eaa00f 100644 --- a/src/panfrost/midgard/midgard_liveness.c +++ b/src/panfrost/midgard/midgard_liveness.c @@ -60,11 +60,24 @@ is_live_after_successors(compiler_context *ctx, midgard_block *bl, int src) succ->visited = true; + /* Within this block, check if it's overwritten first */ + bool block_done = false; + mir_foreach_instr_in_block(succ, ins) { if (midgard_is_live_in_instr(ins, src)) return true; + + /* If written-before-use, we're gone */ + + if (ins->ssa_args.dest == src && ins->type == TAG_LOAD_STORE_4 && ins->load_store.op == midgard_op_ld_int4 && ins->load_store.unknown == 0x1EEA) { + block_done = true; + break; + } } + if (block_done) + continue; + /* ...and also, check *its* successors */ if (is_live_after_successors(ctx, succ, src)) return true; -- 2.30.2