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);