aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2018-11-21 10:04:24 +1100
committerTimothy Arceri <[email protected]>2019-01-03 15:17:16 +1100
commit19cafe8084e691647994f97ccfd31cec71ce3274 (patch)
treea4312e11ccbeb1147cbf61b20354d02f42eaffc0 /src/compiler
parent5122fbc4bad8e139463f5a36432673b29ddf52c5 (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.c51
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;