On February 12, 2019 18:22:36 Ian Romanick <i...@freedesktop.org> wrote:
On 2/12/19 12:58 AM, Juan A. Suarez Romero wrote:
opt_split_alu_of_phi moves ALU instruction to the end of continue block.
But if the continue block ends with a jump instruction (an explicit
"continue" instruction) then the ALU must be inserted before the jump,
as it is illegal to add instructions after the jump.
I'm assuming you found this by inspection? Since this pass only
operates when the first block of the loop only has two predecessors (the
block before the loop and the implicit continue at the end of the loop),
this shouldn't be a a problem in practice... or were you able to trigger
it somehow?
What if you have
loop {
if (....) {
/* Stuff*/
continue;
}
break;
}
Or, for that matter, if the break and continue are flipped and this runs
before the pass that gets rid of trivial continues.
Sorry, on my phone and not looking at the code so I could be way off base.
CC: Ian Romanick <ian.d.roman...@intel.com>
Fixes: 0881e90c099 ("nir: Split ALU instructions in loops that read phis")
---
src/compiler/nir/nir_opt_if.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c
index 9afb901be14..932af9e37ab 100644
--- a/src/compiler/nir/nir_opt_if.c
+++ b/src/compiler/nir/nir_opt_if.c
@@ -488,7 +488,7 @@ opt_split_alu_of_phi(nir_builder *b, nir_loop *loop)
*
* Insert the new instruction at the end of the continue block.
*/
- b->cursor = nir_after_block(continue_block);
+ b->cursor = nir_after_block_before_jump(continue_block);
nir_ssa_def *const alu_copy =
clone_alu_and_replace_src_defs(b, alu, continue_srcs);
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev