On Thu, Dec 19, 2024 at 3:36 AM Alexandre Oliva <ol...@adacore.com> wrote: > > > When we emit a sequence before a preexisting insn and naming a BB to > store in the insns, we will attempt to store the BB even in barriers > present in the sequence. > > Barriers don't expect blocks, and rtl checking catches the problem. > > When emitting after a preexisting insn, we skip the block setting in > barriers. Change the before emitter to do so as well. > > Regstrapped on x86_64-linux-gnu. Testcase used to reproduce the problem > and to confirm the fix with a cross to riscv32-elf configured with rtl > checking. Ok to install?
OK > > for gcc/ChangeLog > > PR middle-end/113506 > * emit-rtl.cc (add_insn_before): Don't set the block of a > barrier. > > for gcc/testsuite/ChangeLog > > PR middle-end/113506 > * gcc.target/riscv/pr113506.c: New. > --- > gcc/emit-rtl.cc | 6 ++++-- > gcc/testsuite/gcc.target/riscv/pr113506.c | 15 +++++++++++++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/riscv/pr113506.c > > diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc > index a556692e8a02a..3af6849a29bc6 100644 > --- a/gcc/emit-rtl.cc > +++ b/gcc/emit-rtl.cc > @@ -4369,9 +4369,11 @@ add_insn_before (rtx_insn *insn, rtx_insn *before, > basic_block bb) > { > add_insn_before_nobb (insn, before); > > + if (BARRIER_P (insn)) > + return; > + > if (!bb > - && !BARRIER_P (before) > - && !BARRIER_P (insn)) > + && !BARRIER_P (before)) > bb = BLOCK_FOR_INSN (before); > > if (bb) > diff --git a/gcc/testsuite/gcc.target/riscv/pr113506.c > b/gcc/testsuite/gcc.target/riscv/pr113506.c > new file mode 100644 > index 0000000000000..404dda9fd532d > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/pr113506.c > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-options "-fchecking=1 -Os -fno-tree-coalesce-vars > -finline-stringops" } */ > + > +typedef unsigned v32su __attribute__((vector_size (32))); > + > +v32su foo_v32su_4; > + > +unsigned > +foo (v32su v32su_2) > +{ > + v32su_2 *= v32su_2; > + if (foo_v32su_4[3]) > + v32su_2 &= (v32su){}; > + return v32su_2[1]; > +} > > > -- > Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/ > Free Software Activist GNU Toolchain Engineer > More tolerance and less prejudice are key for inclusion and diversity > Excluding neuro-others for not behaving ""normal"" is *not* inclusive