[Mesa-dev] [RFC 1/3] nir: Add a generic instruction index

Jason Ekstrand jason at jlekstrand.net
Mon Sep 14 12:21:26 PDT 2015


On Mon, Sep 14, 2015 at 11:52 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Tuesday, September 08, 2015 05:35:12 PM Jason Ekstrand wrote:
>> ---
>>  src/glsl/nir/nir.c | 18 ++++++++++++++++++
>>  src/glsl/nir/nir.h |  4 ++++
>>  2 files changed, 22 insertions(+)
>
> Commit message could use a rationale, such as:
>
> This will allow us to efficiently determine whether one instruction
> comes before another.
>
> (which is a little different than the reasoning behind SSA defs and
> register having indexes...those are for printing...this is IP)
>
>>
>> diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
>> index 3f4bec4..156fe94 100644
>> --- a/src/glsl/nir/nir.c
>> +++ b/src/glsl/nir/nir.c
>> @@ -1404,3 +1404,21 @@ nir_index_ssa_defs(nir_function_impl *impl)
>>     nir_foreach_block(impl, index_ssa_block, &index);
>>     impl->ssa_alloc = index;
>>  }
>> +
>> +static bool
>> +index_instrs_block(nir_block *block, void *state)
>> +{
>> +   unsigned *index = state;
>> +   nir_foreach_instr(block, instr)
>> +      instr->index = (*index)++;
>> +
>> +   return true;
>> +}
>> +
>> +unsigned
>> +nir_index_instrs(nir_function_impl *impl)
>> +{
>> +   unsigned index = 0;
>> +   nir_foreach_block(impl, index_instrs_block, &index);
>> +   return index;
>> +}
>> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
>> index e73b7fb..e7e1881 100644
>> --- a/src/glsl/nir/nir.h
>> +++ b/src/glsl/nir/nir.h
>> @@ -417,6 +417,9 @@ typedef struct nir_instr {
>>     nir_instr_type type;
>>     struct nir_block *block;
>>
>> +   /** generic register index. */
>> +   unsigned index;
>
> Not a register index.  An global instruction index or IP of sorts...

Thanks

> Do we want to say something about the how the order of blocks influences
> the numbers, and how this affects dominance?  It's not immediately
> obvious from the code (nir_foreach_block and all...)

I'll add a comment to index_instrs as a follow-up patch.

>
> Certainly using this within a block is safe and reasonable.
>
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
>
>> +
>>     /* A temporary for optimization and analysis passes to use for storing
>>      * flags.  For instance, DCE uses this to store the "dead/live" info.
>>      */
>> @@ -1739,6 +1742,7 @@ nir_loop *nir_block_get_following_loop(nir_block *block);
>>  void nir_index_local_regs(nir_function_impl *impl);
>>  void nir_index_global_regs(nir_shader *shader);
>>  void nir_index_ssa_defs(nir_function_impl *impl);
>> +unsigned nir_index_instrs(nir_function_impl *impl);
>>
>>  void nir_index_blocks(nir_function_impl *impl);
>>
>>


More information about the mesa-dev mailing list