[LLVMdev] Problem with cross class joins in the RegisterCoalescer
Jakob Stoklund Olesen
stoklund at 2pi.dk
Fri Jan 20 09:53:15 PST 2012
On Jan 20, 2012, at 1:19 AM, Patrik Hägglund H wrote:
> Our bug is now fixed.
Great!
> Our getMatchingSuperRegClass is huge (more than 300 lines), messy, and incomplete.
The versions I deleted from ARM and X86 weren't pretty either.
>> Or you could just rebase. On trunk, TableGen writes this difficult function for you.
>
> That in itself would be a compelling reason to get the rebase to trunk done. I just curious how large the generated version will be. :-)
Probably not that bad. TableGen uses a table that takes advantage of the topological register class ordering.
The X86 version looks like this:
const TargetRegisterClass *X86GenRegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const {
static const unsigned Table[58][7][2] = {
...
};
assert(A && B && "Missing regclass");
--Idx;
assert(Idx < 7 && "Bad subreg");
const unsigned *TV = Table[B->getID()][Idx];
const unsigned *SC = A->getSubClassMask();
for (unsigned i = 0; i != 2; ++i)
if (unsigned Common = TV[i] & SC[i])
return getRegClass(32*i + CountTrailingZeros_32(Common));
return 0;
}
The table is just over 3kB. It is quite sparse and could probably be compressed. Patches welcome!
/jakob
More information about the llvm-dev
mailing list