On 10/09/2018 09:00 AM, Jason Ekstrand wrote:
> This fixes a bug uncovered by my NIR integer division by constant
> optimization series.
> 
> Fixes: 19f9cb72c8b "i965/fs: Add pass to propagate conditional..."
> Fixes: 627f94b72e0 "i965/vec4: adding vec4_cmod_propagation..."
> Cc: Matt Turner <matts...@gmail.com>
> ---
>  .../compiler/brw_fs_cmod_propagation.cpp      | 25 ++++++++++++++++---
>  src/intel/compiler/brw_reg.h                  |  9 +++++++
>  .../compiler/brw_vec4_cmod_propagation.cpp    | 24 ++++++++++++++++--
>  3 files changed, 53 insertions(+), 5 deletions(-)
> 
> diff --git a/src/intel/compiler/brw_fs_cmod_propagation.cpp 
> b/src/intel/compiler/brw_fs_cmod_propagation.cpp
> index 5fb522f810f..4fdd04a9983 100644
> --- a/src/intel/compiler/brw_fs_cmod_propagation.cpp
> +++ b/src/intel/compiler/brw_fs_cmod_propagation.cpp
> @@ -25,6 +25,25 @@
>  #include "brw_cfg.h"
>  #include "brw_eu.h"
>  
> +static bool
> +can_add_cmod_to_inst(const fs_inst *inst)
> +{
> +   if (!inst->can_do_cmod())
> +      return false;
> +
> +   /* The accumulator result appears to get used for the conditional modifier
> +    * generation.  When negating a UD value, there is a 33rd bit generated 
> for
> +    * the sign in the accumulator value, so now you can't check, for example,
> +    * equality with a 32-bit value.  See piglit fs-op-neg-uvec4.
> +    */
> +   for (unsigned i = 0; i < inst->sources; i++) {
> +      if (type_is_unsigned_int(inst->src[i].type) && inst->src[i].negate)
> +         return false;
> +   }
> +
> +   return true;
> +}
> +

This probably should go after the @file header comment. :)

Also... it looks like this patch replaces every caller of
::can_do_cmod() with can_add_cmod_to_inst.  Maybe just change
can_do_cmod?  If you do that, I'd support changing the name to
can_add_cmod_to_inst.

>  /** @file brw_fs_cmod_propagation.cpp
>   *
>   * Implements a pass that propagates the conditional modifier from a CMP x 
> 0.0
> @@ -91,7 +110,7 @@ cmod_propagate_cmp_to_add(const gen_device_info *devinfo, 
> bblock_t *block,
>              negate ? brw_swap_cmod(inst->conditional_mod)
>              : inst->conditional_mod;
>  
> -         if (scan_inst->can_do_cmod() &&
> +         if (can_add_cmod_to_inst(scan_inst) &&
>               ((!read_flag && scan_inst->conditional_mod == 
> BRW_CONDITIONAL_NONE) ||
>                scan_inst->conditional_mod == cond)) {
>              scan_inst->conditional_mod = cond;
> @@ -146,7 +165,7 @@ cmod_propagate_not(const gen_device_info *devinfo, 
> bblock_t *block,
>               scan_inst->exec_size != inst->exec_size)
>              break;
>  
> -         if (scan_inst->can_do_cmod() &&
> +         if (can_add_cmod_to_inst(scan_inst) &&
>               ((!read_flag && scan_inst->conditional_mod == 
> BRW_CONDITIONAL_NONE) ||
>                scan_inst->conditional_mod == cond)) {
>              scan_inst->conditional_mod = cond;
> @@ -316,7 +335,7 @@ opt_cmod_propagation_local(const gen_device_info 
> *devinfo, bblock_t *block)
>                 inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)
>                                     : inst->conditional_mod;
>  
> -            if (scan_inst->can_do_cmod() &&
> +            if (can_add_cmod_to_inst(scan_inst) &&
>                  ((!read_flag && scan_inst->conditional_mod == 
> BRW_CONDITIONAL_NONE) ||
>                   scan_inst->conditional_mod == cond)) {
>                 scan_inst->conditional_mod = cond;
> diff --git a/src/intel/compiler/brw_reg.h b/src/intel/compiler/brw_reg.h
> index ac12ab3d2dd..46d66198a1d 100644
> --- a/src/intel/compiler/brw_reg.h
> +++ b/src/intel/compiler/brw_reg.h
> @@ -376,6 +376,15 @@ brw_int_type(unsigned sz, bool is_signed)
>     }
>  }
>  
> +static inline bool
> +type_is_unsigned_int(enum brw_reg_type tp)
> +{
> +   return tp == BRW_REGISTER_TYPE_UB ||
> +          tp == BRW_REGISTER_TYPE_UW ||
> +          tp == BRW_REGISTER_TYPE_UD ||
> +          tp == BRW_REGISTER_TYPE_UQ;
> +}
> +
>  /**
>   * Construct a brw_reg.
>   * \param file      one of the BRW_x_REGISTER_FILE values
> diff --git a/src/intel/compiler/brw_vec4_cmod_propagation.cpp 
> b/src/intel/compiler/brw_vec4_cmod_propagation.cpp
> index a1d46dc8dca..392e283d1f8 100644
> --- a/src/intel/compiler/brw_vec4_cmod_propagation.cpp
> +++ b/src/intel/compiler/brw_vec4_cmod_propagation.cpp
> @@ -46,6 +46,26 @@ writemasks_incompatible(const vec4_instruction *earlier,
>            (later->dst.writemask & ~earlier->dst.writemask) != 0;
>  }
>  
> +static bool
> +can_add_cmod_to_inst(const vec4_instruction *inst)
> +{
> +   if (!inst->can_do_cmod())
> +      return false;
> +
> +   /* The accumulator result appears to get used for the conditional modifier
> +    * generation.  When negating a UD value, there is a 33rd bit generated 
> for
> +    * the sign in the accumulator value, so now you can't check, for example,
> +    * equality with a 32-bit value.  See piglit fs-op-neg-uvec4.
> +    */
> +   for (unsigned i = 0; i < 3; i++) {
> +      if (inst->src[i].file != BAD_FILE &&
> +          type_is_unsigned_int(inst->src[i].type) && inst->src[i].negate)
> +         return false;
> +   }
> +
> +   return true;
> +}
> +
>  static bool
>  opt_cmod_propagation_local(bblock_t *block)
>  {
> @@ -132,7 +152,7 @@ opt_cmod_propagation_local(bblock_t *block)
>                 negate ? brw_swap_cmod(inst->conditional_mod)
>                        : inst->conditional_mod;
>  
> -            if (scan_inst->can_do_cmod() &&
> +            if (can_add_cmod_to_inst(scan_inst) &&
>                  ((!read_flag && scan_inst->conditional_mod == 
> BRW_CONDITIONAL_NONE) ||
>                   scan_inst->conditional_mod == cond)) {
>                 scan_inst->conditional_mod = cond;
> @@ -229,7 +249,7 @@ opt_cmod_propagation_local(bblock_t *block)
>                 inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)
>                                     : inst->conditional_mod;
>  
> -            if (scan_inst->can_do_cmod() &&
> +            if (can_add_cmod_to_inst(scan_inst) &&
>                  ((!read_flag && scan_inst->conditional_mod == 
> BRW_CONDITIONAL_NONE) ||
>                   scan_inst->conditional_mod == cond)) {
>                 scan_inst->conditional_mod = cond;
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to