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 <robdclark@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10076>
This commit is contained in:
parent
1ad5ee5a04
commit
5a70c4d4a0
|
@ -338,6 +338,9 @@ reg_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr,
|
||||||
struct ir3_register *src_reg = src->regs[1];
|
struct ir3_register *src_reg = src->regs[1];
|
||||||
unsigned new_flags = reg->flags;
|
unsigned new_flags = reg->flags;
|
||||||
|
|
||||||
|
if (src_reg->flags & IR3_REG_ARRAY)
|
||||||
|
return false;
|
||||||
|
|
||||||
combine_flags(&new_flags, src);
|
combine_flags(&new_flags, src);
|
||||||
|
|
||||||
if (!ir3_valid_flags(instr, n, new_flags)) {
|
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;
|
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
|
/* NOTE: seems we can only do immed integers, so don't
|
||||||
* need to care about float. But we do need to handle
|
* need to care about float. But we do need to handle
|
||||||
* abs/neg *before* checking that the immediate requires
|
* abs/neg *before* checking that the immediate requires
|
||||||
|
|
Loading…
Reference in New Issue