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

commit r15-776-gf14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Wed May 22 18:10:39 2024 +0200

    Fix internal error in seh_cfa_offset with -O2 -fno-omit-frame-pointer
    
    The problem directly comes from the -ffold-mem-offsets pass messing up with
    the prologue and the frame-related instructions, which is a no-no with SEH,
    so the fix simply disconnects the pass in these circumstances.
    
    gcc/
            PR rtl-optimization/115038
            * fold-mem-offsets.cc (fold_offsets): Return 0 if the defining
            instruction of the register is frame related.
    
    gcc/testsuite/
            * g++.dg/opt/fmo1.C: New test.

Diff:
---
 gcc/fold-mem-offsets.cc         |  2 +-
 gcc/testsuite/g++.dg/opt/fmo1.C | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/gcc/fold-mem-offsets.cc b/gcc/fold-mem-offsets.cc
index 2e15b05529e..84b9623058b 100644
--- a/gcc/fold-mem-offsets.cc
+++ b/gcc/fold-mem-offsets.cc
@@ -491,7 +491,7 @@ fold_offsets (rtx_insn *insn, rtx reg, bool analyze, bitmap 
foldable_insns)
 {
   rtx_insn *def = get_single_def_in_bb (insn, reg);
 
-  if (!def || GET_CODE (PATTERN (def)) != SET)
+  if (!def || RTX_FRAME_RELATED_P (def) || GET_CODE (PATTERN (def)) != SET)
     return 0;
 
   rtx dest = SET_DEST (PATTERN (def));
diff --git a/gcc/testsuite/g++.dg/opt/fmo1.C b/gcc/testsuite/g++.dg/opt/fmo1.C
new file mode 100644
index 00000000000..f0ae624c61a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/fmo1.C
@@ -0,0 +1,25 @@
+// PR rtl-optimization/115038
+// Reported by Christoph Reiter <reiter.christ...@gmail.com>
+
+// { dg-do compile }
+// { dg-options "-O2 -fno-omit-frame-pointer" }
+
+struct d {
+  d();
+};
+
+struct e {
+  e() : c(1.0) {}
+  float c;
+};
+
+class k {
+  d g;
+  e h;
+};
+
+class a {
+  k f;
+} a;
+
+k b;

Reply via email to