pan/midgard: Allow scheduling conditions with constants
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sat, 28 Sep 2019 17:05:12 +0000 (13:05 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 30 Sep 2019 12:40:13 +0000 (08:40 -0400)
Now that we have constant adjustment logic abstracted, we can do this
safely. Along with the csel inversion patch, this allows many more
common csel ops to inline their condition in the bundle.

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

index 7ed36a5e7391ca537e8fe788795c459b4c3d1d2c..d5fd17bc6db3c2294d3b1e0f646348a96c7e2513 100644 (file)
@@ -654,6 +654,7 @@ static unsigned
 mir_comparison_mobile(
                 compiler_context *ctx,
                 midgard_instruction **instructions,
+                struct midgard_predicate *predicate,
                 unsigned count,
                 unsigned cond)
 {
@@ -676,9 +677,9 @@ mir_comparison_mobile(
                 if (GET_CHANNEL_COUNT(alu_opcode_props[instructions[i]->alu.op].props))
                         return ~0;
 
-                /* TODO: moving conditionals with constants */
+                /* Ensure it will fit with constants */
 
-                if (instructions[i]->has_constants)
+                if (!mir_adjust_constants(instructions[i], predicate, false))
                         return ~0;
 
                 /* Ensure it is written only once */
@@ -689,6 +690,10 @@ mir_comparison_mobile(
                         ret = i;
         }
 
+        /* Inject constants now that we are sure we want to */
+        if (ret != ~0)
+                mir_adjust_constants(instructions[ret], predicate, true);
+
         return ret;
 }
 
@@ -700,6 +705,7 @@ static midgard_instruction *
 mir_schedule_comparison(
                 compiler_context *ctx,
                 midgard_instruction **instructions,
+                struct midgard_predicate *predicate,
                 BITSET_WORD *worklist, unsigned count,
                 unsigned cond, bool vector, unsigned swizzle,
                 midgard_instruction *user)
@@ -707,7 +713,7 @@ mir_schedule_comparison(
         /* TODO: swizzle when scheduling */
         unsigned comp_i =
                 (!vector && (swizzle == 0)) ?
-                mir_comparison_mobile(ctx, instructions, count, cond) : ~0;
+                mir_comparison_mobile(ctx, instructions, predicate, count, cond) : ~0;
 
         /* If we can, schedule the condition immediately */
         if ((comp_i != ~0) && BITSET_TEST(worklist, comp_i)) {
@@ -747,7 +753,7 @@ mir_schedule_condition(compiler_context *ctx,
         /* Grab the conditional instruction */
 
         midgard_instruction *cond = mir_schedule_comparison(
-                        ctx, instructions, worklist, count, last->src[condition_index],
+                        ctx, instructions, predicate, worklist, count, last->src[condition_index],
                         vector, last->cond_swizzle, last);
 
         /* We have exclusive reign over this (possibly move) conditional