diff mbox series

Fix PR rtl-optimization/115038

Message ID 1886462.tdWV9SEqCh@fomalhaut
State New
Headers show
Series Fix PR rtl-optimization/115038 | expand

Commit Message

Eric Botcazou May 20, 2024, 7:13 a.m. UTC
Hi,

this is a regression present on mainline and 14 branch under the form of an 
ICE in seh_cfa_offset from config/i386/winnt.cc on the attached C++ testcase 
compiled 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, the question being 
whether this should be done unconditionally as in the fix or only with SEH.

Tested on x86-64/Linux, OK for the mainline and 14 branch?


2024-05-20  Eric Botcazou  <ebotcazou@adacore.com>

	PR rtl-optimization/115038
	* fold-mem-offsets.cc (fold_offsets): Return 0 if the defining
	instruction of the register is frame related.


2024-05-20  Eric Botcazou  <ebotcazou@adacore.com>

	* g++.dg/opt/fmo1.C: New test.

Comments

Jeff Law May 22, 2024, 3:29 p.m. UTC | #1
On 5/20/24 1:13 AM, Eric Botcazou wrote:
> Hi,
> 
> this is a regression present on mainline and 14 branch under the form of an
> ICE in seh_cfa_offset from config/i386/winnt.cc on the attached C++ testcase
> compiled 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, the question being
> whether this should be done unconditionally as in the fix or only with SEH.
> 
> Tested on x86-64/Linux, OK for the mainline and 14 branch?
> 
> 
> 2024-05-20  Eric Botcazou  <ebotcazou@adacore.com>
> 
> 	PR rtl-optimization/115038
> 	* fold-mem-offsets.cc (fold_offsets): Return 0 if the defining
> 	instruction of the register is frame related.
> 
> 
> 2024-05-20  Eric Botcazou  <ebotcazou@adacore.com>
> 
> 	* g++.dg/opt/fmo1.C: New test.
lol.  I missed that you had already submitted this when I made my 
comment in the PR.

OK for the trunk and gcc-14 branch.

Jeff
diff mbox series

Patch

diff --git a/gcc/fold-mem-offsets.cc b/gcc/fold-mem-offsets.cc
index 2e15b05529e..84b9623058b 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));