Commit ae0b8ba5 authored by Erico Nunes's avatar Erico Nunes
Browse files

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's avatarErico Nunes <nunes.erico@gmail.com>
Reviewed-by: Vasily Khoruzhick's avatarVasily Khoruzhick <anarsoul@gmail.com>
Tested-by: Marge Bot <mesa/mesa!3502>
Part-of: <mesa/mesa!3502>
parent ab36523a
Pipeline #101431 passed with stages
in 20 minutes and 25 seconds
......@@ -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) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment