-
Notifications
You must be signed in to change notification settings - Fork 42
Description
Two core data-structure elements, Operand
and Use
, are both designed to fit a relatively large amount of information in one u32
. This is a performance optimization that we have found to be relatively impactful; expanding even to a u64
has a measurable impact (of at least a few percent) on compilation time.
Unfortunately, the scarcity of bits means that certain limits are lower than we would prefer. For example, we support only a 5-bit index for physical registers in each register class (so 32 integer registers and 32 float/vector registers), which may not be enough for some use-cases (though it can work for aarch64 and x64 at least). This also limits the VReg count to 1M (2^20).
We should investigate ways of, e.g., out-of-lining infrequently-used information (such as fixed-PReg constraints) to raise the limits on VRegs, PRegs, instruction count, and the like and provide enough headroom for any reasonably-imaginable use case.