nir: unroll some loops with a variable limit

Graphics / Mesa 3D Graphics Library / Mesa - Timothy Arceri [itsqueeze.com] - 12 March 2019 00:52 EDT

For some loops can have a single terminator but the exact trip count is still unknown. For example:

for (int i = 0; i < imin(x, 4); i++)


Shader-db results radeonsi (all affected are from Tropico 5):

Totals from affected shaders: SGPRS: 144 -> 152 (5.56 %)
VGPRS: 124 -> 108 (-12.90 %) Spilled SGPRs: 0 -> 0 (0.00 %) Spilled VGPRs: 0 -> 0 (0.00 %) Private memory VGPRs: 0 -> 0 (0.00 %) Scratch size: 0 -> 0 (0.00 %) dwords per thread Code Size: 5180 -> 6640 (28.19 %) bytes LDS: 0 -> 0 (0.00 %) blocks Max Waves: 17 -> 21 (23.53 %) Wait states: 0 -> 0 (0.00 %)

Shader-db results i965 (SKL):

total loops in shared programs: 3808 -> 3802 (-0.16%) loops in affected programs: 6 -> 0 helped: 6 HURT: 0

vkpipeline-db results RADV (Unrolls some Skyrim VR shaders):

Totals from affected shaders: SGPRS: 304 -> 304 (0.00 %)
VGPRS: 296 -> 292 (-1.35 %) Spilled SGPRs: 0 -> 0 (0.00 %) Spilled VGPRs: 0 -> 0 (0.00 %) Private memory VGPRs: 0 -> 0 (0.00 %) Scratch size: 0 -> 0 (0.00 %) dwords per thread Code Size: 15756 -> 25884 (64.28 %) bytes LDS: 0 -> 0 (0.00 %) blocks Max Waves: 29 -> 29 (0.00 %) Wait states: 0 -> 0 (0.00 %)

v2: fix bug where last iteration would get optimised away by mistake.

7571de8eaa5 nir: unroll some loops with a variable limit
src/compiler/nir/nir_opt_loop_unroll.c | 55 ++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)

Upstream: cgit.freedesktop.org


  • Share