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 <k...@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 <k...@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