diff options
author | Jason Ekstrand <[email protected]> | 2018-06-25 16:18:19 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-06-26 10:47:26 -0700 |
commit | ff6db94c18a585538058df59bd1025463bba2437 (patch) | |
tree | a6e09e1d7f8b88af68d880396b3462e04a9c340e /src/compiler/nir | |
parent | fa42fa1a60debf26cdf86f40c0c805b0fc3b444f (diff) |
nir/opt_if: Remove unneeded phis if we make progress
Now that SSA values can be derefs and they have special rules, we have
to be a bit more careful about our LCSSA phis. In particular, we need
to clean up in case LCSSA ended up creating a phi node for a deref.
This fixes validation issues with some Vulkan CTS tests with the new
deref instructions.
Reviewed-by: Samuel Iglesias Gonsálvez <[email protected]>
Diffstat (limited to 'src/compiler/nir')
-rw-r--r-- | src/compiler/nir/nir.h | 1 | ||||
-rw-r--r-- | src/compiler/nir/nir_opt_if.c | 7 | ||||
-rw-r--r-- | src/compiler/nir/nir_opt_remove_phis.c | 6 |
3 files changed, 11 insertions, 3 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index be7b92dd7d2..c16ce547642 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2903,6 +2903,7 @@ bool nir_opt_move_load_ubo(nir_shader *shader); bool nir_opt_peephole_select(nir_shader *shader, unsigned limit); +bool nir_opt_remove_phis_impl(nir_function_impl *impl); bool nir_opt_remove_phis(nir_shader *shader); bool nir_opt_shrink_load(nir_shader *shader); diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c index 863ca630fbd..ec5bf1c9027 100644 --- a/src/compiler/nir/nir_opt_if.c +++ b/src/compiler/nir/nir_opt_if.c @@ -403,6 +403,13 @@ nir_opt_if(nir_shader *shader) * that don't dominate their uses. */ nir_lower_regs_to_ssa_impl(function->impl); + + /* Calling nir_convert_loop_to_lcssa() in opt_peel_loop_initial_if() + * adds extra phi nodes which may not be valid if they're used for + * something such as a deref. Remove any unneeded phis. + */ + nir_opt_remove_phis_impl(function->impl); + progress = true; } } diff --git a/src/compiler/nir/nir_opt_remove_phis.c b/src/compiler/nir/nir_opt_remove_phis.c index b20ff729156..e2d3994c49e 100644 --- a/src/compiler/nir/nir_opt_remove_phis.c +++ b/src/compiler/nir/nir_opt_remove_phis.c @@ -139,8 +139,8 @@ remove_phis_block(nir_block *block, nir_builder *b) return progress; } -static bool -remove_phis_impl(nir_function_impl *impl) +bool +nir_opt_remove_phis_impl(nir_function_impl *impl) { bool progress = false; nir_builder bld; @@ -165,7 +165,7 @@ nir_opt_remove_phis(nir_shader *shader) nir_foreach_function(function, shader) if (function->impl) - progress = remove_phis_impl(function->impl) || progress; + progress = nir_opt_remove_phis_impl(function->impl) || progress; return progress; } |