diff options
author | Eric Anholt <[email protected]> | 2018-07-16 13:27:13 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2018-07-16 14:39:59 -0700 |
commit | 2baab6bf2a9c3a1ecfb29dce13d8d721101b6842 (patch) | |
tree | ad1cfab317ba1938e0789c07a5ff4b89a07344c4 /src/broadcom | |
parent | 26f830d9fc5fb52a1e70839813b4c6ddbcb3a876 (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')
-rw-r--r-- | src/broadcom/compiler/vir_lower_uniforms.c | 38 |
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; } |