[Mesa-dev] [PATCH 2/3] nir: Try commutative sources in CSE

Ian Romanick idr at freedesktop.org
Tue Apr 14 08:43:40 PDT 2015


From: Ian Romanick <ian.d.romanick at intel.com>

Shader-db results:

GM45 NIR:
total instructions in shared programs: 4082044 -> 4081919 (-0.00%)
instructions in affected programs:     27609 -> 27484 (-0.45%)
helped:                                44

Iron Lake NIR:
total instructions in shared programs: 5678776 -> 5678646 (-0.00%)
instructions in affected programs:     27406 -> 27276 (-0.47%)
helped:                                45

Sandy Bridge NIR:
total instructions in shared programs: 7329995 -> 7329096 (-0.01%)
instructions in affected programs:     142035 -> 141136 (-0.63%)
helped:                                406
HURT:                                  19

Ivy Bridge NIR:
total instructions in shared programs: 6769314 -> 6768359 (-0.01%)
instructions in affected programs:     140820 -> 139865 (-0.68%)
helped:                                423
HURT:                                  2

Haswell NIR:
total instructions in shared programs: 6183693 -> 6183298 (-0.01%)
instructions in affected programs:     96538 -> 96143 (-0.41%)
helped:                                303
HURT:                                  4

Broadwell NIR:
total instructions in shared programs: 7501711 -> 7498170 (-0.05%)
instructions in affected programs:     266403 -> 262862 (-1.33%)
helped:                                705
HURT:                                  5
GAINED:                                4

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/glsl/nir/nir_opt_cse.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/glsl/nir/nir_opt_cse.c b/src/glsl/nir/nir_opt_cse.c
index 03039cf..bd994a8 100644
--- a/src/glsl/nir/nir_opt_cse.c
+++ b/src/glsl/nir/nir_opt_cse.c
@@ -73,10 +73,20 @@ nir_instrs_equal(nir_instr *instr1, nir_instr *instr2)
       if (alu1->dest.dest.ssa.num_components != alu2->dest.dest.ssa.num_components)
          return false;
 
-      for (unsigned i = 0; i < nir_op_infos[alu1->op].num_inputs; i++) {
-         if (!nir_alu_srcs_equal(alu1->src[i], alu2->src[i],
-                                 (1 << alu1->dest.dest.ssa.num_components) - 1))
-            return false;
+      if (nir_op_infos[alu1->op].num_inputs == 2 &&
+          (nir_op_infos[alu1->op].algebraic_properties & NIR_OP_IS_COMMUTATIVE)) {
+         const uint8_t read_mask = (1 << alu1->dest.dest.ssa.num_components) - 1;
+
+         return (nir_alu_srcs_equal(alu1->src[0], alu2->src[0], read_mask) &&
+                 nir_alu_srcs_equal(alu1->src[1], alu2->src[1], read_mask)) ||
+                (nir_alu_srcs_equal(alu1->src[0], alu2->src[1], read_mask) &&
+                 nir_alu_srcs_equal(alu1->src[1], alu2->src[0], read_mask));
+      } else {
+         for (unsigned i = 0; i < nir_op_infos[alu1->op].num_inputs; i++) {
+            if (!nir_alu_srcs_equal(alu1->src[i], alu2->src[i],
+                                    (1 << alu1->dest.dest.ssa.num_components) - 1))
+               return false;
+         }
       }
       return true;
    }
-- 
2.1.0



More information about the mesa-dev mailing list