[Mesa-dev] [PATCH] nir/search: Use the correct bit size for integer comparisons

Iago Toral itoral at igalia.com
Fri Jan 20 10:19:45 UTC 2017


Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

On Thu, 2017-01-19 at 21:47 -0800, Jason Ekstrand wrote:
> The previous code always compared integers as 64-bit.  Due to
> variations
> in sign-extension in the code generated by nir_opt_algebraic.py, this
> meant that nir_search doesn't always do what you want.  Instead, 32-
> bit
> values should be matched as 32-bit and 64-bit values should be
> matched
> as 64-bit.  While we're here we unify the unsigned and signed paths.
> Now that we're using the right bit size, they should be the same
> since
> the only difference we had before was sign extension.
> 
> This gets the UE4 bitfield_extract optimization working again.  It
> had
> stopped working due to the constant 0xff00ff00 getting sign-extended
> when it shouldn't have.
> 
> Cc: "17.0 13.0" <mesa-stable at lists.freedesktop.org>
> Cc: Eric Anholt <eric at anholt.net>
> ---
>  src/compiler/nir/nir_search.c | 48 +++++++++++++++----------------
> ------------
>  1 file changed, 16 insertions(+), 32 deletions(-)
> 
> diff --git a/src/compiler/nir/nir_search.c
> b/src/compiler/nir/nir_search.c
> index 68275e4..dec56fe 100644
> --- a/src/compiler/nir/nir_search.c
> +++ b/src/compiler/nir/nir_search.c
> @@ -210,43 +210,27 @@ match_value(const nir_search_value *value,
> nir_alu_instr *instr, unsigned src,
>           return true;
>  
>        case nir_type_int:
> -         for (unsigned i = 0; i < num_components; ++i) {
> -            int64_t val;
> -            switch (load->def.bit_size) {
> -            case 32:
> -               val = load->value.i32[new_swizzle[i]];
> -               break;
> -            case 64:
> -               val = load->value.i64[new_swizzle[i]];
> -               break;
> -            default:
> -               unreachable("unknown bit size");
> -            }
> -
> -            if (val != const_val->data.i)
> -               return false;
> -         }
> -         return true;
> -
>        case nir_type_uint:
>        case nir_type_bool32:
> -         for (unsigned i = 0; i < num_components; ++i) {
> -            uint64_t val;
> -            switch (load->def.bit_size) {
> -            case 32:
> -               val = load->value.u32[new_swizzle[i]];
> -               break;
> -            case 64:
> -               val = load->value.u64[new_swizzle[i]];
> -               break;
> -            default:
> -               unreachable("unknown bit size");
> +         switch (load->def.bit_size) {
> +         case 32:
> +            for (unsigned i = 0; i < num_components; ++i) {
> +               if (load->value.u32[new_swizzle[i]] !=
> +                   (uint32_t)const_val->data.u)
> +                  return false;
>              }
> +            return true;
>  
> -            if (val != const_val->data.u)
> -               return false;
> +         case 64:
> +            for (unsigned i = 0; i < num_components; ++i) {
> +               if (load->value.u64[new_swizzle[i]] != const_val-
> >data.u)
> +                  return false;
> +            }
> +            return true;
> +
> +         default:
> +            unreachable("unknown bit size");
>           }
> -         return true;
>  
>        default:
>           unreachable("Invalid alu source type");


More information about the mesa-dev mailing list