[Mesa-dev] [PATCH 27/29] nir/lower_to_source_mod: Skip unsafe operations

Samuel Iglesias Gonsálvez siglesias at igalia.com
Fri Apr 1 08:56:19 UTC 2016


On 31/03/16 17:16, Connor Abbott wrote:
> This seems a little ugly to me. Since these ops are just moving bits
> around, maybe we should just convert the float64 src/dest to uint64?
> We do this for other opcodes that just shuffle bits around.
> 

Yes, this is a possibility. I wonder if the change float64 -> uint64
should be done only to these unpack_double_split_* ops or apply it to
all (un)pack_double*'s src/dst to keep consistency between them.

I executed a piglit run with this change applied only to
unpack_double_split_* and then to all (un)pack_double* ops, none of them
produce regressions.

I don't have a strong opinion here, we can keep the code as it is or use
uint64 instead but I prefer to apply it to all of *pack_double* ops to
keep consistency. What do you think?

Sam

> On Mon, Mar 21, 2016 at 8:06 AM, Samuel Iglesias Gonsálvez
> <siglesias at igalia.com> wrote:
>> From: Iago Toral Quiroga <itoral at igalia.com>
>>
>> Some special alu operations cannot absorve src modifiers safely. For example,
>> double unpack operations split a double into separate 32-bit chunks that
>> are to be manipulated at bit level. If we allow these operations to absorve
>> the srcmod we run into two issues:
>>
>> 1. We would be applying the source modifiers to both 32-bit chunks, which is
>>    not correct.
>> 2. If the 32-bit chunks are handled as unsigned data by the driver, the
>>    the effect of the source modifier could be lost.
>>
>> So just skip srcmod lowering for these operations.
>> ---
>>  src/compiler/nir/nir_lower_to_source_mods.c | 22 ++++++++++++++++++++++
>>  1 file changed, 22 insertions(+)
>>
>> diff --git a/src/compiler/nir/nir_lower_to_source_mods.c b/src/compiler/nir/nir_lower_to_source_mods.c
>> index 1e8c3c2..8964dc0 100644
>> --- a/src/compiler/nir/nir_lower_to_source_mods.c
>> +++ b/src/compiler/nir/nir_lower_to_source_mods.c
>> @@ -33,6 +33,26 @@
>>   * easier to not have them when we're doing optimizations.
>>   */
>>
>> +/*
>> + * Some special alu operations cannot absorve src modifiers safely. For example,
>> + * double unpack operations split a double into separate 32-bit chunks that
>> + * are to be manipulated at bit level. If we allow these operations to absorve
>> + * the srcmod we run into two issues:
>> + *
>> + * 1. We would be applying the source modifiers to both 32-bit chunks, which is
>> + *    not correct.
>> + * 2. If the 32-bit chunks are handled as unsigned data by the driver, the
>> + *    the effect of the source modifier could be lost.
>> + *
>> + * So just skip srcmod lowering for these operations.
>> + */
>> +static bool
>> +nir_alu_op_unsafe_for_srcmods(unsigned opcode)
>> +{
>> +   return opcode == nir_op_unpack_double_2x32_split_x ||
>> +          opcode == nir_op_unpack_double_2x32_split_y;
>> +}
>> +
>>  static bool
>>  nir_lower_to_source_mods_block(nir_block *block, void *state)
>>  {
>> @@ -41,6 +61,8 @@ nir_lower_to_source_mods_block(nir_block *block, void *state)
>>           continue;
>>
>>        nir_alu_instr *alu = nir_instr_as_alu(instr);
>> +      if (nir_alu_op_unsafe_for_srcmods(alu->op))
>> +         continue;
>>
>>        for (unsigned i = 0; i < nir_op_infos[alu->op].num_inputs; i++) {
>>           if (!alu->src[i].src.is_ssa)
>> --
>> 2.5.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list