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

commit r15-5983-gb317dca04e3ffb31144f79cb804ff6835c2a9af8
Author: kelefth <konstantinos.elefther...@vrull.eu>
Date:   Thu Dec 5 11:11:27 2024 +0100

    avoid-store-forwarding: bail when an instruction may throw [PR117816]
    
    Avoid-store-forwarding doesn't handle the case where an instruction in
    the store-load sequence contains a REG_EH_REGION note, leading to the
    insertion of instructions after it, while it should be the last
    instruction in the basic block. This causes an ICE when compiling
    using `-O -fnon-call-exceptions -favoid-store-forwarding
    -fno-forward-propagate -finstrument-functions`.
    
    This patch rejects the transformation when there are instructions in
    the sequence that may throw an exeption.
    
            PR rtl-optimization/117816
    
    gcc/ChangeLog:
    
            * avoid-store-forwarding.cc 
(store_forwarding_analyzer::avoid_store_forwarding):
            Reject the transformation when having instructions that may
            throw exceptions in the sequence.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/pr117816.c: New test.

Diff:
---
 gcc/avoid-store-forwarding.cc   |  2 +-
 gcc/testsuite/gcc.dg/pr117816.c | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/avoid-store-forwarding.cc b/gcc/avoid-store-forwarding.cc
index b1fa1678dc30..1b8c35bc6cb7 100644
--- a/gcc/avoid-store-forwarding.cc
+++ b/gcc/avoid-store-forwarding.cc
@@ -429,7 +429,7 @@ store_forwarding_analyzer::avoid_store_forwarding 
(basic_block bb)
 
       rtx set = single_set (insn);
 
-      if (!set)
+      if (!set || insn_could_throw_p (insn))
        {
          store_exprs.truncate (0);
          continue;
diff --git a/gcc/testsuite/gcc.dg/pr117816.c b/gcc/testsuite/gcc.dg/pr117816.c
new file mode 100644
index 000000000000..6a9fc5fa1415
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr117816.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fnon-call-exceptions -favoid-store-forwarding 
-fno-forward-propagate -finstrument-functions" } */
+
+char *p;
+int y;
+long x;
+
+void foo()
+{
+  x /= *(int *)__builtin_memmove(&y, 4 + p, 3);
+}

Reply via email to