summaryrefslogtreecommitdiffstats
path: root/src/broadcom/compiler/vir_lower_uniforms.c
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-07-16 13:27:13 -0700
committerEric Anholt <[email protected]>2018-07-16 14:39:59 -0700
commit2baab6bf2a9c3a1ecfb29dce13d8d721101b6842 (patch)
treead1cfab317ba1938e0789c07a5ff4b89a07344c4 /src/broadcom/compiler/vir_lower_uniforms.c
parent26f830d9fc5fb52a1e70839813b4c6ddbcb3a876 (diff)
v3d: Emit the lowered uniform just before its first use in a block.
total instructions in shared programs: 98578 -> 98119 (-0.47%) instructions in affected programs: 27571 -> 27112 (-1.66%) and it also eliminates most spills/fills on the CTS's randomized uniform usage testcases.
Diffstat (limited to 'src/broadcom/compiler/vir_lower_uniforms.c')
-rw-r--r--src/broadcom/compiler/vir_lower_uniforms.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/src/broadcom/compiler/vir_lower_uniforms.c b/src/broadcom/compiler/vir_lower_uniforms.c
index 7f3bb8460e1..97375b483b0 100644
--- a/src/broadcom/compiler/vir_lower_uniforms.c
+++ b/src/broadcom/compiler/vir_lower_uniforms.c
@@ -152,7 +152,7 @@ vir_lower_uniforms(struct v3d_compile *c)
* reference a temp instead.
*/
vir_for_each_block(block, c) {
- struct qinst *mov = NULL;
+ struct qreg temp = c->undef;
vir_for_each_inst(inst, block) {
uint32_t nsrc = vir_get_nsrc(inst);
@@ -162,29 +162,27 @@ vir_lower_uniforms(struct v3d_compile *c)
if (count <= 1)
continue;
- /* If the block doesn't have a load of the
- * uniform yet, add it. We could potentially
- * do better and CSE MOVs from multiple blocks
- * into dominating blocks, except that may
- * cause troubles for register allocation.
- */
- if (!mov) {
- mov = vir_mul_inst(V3D_QPU_M_MOV,
- vir_get_temp(c),
- unif, c->undef);
- list_add(&mov->link,
- &block->instructions);
- c->defs[mov->dst.index] = mov;
- }
-
bool removed = false;
for (int i = 0; i < nsrc; i++) {
if (is_lowerable_uniform(inst, i) &&
inst->src[i].index == max_index) {
- inst->src[i].file =
- mov->dst.file;
- inst->src[i].index =
- mov->dst.index;
+ /* If the block doesn't have a
+ * load of the uniform yet,
+ * add it now. We could
+ * potentially do better and
+ * CSE MOVs from multiple
+ * blocks into dominating
+ * blocks, except that may
+ * cause troubles for register
+ * allocation.
+ */
+ if (temp.file == QFILE_NULL) {
+ c->cursor =
+ vir_before_inst(inst);
+ temp = vir_MOV(c, unif);
+ }
+
+ inst->src[i] = temp;
remove_uniform(ht, unif);
removed = true;
}