From ae0b8ba5d568f0029f868e02e388c7a71474f6eb Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Mon, 20 Jan 2020 01:29:40 +0100 Subject: [PATCH] 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 Reviewed-by: Vasily Khoruzhick Tested-by: Marge Bot Part-of: --- src/gallium/drivers/lima/ir/pp/liveness.c | 4 ++-- src/gallium/drivers/lima/ir/pp/ppir.h | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/lima/ir/pp/liveness.c b/src/gallium/drivers/lima/ir/pp/liveness.c index 1bc1dc812c6..ccc01a3545f 100644 --- a/src/gallium/drivers/lima/ir/pp/liveness.c +++ b/src/gallium/drivers/lima/ir/pp/liveness.c @@ -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 == diff --git a/src/gallium/drivers/lima/ir/pp/ppir.h b/src/gallium/drivers/lima/ir/pp/ppir.h index b2637cb68c3..2b4629bcaab 100644 --- a/src/gallium/drivers/lima/ir/pp/ppir.h +++ b/src/gallium/drivers/lima/ir/pp/ppir.h @@ -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) { -- 2.30.2