[llvm-dev] Disable spilling sub-registers in LLVM
ahmede via llvm-dev
llvm-dev at lists.llvm.org
Tue Jan 30 10:33:07 PST 2018
Right Matthias, I am aware that an implementation for
storeRegToStackSlot()/loadRegFromStackSlot() is necessary. But these
functions receive the physical register that need to be spilled, they
might receive the sub-register. In this case, using the super-register
naively is unsafe (e.g., one might overwrite parts of it). Thus, I think
the register allocator/spillar need to be aware of the exact register
that is spilled.
On 2018-01-30 13:23, Matthias Braun wrote:
> I still think my answer applies that you have to modify
> storeRegToStackSlot()/loadRegFromStackSlot(). They decide how
> registers are spilled and reloaded. Nobody is stopping you from using
> super registers spills/reloads to implement spilling/reloading smaller
> registers there.
>
> - Matthias
>
>> On Jan 30, 2018, at 10:21 AM, ahmede <ahmede at ece.ubc.ca> wrote:
>>
>> Hi Quentin,
>>
>> Let me clarify if I understood this correctly.
>>
>> If the accesses (writes and reads) to sub-registers are expressed
>> always as sub-registers of the super-register register class (e.g.,
>> SuperReg.sub1;), then the spilling decision is for the super register.
>>
>> But, if the accesses are in terms of the register class of the
>> sub-registers directly (SubReg;), then the spilling decision will be
>> for the sub-register.
>>
>>
>> So if we forced before register allocation all sub-register accesses
>> to be accessed to "lanes" of the super register class then we
>> guarantee that spilling is for the Super Registers only?
>>
>> Thanks,
>> Ahmed
>>
>>
>> On 2018-01-30 00:22, Quentin Colombet wrote:
>>> Hi Ahmed,
>>> If you access your values with sub-registers indices, IIRC the inline
>>> spiller will spill the super register.
>>> If you access your values directly (via sub-regclass), then the
>>> spiller uses this class.
>>> Basically what I am saying is the spiller spills the value that
>>> contains the accesses.
>>> E.g.,
>>> = v; will spill v
>>> = v.sub1; will spill v too, but v is a super register in that case.
>>> Cheers,
>>> -Quentin
>>>> On Jan 29, 2018, at 6:38 PM, ahmede via llvm-dev
>>>> <llvm-dev at lists.llvm.org> wrote:
>>>> Hi Matthias,
>>>> No. I want the register allocator to spill the super-register (the
>>>> large one e.g., 64-bit) and not just the sub-register (e.g., the
>>>> 32-bit that is a piece of of the 64-bit register) because the stack
>>>> loads/store width is 64-bit in this example.
>>>> RegClass1 (sub-registers): sub_registers (32-bit)
>>>> --> can be natively used in arithmetic operations but no stack
>>>> loads/stores for that width.
>>>> RegClass2 (super-registers): [sub_register, subregister] (64-bit)
>>>> --> can be natively used in arithmetic operations and can be used in
>>>> loads/stores.
>>>> Thanks,
>>>> Ahmed
>>>> On 2018-01-29 20:20, Matthias Braun wrote:
>>>>>> On Jan 29, 2018, at 1:20 PM, ahmede via llvm-dev
>>>>>> <llvm-dev at lists.llvm.org> wrote:
>>>>>> Hi,
>>>>>> I wonder if there is a way in LLVM to disable spilling a
>>>>>> register-class while still enabling the super-registers of this
>>>>>> register-class to be spilled.
>>>>> What would you have the register allocator do when it runs out of
>>>>> register and you have spilling disabled? Abort the compilation?
>>>>> If you just want a special instruction sequence (like using a
>>>>> bigger
>>>>> loads/stores for the spills) then you should be able to implement
>>>>> that
>>>>> in storeRegToStackSlot()/loadRegFromStackSlot().
>>>>> - Matthias
>>>>>> If not, how can we implement spilling for sub-registers when stack
>>>>>> load/stores can only operate on the super registers? Is there a
>>>>>> way even if it is suboptimal?
>>>>>> Thanks,
>>>>>> Ahmed
>>>>>> _______________________________________________
>>>>>> LLVM Developers mailing list
>>>>>> llvm-dev at lists.llvm.org
>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list