]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
AVR: target/64242 - Copy FP to a local reg in nonlocal_goto.
authorGeorg-Johann Lay <avr@gjlay.de>
Wed, 4 Dec 2024 19:56:50 +0000 (20:56 +0100)
committerGeorg-Johann Lay <avr@gjlay.de>
Thu, 5 Dec 2024 10:47:42 +0000 (11:47 +0100)
In nonlocal_goto sets, change hard_frame_pointer_rtx only after
emit_stack_restore() restored SP.  This is needed because SP
my be stored in some frame location.

gcc/
PR target/64242
* config/avr/avr.md (nonlocal_goto): Don't restore
hard_frame_pointer_rtx directly, but copy it to local
register, and only set hard_frame_pointer_rtx from it
after emit_stack_restore().

(cherry picked from commit f7b5527d1b48b33d8ab633c1e9dcb9883667492a)

gcc/config/avr/avr.md

index b7273fa19f6e0e08beb9b9c5a91e6959334b8abf..823fc716f2c7757e9f3f0809138f3ec7d0c732fd 100644 (file)
 
     emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
 
-    emit_move_insn (hard_frame_pointer_rtx, r_fp);
+    // PR64242: When r_sp is located in the frame, we must not
+    // change FP prior to reading r_sp.  Hence copy r_fp to a
+    // local register (and hope that reload won't spill it).
+    rtx r_fp_reg = copy_to_reg (r_fp);
     emit_stack_restore (SAVE_NONLOCAL, r_sp);
 
+    emit_move_insn (hard_frame_pointer_rtx, r_fp_reg);
+
     emit_use (hard_frame_pointer_rtx);
     emit_use (stack_pointer_rtx);