[Mesa-dev] [PATCH v6 2/6] mesa/st: glsl_to_tgsi: implement new temporary register lifetime tracker
Gert Wollny
gw.fossdev at gmail.com
Mon Jul 17 08:32:55 UTC 2017
Just a few comments while updating the patch:
> One more comment about the debug_log: as written, it will getenv
> every time. It would be better to use the approach taken by e.g.
> should_clone_nir() in compiler/nir/nir.h. There's no reason to have
> a whole class for this.
Actually, debug_log is implemented as a singleton, and the constructor
that calles getenv is only called once, but yes, there is no need to
make it a class.
>
> > +
> > + assert(num_inst_src_regs(inst) == 1);
> > + const st_src_reg& src = inst->src[0];
> > + if (src.file == PROGRAM_TEMPORARY)
> > + acc[src.index].record_read(line, switch_scope,
> > src.swizzle);
>
> I think this read (and the one of the switch_register) should both be
> on the line of the SWITCH statement, so at the beginning of the
> switch_scope.
>
> What you're doing is only more conservative, and I don't mind that
> much, except that at least it should be possible to remove the
> set_switch_register and friends, since a read of the switch register
> need not be recorded for every CASE statement.
Since SWITCH currently is not really generated it is difficult to test
what byte code would actually be later generated, but I figured that in
the worst case the SWITCH would translate to an IF-chain, in which case
for each CASE statement one would actually need to read both, the
SWITCH value and the CASE value.
> The two branches are inconsistent about where the new scope ends.
> Overall, I think this could be simplified:
>
> prog_scope *switch_scope =
> cur_scope->type() == switch_body ? cur_scope : cur_scope-
> >parent();
> assert(switch_scope->type() == switch_body);
>
> prog_scope *scope = scopes.create(...);
>
> if (cur_scope != switch_body && cur_scope->end() == -1)
> scope->set_previous_case_scope(cur_scope);
> cur_scope = scope;
>
> For that matter, I'm not sure the previous_case_scope handling is
> necessary or whether it's correct at all. Do
I don't think it is necessary, and I will check whether it breaks
something.
> you really need the end to overlap the next scope on fall-through?
> And if yes, what happens if have multiple fall-throughs in a row?
I think that this case is handled consistently.
Anyway, I will contemplate about whether it makes sense to keep this
behavior, and I actually lean towards removing it.
> +
> > +void temp_access::update_access_mask(int mask)
> > +{
> > + if (!first_access_mask) {
> > + first_access_mask = mask;
> > + } else {
> > + needs_component_tracking |= (first_access_mask != mask);
> > + }
> > + summary_access_mask |= mask;
>
> This can be simplified to:
>
> if (mask != access_mask)
> needs_component_tracking = true;
> access_mask |= mask;
>
> saving one member variable.
Actually, it must be
if (access_mask && (mask != access_mask))
needs_component_tracking = true;
...
otherwise needs_component_tracking would always be set to true.
>
> > + * the life time to [lr,lr), so it can me merged "away"
> > + */
> > + if (last_write < 0)
> > + return make_lifetime(last_read, last_read);
>
> Ah I see. I think it'd be better to return (-1, -1) here and handle
> that case when merging the lifetimes. It's not more code, since it
> allows you to merge the first two case in this function, and it
> avoids an overly conservative extension of the register lifetime in
> the unlikely case where a component is read from outside the scope of
> the other components.
My thinking was to completely ignore unused registers, and use read-
only registers for renaming, but now I checked that a register that is
only read is actually eliminated in
glsl_to_tgsi_visitor::renumber_registers
so no need to bother distinguishing the two cases.
Best,
Gert
More information about the mesa-dev
mailing list