diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2024-05-22 18:10:39 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2024-05-22 18:13:54 +0200 |
commit | f14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce (patch) | |
tree | f7cb294a29c89489b458686df0e452c84cd86484 | |
parent | a3b16e73a2d5b2d4d20ef6f2fd164cea633bbec8 (diff) | |
download | gcc-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.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/fmo1.C | 25 |
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; |