This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] LRA: Fix caller-save store/restore instruction for large mode
- From: Kito Cheng <kito dot cheng at gmail dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Vladimir Makarov <vmakarov at redhat dot com>, bin dot cheng at arm dot com
- Date: Mon, 5 Jan 2015 15:44:00 +0800
- Subject: [PATCH] LRA: Fix caller-save store/restore instruction for large mode
- Authentication-results: sourceware.org; auth=none
Hi Vladimir:
This patch has a discusses with you in May 2014, this patch is about
the caller-save register store and restore instruction generation, the
current LRA implementation will miss caller-save store/restore
instruction if need one more instruction.
You said you will investigate for this on IRC, so I don't send the
patch last year, however ARM guys seem got this problem too, so I
think it's time to send this patch :)
ChangeLog
2015-01-05 Kito Cheng <kito@0xlab.org>
* lra-constraints.c (split_reg): Fix caller-save store/restore
instruction generation.
From 434dc294cf3f2267eed89d27b34c53c079e2b25a Mon Sep 17 00:00:00 2001
From: Kito Cheng <kito@andestech.com>
Date: Thu, 29 May 2014 23:53:23 +0800
Subject: [PATCH] Fix caller-save store/restore instruction for large mode in
lra
- The original code assume store/restore will always have only
one insn, it's will fail if you split in move pattern!!!
---
gcc/lra-constraints.c | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 382281c..4dcf553 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4918,9 +4918,8 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
reg_renumber[REGNO (new_reg)] = hard_regno;
}
save = emit_spill_move (true, new_reg, original_reg);
- if (NEXT_INSN (save) != NULL_RTX)
+ if (NEXT_INSN (save) != NULL_RTX && !call_save_p)
{
- lra_assert (! call_save_p);
if (lra_dump_file != NULL)
{
fprintf
@@ -4934,9 +4933,8 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
return false;
}
restore = emit_spill_move (false, new_reg, original_reg);
- if (NEXT_INSN (restore) != NULL_RTX)
+ if (NEXT_INSN (restore) != NULL_RTX && !call_save_p)
{
- lra_assert (! call_save_p);
if (lra_dump_file != NULL)
{
fprintf (lra_dump_file,
--
1.7.6