[llvm-dev] Disable spilling sub-registers in LLVM
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Wed Jan 31 07:18:23 PST 2018
Matthias's suggestion was to use the TII functions not to simply replace
the smaller register with a larger one (which as you pointed out would
not work), but to generate code that would effectively loaded/stored the
small register, while using load/store instructions for larger
registers. In other words, this code would have several instructions,
that would make sure that the loaded value is correct in the end.
-Krzysztof
On 1/30/2018 12:55 PM, ahmede via llvm-dev wrote:
> To make my point clear, I believe an implementation of
> storeRegToStackSlot()/loadRegFromStackSlot() is not sufficient (as it
> received the physical register already). Does this make sense?
>
> On 2018-01-30 13:33, ahmede wrote:
>> 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
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-dev
mailing list