Mesa (master): nir: fix opt_if_loop_last_continue()
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Mar 21 23:01:20 UTC 2019
Module: Mesa
Branch: master
Commit: a1bd9dd5bcd6e4aa9a5cf33d9901046f68d3d580
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a1bd9dd5bcd6e4aa9a5cf33d9901046f68d3d580
Author: Timothy Arceri <tarceri at itsqueeze.com>
Date: Wed Mar 20 22:59:40 2019 +1100
nir: fix opt_if_loop_last_continue()
Rather than skipping code that looked like this:
loop {
...
if (cond) {
do_work_1();
continue;
} else {
break;
}
do_work_2();
}
Previously we would turn this into:
loop {
...
if (cond) {
do_work_1();
continue;
} else {
do_work_2();
break;
}
}
This was clearly wrong. This change checks for this case and makes
sure we now leave it for nir_opt_dead_cf() to clean up.
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
---
src/compiler/nir/nir_opt_if.c | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c
index bc128f79f3c..4d3183ed151 100644
--- a/src/compiler/nir/nir_opt_if.c
+++ b/src/compiler/nir/nir_opt_if.c
@@ -855,7 +855,8 @@ opt_if_loop_last_continue(nir_loop *loop)
/* If both branches end in a continue do nothing, this should be handled
* by nir_opt_dead_cf().
*/
- if (then_ends_in_continue && else_ends_in_continue)
+ if ((then_ends_in_continue || nir_block_ends_in_break(then_block)) &&
+ (else_ends_in_continue || nir_block_ends_in_break(else_block)))
return false;
if (!then_ends_in_continue && !else_ends_in_continue)
@@ -872,15 +873,10 @@ opt_if_loop_last_continue(nir_loop *loop)
nir_cf_list tmp;
nir_cf_extract(&tmp, nir_after_cf_node(if_node),
nir_after_block(last_block));
- if (then_ends_in_continue) {
- 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 {
- 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));
- }
+ if (then_ends_in_continue)
+ nir_cf_reinsert(&tmp, nir_after_cf_list(&nif->else_list));
+ else
+ nir_cf_reinsert(&tmp, nir_after_cf_list(&nif->then_list));
/* In order to avoid running nir_lower_regs_to_ssa_impl() every time an if
* opt makes progress we leave nir_opt_trivial_continues() to remove the
More information about the mesa-commit
mailing list