IRA improvement patch
Vladimir Makarov
vmakarov@redhat.com
Tue May 10 16:54:00 GMT 2011
On 05/06/2011 10:21 AM, Hari Sandanagobalane wrote:
> Hi Vlad,
> I found a problem with your IRA improvement checkin r171649 on
> 29-3-2011. I can't get picochip port to build with this change. The
> problem is in the function "clarify_prohibited_class_mode_regs" in
> ira.c:1413. The code reproduced here is
>
> /* Clarify IRA_PROHIBITED_CLASS_MODE_REGS by excluding hard registers
> spanning from one register pressure class to another one. It is
> called after defining the pressure classes. */
> static void
> clarify_prohibited_class_mode_regs (void)
> {
> int j, k, hard_regno, cl, pclass, nregs;
>
> for (cl = (int) N_REG_CLASSES - 1; cl >= 0; cl--)
> for (j = 0; j < NUM_MACHINE_MODES; j++)
> for (k = ira_class_hard_regs_num[cl] - 1; k >= 0; k--)
> {
> hard_regno = ira_class_hard_regs[cl][k];
> if (TEST_HARD_REG_BIT
> (ira_prohibited_class_mode_regs[cl][j], hard_regno))
> continue;
> nregs = hard_regno_nregs[hard_regno][j];
> pclass = ira_pressure_class_translate[REGNO_REG_CLASS
> (hard_regno)];
> for (nregs-- ;nregs >= 0; nregs--)
> if (((enum reg_class) pclass
> != ira_pressure_class_translate[REGNO_REG_CLASS
> (hard_regno + nregs)]))
> {
> SET_HARD_REG_BIT (ira_prohibited_class_mode_regs[cl][j],
> hard_regno);
> break;
> }
> }
> }
>
>
> I do not understand the functionality of the code, but i get a
> segfault in the line
>
> if (((enum reg_class) pclass
> != ira_pressure_class_translate[REGNO_REG_CLASS
> (hard_regno + nregs)]))
>
> In the case where it segfaults, the hard_regno+nregs is greater than
> FIRST_PSEUDO_REGISTER. It leads to access beyond the end of
> REGNO_REG_CLASS array.
>
> I realise that hard_regno_nregs happily gives you a value beyond the
> FIRST_PSEUDO_REGISTER. I can change it so it wouldn't do that, if that
> is the solution to this. Can you clarify?
>
Sorry for the delay with the answer, Hari. I was on vacation last week.
Thanks for pointing the problem. Usually ports have some virtual
registers after the real hard registers before the first pseudo-register
and this did not happen for other ports.
So your proposal is right one. You could add `hard_regno + nregs >=
FIRST_PSEUDO_REGISTER ||' at the start of if-condition and send the
patch for approval.
Vlad
More information about the Gcc
mailing list