https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70961
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-05-05
CC| |ebotcazou at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #1 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> When deciding which register to use regrename.c calls the target function
> preferred_rename_class. However in pass 2 in find_rename_reg it then just
> ignores this preference. This results in significantly increased codesize on
> targets which prefer a subset of allocatable registers in order to use
> smaller instructions.
Pass #2 ignores it since the preference simply couldn't be honored.
> Also the computed super_class appears to be the union of all uses and defs
> instead of the intersection. This should be the intersection as that is the
> set of registers that all uses and defs support.
The super_class has nothing to do with the class that is searched for renaming
registers though, it's just the info passed to the back-end to compute this
class. For example, on the ARM, the preferred_class will be LO_REGS for any
chain of GENERAL_REGS.
> If the preferred class doesn't result in a valid rename then it could search
> a wider class, but then it would need to check that the size of the newly
> selected patterns does not increase.
The size is an arbitrary criterion, this could also be the latency, etc.