Skip to content
Snippets Groups Projects
Commit 96cde778 authored by Danylo Piliaiev's avatar Danylo Piliaiev :flag_ua: Committed by Eric Engestrom
Browse files

nir/opt_if: Fix opt_if_simplification when else branch has jump

Consider the following case:

 if ssa_1 {
    block block_2:
    /* succs: block_4 */
 } else {
    block block_3:
    ...
    break
    /* succs: block_5 */
 }

 block block_4:
 vec1 32 ssa_100 = phi block_2: ssa_2

After block_3 extraction and reinsertion, phi->pred becomes invalid
and isn't updated by reinsertion since it is unreachable from block_3.

Call nir_opt_remove_phis_block before moving block to eliminate single
source phis after the if.

Closes: mesa/mesa#3282


Fixes: e3e929f8
Signed-off-by: default avatarDanylo Piliaiev <danylo.piliaiev@globallogic.com>
Reviewed-by: default avatarMatt Turner <mattst88@gmail.com>
Reviewed-by: default avatarTimothy Arceri <tarceri@itsqueeze.com>
Part-of: <mesa/mesa!5945>
(cherry picked from commit 6f94b3da)
parent c334f842
No related branches found
No related tags found
Loading
......@@ -67,7 +67,7 @@
"description": "nir/opt_if: Fix opt_if_simplification when else branch has jump",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"master_sha": null,
"because_sha": "e3e929f8c342b32dc8f5296adf8fb337866fa40a"
},
......
......@@ -933,6 +933,17 @@ 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);
if (nir_block_ends_in_jump(else_block)) {
/* Even though this if statement has a jump on one side, we may still have
* phis afterwards. Single-source phis can be produced by loop unrolling
* or dead control-flow passes and are perfectly legal. Run a quick phi
* removal on the block after the if to clean up any such phis.
*/
nir_block *const next_block =
nir_cf_node_as_block(nir_cf_node_next(&nif->cf_node));
nir_opt_remove_phis_block(next_block);
}
rewrite_phi_predecessor_blocks(nif, then_block, else_block, else_block,
then_block);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment