[llvm-dev] Reserved/Unallocatable Registers
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Sat Feb 27 07:46:17 PST 2016
On 2/26/2016 7:09 PM, Quentin Colombet via llvm-dev wrote:
> To summarize my thoughts, I believe reserved registers were introduced
> to fill the gap of want we don’t model. E.g., for pc for instance, each
> instruction should implicitly define it, then the actual use are
> predictable. Since we don’t do that, we need to conservatively assume
> that the value of a reserved register is unknown and that rule #4 is not
> true.
Maybe we need to extend the model then? From the point of view of
register allocation, none of these registers are allocatable, so nothing
would change, but from the point of view of scheduling, for example,
certain moves involving reserved registers are legal, while others are not.
For example:
1. Status (flags) register, such as the one in x86: it's a special
register, but it cannot be modified except by an instruction that is
known to alter it. (I know there was no direct copy from flags to a
register on x86, but I can't think of a better example.) Dependencies
on this register need to be respected.
a. Special cases: Hexagon has USR (user status register), where one
of the bits indicates "overflow". This bit is sticky and can only go
from 0 to 1, except where it's cleared explicitly. Stores to this bit of
the register can be reordered (except the "clear bit" case).[1]
2. Timer/cycle count registers, PC, etc.: these registers are "volatile"
in the sense that they are modified in a way that does not depend on the
semantics of the executed code in a predictable or controllable manner.
Dependencies on such registers can be ignored, and two subsequent reads
of their value are not guaranteed to be equal.
a. Special case: one could imagine a special register, the reading of
which in itself can have side-effects. In such case the reads should not
be elinminated or duplicated.
[1] In our local repository we have a hook in the subtarget info, which
is called with the DAG as its argument after its construction, and where
we remove the write-write dependencies on the overflow bit (which we
model as a subregister of USR). This is really important for us for
performance reasons, and it would be great to have an "official" way of
handling such cases.
-Krzysztof
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-dev
mailing list