aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2024-05-22 18:10:39 +0200
committerEric Botcazou <ebotcazou@adacore.com>2024-05-22 18:13:54 +0200
commitf14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce (patch)
treef7cb294a29c89489b458686df0e452c84cd86484
parenta3b16e73a2d5b2d4d20ef6f2fd164cea633bbec8 (diff)
downloadgcc-f14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce.zip
gcc-f14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce.tar.gz
gcc-f14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce.tar.bz2
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.
-rw-r--r--gcc/fold-mem-offsets.cc2
-rw-r--r--gcc/testsuite/g++.dg/opt/fmo1.C25
2 files changed, 26 insertions, 1 deletions
diff --git a/gcc/fold-mem-offsets.cc b/gcc/fold-mem-offsets.cc
index 2e15b05..84b9623 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 0000000..f0ae624
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/fmo1.C
@@ -0,0 +1,25 @@
+// 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;