freedreno/ir3/cp: fix cmps folding
authorRob Clark <robdclark@chromium.org>
Sun, 17 May 2020 01:03:25 +0000 (18:03 -0700)
committerMarge Bot <eric+marge@anholt.net>
Tue, 19 May 2020 16:06:17 +0000 (16:06 +0000)
When we start doing cp iteratively, we hit the case that we've already
`cmps.s.*` into a `cmps.s.ne p0.x, ...`..  when we try to do that again
we can invert the logic condition.  So check specifically the condition
to prevent this.

TODO we could maybe be more clever about this to combine conditions.
But why isn't that happening in nir?  For example, see
dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.bool

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5048>

src/freedreno/ir3/ir3_cp.c

index a7ae834d18affec8a9788e1cca8cebefb239bb2f..fd1373018741ffe77969e38f42a27f4ebe0baab2 100644 (file)
@@ -696,7 +696,8 @@ instr_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr)
                        (instr->regs[0]->num == regid(REG_P0, 0)) &&
                        ssa(instr->regs[1]) &&
                        (instr->regs[2]->flags & IR3_REG_IMMED) &&
-                       (instr->regs[2]->iim_val == 0)) {
+                       (instr->regs[2]->iim_val == 0) &&
+                       (instr->cat2.condition == IR3_COND_NE)) {
                struct ir3_instruction *cond = ssa(instr->regs[1]);
                switch (cond->opc) {
                case OPC_CMPS_S: