diff options
author | Timothy Arceri <[email protected]> | 2018-11-21 10:04:24 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2019-01-03 15:17:16 +1100 |
commit | 19cafe8084e691647994f97ccfd31cec71ce3274 (patch) | |
tree | a4312e11ccbeb1147cbf61b20354d02f42eaffc0 /src/compiler | |
parent | 5122fbc4bad8e139463f5a36432673b29ddf52c5 (diff) |
nir: add rewrite_phi_predecessor_blocks() helper
This will also be used by the if merge pass in the following commit.
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/nir/nir_opt_if.c | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c index c21ac9219f0..84cfc04d42d 100644 --- a/src/compiler/nir/nir_opt_if.c +++ b/src/compiler/nir/nir_opt_if.c @@ -335,6 +335,35 @@ opt_if_loop_last_continue(nir_loop *loop) return true; } +/* Walk all the phis in the block immediately following the if statement and + * swap the blocks. + */ +static void +rewrite_phi_predecessor_blocks(nir_if *nif, + nir_block *old_then_block, + nir_block *old_else_block, + nir_block *new_then_block, + nir_block *new_else_block) +{ + nir_block *after_if_block = + nir_cf_node_as_block(nir_cf_node_next(&nif->cf_node)); + + nir_foreach_instr(instr, after_if_block) { + if (instr->type != nir_instr_type_phi) + continue; + + nir_phi_instr *phi = nir_instr_as_phi(instr); + + foreach_list_typed(nir_phi_src, src, node, &phi->srcs) { + if (src->pred == old_then_block) { + src->pred = new_then_block; + } else if (src->pred == old_else_block) { + src->pred = new_else_block; + } + } + } +} + /** * This optimization turns: * @@ -379,26 +408,8 @@ opt_if_simplification(nir_builder *b, nir_if *nif) nir_block *then_block = nir_if_last_then_block(nif); nir_block *else_block = nir_if_last_else_block(nif); - /* Walk all the phis in the block immediately following the if statement and - * swap the blocks. - */ - nir_block *after_if_block = - nir_cf_node_as_block(nir_cf_node_next(&nif->cf_node)); - - nir_foreach_instr(instr, after_if_block) { - if (instr->type != nir_instr_type_phi) - continue; - - nir_phi_instr *phi = nir_instr_as_phi(instr); - - foreach_list_typed(nir_phi_src, src, node, &phi->srcs) { - if (src->pred == else_block) { - src->pred = then_block; - } else if (src->pred == then_block) { - src->pred = else_block; - } - } - } + rewrite_phi_predecessor_blocks(nif, then_block, else_block, else_block, + then_block); /* Finally, move the else block to the then block. */ nir_cf_list tmp; |