diff options
-rw-r--r-- | src/gallium/drivers/vc4/vc4_opt_copy_propagation.c | 12 |
1 files changed, 11 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 0cffb284e44..9cf1352514c 100644 --- a/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c +++ b/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c @@ -41,10 +41,14 @@ qir_opt_copy_propagation(struct vc4_compile *c) struct simple_node *node; bool debug = false; struct qreg *movs = calloc(c->num_temps, sizeof(struct qreg)); + struct qinst **defs = calloc(c->num_temps, sizeof(struct qreg)); foreach(node, &c->instructions) { struct qinst *inst = (struct qinst *)node; + if (inst->dst.file == QFILE_TEMP) + defs[inst->dst.index] = inst; + /* 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). @@ -81,10 +85,16 @@ qir_opt_copy_propagation(struct vc4_compile *c) } } - if (inst->op == QOP_MOV && inst->dst.file == QFILE_TEMP) + if (inst->op == QOP_MOV && + inst->dst.file == QFILE_TEMP && + (inst->src[0].file != QFILE_TEMP || + (defs[inst->src[0].index]->op != QOP_TEX_RESULT && + defs[inst->dst.index]->op != QOP_TLB_COLOR_READ))) { movs[inst->dst.index] = inst->src[0]; + } } free(movs); + free(defs); return progress; } |