nir: allow to fine tune unrolling for loops with soft fp64 ops
authorSoroushIMG <soroush.kashani@imgtec.com>
Thu, 29 Sep 2022 14:04:21 +0000 (15:04 +0100)
committerMarge Bot <emma+marge@anholt.net>
Fri, 30 Sep 2022 17:07:37 +0000 (17:07 +0000)
Lowered fp64 ops can blow up the loop bodies while still being
suitable for unrolling.
Allow for using different parameters to unroll loops with
soft fp64.

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18863>

src/compiler/glsl/gl_nir_linker.c
src/compiler/nir/nir.h
src/compiler/nir/nir_opt_loop_unroll.c

index 22dbbf2..ef3d64b 100644 (file)
@@ -111,7 +111,9 @@ gl_nir_opts(nir_shader *nir)
 
       NIR_PASS(progress, nir, nir_opt_undef);
       NIR_PASS(progress, nir, nir_opt_conditional_discard);
-      if (nir->options->max_unroll_iterations) {
+      if (nir->options->max_unroll_iterations ||
+            (nir->options->max_unroll_iterations_fp64 &&
+               (nir->options->lower_doubles_options & nir_lower_fp64_full_software))) {
          NIR_PASS(progress, nir, nir_opt_loop_unroll);
       }
    } while (progress);
index 06987a8..98dac7e 100644 (file)
@@ -3622,6 +3622,7 @@ typedef struct nir_shader_compiler_options {
 
    unsigned max_unroll_iterations;
    unsigned max_unroll_iterations_aggressive;
+   unsigned max_unroll_iterations_fp64;
 
    bool lower_uniforms_to_ubo;
 
index 095fd02..43f9816 100644 (file)
@@ -875,6 +875,9 @@ check_unrolling_restrictions(nir_shader *shader, nir_loop *loop)
    /* Unroll much more aggressively if it can hide load latency. */
    if (shader->options->max_unroll_iterations_aggressive && can_pipeline_loads(loop))
       max_iter = shader->options->max_unroll_iterations_aggressive;
+   /* Tune differently if the loop has double ops and soft fp64 is in use */
+   else if (shader->options->max_unroll_iterations_fp64 && loop->info->has_soft_fp64)
+      max_iter = shader->options->max_unroll_iterations_fp64;
    unsigned trip_count =
       li->max_trip_count ? li->max_trip_count : li->guessed_trip_count;