pan/midgard: Add mir_single_use helper
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 24 Jul 2019 03:01:44 +0000 (20:01 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 25 Jul 2019 13:37:21 +0000 (06:37 -0700)
Helps as an optimization heuristic.

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

index 2d5f07451a5d0e5be27e7ae30b070386913ae1b0..50e1846f8938ea335f893e3007f7920abc6263e1 100644 (file)
@@ -373,6 +373,7 @@ void mir_rewrite_index(compiler_context *ctx, unsigned old, unsigned new);
 void mir_rewrite_index_src(compiler_context *ctx, unsigned old, unsigned new);
 void mir_rewrite_index_dst(compiler_context *ctx, unsigned old, unsigned new);
 void mir_rewrite_index_src_single(midgard_instruction *ins, unsigned old, unsigned new);
+bool mir_single_use(compiler_context *ctx, unsigned value);
 
 /* MIR printing */
 
index c606cb3ddf798e10e098c0307121b9075499d545..ea7c65110b4f7777acca46c26f5561678daca7d4 100644 (file)
@@ -57,3 +57,24 @@ mir_rewrite_index(compiler_context *ctx, unsigned old, unsigned new)
         mir_rewrite_index_src(ctx, old, new);
         mir_rewrite_index_dst(ctx, old, new);
 }
+
+/* Checks if a value is used only once (or totally dead), which is an important
+ * heuristic to figure out if certain optimizations are Worth It (TM) */
+
+bool
+mir_single_use(compiler_context *ctx, unsigned value)
+{
+        unsigned used_count = 0;
+
+        mir_foreach_instr_global(ctx, ins) {
+                if (mir_has_arg(ins, value))
+                        ++used_count;
+
+                /* Short circuit for speed */
+                if (used_count > 1)
+                        return false;
+        }
+
+        return used_count <= 1;
+
+}