[llvm-dev] spill to register not stack?
Bagel via llvm-dev
llvm-dev at lists.llvm.org
Thu Sep 10 09:38:05 PDT 2020
Thank you Nemanja and Quentin! I did the following:
1. Defined a register class AC that is the union of A and C.
2. In *RegisterInfo, implement getLargestLegalSuperClass, which when queried
for C returns AC.
3. In *InstrInfo, teach copyPhysReg how to copy between registers in A and C.
And voila, spills to register work!
Maybe there should be a FAQ for implementers of backends and this should be in it.
Thanks again,
brian
On 9/9/20 1:48 PM, Quentin Colombet wrote:
> Hi Brian,
>
> +1 on what Nemanja said: specifying large register classes is the key.
>
> More details here:
> http://lists.llvm.org/pipermail/llvm-dev/2019-December/137700.html
>
> Cheers,
> -Quentin
>
>> On Sep 9, 2020, at 11:13 AM, Nemanja Ivanovic via llvm-dev
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> On PowerPC, we implemented support for spilling GPR registers to vector
>> registers. Essentially, it requires specifying the correct register class in
>> `getLargestLegalSuperClass()` as well as
>> `storeRegToStackSlot()/loadRegFromStackSlot()`. You can see what is
>> controlled with the `EnableGPRToVecSpills` option.
>>
>> If you also want to use this method for spilling callee-saved registers to
>> other registers, you can do what we do on PPC in
>> `assignCalleeSavedSpillSlots()` to specify the destination register. This
>> should also ensure that the CFI directives are emitted correctly. Keep in
>> mind that this can likely only be done for leaf functions since you'll likely
>> be spilling these to caller-saved registers of the other class.
>>
>> Hope this helps,
>> Nemanja
>>
>>
>> On Wed, Sep 9, 2020 at 1:30 PM Bagel via llvm-dev <llvm-dev at lists.llvm.org
>> <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> Given an architecture with two classes of registers: A is general purpose
>> and
>> has an "adequate" number of registers, and C which is special purpose and
>> has
>> very few (e.g. one) register. There are cheap instructions that directly
>> copy
>> from C to A and vice versa.
>>
>> If we need another C register and they are all live, we need to spill one.
>> Currently as far as I can tell, the only way to do that is spill to the
>> stack.
>> Is there a knob I can turn to get the spill from C to go to an A register?
>>
>> Thanks,
>> brian
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
More information about the llvm-dev
mailing list