This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] LRA: Fix incorrect register spill/reload
- From: Robert Suchanek <Robert dot Suchanek at imgtec dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 31 Oct 2013 13:23:52 +0000
- Subject: [PATCH] LRA: Fix incorrect register spill/reload
- Authentication-results: sourceware.org; auth=none
Hello,
When investigating regression with LRA enabled for mips16 I found incorrect spilling and reload of
registers by callee. In the case, one register was not saved, although used, and another one never
used but saved/restored.
The issue appears to be in setting registers ever lived and subsequent passes save/restore the wrong
register(s). I have attached a patch below. I presume that the statement terminator was
typed accidentally as I do not see a justification of the df_set_regs_ever_live() function to be outside
the for loop. Or I am wrong?
Regards,
Robert
* lra-spills.c (assign_spill_hard_regs): Removed statement terminator after comment.
Loop body outside the for loop.
diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c
index 7c0c630..e1cf654 100644
--- a/gcc/lra-spills.c
+++ b/gcc/lra-spills.c
@@ -334,8 +334,8 @@ assign_spill_hard_regs (int *pseudo_regnos, int n)
for (nr = 0;
nr < hard_regno_nregs[hard_regno][lra_reg_info[regno].biggest_mode];
nr++)
- /* Just loop. */;
- df_set_regs_ever_live (hard_regno + nr, true);
+ /* Just loop. */
+ df_set_regs_ever_live (hard_regno + nr, true);
}
bitmap_clear (&ok_insn_bitmap);
free (reserved_hard_regs);