[PATCH] PEI scavengeFrameVirtualRegs and RS improvments
Jakob Stoklund Olesen
stoklund at 2pi.dk
Sun Mar 24 14:08:40 PDT 2013
Looks good.
/jakob
On Mar 24, 2013, at 1:36 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> ----- Original Message -----
>> From: "Jakob Stoklund Olesen" <stoklund at 2pi.dk>
>> To: "Hal Finkel" <hfinkel at anl.gov>
>> Cc: "Commit Messages and Patches for LLVM" <llvm-commits at cs.uiuc.edu>
>> Sent: Sunday, March 24, 2013 2:30:58 PM
>> Subject: Re: [PATCH] PEI scavengeFrameVirtualRegs and RS improvments
>>
>>
>> On Mar 24, 2013, at 12:21 PM, Hal Finkel <hfinkel at anl.gov> wrote:
>>>>
>>>> If you use replaceRegWith(), I don't think you'll know which
>>>> instruction is the last use, and you won't be setting kill flags.
>>>> Can the scavenger recover after that, or will it think that the
>>>> rewritten physreg stays alive because there are no kill flags?
>>>
>>> Currently, code that uses the scavengeFrameVirtualRegs
>>> functionality is, as it must, manually setting the kill flags on
>>> the virtual registers; and these flags survive the
>>> register-replacement with the scavanged register. What I've done
>>> preserves this requirement.
>>
>> OK, that works too.
>
> Alright, then we'll keep this behavior for now (I'll add a note about this somewhere).
>
>>
>>>> Instead of replaceRegWith, you can steal a trick from RAFast: When
>>>> you rewrite virtual registers top-down, MRI.reg_empty(VirtReg) is
>>>> going to return true only after you've rewritten the last use of
>>>> the
>>>> register. That's the kill, and you can set a kill flag on that
>>>> last
>>>> use operand so the scavenger will be able to reuse the register.
>>>
>>> I could do that. Maybe the best way of doing this is to make
>>> replaceRegWith set the kill flags (I could add a parameter to have
>>> it do this). Currently, the inner loop of replaceRegWith has:
>>>
>>> MachineOperand &O = I.getOperand();
>>> ++I;
>>> O.setReg(ToReg);
>>>
>>> so making this (..., bool setKill = false):
>>>
>>> MachineOperand &O = I.getOperand();
>>> ++I;
>>> O.setReg(ToReg);
>>> if (setKill && I == E)
>>> O.setIsKill();
>>>
>>> should accomplish what you've suggested, right?
>>
>> Unfortunately, that won't work. The use-def list is not guaranteed to
>> be ordered. (And globally live registers can have multiple kills. Or
>> no kills.)
>>
>>>>> 2. Normally, scavengeRegister will remove from consideration all
>>>>> registers referenced by the instruction pointed to by the
>>>>> iterator. I've added a boolean parameter to disable this behavior
>>>>> for killed registers (this cannot be made the default behavior
>>>>> because some code inserts code that uses the scavenged register
>>>>> prior to the provided iterator).
>>>>
>>>> This sounds to me like a workaround for an off-by-one error.
>>>> Shouldn't it be properly defined if the scavenged register is safe
>>>> to use before or after the current scavenger position?
>>>
>>> Hrmm... yes, it would be convenient (for me) to define that the
>>> returned register is free to be defined at the provided position.
>>> Both XCore and Hexagon call scavengeRegister and then insert
>>> definitions of the returned register using BuildMI at the same
>>> position (which I think inserts instructions prior to that
>>> position). I could update those targets to insert those
>>> instructions at llvm::next(I) instead. I'm afraid of subtly
>>> breaking out-of-tree targets with such a change.
>>>
>>> On the other hand, maybe it is better if, in
>>> scavengeFrameVirtualRegs(), I call scavengeRegister with
>>> llvm::next(I) as the iterator. Because we're not actually
>>> inserting any instructions during scavengeFrameVirtualRegs, this
>>> might work as required.
>>>
>>> What do you think?
>>
>> It would make sense to me if scavengeRegister(I) returned a register
>> that was available *before* the instruction at I, because BuildMI(I)
>> inserts instructions *before* I. Then it would also makes sense to
>> call scavengeRegister(MBB.end()).
>
> Okay, this was simple enough to change; I like this way better (and requires less change). I've attached a revised patch (in which PEI calls scavengeRegister with llvm::next(I)). How's this?
>
> Thanks again,
> Hal
>
>>
>> /jakob
>>
>>
> <pei_rs-v2.patch>
More information about the llvm-commits
mailing list