freedreno/ir3: fix for array/reg store vs meta instructions

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>
This commit is contained in:
Rob Clark 2019-07-19 16:47:15 -07:00
parent f7b6a8d12f
commit 73cc2dc084

View 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;