Module: Mesa
Branch: main
Commit: f1c9e9014629fb0ea73ae73b35b642a97b06ba04
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f1c9e9014629fb0ea73ae73b35b642a97b06ba04

Author: Pavel Ondračka <pavel.ondra...@gmail.com>
Date:   Tue Sep 26 17:33:20 2023 +0200

r300: add late vectorization after nir_move_vec_src_uses_to_dest

Turns out that besides the benefits from nir_move_vec_src_uses_to_dest
itself, it also creates new opportunities for vectorization. Enable it
for vertex shaders, there is a clear instruction win and the only
downside is some increased register presure. However this is mostly
concerning few Unigine Tropics and Sanctiary shaders where we go
11->14 or 10->13 used registers. According to the docs, the increased
register usage would only lower vertex processing concurency if we go
over 15 (R300) or 25 (R500) registers, so we should be safe here.

Fragment shaders are a mixed bag so leave them be for now.

Shader-db RV530
total instructions in shared programs: 129303 -> 128762 (-0.42%)
instructions in affected programs: 13887 -> 13346 (-3.90%)
helped: 99
HURT: 0
total temps in shared programs: 17355 -> 17543 (1.08%)
temps in affected programs: 730 -> 918 (25.75%)
helped: 4
HURT: 66
total cycles in shared programs: 197190 -> 196984 (-0.10%)
cycles in affected programs: 9998 -> 9792 (-2.06%)
helped: 65
HURT: 0

Shader-db RV370:
total instructions in shared programs: 84807 -> 84225 (-0.69%)
instructions in affected programs: 10203 -> 9621 (-5.70%)
helped: 92
HURT: 0
total temps in shared programs: 13036 -> 13231 (1.50%)
temps in affected programs: 787 -> 982 (24.78%)
helped: 4
HURT: 73
total cycles in shared programs: 133178 -> 132946 (-0.17%)
cycles in affected programs: 5911 -> 5679 (-3.92%)
helped: 58

HURT: 0
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25417>

---

 src/gallium/drivers/r300/compiler/nir_to_rc.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/gallium/drivers/r300/compiler/nir_to_rc.c 
b/src/gallium/drivers/r300/compiler/nir_to_rc.c
index 0fda015ced0..9c9bfaaa241 100644
--- a/src/gallium/drivers/r300/compiler/nir_to_rc.c
+++ b/src/gallium/drivers/r300/compiler/nir_to_rc.c
@@ -2452,6 +2452,11 @@ const void *nir_to_rc_options(struct nir_shader *s,
 
    NIR_PASS_V(s, nir_opt_move, move_all);
    NIR_PASS_V(s, nir_move_vec_src_uses_to_dest, true);
+   /* Late vectorizing after nir_move_vec_src_uses_to_dest helps instructions 
but
+    * increases register usage. Testing shows this is beneficial only in VS.
+    */
+   if (s->info.stage == MESA_SHADER_VERTEX)
+      NIR_PASS_V(s, nir_opt_vectorize, ntr_should_vectorize_instr, NULL);
 
    NIR_PASS_V(s, nir_convert_from_ssa, true);
    NIR_PASS_V(s, nir_lower_vec_to_regs, NULL, NULL);

Reply via email to