freedreno/ir3: don't cp absneg into meta:fi
authorRob Clark <robdclark@gmail.com>
Mon, 4 Jun 2018 17:31:47 +0000 (13:31 -0400)
committerRob Clark <robdclark@gmail.com>
Mon, 11 Jun 2018 13:06:03 +0000 (09:06 -0400)
If using a fanin (collect) to collect of consecutive registers together,
we can CP mov's into the fanin, but not (abs) or (neg).  No places that
allow those modifiers are consuming a fanin anyways.  But this caused an
absneg to be lost between a ldgb and stgb for shaders like:

  outputs[n] = abs(input[n])

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_cp.c

index e3a3a9db690758f53f330555ff57114158e8bb69..0ee8ea2e0ea295c1c8fea091dabeea180448a603 100644 (file)
@@ -543,6 +543,10 @@ instr_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr)
                if (reg->flags & IR3_REG_ARRAY)
                        continue;
 
+               /* Don't CP absneg into meta instructions, that won't end well: */
+               if (is_meta(instr) && (src->opc != OPC_MOV))
+                       continue;
+
                reg_cp(ctx, instr, reg, n);
        }