pan/bi: Structify ADD unit add/min/max
[mesa.git] / src / panfrost / midgard / midgard_opt_copy_prop.c
index 9a278876088f0cdcfcf58194205c8837e186540f..ca4f78f9a330806c305e082e8395b469a807812e 100644 (file)
 #include "compiler.h"
 #include "midgard_ops.h"
 
+/* Special case for copypropagating the results of vectors */
+
+static bool
+midgard_opt_copy_prop_reg(compiler_context *ctx, midgard_block *block)
+{
+        bool progress = false;
+
+        mir_foreach_instr_in_block_safe(block, ins) {
+                if (ins->type != TAG_ALU_4) continue;
+                if (!OP_IS_MOVE(ins->alu.op)) continue;
+
+                unsigned from = ins->src[1];
+                unsigned to = ins->dest;
+
+                if (!(to & IS_REG))  continue;
+                if (from & IS_REG) continue;
+
+                if (ins->has_inline_constant) continue;
+                if (ins->has_constants) continue;
+                if (mir_nontrivial_source2_mod(ins)) continue;
+                if (mir_nontrivial_outmod(ins)) continue;
+                if (!mir_single_use(ctx, from)) continue;
+
+                /* Ensure mask is continguous from 0 */
+                if (!(ins->mask & (1 << COMPONENT_X))) continue;
+                if (ins->mask & (ins->mask + 1)) continue;
+
+                mir_rewrite_index_dst(ctx, from, ins->dest);
+                mir_remove_instruction(ins);
+                progress |= true;
+        }
+
+        return progress;
+}
+
 bool
 midgard_opt_copy_prop(compiler_context *ctx, midgard_block *block)
 {
@@ -53,22 +88,25 @@ midgard_opt_copy_prop(compiler_context *ctx, midgard_block *block)
                 if (mir_nontrivial_outmod(ins)) continue;
 
                 /* Shortened arguments (bias for textures, extra load/store
-                 * arguments, etc.) do not get a swizzlw, only a start
-                 * component and even that is restricted. */
+                 * arguments, etc.) do not get a swizzle, only a start
+                 * component and even that is restricted. Fragment writeout
+                 * doesn't even get that much */
 
                 bool skip = false;
 
                 mir_foreach_instr_global(ctx, q) {
                         bool is_tex = q->type == TAG_TEXTURE_4;
                         bool is_ldst = q->type == TAG_LOAD_STORE_4;
+                        bool is_branch = q->compact_branch;
 
-                        if (!(is_tex || is_ldst)) continue;
+                        if (!(is_tex || is_ldst || is_branch)) continue;
 
-                        /* For textures, we get one real swizzle. For stores,
-                         * we also get one. For loads, we get none. */
+                        /* For textures, we get a real swizzle for the
+                         * coordinate and the content. For stores, we get one.
+                         * For loads, we get none. */
 
                         unsigned start =
-                                is_tex ? 1 :
+                                is_tex ? 2 :
                                 OP_IS_STORE(q->load_store.op) ? 1 : 0;
 
                         mir_foreach_src(q, s) {
@@ -83,13 +121,10 @@ midgard_opt_copy_prop(compiler_context *ctx, midgard_block *block)
                         continue;
 
                 /* We're clear -- rewrite, composing the swizzle */
-                midgard_vector_alu_src src2 =
-                        vector_alu_from_unsigned(ins->alu.src2);
-
-                mir_rewrite_index_src_swizzle(ctx, to, from, src2.swizzle);
+                mir_rewrite_index_src_swizzle(ctx, to, from, ins->swizzle[1]);
                 mir_remove_instruction(ins);
                 progress |= true;
         }
 
-        return progress;
+        return progress | midgard_opt_copy_prop_reg(ctx, block);
 }