[Mesa-dev] [PATCH v5] i965/vec4: refactor brw_vec4_copy_propagation.
Jason Ekstrand
jason at jlekstrand.net
Tue Sep 22 09:09:32 PDT 2015
On Tue, Sep 22, 2015 at 8:06 AM, Alejandro PiƱeiro <apinheiro at igalia.com> wrote:
> Now it is more similar to brw_fs_copy_propagation, with three
> clear stages:
>
> 1) Build up the value we are propagating as if it were the source of a
> single MOV:
> 2) Check that we can propagate that value
> 3) Build the final value
>
> Previously everything was somewhat messed up, making the
> implementation on some specific cases, like knowing if you can
> propagate from a previous instruction even with type mismatches even
> messier (for example, with the need of maintaining more of one
> has_source_modifiers). The refactoring clears stuff, and gives
> support to this mentioned use case without doing anything extra
> (for example, only one has_source_modifiers is used).
>
> Shader-db results for vec4 programs on Haswell:
> total instructions in shared programs: 1683842 -> 1669037 (-0.88%)
> instructions in affected programs: 739837 -> 725032 (-2.00%)
> helped: 6237
> HURT: 0
>
> v2: using 'arg' index to get the from inst was wrong, as pointed
> by Jason Ekstrand
> v3: rebased against last change on the previous patch of the series
> v4: don't need to track instructions on struct copy_entry, as we
> only set the source on a direct copy, as pointed by Jason
> v5: change the approach for a refactoring, as pointed by Jason
> ---
>
> Just the refactoring suggested at v4 review is enough to get the use
> case was dealing with at the beginning solved. It would be hard
> to split this patch in two (refactoring+solve issue).
>
> Tested with piglit without any regression. Needed to update shader-db
> numbers after last Matt Turner's improvements. I think that the fact
> of going from 30 HURT (v4) to 0 (v5) is Matt's merit.
>
> I added comments to clearly mark the different stages mentioned at
> v4 review (1, 2 and 3), to make the review easier, but if the patch
> gets approved, they can go away.
I'd like to keep them only without the "1)", "2)", etc.
> The change itself doesn't explain clearly how it got solved, but the
> resulting code is clearer. Thanks for the thoroughly review.
>
> .../drivers/dri/i965/brw_vec4_copy_propagation.cpp | 28 ++++++++++++++--------
> 1 file changed, 18 insertions(+), 10 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 1522eea..8a0bd72 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> @@ -265,6 +265,9 @@ try_copy_propagate(const struct brw_device_info *devinfo,
> vec4_instruction *inst,
> int arg, struct copy_entry *entry)
> {
> + /* 1) Build up the value we are propagating as if it were the source of a
> + * single MOV
> + */
> /* For constant propagation, we only handle the same constant
> * across all 4 channels. Some day, we should handle the 8-bit
> * float vector format, which would let us constant propagate
Can we please kill this comment while we're here? It seems to have
gotten copied+pasted from constant propagation and makes no sense in
this context.
With that, and the updated comments,
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
I'm also running it through our CI system as I type. I'll let you
know how that goes when I get to my office in about an hour.
Do you have push access yet? If not, I can make the trivial changes
and push this for you.
--Jason
> @@ -291,9 +294,9 @@ try_copy_propagate(const struct brw_device_info *devinfo,
> for (int i = 0; i < 4; i++) {
> s[i] = BRW_GET_SWZ(entry->value[i]->swizzle, i);
> }
> - value.swizzle = brw_compose_swizzle(inst->src[arg].swizzle,
> - BRW_SWIZZLE4(s[0], s[1], s[2], s[3]));
> + value.swizzle = BRW_SWIZZLE4(s[0], s[1], s[2], s[3]);
>
> + /* 2) Check that we can propagate that value */
> if (value.file != UNIFORM &&
> value.file != GRF &&
> value.file != ATTR)
> @@ -304,13 +307,6 @@ try_copy_propagate(const struct brw_device_info *devinfo,
> return false;
> }
>
> - if (inst->src[arg].abs) {
> - value.negate = false;
> - value.abs = true;
> - }
> - if (inst->src[arg].negate)
> - value.negate = !value.negate;
> -
> bool has_source_modifiers = value.negate || value.abs;
>
> /* gen6 math and gen7+ SENDs from GRFs ignore source modifiers on
> @@ -376,6 +372,16 @@ try_copy_propagate(const struct brw_device_info *devinfo,
> }
> }
>
> + /* 3) Build the final value */
> + if (inst->src[arg].abs) {
> + value.negate = false;
> + value.abs = true;
> + }
> + if (inst->src[arg].negate)
> + value.negate = !value.negate;
> +
> + value.swizzle = brw_compose_swizzle(inst->src[arg].swizzle,
> + value.swizzle);
> if (has_source_modifiers &&
> value.type != inst->src[arg].type) {
> /* We are propagating source modifiers from a MOV with a different
> @@ -387,8 +393,10 @@ try_copy_propagate(const struct brw_device_info *devinfo,
> inst->src[i].type = value.type;
> }
> inst->dst.type = value.type;
> - } else
> + } 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