Module: Mesa
Branch: master
Commit: 71d4fc88d6b97d6b9a8f1a324d2dcd0c56b79f3d
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=71d4fc88d6b97d6b9a8f1a324d2dcd0c56b79f3d

Author: Eric Anholt <[email protected]>
Date:   Tue Sep 16 16:03:39 2014 -0700

vc4: Allow copy propagation of uniforms.

Fixes 12 piglit tests (and 8 more crash -> fail) from reducing register
pressure.

---

 src/gallium/drivers/vc4/vc4_opt_copy_propagation.c |   16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c 
b/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c
index b36bb42..66b7c80 100644
--- a/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c
+++ b/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c
@@ -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: ");

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to