This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Ping] [patch 0/3] New macro PREFERRED_RENAME_CLASS
> Currently, we iterate registers from low to high, and resulting
> "preferring" high registers in each iteration. Generally speaking, low
> registers are "better", at least not worse, than high register, in terms
> of code size or other metrics. Why can't we reverse the order of
> iteration?
Generally we avoid changing things if we cannot prove that there is a benefit
in doing so. The compiler supports many architectures and you never really
know how a change behaves with each of them in particular. Why would "low"
registers be universally better than "high" registers?
> I don't see any ports do something specific to this iteration order. I run
> regression test on ARM, X86, X86_64, and don't see any regressions if
> iteration order is reversed. So I assume that it is not harmful to reverse
> the iteration order to all ports, and useful to some ports, not only to ARM.
Testing on a couple of architectures isn't really sufficient to conclude here
in my opinion, so I wouldn't change this, unless specifically requested by
the presence of the hook.
> The goal of this piece of work is to assign low registers to mostly used
> registers, so that code size can be reduced. There is similar feature
> on X86_64, pointed out by HJ. In order to achieve this, we need 1) a
> target hook to prefer low register class, 2) iterate registers from high
> to low.
OK, but AFAICS the target hook as currently written isn't a "preference" thing
but an "exclusion" thing, i.e. all the non-LO_REGS will be excluded and not
only disparaged for GENERAL_REGS. So, once non-LO_REGS are excluded, why
changing the iteration order? Does the iteration order within the LO_REGS
class matter as well for the ARM?
> Yes, the situation you described is correct, but this situation is *not*
> popular, because we've sorted du_head linked list, and assign mostly
> used registers to low registers. I can't give you a quantitative
> measurements, but code size of some programs is reduced.
OK, on the ARM, but what about the 20 other architectures that may want to
paramerize the pass too?
> I thought of target hook like this before, but this can't solve the
> issue of iteration order. If different ports need different iteration
> order, we have to provide a target hook for this.
This can solve the iteration order like so: you compute a "representative"
class for the renaming chain, and then you iterate over N, call the hook, and
iterate over the contents of the class it returns.
--
Eric Botcazou