vc4: Drop destination register when it's unused.
authorEric Anholt <eric@anholt.net>
Wed, 5 Oct 2016 16:21:37 +0000 (09:21 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 7 Oct 2016 01:09:24 +0000 (18:09 -0700)
This slightly reduces instructions on shader-db, but I think it's just
perturbing register allocation -- the allocator should have always
trivially colored these nodes, before.  This commit is just to make QIR
code failing more intelligible when register allocation fails.

src/gallium/drivers/vc4/vc4_opt_dead_code.c

index f516d388429b6414e907c834259f84f369bb14d6..1838c394ff91aa0f68a8d6c8ffcfab36c4378f17 100644 (file)
@@ -102,9 +102,30 @@ qir_opt_dead_code(struct vc4_compile *c)
                                 continue;
                         }
 
+                        if (qir_has_side_effects(c, inst))
+                                continue;
+
                         if (inst->sf ||
-                            qir_has_side_effects(c, inst) ||
                             has_nonremovable_reads(c, inst)) {
+                                /* If we can't remove the instruction, but we
+                                 * don't need its destination value, just
+                                 * remove the destination.  The register
+                                 * allocator would trivially color it and it
+                                 * wouldn't cause any register pressure, but
+                                 * it's nicer to read the QIR code without
+                                 * unused destination regs.
+                                 */
+                                if (inst->dst.file == QFILE_TEMP) {
+                                        if (debug) {
+                                                fprintf(stderr,
+                                                        "Removing dst from: ");
+                                                qir_dump_inst(c, inst);
+                                                fprintf(stderr, "\n");
+                                        }
+                                        c->defs[inst->dst.index] = NULL;
+                                        inst->dst.file = QFILE_NULL;
+                                        progress = true;
+                                }
                                 continue;
                         }