nir/algebraic: Allow fmin(a,a) optimization when flush denorm to zero is not set
I was surprised this had any affect on Intel GPUs because we have been unconditionally performing this optimization in the backend since June 2014. Once that error is fixed (later in this MR), this change prevents a couple dozen regressions in shader-db and around 90 regressions in fossil-db. Many of the regressions in fossil-db were loss of SIMD32, and that can be a big deal. v2: Add 64-bit too. Suggested by Alyssa. shader-db: All Intel platforms had similar results. (Lunar Lake shown) total instructions in shared programs: 16970141 -> 16970139 (<.01%) instructions in affected programs: 40 -> 38 (-5.00%) helped: 2 / HURT: 0 total cycles in shared programs: 914617580 -> 914617548 (<.01%) cycles in affected programs: 3428 -> 3396 (-0.93%) helped: 2 / HURT: 0 fossil-db: All Intel platforms had similar results. (Lunar Lake shown) Totals: Cycle count: 30546028462 -> 30546025224 (-0.00%); split: -0.00%, +0.00% Non SSA regs after NIR: 237017827 -> 237017731 (-0.00%) Totals from 83 (0.01% of 706657) affected shaders: Cycle count: 3042978 -> 3039740 (-0.11%); split: -0.13%, +0.02% Non SSA regs after NIR: 78997 -> 78901 (-0.12%) Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Reviewed-by: Ivan Briano <ivan.briano@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34192>
This commit is contained in:
@@ -888,8 +888,12 @@ optimizations.extend([
|
||||
(('bcsel', a, b, a), ('iand', a, b)),
|
||||
(('bcsel', a, b, True), ('ior', ('inot', a), b)),
|
||||
(('bcsel', a, False, b), ('iand', ('inot', a), b)),
|
||||
(('~fmin', a, a), a),
|
||||
(('~fmax', a, a), a),
|
||||
(('fmin', 'a@64', a), a, '!nir_is_denorm_flush_to_zero(info->float_controls_execution_mode, 64)'),
|
||||
(('fmin', 'a@32', a), a, '!nir_is_denorm_flush_to_zero(info->float_controls_execution_mode, 32)'),
|
||||
(('fmin', 'a@16', a), a, '!nir_is_denorm_flush_to_zero(info->float_controls_execution_mode, 16)'),
|
||||
(('fmax', 'a@64', a), a, '!nir_is_denorm_flush_to_zero(info->float_controls_execution_mode, 64)'),
|
||||
(('fmax', 'a@32', a), a, '!nir_is_denorm_flush_to_zero(info->float_controls_execution_mode, 32)'),
|
||||
(('fmax', 'a@16', a), a, '!nir_is_denorm_flush_to_zero(info->float_controls_execution_mode, 16)'),
|
||||
(('imin', a, a), a),
|
||||
(('imax', a, a), a),
|
||||
(('umin', a, a), a),
|
||||
|
Reference in New Issue
Block a user