From 71d4fc88d6b97d6b9a8f1a324d2dcd0c56b79f3d Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 16 Sep 2014 16:03:39 -0700 Subject: [PATCH] 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: "); -- 2.7.4