On 08/17/2011 07:52 AM, Richard Sandiford wrote:
   cost = rtx_cost (SET_SRC (set), SET, speed);
   return cost>  0 ? cost : COSTS_N_INSNS (1);

This ignores SET_DEST (the problem I'm trying to fix).  It also means
that constants that are slightly more expensive than a register --
somewhere in the range [0, COSTS_N_INSNS (1)] -- end up seeming
cheaper than registers.

This can be fixed by doing

  return cost >= COSTS_N_INSNS (1) ? cost : COSTS_N_INSNS (1);

One approach I'm trying is to make sure that every target that doesn't
explicitly handle SET does nothing with it.  (Targets that do handle
SET remain unchanged.)  Then, if we see a SET whose SET_SRC is a
register, constant, memory or subreg, we give it cost:

     COSTS_N_INSNS (1)
     + rtx_cost (SET_DEST (x), SET, speed)
     + rtx_cost (SET_SRC (x), SET, speed)

as now.  In other cases we give it a cost of:

     rtx_cost (SET_DEST (x), SET, speed)
     + rtx_cost (SET_SRC (x), SET, speed)

But that hardly seems clean either.  Perhaps we should instead make
the SET_SRC always include the cost of the SET, even for registers,
constants and the like.  Thoughts?

Similarly, this becomes

  dest_cost = rtx_cost (SET_DEST (x), SET, speed);
  src_cost = MAX (rtx_cost (SET_SRC (x), SET, speed),
                  COSTS_N_INSNS (1));
  return dest_cost + src_cost;

How does this look?

Paolo

Reply via email to