On Tue, 2019-02-12 at 16:22 -0800, Ian Romanick 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? >
Found when dealing with the SPIR-V code that I've sent in https://lists.freedesktop.org/archives/mesa-dev/2019-February/214906.html The obtained NIR code has an explicit continue at the end of the loop (see http://paste.debian.net/1067619/, in particular the loop with header block_2). J.A. > > 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