glsl: fix potential slow compile times for GLSLOptimizeConservatively
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 5 Jun 2020 03:57:40 +0000 (13:57 +1000)
committerMarge Bot <eric+marge@anholt.net>
Sun, 7 Jun 2020 03:28:30 +0000 (03:28 +0000)
See code comment for full description of the change.

Fixes: 0a5018c1a483 ("mesa: add gl_constants::GLSLOptimizeConservatively")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3034
Tested-by: Witold Baryluk <witold.baryluk@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5346>

src/compiler/glsl/glsl_parser_extras.cpp

index c0f116b8fb4fe19263b313de9fea9b7259a91f48..e5c9f83e63a17342e2c8a7175aa70a9deb14ed51 100644 (file)
@@ -2361,7 +2361,20 @@ do_common_optimization(exec_list *ir, bool linked,
    OPT(lower_vector_insert, ir, false);
    OPT(optimize_swizzles, ir);
 
-   OPT(optimize_split_arrays, ir, linked);
+   /* Some drivers only call do_common_optimization() once rather than in a
+    * loop, and split arrays causes each element of a constant array to
+    * dereference is own copy of the entire array initilizer. This IR is not
+    * something that can be generated manually in a shader and is not
+    * accounted for by NIR optimisations, the result is an exponential slow
+    * down in compilation speed as a constant arrays element count grows. To
+    * avoid that here we make sure to always clean up the mess split arrays
+    * causes to constant arrays.
+    */
+   bool array_split = optimize_split_arrays(ir, linked);
+   if (array_split)
+      do_constant_propagation(ir);
+   progress |= array_split;
+
    OPT(optimize_redundant_jumps, ir);
 
    if (options->MaxUnrollIterations) {