nir: fix opt_if_loop_last_continue()
The pass did not correctly handle loops ending in:
if ssa_7 {
block block_8:
/* preds: block_7 */
continue
/* succs: block_1 */
} else {
block block_9:
/* preds: block_7 */
break
/* succs: block_11 */
}
The break will get eliminated by another opt but if this pass gets
called first (as it does on RADV) we ended up inserting
instructions after the break.
Fixes: 5921a19d4b
("nir: add if opt opt_if_loop_last_continue()")
Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -318,9 +318,13 @@ opt_if_loop_last_continue(nir_loop *loop)
|
|||||||
nir_cf_extract(&tmp, nir_after_cf_node(if_node),
|
nir_cf_extract(&tmp, nir_after_cf_node(if_node),
|
||||||
nir_after_block(last_block));
|
nir_after_block(last_block));
|
||||||
if (then_ends_in_continue) {
|
if (then_ends_in_continue) {
|
||||||
nir_cf_reinsert(&tmp, nir_after_cf_list(&nif->else_list));
|
nir_cursor last_blk_cursor = nir_after_cf_list(&nif->else_list);
|
||||||
|
nir_cf_reinsert(&tmp,
|
||||||
|
nir_after_block_before_jump(last_blk_cursor.block));
|
||||||
} else {
|
} else {
|
||||||
nir_cf_reinsert(&tmp, nir_after_cf_list(&nif->then_list));
|
nir_cursor last_blk_cursor = nir_after_cf_list(&nif->then_list);
|
||||||
|
nir_cf_reinsert(&tmp,
|
||||||
|
nir_after_block_before_jump(last_blk_cursor.block));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In order to avoid running nir_lower_regs_to_ssa_impl() every time an if
|
/* In order to avoid running nir_lower_regs_to_ssa_impl() every time an if
|
||||||
|
Reference in New Issue
Block a user