vc4: Allow copy propagation of uniforms.
authorEric Anholt <eric@anholt.net>
Tue, 16 Sep 2014 23:03:39 +0000 (16:03 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 17 Sep 2014 21:21:24 +0000 (14:21 -0700)
Fixes 12 piglit tests (and 8 more crash -> fail) from reducing register
pressure.

src/gallium/drivers/vc4/vc4_opt_copy_propagation.c

index b36bb42..66b7c80 100644 (file)
@@ -45,10 +45,22 @@ qir_opt_copy_propagation(struct vc4_compile *c)
         foreach(node, &c->instructions) {
                 struct qinst *inst = (struct qinst *)node;
 
+                /* A single instruction can only read one uniform value.  (It
+                 * could maybe read the same uniform value in two operands,
+                 * but that doesn't seem important to do).
+                 */
+                bool reads_a_uniform = false;
+                for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) {
+                        if (inst->src[i].file == QFILE_UNIF)
+                                reads_a_uniform = true;
+                }
+
                 for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) {
                         int index = inst->src[i].index;
                         if (inst->src[i].file == QFILE_TEMP &&
-                            movs[index].file == QFILE_TEMP) {
+                            (movs[index].file == QFILE_TEMP ||
+                             (movs[index].file == QFILE_UNIF &&
+                              !reads_a_uniform))) {
                                 if (debug) {
                                         fprintf(stderr, "Copy propagate: ");
                                         qir_dump_inst(inst);
@@ -56,6 +68,8 @@ qir_opt_copy_propagation(struct vc4_compile *c)
                                 }
 
                                 inst->src[i] = movs[index];
+                                if (movs[index].file == QFILE_UNIF)
+                                        reads_a_uniform = true;
 
                                 if (debug) {
                                         fprintf(stderr, "to: ");