On 10/28/2010 12:24 PM, Georg Lay wrote:
Emitting a bunch of CLOBBERs in epilogue/sibcall_epilogue works also, at least
for the small example above. But using LOCAL_REGNO seems more natural to me and
that does not clutter RTL.

True. It's a pretty elegant solution, and I missed it in my mail (I'm not really a backend guy at all, which explains why it's easy for me to blame backends).

I already had to fix IRA and remove the following part of
ira-color.c::assign_hard_reg() because it makes assumptions that do not hold for
the machine:

       if (! allocated_hardreg_p[hard_regno]
        &&  ira_hard_reg_not_in_set_p (hard_regno, mode, call_used_reg_set))
        /* We need to save/restore the hard register in
           epilogue/prologue.  Therefore we increase the cost.  */
        {
          /* ??? If only part is call clobbered.  */
          rclass = REGNO_REG_CLASS (hard_regno);
          add_cost = (ira_memory_move_cost[mode][rclass][0]
                      + ira_memory_move_cost[mode][rclass][1] - 1);
          cost += add_cost;
          full_cost += add_cost;
        }


Maybe you can use LOCAL_REGNO here too, and submit a patch for that?

Paolo

Reply via email to