<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote">On Dec 30, 2016 3:50 AM, "Timothy Arceri" <<a href="mailto:timothy.arceri@collabora.com">timothy.arceri@collabora.com</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If one of the inputs to the multiplcation in ffma is the result of<br>
an fmul there is a chance that we can reuse the result of that<br>
fmul in other ffma calls if we do the multiplication in the right<br>
order.<br>
<br>
For example it is a fairly common pattern for shaders to do something<br>
similar to this:<br>
<br>
  const float a = 0.5;<br>
  in vec4 b;<br>
  in float c;<br>
<br>
  ...<br>
<br>
  b.x = b.x * c;<br>
  b.y = b.y * c;<br>
<br>
  ...<br>
<br>
  b.x = b.x * a + a;<br>
  b.y = b.y * a + a;<br>
<br>
So by simply detecting that constant a is part of the multiplication<br>
in ffma and switching it with previous fmul that updates b we end up<br>
with:<br>
<br>
  ...<br>
<br>
  c = a * c;<br>
<br>
  ...<br>
<br>
  b.x = b.x * c + a;<br>
  b.y = b.y * c + a;<br>
<br>
shader-db results BDW:<br>
<br>
total instructions in shared programs: 13065888 -> 13045434 (-0.16%)<br>
instructions in affected programs: 2436228 -> 2415774 (-0.84%)<br>
helped: 10261<br>
HURT: 30<br></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Nice!  Those are some impressive instruction count reductions.</div><div dir="auto"><br></div><div dir="auto">I'm not sure what I think of the approach though.  We could probably also do this in the ffma peephole itself.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
total cycles in shared programs: 253619698 -> 253418728 (-0.08%)<br>
cycles in affected programs: 141182838 -> 140981868 (-0.14%)<br>
helped: 8853<br>
HURT: 3162<br>
<br>
total loops in shared programs: 2952 -> 2918 (-1.15%)<br>
loops in affected programs: 66 -> 32 (-51.52%)<br>
helped: 22<br>
HURT: 0<br>
<br>
total spills in shared programs: 15106 -> 14840 (-1.76%)<br>
spills in affected programs: 8475 -> 8209 (-3.14%)<br>
helped: 287<br>
HURT: 31<br>
<br>
total fills in shared programs: 20210 -> 19708 (-2.48%)<br>
fills in affected programs: 12054 -> 11552 (-4.16%)<br>
helped: 293<br>
HURT: 28<br>
<br>
LOST:   8<br>
GAINED: 5<br>
<br>
All the HURT besides an increase of a single instruction in a<br>
yofrankie shader comes from deus-ex, however the helped<br>
fills/spills/instructions far outways the HURT for other deus-ex<br>
shaders.<br>
---<br>
 src/compiler/nir/nir_opt_<wbr>algebraic.py | 1 +<br>
 src/mesa/drivers/dri/i965/brw_<wbr>nir.c   | 1 +<br>
 2 files changed, 2 insertions(+)<br>
<br>
diff --git a/src/compiler/nir/nir_opt_<wbr>algebraic.py b/src/compiler/nir/nir_opt_<wbr>algebraic.py<br>
index 982f8b2..b13e484 100644<br>
--- a/src/compiler/nir/nir_opt_<wbr>algebraic.py<br>
+++ b/src/compiler/nir/nir_opt_<wbr>algebraic.py<br>
@@ -111,6 +111,7 @@ optimizations = [<br>
    (('~ffma', a, b, 0.0), ('fmul', a, b)),<br>
    (('ffma', a, 1.0, b), ('fadd', a, b)),<br>
    (('ffma', 1.0, a, b), ('fadd', a, b)),<br>
+   (('ffma', ('!fmul', a, b), '#c', d), ('ffma', a, ('fmul', c, b), d)),<br>
    (('~flrp', a, b, 0.0), a),<br>
    (('~flrp', a, b, 1.0), b),<br>
    (('~flrp', a, a, b), a),<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_nir.c b/src/mesa/drivers/dri/i965/<wbr>brw_nir.c<br>
index 6f37e97..7babc54 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_nir.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_nir.c<br>
@@ -550,6 +550,7 @@ brw_postprocess_nir(nir_shader *nir, const struct brw_compiler *compiler,<br>
    if (devinfo->gen >= 6) {<br>
       /* Try and fuse multiply-adds */<br>
       OPT(brw_nir_opt_peephole_ffma)<wbr>;<br>
+      nir = nir_optimize(nir, compiler, is_scalar);<br></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Why not just put this optimization in the late bucket with the other post-ffma optimizations.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    }<br>
<br>
    OPT(nir_opt_algebraic_late);<br>
<font color="#888888">--<br>
2.9.3<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></blockquote></div><br></div></div></div>