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.
This commit is contained in:
Eric Botcazou 2024-05-22 18:10:39 +02:00
parent 4896bb3199
commit 2f0e086240
2 changed files with 26 additions and 1 deletions

View file

@ -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); 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; return 0;
rtx dest = SET_DEST (PATTERN (def)); rtx dest = SET_DEST (PATTERN (def));

View file

@ -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;