This pass seems totally correct, as well as the generated NIR and
LLVM IR for the revelant shader that hangs the GPU. This likely
triggers a new bug in LLVM which has to be fixed.

As LLVM 7&8 have already been released we need a workaround.

According to my collection of vkpipeline-db shaders, this is the only
game that is affected by this optimization.

Fixes: 0881e90c099 ("nir: Split ALU instructions in loops that read phis")
Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/amd/vulkan/radv_shader.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 54a4e732230..fd80e4aac93 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -158,7 +158,15 @@ radv_optimize_nir(struct nir_shader *shader, bool 
optimize_conservatively,
                        NIR_PASS(progress, shader, nir_opt_remove_phis);
                         NIR_PASS(progress, shader, nir_opt_dce);
                 }
-                NIR_PASS(progress, shader, nir_opt_if, true, false);
+
+               /* Skip the split_alu_of_phi NIR pass because this triggers a
+                * new bug in LLVM with No Man Sky.
+                * (see https://bugs.freedesktop.org/show_bug.cgi?id=110471).
+                * As far I can tell, it's the only game that is affected by
+                * this optimization.
+                * TODO: Fix LLVM!
+                */
+                NIR_PASS(progress, shader, nir_opt_if, true, true);
                 NIR_PASS(progress, shader, nir_opt_dead_cf);
                 NIR_PASS(progress, shader, nir_opt_cse);
                 NIR_PASS(progress, shader, nir_opt_peephole_select, 8, true, 
true);
-- 
2.21.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to