[Mesa-dev] [PATCH 1/5] i965/fs: Don't CSE negated multiplies with saturation.

Ian Romanick idr at freedesktop.org
Tue Feb 23 01:30:28 UTC 2016


Patches 1 - 4 are

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

Patch 5 probably is too, but I have a question or two.

On 02/22/2016 04:13 PM, Matt Turner wrote:
> It's not correct to CSE these multiplies
> 
>    mul.sat dst1, -a, b
>    mul.sat dst2,  a, b
> 
> by emitting a negated MOV from dst1 to dst2:
> 
>    mul.sat dst1, -a, b
>    mov     dst2, -dst1
> 
> Take 2.0*2.0 for example. The first multiply would produce 0.0 and the
> second would produce 1.0.
> 
> Fixes bad generated code in 18 to 22 shaders:
> 
> instructions in affected programs: 432 -> 464 (7.41%)
> helped: 4
> HURT: 18
> 
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
> index cde6566..0e743de 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
> @@ -139,6 +139,8 @@ operands_match(const fs_inst *a, const fs_inst *b, bool *negate)
>        ys[1].f = ys1_imm;
>  
>        *negate = (xs0_negate != xs1_negate) != (ys0_negate != ys1_negate);
> +      if (*negate && (a->saturate || b->saturate))
> +         return false;
>        return ret;
>     } else if (!a->is_commutative()) {
>        bool match = true;
> 



More information about the mesa-dev mailing list