]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
LoongArch: Fix bug in loongarch_emit_stack_tie [PR110484].
authorLulu Cheng <chenglulu@loongson.cn>
Thu, 29 Jun 2023 11:30:59 +0000 (19:30 +0800)
committerLulu Cheng <chenglulu@loongson.cn>
Fri, 1 Sep 2023 02:45:07 +0000 (10:45 +0800)
Which may result in implicit references to $fp when frame_pointer_needed is false,
causing regs_ever_live[$fp] to be true when $fp is not explicitly used,
resulting in $fp being used as the target replacement register in the rnreg pass.

The bug originates from SPEC2017 541.leela_r(-flto).

gcc/ChangeLog:

PR target/110484
* config/loongarch/loongarch.cc (loongarch_emit_stack_tie): Use the
frame_pointer_needed to determine whether to use the $fp register.

Co-authored-by: Guo Jie <guojie@loongson.cn>
(cherry picked from commit 1967f21d000e09d3d3190317af7923b578ce02b1)

gcc/config/loongarch/loongarch.cc

index 22901cb6101028c38272cffd926529b699e4d5a0..9cc9c74cd73d427a0837f133084709a9d84b0bb7 100644 (file)
@@ -1098,7 +1098,9 @@ loongarch_first_stack_step (struct loongarch_frame_info *frame)
 static void
 loongarch_emit_stack_tie (void)
 {
-  emit_insn (gen_stack_tie (Pmode, stack_pointer_rtx, hard_frame_pointer_rtx));
+  emit_insn (gen_stack_tie (Pmode, stack_pointer_rtx,
+                           frame_pointer_needed ? hard_frame_pointer_rtx
+                           : stack_pointer_rtx));
 }
 
 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)