From 3a9c2e073e263edec7f2ac500367ae09cee5e010 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Fri, 19 Mar 2021 16:41:38 +0100 Subject: [PATCH] ir3: Don't copy propagate arrays in ir3_cp We don't check whether there's an intervening write in this pass, which makes it incorrect. ir3_cp_postsched does check correctly, but we were accidentally doing it here anyway for some sources. While we're here, delete some code that was only used in the array case. Fixes: f370e954 ("freedreno/ir3: handle const/immed/abs/neg in cp") Reviewed-by: Rob Clark Part-of: (cherry picked from commit 5a70c4d4a0a6655b4b667289c0e32f9a8bb1f486) --- .pick_status.json | 2 +- src/freedreno/ir3/ir3_cp.c | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index d96058b5fd0..c3aa5869b6f 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -67,7 +67,7 @@ "description": "ir3: Don't copy propagate arrays in ir3_cp", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "f370e95421f553ace931a02743c96be80fd62dc8" }, diff --git a/src/freedreno/ir3/ir3_cp.c b/src/freedreno/ir3/ir3_cp.c index a8e92911e96..e5b5e101f9e 100644 --- a/src/freedreno/ir3/ir3_cp.c +++ b/src/freedreno/ir3/ir3_cp.c @@ -338,6 +338,9 @@ reg_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr, struct ir3_register *src_reg = src->regs[1]; unsigned new_flags = reg->flags; + if (src_reg->flags & IR3_REG_ARRAY) + return false; + combine_flags(&new_flags, src); if (!ir3_valid_flags(instr, n, new_flags)) { @@ -412,16 +415,6 @@ reg_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr, return true; } - if ((src_reg->flags & IR3_REG_RELATIV) && - !conflicts(instr->address, reg->instr->address)) { - src_reg = ir3_reg_clone(instr->block->shader, src_reg); - src_reg->flags = new_flags; - instr->regs[n+1] = src_reg; - ir3_instr_set_address(instr, reg->instr->address); - - return true; - } - /* NOTE: seems we can only do immed integers, so don't * need to care about float. But we do need to handle * abs/neg *before* checking that the immediate requires