summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2020-02-10 18:23:54 -0800
committerMarge Bot <[email protected]>2020-04-01 00:28:38 +0000
commitaf1bc7e0c7dd1f3c4f2226f93e819e410fd7a731 (patch)
treeec3bb3f1b46d6ac5316e5581edb62f4f5a411597 /src
parent62795475e8f45f92bb8f467d9e2318fdfdba6297 (diff)
nir/algebraic: Use value range analysis to convert fmax to fsat
This is conceptually similar to the 1-fsat(a) <=> fsat(1-a) rearragement done in: 3b747909419 ("nir/algebraic: Recognize open-coded flrp(a, b, fsat(c))") 2d259713b7 ("nir/algebraic: Commute 1-fsat(a) to fsat(1-a) for all non-fmul instructions"). Note: this helps the Aztex Ruins shader that was hurt for spills and fills on Braodwell in the previous commit, but it does not fix the spills or fills. :( All Intel platforms had similar results. (Ice Lake shown) total instructions in shared programs: 14528985 -> 14526116 (-0.02%) instructions in affected programs: 477300 -> 474431 (-0.60%) helped: 2332 HURT: 0 helped stats (abs) min: 1 max: 18 x̄: 1.23 x̃: 1 helped stats (rel) min: 0.07% max: 8.89% x̄: 0.88% x̃: 0.64% 95% mean confidence interval for instructions value: -1.27 -1.19 95% mean confidence interval for instructions %-change: -0.92% -0.85% Instructions are helped. total cycles in shared programs: 203723684 -> 203692984 (-0.02%) cycles in affected programs: 4878847 -> 4848147 (-0.63%) helped: 1764 HURT: 324 helped stats (abs) min: 1 max: 706 x̄: 22.94 x̃: 17 helped stats (rel) min: <.01% max: 17.75% x̄: 1.94% x̃: 1.66% HURT stats (abs) min: 1 max: 400 x̄: 30.15 x̃: 10 HURT stats (rel) min: <.01% max: 17.76% x̄: 1.91% x̃: 0.69% 95% mean confidence interval for cycles value: -16.55 -12.86 95% mean confidence interval for cycles %-change: -1.44% -1.24% Cycles are helped. Reviewed-by: Matt Turner <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/1359>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir_opt_algebraic.py10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index 76ec1acc056..bb490d2a19c 100644
--- a/src/compiler/nir/nir_opt_algebraic.py
+++ b/src/compiler/nir/nir_opt_algebraic.py
@@ -560,6 +560,16 @@ optimizations.extend([
(('umin', ('umax', ('umin', ('umax', a, b), c), b), c), ('umin', ('umax', a, b), c)),
(('fmax', ('fsat', a), '#b@32(is_zero_to_one)'), ('fsat', ('fmax', a, b))),
(('fmin', ('fsat', a), '#b@32(is_zero_to_one)'), ('fsat', ('fmin', a, b))),
+
+ # If a in [0,b] then b-a is also in [0,b]. Since b in [0,1], max(b-a, 0) =
+ # fsat(b-a).
+ #
+ # If a > b, then b-a < 0 and max(b-a, 0) = fsat(b-a) = 0
+ #
+ # This should be NaN safe since max(NaN, 0) = fsat(NaN) = 0.
+ (('fmax', ('fadd(is_used_once)', ('fneg', 'a(is_not_negative)'), '#b@32(is_zero_to_one)'), 0.0),
+ ('fsat', ('fadd', ('fneg', a), b)), '!options->lower_fsat'),
+
(('extract_u8', ('imin', ('imax', a, 0), 0xff), 0), ('imin', ('imax', a, 0), 0xff)),
(('~ior', ('flt(is_used_once)', a, b), ('flt', a, c)), ('flt', a, ('fmax', b, c))),
(('~ior', ('flt(is_used_once)', a, c), ('flt', b, c)), ('flt', ('fmin', a, b), c)),