[Mesa-dev] [PATCH] i965/fs: Add pass to rename registers to break live ranges.
Matt Turner
mattst88 at gmail.com
Thu Aug 14 10:31:03 PDT 2014
On Wed, Aug 13, 2014 at 8:36 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
> On Wed, Aug 13, 2014 at 1:22 PM, Matt Turner <mattst88 at gmail.com> wrote:
>> From: Kenneth Graunke <kenneth at whitecape.org>
>>
>> The pass breaks live ranges of virtual registers by allocating new
>> registers when it sees an assignment to a virtual GRF it's already seen
>> written.
>>
>> total instructions in shared programs: 4337879 -> 4335014 (-0.07%)
>> instructions in affected programs: 343865 -> 341000 (-0.83%)
>> GAINED: 46
>> LOST: 1
>>
>> Reviewed-by: Eric Anholt <eric at anholt.net>
>> Reviewed-by: Matt Turner <mattst88 at gmail.com>
>> ---
>> src/mesa/drivers/dri/i965/brw_fs.cpp | 67 ++++++++++++++++++++++++++++++++++++
>> src/mesa/drivers/dri/i965/brw_fs.h | 1 +
>> 2 files changed, 68 insertions(+)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
>> index cc5ec16..6ec1c8f 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
>> @@ -2068,6 +2068,72 @@ fs_visitor::opt_algebraic()
>> }
>>
>> bool
>> +fs_visitor::opt_register_renaming()
>> +{
>> + bool progress = false;
>> + int depth = 0;
>> +
>> + int remap[virtual_grf_count];
>> + memset(remap, -1, sizeof(int) * virtual_grf_count);
>> +
>> + foreach_in_list(fs_inst, inst, &this->instructions) {
>> + if (inst->opcode == BRW_OPCODE_IF || inst->opcode == BRW_OPCODE_DO) {
>> + depth++;
>> + } else if (inst->opcode == BRW_OPCODE_ENDIF ||
>> + inst->opcode == BRW_OPCODE_WHILE) {
>> + depth--;
>> + }
>> +
>> + /* Rewrite instruction sources. */
>> + for (int i = 0; i < inst->sources; i++) {
>> + if (inst->src[i].file == GRF &&
>> + remap[inst->src[i].reg] != -1 &&
>> + remap[inst->src[i].reg] != inst->src[i].reg) {
>> + inst->src[i].reg = remap[inst->src[i].reg];
>> + progress = true;
>> + }
>> + }
>> +
>> + int dst = inst->dst.reg;
>> +
>> + if (depth == 0 &&
>> + inst->dst.file == GRF &&
>> + virtual_grf_sizes[inst->dst.reg] == 1 &&
>
> We can just use dst here instead of inst->dst.reg
Yeah, a bit weird to use inst->dst.file in one conditional, and not
use inst->dst.reg in the next though.
>> + !inst->is_partial_write()) {
>> + if (remap[dst] == -1) {
>> + remap[dst] = dst;
>> + } else {
>> + remap[dst] = virtual_grf_alloc(virtual_grf_sizes[dst]);
>
> Since this code only gets run when virtual_grf_sizes[dst] == 1, we can
> just do virtual_grf_alloc(1).
>
> Also, I think you're forgetting to set the type of the new destination
> (i.e. remap[dst]).
>
> Finally, I don't think this should matter in practice, but if the
> instruction's destination is a hardware register we should probably
> bail out.
HW_REG's register file and number are stored in the fixed_hw_reg
struct, not in the regular file/reg fields.
>> + inst->dst.reg = remap[dst];
>> + progress = true;
>> + }
>> + } else if (inst->dst.file == GRF &&
>> + remap[dst] != -1 &&
>> + remap[dst] != dst) {
>> + inst->dst.reg = remap[dst];
>
> I think you're forgetting to set the type here too.
remap[] is just an array of the register numbers, so we're not
overwriting the type of inst->dst at any point, just giving it a new
register number.
Thanks for the review!
More information about the mesa-dev
mailing list