Machine code sinking pass

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 = COPY %vreg368

%vreg568<def,tied1> = cmp %vreg341, %vreg520

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, %vreg368

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

Hi Jonas,

This looks like a bug in Machine code sinking pass.

Please file a PR on llvm.org/bugs with a reduced test case to keep track of the issue.

Thanks,
-Quentin