vc4: Convert vc4_opt_peephole_sf to work with control flow.
authorEric Anholt <eric@anholt.net>
Fri, 8 Jul 2016 23:59:15 +0000 (16:59 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 12 Jul 2016 22:47:26 +0000 (15:47 -0700)
We need to apply the peephole pass to each of the blocks in the program.
We don't do dataflow analysis for SF across blocks, but we also don't
generate code that would need us to do so.

src/gallium/drivers/vc4/vc4_opt_peephole_sf.c

index 414a9ef1eb30e073a7a75feabc396dbbd617ca82..f4856673ba24e06fefa6631c9860a6b6ceaf116d 100644 (file)
@@ -106,18 +106,21 @@ inst_result_equals(struct qinst *a, struct qinst *b)
         return true;
 }
 
-bool
-qir_opt_peephole_sf(struct vc4_compile *c)
+static bool
+qir_opt_peephole_sf_block(struct vc4_compile *c, struct qblock *block)
 {
         bool progress = false;
+        /* We don't have liveness dataflow analysis for flags, but we also
+         * never generate a use of flags across control flow, so just treat
+         * them as unused at block exit.
+         */
         bool sf_live = false;
         struct qinst *last_sf = NULL;
 
         /* Walk the block from bottom to top, tracking if the SF is used, and
          * removing unused or repeated ones.
          */
-        list_for_each_entry_rev(struct qinst, inst, &c->cur_block->instructions,
-                                link) {
+        qir_for_each_inst_rev(inst, block) {
                 if (inst->sf) {
                         if (!sf_live) {
                                 /* Our instruction's SF isn't read, so drop it.
@@ -153,3 +156,14 @@ qir_opt_peephole_sf(struct vc4_compile *c)
 
         return progress;
 }
+
+bool
+qir_opt_peephole_sf(struct vc4_compile *c)
+{
+        bool progress = false;
+
+        qir_for_each_block(block, c)
+                progress = qir_opt_peephole_sf_block(c, block) || progress;
+
+        return progress;
+}