[Mesa-dev] [PATCH 2/2] i965/vec4: Change types as needed to propagate source modifiers using from instruction

Jason Ekstrand jason at jlekstrand.net
Wed Sep 16 15:31:15 PDT 2015


On Wed, Sep 16, 2015 at 12:47 PM, Alejandro PiƱeiro
<apinheiro at igalia.com> wrote:
> SEL and MOV instructions, as long as they don't have source modifiers, are
> just copying bits around.  So those kind of instruction could be propagated
> even if there are type mismatches. This is needed because NIR generates
> integer SEL and MOV instructions whenever it doesn't know what else to
> generate.
>
> This commit adds support for copy propagation using previous instruction
> as reference.
> ---
>
> I was tempted to try to remove copy_entry->value, as with this commit
> we are tracking the instructions too, but I think that the code would
> be clearer this way.
>
>
>  .../drivers/dri/i965/brw_vec4_copy_propagation.cpp | 35 +++++++++++++++-------
>  1 file changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> index 64e2528..f8ecd0b 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> @@ -39,6 +39,7 @@ namespace brw {
>
>  struct copy_entry {
>     src_reg *value[4];
> +   vec4_instruction *inst[4];
>     int saturatemask;
>  };
>
> @@ -320,7 +321,8 @@ try_copy_propagate(const struct brw_device_info *devinfo,
>
>     if (has_source_modifiers &&
>         value.type != inst->src[arg].type &&
> -       !can_change_source_types(inst))
> +       !can_change_source_types(inst) &&
> +       !can_change_source_types(entry->inst[arg]))

This isn't right.  The entry->inst array is indexed on vec4 component
but arg is the argument of the instruction.  I think what you want to
do is add something to the loop above to loop over 0...3 and check
them all.  Also, how this is different from has_source_modifiers?
Obviously, it is (the shader-db numbers say so) but I'm not seeing it.
Could you please provide an example.

>        return false;
>
>     if (has_source_modifiers &&
> @@ -338,7 +340,8 @@ try_copy_propagate(const struct brw_device_info *devinfo,
>      * instead. See also resolve_ud_negate().
>      */
>     if (value.negate &&
> -       value.type == BRW_REGISTER_TYPE_UD)
> +       value.type == BRW_REGISTER_TYPE_UD &&
> +       !can_change_source_types(entry->inst[arg]))
>        return false;
>
>     /* Don't report progress if this is a noop. */
> @@ -376,17 +379,25 @@ try_copy_propagate(const struct brw_device_info *devinfo,
>
>     if (has_source_modifiers &&
>         value.type != inst->src[arg].type) {
> -      /* We are propagating source modifiers from a MOV with a different
> -       * type.  If we got here, then we can just change the source and
> -       * destination types of the instruction and keep going.
> +      /* We are propagating source modifiers from a safe instruction with a
> +       * different type. If we got here, then we can just change the source
> +       * and destination types of the current instruction or the instruction
> +       * from we are propagating.
>         */
> -      assert(can_change_source_types(inst));
> -      for (int i = 0; i < 3; i++) {
> -         inst->src[i].type = value.type;
> +      assert(can_change_source_types(inst) ||
> +             can_change_source_types(entry->inst[arg]));
> +
> +      if (can_change_source_types(inst)) {
> +         for (int i = 0; i < 3; i++) {
> +            inst->src[i].type = value.type;
> +         }
> +         inst->dst.type = value.type;
> +      } else {
> +         value.type = inst->src[arg].type;
>        }
> -      inst->dst.type = value.type;
> -   } else
> +   } else {
>        value.type = inst->src[arg].type;
> +   }
>     inst->src[arg] = value;
>     return true;
>  }
> @@ -439,7 +450,7 @@ vec4_visitor::opt_copy_propagation(bool do_constant_prop)
>          for (c = 0; c < 4; c++) {
>              int channel = BRW_GET_SWZ(inst->src[i].swizzle, c);
>              entry.value[c] = entries[reg].value[channel];
> -
> +            entry.inst[c] = entries[reg].inst[channel];
>             /* If there's no available copy for this channel, bail.
>              * We could be more aggressive here -- some channels might
>              * not get used based on the destination writemask.
> @@ -484,6 +495,7 @@ vec4_visitor::opt_copy_propagation(bool do_constant_prop)
>                 entries[reg].value[i] = direct_copy ? &inst->src[0] : NULL;
>                 entries[reg].saturatemask |=
>                    inst->saturate && direct_copy ? 1 << i : 0;
> +               entries[reg].inst[i] = direct_copy ? inst : NULL;
>              }
>          }
>
> @@ -498,6 +510,7 @@ vec4_visitor::opt_copy_propagation(bool do_constant_prop)
>                   if (is_channel_updated(inst, entries[i].value, j)) {
>                      entries[i].value[j] = NULL;
>                      entries[i].saturatemask &= ~(1 << j);
> +                     entries[i].inst[j] = NULL;
>                    }
>                }
>             }
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list