freedreno/ir3/cf: skip array load/store
authorRob Clark <robdclark@chromium.org>
Mon, 16 Mar 2020 21:50:32 +0000 (14:50 -0700)
committerMarge Bot <eric+marge@anholt.net>
Sat, 4 Apr 2020 00:07:10 +0000 (00:07 +0000)
Don't fold conversions into array (incl phi lowered to regs/array).
These aren't SSA.  Avoids crashes in particular in frag shaders with
flow control, which would leave a dangling array write disconnect from
the original cov src.

Possibly this could be slightly relaxed, if there is no other consumer
of the src, and it were in the same block.  But it would require
updating block->keeps, and taking care of barrier state.  Which isn't a
thing the cf pass does currently.

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

src/freedreno/ir3/ir3_cf.c

index 636ed384d792eb6f6885541c8d92634940de439b..b90357061318336bd4372a09a8832f47f5dcc813 100644 (file)
@@ -38,6 +38,11 @@ is_fp16_conv(struct ir3_instruction *instr)
        if (dst->flags & (IR3_REG_EVEN | IR3_REG_POS_INF))
                return false;
 
+       if (dst->flags & (IR3_REG_RELATIV | IR3_REG_ARRAY))
+               return false;
+       if (src->flags & (IR3_REG_RELATIV | IR3_REG_ARRAY))
+               return false;
+
        if (instr->cat1.src_type == TYPE_F32 &&
                        instr->cat1.dst_type == TYPE_F16)
                return true;