I was hoping this should fix the problem with the pass getting rerun forever, but apparently not. We still need a solution like this though, so sending it out for some feedback of whether or not this is the way to do it.
Signed-off-by: Thomas Helland <thomashellan...@gmail.com> --- src/glsl/nir/nir.h | 1 + src/glsl/nir/nir_form_LCSSA.c | 2 ++ src/glsl/nir/nir_opt_remove_phis.c | 3 +++ 3 files changed, 6 insertions(+) diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h index 772fa9a..0abe0cb 100644 --- a/src/glsl/nir/nir.h +++ b/src/glsl/nir/nir.h @@ -1108,6 +1108,7 @@ typedef struct { struct exec_list srcs; /** < list of nir_phi_src */ nir_dest dest; + bool is_LCSSA_phi; } nir_phi_instr; typedef struct { diff --git a/src/glsl/nir/nir_form_LCSSA.c b/src/glsl/nir/nir_form_LCSSA.c index 76279f5..b2c0c1f 100644 --- a/src/glsl/nir/nir_form_LCSSA.c +++ b/src/glsl/nir/nir_form_LCSSA.c @@ -82,6 +82,8 @@ insert_phi_for_def(nir_ssa_def *def_in_loop, nir_src *use_outside_loop, { nir_phi_instr *phi = nir_phi_instr_create(state->shader); + phi->is_LCSSA_phi = true; + nir_block *succ = nir_cf_node_as_block( nir_cf_node_next(&state->loop->cf_node)); diff --git a/src/glsl/nir/nir_opt_remove_phis.c b/src/glsl/nir/nir_opt_remove_phis.c index 7896584..e4fc70a 100644 --- a/src/glsl/nir/nir_opt_remove_phis.c +++ b/src/glsl/nir/nir_opt_remove_phis.c @@ -55,6 +55,9 @@ remove_phis_block(nir_block *block, void *state) nir_phi_instr *phi = nir_instr_as_phi(instr); + if (phi->is_LCSSA_phi) + break; + nir_ssa_def *def = NULL; bool srcs_same = true; -- 2.4.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev