freedreno/ir3: fix for array/reg store vs meta instructions
authorRob Clark <robdclark@chromium.org>
Fri, 19 Jul 2019 23:47:15 +0000 (16:47 -0700)
committerRob Clark <robdclark@chromium.org>
Mon, 29 Jul 2019 22:15:31 +0000 (15:15 -0700)
fishgl.com has a shader which does roughly:

   foo = texture(...);
   if (bar)
      foo = texture(...);

after lowering phi webs to regs we end up w/ a vec4 reg (array).  But
since it was not an indirect access, we try to skip the extra mov.  This
results that the per-component fanout (split) meta instructions store
directly to the reg (array).  Which doesn't work out in RA.

Signed-off-by: Rob Clark <robdclark@chromium.org>
src/freedreno/ir3/ir3_context.c

index dc9ed10d84496a302cd93b8b09780e7b96e22155..c389f750bd57596f06b4b09ed6a3972b238f9180 100644 (file)
@@ -530,8 +530,11 @@ ir3_create_array_store(struct ir3_context *ctx, struct ir3_array *arr, int n,
 
        /* if not relative store, don't create an extra mov, since that
         * ends up being difficult for cp to remove.
+        *
+        * Also, don't skip the mov if the src is meta (like fanout/split),
+        * since that creates a situation that RA can't really handle properly.
         */
-       if (!address) {
+       if (!address && !is_meta(src)) {
                dst = src->regs[0];
 
                src->barrier_class |= IR3_BARRIER_ARRAY_W;