[Mesa-dev] [PATCH] nir/copy_propagate: do not copy-propagate MOV srcs with source modifiers

Jason Ekstrand jason at jlekstrand.net
Thu Nov 12 08:29:55 PST 2015


Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

On Wed, Nov 11, 2015 at 11:34 PM, Iago Toral Quiroga <itoral at igalia.com> wrote:
> If a source operand in a MOV has source modifiers, then we cannot
> copy-propagate it from the parent instruction and remove the MOV.
>
> v2: remove the check for source source modifiers from is_move() (Jason)
> ---
>  src/glsl/nir/nir_opt_copy_propagate.c | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/src/glsl/nir/nir_opt_copy_propagate.c b/src/glsl/nir/nir_opt_copy_propagate.c
> index 7d8bdd7..2611069 100644
> --- a/src/glsl/nir/nir_opt_copy_propagate.c
> +++ b/src/glsl/nir/nir_opt_copy_propagate.c
> @@ -41,11 +41,6 @@ static bool is_move(nir_alu_instr *instr)
>     if (instr->dest.saturate)
>        return false;
>
> -   /* we handle modifiers in a separate pass */
> -
> -   if (instr->src[0].abs || instr->src[0].negate)
> -      return false;
> -
>     if (!instr->src[0].src.is_ssa)
>        return false;
>
> @@ -65,9 +60,13 @@ static bool is_vec(nir_alu_instr *instr)
>  }
>
>  static bool
> -is_swizzleless_move(nir_alu_instr *instr)
> +is_simple_move(nir_alu_instr *instr)
>  {
>     if (is_move(instr)) {
> +      /* We handle modifiers in a separate pass */
> +      if (instr->src[0].negate || instr->src[0].abs)
> +         return false;
> +
>        for (unsigned i = 0; i < 4; i++) {
>           if (!((instr->dest.write_mask >> i) & 1))
>              break;
> @@ -81,6 +80,10 @@ is_swizzleless_move(nir_alu_instr *instr)
>           if (instr->src[i].swizzle[0] != i)
>              return false;
>
> +         /* We handle modifiers in a separate pass */
> +         if (instr->src[i].negate || instr->src[i].abs)
> +            return false;
> +
>           if (def == NULL) {
>              def = instr->src[i].src.ssa;
>           } else if (instr->src[i].src.ssa != def) {
> @@ -107,7 +110,7 @@ copy_prop_src(nir_src *src, nir_instr *parent_instr, nir_if *parent_if)
>        return false;
>
>     nir_alu_instr *alu_instr = nir_instr_as_alu(src_instr);
> -   if (!is_swizzleless_move(alu_instr))
> +   if (!is_simple_move(alu_instr))
>        return false;
>
>     /* Don't let copy propagation land us with a phi that has more
> --
> 1.9.1
>


More information about the mesa-dev mailing list