Mesa (master): i965/fs: Don't CSE negated multiplies with saturation.

Matt Turner mattst88 at kemper.freedesktop.org
Thu Feb 25 18:52:51 UTC 2016


Module: Mesa
Branch: master
Commit: 1567da1e2820d4c1a6c14f4598ad3addba6bc788
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1567da1e2820d4c1a6c14f4598ad3addba6bc788

Author: Matt Turner <mattst88 at gmail.com>
Date:   Mon Feb 22 10:25:38 2016 -0800

i965/fs: Don't CSE negated multiplies with saturation.

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
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

---

 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-commit mailing list