aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/vc4/vc4_opt_copy_propagation.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c b/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c
index b36bb4209a5..66b7c80a77d 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: ");