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.
{
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));
--- /dev/null
+// PR rtl-optimization/115038
+// Reported by Christoph Reiter <reiter.christoph@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;