diff options
author | Jason Ekstrand <[email protected]> | 2014-11-07 19:35:23 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2015-01-15 07:19:01 -0800 |
commit | ef7ebb908ed0ebd005bb5eb4554dc2ba8d6be983 (patch) | |
tree | 9496d434404bd6475cdd874a5b44eecddb086b4b /src/glsl/nir/nir.c | |
parent | 02eef483430e48efdd30db06ea6b68fe64d62bfd (diff) |
nir/nir: Patch up phi predecessors in move_successors
Reviewed-by: Connor Abbott <[email protected]>
Diffstat (limited to 'src/glsl/nir/nir.c')
-rw-r--r-- | src/glsl/nir/nir.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c index e5346ffba49..20826b874e5 100644 --- a/src/glsl/nir/nir.c +++ b/src/glsl/nir/nir.c @@ -730,6 +730,23 @@ split_block_beginning(nir_block *block) return new_block; } +static void +rewrite_phi_preds(nir_block *block, nir_block *old_pred, nir_block *new_pred) +{ + nir_foreach_instr_safe(block, instr) { + if (instr->type != nir_instr_type_phi) + break; + + nir_phi_instr *phi = nir_instr_as_phi(instr); + foreach_list_typed_safe(nir_phi_src, src, node, &phi->srcs) { + if (src->pred == old_pred) { + src->pred = new_pred; + break; + } + } + } +} + /** * Moves the successors of source to the successors of dest, leaving both * successors of source NULL. @@ -741,11 +758,15 @@ move_successors(nir_block *source, nir_block *dest) nir_block *succ1 = source->successors[0]; nir_block *succ2 = source->successors[1]; - if (succ1) + if (succ1) { unlink_blocks(source, succ1); + rewrite_phi_preds(succ1, source, dest); + } - if (succ2) + if (succ2) { unlink_blocks(source, succ2); + rewrite_phi_preds(succ2, source, dest); + } unlink_block_successors(dest); link_blocks(dest, succ1, succ2); |