mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 22:38:05 +02:00
lima/ppir: fix src read mask swizzling
The src mask can't be calculated from the dest write_mask. Instead, it must be calculated from the swizzled operators of the src. Otherwise, liveness calculation may report incorrect live components for non-ssa registers. Signed-off-by: Erico Nunes <nunes.erico@gmail.com> Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3502> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3502>
This commit is contained in:
parent
ab36523ae7
commit
ae0b8ba5d5
2 changed files with 13 additions and 11 deletions
|
|
@ -148,7 +148,7 @@ ppir_liveness_instr_srcs(ppir_compiler *comp, ppir_instr *instr)
|
|||
_mesa_set_add(instr->live_in_set, &instr->live_in[reg->regalloc_index]);
|
||||
}
|
||||
else {
|
||||
unsigned int mask = ppir_src_get_mask(node);
|
||||
unsigned int mask = ppir_src_get_mask(src);
|
||||
|
||||
/* read reg is type register, need to check if this sets
|
||||
* any additional bits in the current mask */
|
||||
|
|
@ -209,7 +209,7 @@ ppir_liveness_instr_dest(ppir_compiler *comp, ppir_instr *instr)
|
|||
_mesa_set_remove_key(instr->live_in_set, &instr->live_in[reg->regalloc_index]);
|
||||
}
|
||||
else {
|
||||
unsigned int mask = ppir_src_get_mask(node);
|
||||
unsigned int mask = dest->write_mask;
|
||||
/* written reg is type register, need to check if this clears
|
||||
* the remaining mask to remove it from the live set */
|
||||
if (instr->live_in[reg->regalloc_index].mask ==
|
||||
|
|
|
|||
|
|
@ -478,15 +478,6 @@ static inline ppir_dest *ppir_node_get_dest(ppir_node *node)
|
|||
}
|
||||
}
|
||||
|
||||
static inline int ppir_src_get_mask(ppir_node *node)
|
||||
{
|
||||
ppir_dest *dest = ppir_node_get_dest(node);
|
||||
if (dest)
|
||||
return dest->write_mask;
|
||||
|
||||
return 0x01;
|
||||
}
|
||||
|
||||
static inline int ppir_node_get_src_num(ppir_node *node)
|
||||
{
|
||||
switch (node->type) {
|
||||
|
|
@ -635,6 +626,17 @@ static inline int ppir_target_get_dest_reg_index(ppir_dest *dest)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static inline int ppir_src_get_mask(ppir_src *src)
|
||||
{
|
||||
ppir_reg *reg = ppir_src_get_reg(src);
|
||||
int mask = 0;
|
||||
|
||||
for (int i = 0; i < reg->num_components; i++)
|
||||
mask |= (1 << src->swizzle[i]);
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static inline bool ppir_target_is_scaler(ppir_dest *dest)
|
||||
{
|
||||
switch (dest->type) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue