[LLVMdev] Machine code sinking pass
Jonas Paulsson
jonas.paulsson at ericsson.com
Tue Sep 2 05:57:30 PDT 2014
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140902/1d4198e6/attachment.html>
More information about the llvm-dev
mailing list