[LLVMdev] [PATCH] [MachineSinking] Conservatively clear kill flags after coalescing.
Quentin Colombet
qcolombet at apple.com
Fri Sep 5 10:40:54 PDT 2014
On Sep 5, 2014, at 10:35 AM, Quentin Colombet <qcolombet at apple.com> wrote:
>
> On Sep 5, 2014, at 10:21 AM, Juergen Ributzka <juergen at apple.com> wrote:
>
>> clearKillFlags seems a little "overkill" to me. In this case you could just simply transfer the value of the kill flag from the SrcReg to the DstReg.
>
> We are extending the live-range of SrcReg. I do not see how you could relate that to the kill flag of DstReg.
I mean, we *may* extend, but we do not really know.
>
> Therefore, I still think, this is the right fix.
>
> -Quentin
>
>>
>> -Juergen
>>
>> On 09/05/14, Quentin Colombet <qcolombet at apple.com> wrote:
>>>
>>> Hi Patrik,
>>>
>>>
>>> LGTM.
>>>
>>> Thanks,
>>> -Quentin
>>> On Sep 5, 2014, at 1:03 AM, Patrik Hägglund H <patrik.h.hagglund at ericsson.com> wrote:
>>>
>>>> Hi Quentin,
>>>>
>>>> Jonas looked further into the problem below, and asked me to submit his patch. Note the we have our own out-of-tree target, and we have not been able to reproduce this problem on an in-tree target. /PatrikHägglund
>>>>
>>>> [MachineSinking] Conservatively clear kill flags after coalescing.
>>>>
>>>> This solves the problem of having a kill flag inside a loop
>>>> with a definition of the register prior to the loop:
>>>>
>>>> %vreg368<def> ...
>>>>
>>>> Inside loop:
>>>>
>>>> %vreg520<def> = COPY %vreg368
>>>> %vreg568<def,tied1> = add %vreg341<tied0>, %vreg520<kill>
>>>>
>>>> => was coalesced into =>
>>>>
>>>> %vreg568<def,tied1> =add%vreg341<tied0>, %vreg368<kill>
>>>>
>>>> MachineVerifierthen complained:
>>>> *** Bad machine code: Virtual register killed in block, but needed live out. ***
>>>>
>>>> The kill flag for %vreg368 is incorrect, and is cleared by this patch.
>>>>
>>>> This is similar to the clearing done at the end of
>>>> MachineSinking::SinkInstruction().
>>>> ---
>>>> lib/CodeGen/MachineSink.cpp | 5 +++++
>>>> 1 file changed, 5 insertions(+)
>>>>
>>>> diff --gita/lib/CodeGen/MachineSink.cpp b/lib/CodeGen/MachineSink.cpp
>>>> index 7782001..261af54 100644
>>>> --- a/lib/CodeGen/MachineSink.cpp
>>>> +++ b/lib/CodeGen/MachineSink.cpp
>>>> @@ -157,6 +157,11 @@boolMachineSinking::PerformTrivialForwardCoalescing(MachineInstr*MI,
>>>> DEBUG(dbgs() << "*** to: " << *MI);
>>>> MRI->replaceRegWith(DstReg,SrcReg);
>>>> MI->eraseFromParent();
>>>> +
>>>> + // Conservatively, clear any kill flags, since it's possible that they are no
>>>> + // longer correct.
>>>> + MRI->clearKillFlags(SrcReg);
>>>> +
>>>> ++NumCoalesces;
>>>> return true;
>>>> }
>>>> --
>>>> 2.1.0
>>>>
>>>> From:llvmdev-bounces at cs.uiuc.edu[mailto:llvmdev-bounces at cs.uiuc.edu]On Behalf OfQuentin Colombet
>>>> Sent:den 2 september 2014 18:37
>>>> To:Jonas Paulsson
>>>> Cc:llvmdev at cs.uiuc.edu
>>>> Subject:Re: [LLVMdev] Machine code sinking pass
>>>>
>>>> Hi Jonas,
>>>>
>>>> This looks like a bug in Machine code sinking pass.
>>>>
>>>> Please file a PR onllvm.org/bugswith a reduced test case to keep track of the issue.
>>>>
>>>> Thanks,
>>>> -Quentin
>>>>
>>>> On Sep 2, 2014, at 5:57 AM, Jonas Paulsson <jonas.paulsson at ericsson.com> wrote:
>>>>
>>>>
>>>> Hi,
>>>> I ran into MachineVerifier ”Virtual register killed in block, but needed live out.”
>>>>
>>>> It was MachineSinking:PerformTrivialForwardCoalescing() that coalesced a COPY inside a single-block loop, but left the
>>>> kill-flag and then MachineVerifier complains that a register in vregsRequired is killed in MBB.
>>>>
>>>> In the example, %vreg520 is replaced by %vreg368 by PerformTrivialForwardCoalescing(), without clearing the kill flag:
>>>>
>>>> BB#13: derived from LLVM BB %CF250
>>>> Predecessors according to CFG: BB#12 BB#13 BB#14
>>>> …
>>>> %vreg520<def> = COPY %vreg368
>>>> %vreg568<def,tied1> = cmp %vreg341<tied0>, %vreg520<kill>
>>>> brr_cond <BB#13>
>>>> brr_uncond <BB#14>
>>>> Successors according to CFG: BB#13, BB#14
>>>>
>>>> Into
>>>>
>>>> BB#13: derived from LLVM BB %CF250
>>>> Predecessors according to CFG: BB#12 BB#13 BB#14
>>>> …
>>>> %vreg568<def,tied1> = cmp %vreg341<tied0>, %vreg368<kill>
>>>> brr_cond <BB#13>
>>>> brr_uncond <BB#14>
>>>> =>
>>>> *** Bad machine code: Virtual register killed in block, but needed live out. ***
>>>> - function: autogen_SD15028
>>>> - basic block: BB#13 CF250 (0x1c75890)
>>>> Virtual register %vreg368 is used after the block.
>>>> There is only one use of %vreg368 in the function.
>>>>
>>>> One thing that strikes me is that one might want to clear the kill flag for a use inside a loop of a register defined prior to
>>>> the loop?
>>>>
>>>> Best regards,
>>>>
>>>> Jonas Paulsson
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>
>>>> <0001-MachineSinking-Conservatively-clear-kill-flags-after.patch>
>>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140905/755a8a1e/attachment.html>
More information about the llvm-dev
mailing list