From e59bfc820bdf8531c941150de2ea56fb83b6b28f Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 2 Sep 2019 10:08:37 -0700 Subject: [PATCH] freedreno/ir3: assert that only single address An instruction can reference only a single address register value. Add an assert to catch bugs. Also, address value should also be local to the same block as the instruction. (The one spot where changing the instruction address is actually legit needs to clear the address first.) Signed-off-by: Rob Clark Reviewed-by: Eric Anholt --- src/freedreno/ir3/ir3.c | 4 ++++ src/freedreno/ir3/ir3_sched.c | 1 + 2 files changed, 5 insertions(+) diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c index 5c049a5..feec723 100644 --- a/src/freedreno/ir3/ir3.c +++ b/src/freedreno/ir3/ir3.c @@ -1041,6 +1041,10 @@ ir3_instr_set_address(struct ir3_instruction *instr, { if (instr->address != addr) { struct ir3 *ir = instr->block->shader; + + debug_assert(!instr->address); + debug_assert(instr->block == addr->block); + instr->address = addr; array_insert(ir, ir->indirects, instr); } diff --git a/src/freedreno/ir3/ir3_sched.c b/src/freedreno/ir3/ir3_sched.c index 9a544a8..96897f6 100644 --- a/src/freedreno/ir3/ir3_sched.c +++ b/src/freedreno/ir3/ir3_sched.c @@ -709,6 +709,7 @@ split_addr(struct ir3_sched_ctx *ctx) /* original addr is scheduled, but new one isn't: */ new_addr->flags &= ~IR3_INSTR_MARK; } + indirect->address = NULL; ir3_instr_set_address(indirect, new_addr); } } -- 2.7.4