lima/ppir: fix src read mask swizzling
authorErico Nunes <nunes.erico@gmail.com>
Mon, 20 Jan 2020 00:29:40 +0000 (01:29 +0100)
committerErico Nunes <nunes.erico@gmail.com>
Sat, 25 Jan 2020 13:48:55 +0000 (14:48 +0100)
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>

src/gallium/drivers/lima/ir/pp/liveness.c
src/gallium/drivers/lima/ir/pp/ppir.h

index 1bc1dc812c6fe9ba7fd25607e7fd016e8e9b4a40..ccc01a3545f6b1aa4b0e15b162067447bfdacb0f 100644 (file)
@@ -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 ==
index b2637cb68c358a24794a35e77c356ba4fd9df4b4..2b4629bcaabf9cb33b268bfa9976daa16d732c07 100644 (file)
@@ -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) {