aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2024-12-20 18:01:53 -0300
committerAlexandre Oliva <oliva@gnu.org>2024-12-20 18:01:53 -0300
commite7108c34a3685eaf9edd3b1fefbd3645b9bd8def (patch)
tree345c1b9905566d32e2d240c7634ae94fe875518b /gcc
parent0dc35fe5a095d9205da80cba976357cb71f8cb88 (diff)
downloadgcc-e7108c34a3685eaf9edd3b1fefbd3645b9bd8def.zip
gcc-e7108c34a3685eaf9edd3b1fefbd3645b9bd8def.tar.gz
gcc-e7108c34a3685eaf9edd3b1fefbd3645b9bd8def.tar.bz2
avoid trying to set block in barriers [PR113506]
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. 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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/emit-rtl.cc6
-rw-r--r--gcc/testsuite/gcc.target/riscv/pr113506.c15
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc
index a556692..3af6849 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 0000000..404dda9
--- /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];
+}