https://gcc.gnu.org/g:e7108c34a3685eaf9edd3b1fefbd3645b9bd8def

commit r15-6398-ge7108c34a3685eaf9edd3b1fefbd3645b9bd8def
Author: Alexandre Oliva <ol...@adacore.com>
Date:   Fri Dec 20 18:01:53 2024 -0300

    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.

Diff:
---
 gcc/emit-rtl.cc                           |  6 ++++--
 gcc/testsuite/gcc.target/riscv/pr113506.c | 15 +++++++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc
index a556692e8a02..3af6849a29bc 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 000000000000..404dda9fd532
--- /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];
+}

Reply via email to