ir3/cp: Prevent setting an address on subgroup macros
These macros expand to a mov in an if statement which breaks address assumption that instruction which produces address and consumes it are in the same block. Fixes test: dEQP-VK.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intvertex Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13931>
This commit is contained in:

committed by
Marge Bot

parent
d14c09f7f6
commit
a78c36ecc6
@@ -861,6 +861,23 @@ is_const_mov(struct ir3_instruction *instr)
|
|||||||
(type_sint(src_type) && type_sint(dst_type));
|
(type_sint(src_type) && type_sint(dst_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
is_subgroup_cond_mov_macro(struct ir3_instruction *instr)
|
||||||
|
{
|
||||||
|
switch (instr->opc) {
|
||||||
|
case OPC_BALLOT_MACRO:
|
||||||
|
case OPC_ANY_MACRO:
|
||||||
|
case OPC_ALL_MACRO:
|
||||||
|
case OPC_ELECT_MACRO:
|
||||||
|
case OPC_READ_COND_MACRO:
|
||||||
|
case OPC_READ_FIRST_MACRO:
|
||||||
|
case OPC_SWZ_SHARED_MACRO:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
is_alu(struct ir3_instruction *instr)
|
is_alu(struct ir3_instruction *instr)
|
||||||
{
|
{
|
||||||
|
@@ -397,6 +397,11 @@ reg_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr,
|
|||||||
conflicts(instr->address, reg->def->instr->address))
|
conflicts(instr->address, reg->def->instr->address))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
/* These macros expand to a mov in an if statement */
|
||||||
|
if ((src_reg->flags & IR3_REG_RELATIV) &&
|
||||||
|
is_subgroup_cond_mov_macro(instr))
|
||||||
|
return false;
|
||||||
|
|
||||||
/* This seems to be a hw bug, or something where the timings
|
/* This seems to be a hw bug, or something where the timings
|
||||||
* just somehow don't work out. This restriction may only
|
* just somehow don't work out. This restriction may only
|
||||||
* apply if the first src is also CONST.
|
* apply if the first src is also CONST.
|
||||||
|
@@ -149,6 +149,9 @@ instr_cp_postsched(struct ir3_instruction *mov)
|
|||||||
if (is_meta(use))
|
if (is_meta(use))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (is_subgroup_cond_mov_macro(use))
|
||||||
|
continue;
|
||||||
|
|
||||||
struct ir3_register *def = src->def;
|
struct ir3_register *def = src->def;
|
||||||
if (has_conflicting_write(mov, use, &def, src->array.id, offset))
|
if (has_conflicting_write(mov, use, &def, src->array.id, offset))
|
||||||
continue;
|
continue;
|
||||||
|
Reference in New Issue
Block a user