[Mesa-dev] [PATCH 06/15] nir/algebraic: Improve error messages for replace expressions

Timothy Arceri tarceri at itsqueeze.com
Tue Nov 27 00:24:55 UTC 2018


I'm no python expect but for what its worth patches 1-6 are:

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>

On 9/11/18 2:45 pm, Jason Ekstrand wrote:
> In bf441d22a7917f38c, I wrote a bunch of descriptive asserts for various
> bit size checks in the validation of search expressions.  This commit
> improves a few of those and adds descriptive asserts for replace
> expressions as well.  We also rework _validate_bit_class_down so that it
> can properly handle the case where any bit size may be consumed but we
> can infer the correct size from something deeper in the tree.
> ---
>   src/compiler/nir/nir_algebraic.py | 75 ++++++++++++++++++++++++-------
>   1 file changed, 60 insertions(+), 15 deletions(-)
> 
> diff --git a/src/compiler/nir/nir_algebraic.py b/src/compiler/nir/nir_algebraic.py
> index 474d913e722..f9ee637830c 100644
> --- a/src/compiler/nir/nir_algebraic.py
> +++ b/src/compiler/nir/nir_algebraic.py
> @@ -423,7 +423,7 @@ class BitSizeValidator(object):
>            else:
>               if val.common_size != 0:
>                  assert val.bit_size == 0 or val.bit_size == val.common_size, \
> -                      'Variable width expression musr be {0}-bit based on ' \
> +                      'Variable width expression must be {0}-bit based on ' \
>                         'the sources but a {1}-bit result was requested: {2}' \
>                         .format(val.common_size, val.bit_size, str(val))
>               else:
> @@ -445,14 +445,16 @@ class BitSizeValidator(object):
>            if dst_type_bits != 0:
>               assert bit_class == 0 or bit_class == dst_type_bits, \
>                      'nir_op_{0} produces a {1}-bit result but the parent ' \
> -                   'expression wants a {2}-bit value' \
> -                   .format(val.opcode, dst_type_bits, bit_class)
> +                   'expression wants a {2} value' \
> +                   .format(val.opcode, dst_type_bits,
> +                           self._bit_class_to_str(bit_class))
>            else:
>               assert val.common_size == 0 or val.common_size == bit_class, \
>                      'Variable-width expression produces a {0}-bit result ' \
>                      'based on the source widths but the parent expression ' \
> -                   'wants a {1}-bit value: {2}' \
> -                   .format(val.common_size, bit_class, str(val))
> +                   'wants a {1} value: {2}' \
> +                   .format(val.common_size,
> +                           self._bit_class_to_str(bit_class), str(val))
>               val.common_size = bit_class
>   
>            if val.common_size:
> @@ -476,11 +478,16 @@ class BitSizeValidator(object):
>         elif isinstance(val, Variable):
>            var_class = self._get_var_bit_class(val)
>            # By the time we get to validation, every variable should have a class
> -         assert var_class != 0
> +         assert var_class != 0, \
> +                'Variable {} appears in the replace expression but not in ' \
> +                'the search expression'.format(str(val))
>   
>            # If we have an explicit size provided by the user, the variable
>            # *must* exactly match the search.  It cannot be implicitly sized
>            # because otherwise we could end up with a conflict at runtime.
> +         # This is guaranteed by the fact that we explicitly initialize bit
> +         # classes; the assert should never trigger even for malformed
> +         # expressions.
>            assert val.bit_size == 0 or val.bit_size == var_class
>   
>            return var_class
> @@ -495,18 +502,37 @@ class BitSizeValidator(object):
>   
>               src_type_bits = type_bits(nir_op.input_types[i])
>               if src_type_bits != 0:
> -               assert src_class == src_type_bits
> +               assert src_class == src_type_bits, \
> +                      'Source {} of nir_op_{} must be a {}-bit value but ' \
> +                      'the constructed value would be {}: {}' \
> +                      .format(i, val.opcode, src_type_bits,
> +                              self._bit_class_to_str(src_class), str(val))
>               else:
> -               assert val.common_class == 0 or src_class == val.common_class
> +               assert val.common_class == 0 or src_class == val.common_class, \
> +                      'Source {} of nir_op_{} must be a {} value based ' \
> +                      'on other sources but the constructed value would be ' \
> +                      '{}: {}' \
> +                      .format(i, val.opcode,
> +                              self._bit_class_to_str(val.common_class),
> +                              self._bit_class_to_str(src_class), str(val))
>                  val.common_class = src_class
>   
>            dst_type_bits = type_bits(nir_op.output_type)
>            if dst_type_bits != 0:
> -            assert val.bit_size == 0 or val.bit_size == dst_type_bits
> +            assert val.bit_size == 0 or val.bit_size == dst_type_bits, \
> +                   'Result of nir_op_{} must be a {}-bit value but the ' \
> +                   'expression explicitly requests a {}-bit value' \
> +                   .format(val.opcode, dst_type_bits, val.bit_size)
>               return dst_type_bits
>            else:
>               if val.common_class != 0:
> -               assert val.bit_size == 0 or val.bit_size == val.common_class
> +               assert val.bit_size == 0 or val.bit_size == val.common_class, \
> +                      'Result of nir_op_{} must be a {} value based ' \
> +                      'on the sources but the expression explicitly ' \
> +                      'requests a {}-bit value: {}' \
> +                      .format(val.opcode,
> +                              self._bit_class_to_str(val.common_class),
> +                              val.bit_size, str(val))
>               else:
>                  val.common_class = val.bit_size
>               return val.common_class
> @@ -514,21 +540,40 @@ class BitSizeValidator(object):
>      def _validate_bit_class_down(self, val, bit_class):
>         # At this point, everything *must* have a bit class.  Otherwise, we have
>         # a value we don't know how to define.
> -      assert bit_class != 0
> +      assert bit_class != 0, \
> +             'Value cannot be constructed because no bit-size is implied '\
> +             '{}'.format(str(val))
>   
>         if isinstance(val, Constant):
> -         assert val.bit_size == 0 or val.bit_size == bit_class
> +         assert val.bit_size == 0 or val.bit_size == bit_class, \
> +                'Constant value {} explicitly requests being {}-bit but ' \
> +                'must be {} thanks to its consumer' \
> +                .format(str(val), val.bit_size,
> +                        self._bit_class_to_str(bit_class))
>   
>         elif isinstance(val, Variable):
> -         assert val.bit_size == 0 or val.bit_size == bit_class
> +         assert val.bit_size == 0 or val.bit_size == bit_class, \
> +                'Variable {} explicitly only matches {}-bit values but ' \
> +                'must be {} thanks to its consumer' \
> +                .format(str(val), val.bit_size,
> +                        self._bit_class_to_str(bit_class))
>   
>         elif isinstance(val, Expression):
>            nir_op = opcodes[val.opcode]
>            dst_type_bits = type_bits(nir_op.output_type)
>            if dst_type_bits != 0:
> -            assert bit_class == dst_type_bits
> +            assert bit_class == dst_type_bits, \
> +                   'Result of nir_op_{} must be a {}-bit value but the ' \
> +                   'consumer requires a {} value: {}' \
> +                   .format(val.opcode, dst_type_bits,
> +                           self._bit_class_to_str(bit_class), str(val))
>            else:
> -            assert val.common_class == 0 or val.common_class == bit_class
> +            assert val.common_class == 0 or val.common_class == bit_class, \
> +                   'Result of nir_op_{} must be a {} value but based on ' \
> +                   'the sources but the consumer requires a {} value: {}' \
> +                   .format(val.opcode,
> +                           self._bit_class_to_str(val.common_class),
> +                           self._bit_class_to_str(bit_class), str(val))
>               val.common_class = bit_class
>   
>            for i in range(nir_op.num_inputs):
> 


More information about the mesa-dev mailing list