[Mesa-dev] [PATCH 1/2] i965/vec4: Change types as needed to propagate source modifiers using current instruction
Jason Ekstrand
jason at jlekstrand.net
Wed Sep 16 15:31:34 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 current instruction
> as reference.
> ---
>
> Equivalent to commit 472ef9 but for the vec4 case.
>
> .../drivers/dri/i965/brw_vec4_copy_propagation.cpp | 28 ++++++++++++++++++++--
> 1 file changed, 26 insertions(+), 2 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 5a15eb8..64e2528 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> @@ -249,6 +249,16 @@ try_constant_propagate(const struct brw_device_info *devinfo,
> }
>
> static bool
> +can_change_source_types(vec4_instruction *inst)
> +{
> + return !inst->src[0].abs && !inst->src[0].negate &&
> + (inst->opcode == BRW_OPCODE_MOV ||
> + (inst->opcode == BRW_OPCODE_SEL &&
> + inst->predicate != BRW_PREDICATE_NONE &&
> + !inst->src[1].abs && !inst->src[1].negate));
You should probably check saturate in here as well. The only time we
can do saturate propagation is if both the instruction and the MOV are
float type anyway. I think the FS version has the same theoretical
problem.
With that fixed,
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
> +}
> +
> +static bool
> try_copy_propagate(const struct brw_device_info *devinfo,
> vec4_instruction *inst,
> int arg, struct copy_entry *entry)
> @@ -308,7 +318,9 @@ try_copy_propagate(const struct brw_device_info *devinfo,
> value.swizzle != BRW_SWIZZLE_XYZW) && !inst->can_do_source_mods(devinfo))
> return false;
>
> - if (has_source_modifiers && value.type != inst->src[arg].type)
> + if (has_source_modifiers &&
> + value.type != inst->src[arg].type &&
> + !can_change_source_types(inst))
> return false;
>
> if (has_source_modifiers &&
> @@ -362,7 +374,19 @@ try_copy_propagate(const struct brw_device_info *devinfo,
> }
> }
>
> - value.type = inst->src[arg].type;
> + 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.
> + */
> + assert(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->src[arg] = value;
> return true;
> }
> --
> 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