From 7cd548d3523b16a0e8f35c078316388016514d31 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 26 Nov 2019 15:28:54 +0100 Subject: [PATCH] aco: don't value-number instructions from within a loop with ones after the loop. Fixes: Wolfenstein:Youngblood (w/o shader_ballot) dEQP-VK.descriptor_indexing.combined_image_sampler_in_loop_with_lod Reviewed-by: Rhys Perry --- src/amd/compiler/aco_opt_value_numbering.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/amd/compiler/aco_opt_value_numbering.cpp b/src/amd/compiler/aco_opt_value_numbering.cpp index 40823da3c36..6b4eaa8b5f0 100644 --- a/src/amd/compiler/aco_opt_value_numbering.cpp +++ b/src/amd/compiler/aco_opt_value_numbering.cpp @@ -256,9 +256,14 @@ struct vn_ctx { vn_ctx(Program* program) : program(program) {} }; + +/* dominates() returns true if the parent block dominates the child block and + * if the parent block is part of the same loop or has a smaller loop nest depth. + */ bool dominates(vn_ctx& ctx, uint32_t parent, uint32_t child) { - while (parent < child) + unsigned parent_loop_nest_depth = ctx.program->blocks[parent].loop_nest_depth; + while (parent < child && parent_loop_nest_depth <= ctx.program->blocks[child].loop_nest_depth) child = ctx.program->blocks[child].logical_idom; return parent == child; -- 2.30.2