pan/midgard: Analyze load/store for swizzle propagation
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 16 Aug 2019 14:54:34 +0000 (07:54 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 19 Aug 2019 15:32:17 +0000 (08:32 -0700)
If there's a nontrivial swizzle fed into an extra (shortened) argument,
we bail on copyprop. No glmark changes (since it doesn't use fancy
texturing/loads).

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/midgard_opt_copy_prop.c

index dc5579c4d463eda4240f97312c055c2d6f9b78c9..68c1a4d0d55e24758504fe14f3bf60b32623e8c8 100644 (file)
@@ -52,13 +52,31 @@ midgard_opt_copy_prop(compiler_context *ctx, midgard_block *block)
                 if (mir_nontrivial_source2_mod_simple(ins)) continue;
                 if (mir_nontrivial_outmod(ins)) continue;
 
-                /* Texture ops have some weirdness around bias */
+                /* Shortened arguments (bias for textures, extra load/store
+                 * arguments, etc.) do not get a swizzlw, only a start
+                 * component and even that is restricted. */
 
                 bool skip = false;
 
                 mir_foreach_instr_global(ctx, q) {
-                        if (q->ssa_args.src[1] != to) continue;
-                        if (q->type == TAG_TEXTURE_4) skip = true;
+                        bool is_tex = q->type == TAG_TEXTURE_4;
+                        bool is_ldst = q->type == TAG_LOAD_STORE_4;
+
+                        if (!(is_tex || is_ldst)) continue;
+
+                        /* For textures, we get one real swizzle. For stores,
+                         * we also get one. For loads, we get none. */
+
+                        unsigned start =
+                                is_tex ? 1 :
+                                OP_IS_STORE(q->load_store.op) ? 1 : 0;
+
+                        mir_foreach_src(q, s) {
+                                if ((s >= start) && q->ssa_args.src[s] == to) {
+                                        skip = true;
+                                        break;
+                                }
+                        }
                 }
 
                 if (skip)