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:
parent
4896bb3199
commit
2f0e086240
2 changed files with 26 additions and 1 deletions
|
@ -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));
|
||||||
|
|
25
gcc/testsuite/g++.dg/opt/fmo1.C
Normal file
25
gcc/testsuite/g++.dg/opt/fmo1.C
Normal 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;
|
Loading…
Add table
Reference in a new issue