On Thu, Dec 19, 2024 at 3:36 AM Alexandre Oliva <[email protected]> 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