[LLVMdev] [PATCH] [MachineSinking] Conservatively clear kill flags after coalescing.

Quentin Colombet qcolombet at apple.com
Fri Sep 5 10:35:08 PDT 2014


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.

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>
>> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140905/d5165f94/attachment.html>


More information about the llvm-dev mailing list