<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi Carrot,<div class=""><br class=""></div><div class="">Kill flags are an optional information and it is not linked to the track liveness property per se.</div><div class=""><br class=""></div><div class="">Essentially, when looking at individual operands, if a kill flag is present it must be correct. If there is no kill flag, the operand can be a last use or not. Also, if you see at least one kill flag within the function, that doesn’t mean all the kill flags are set.</div><div class="">Bottom line the kill flags are optional, conservatively correct flags.</div><div class=""><br class=""></div><div class="">If you want reliable last use information, I encourage you to use the LiveIntervals analysis or after regalloc, you can use <span style="font-family: Menlo; font-size: 11px;" class="">llvm::recomputeLivenessFlags</span>.</div><div class=""><br class=""></div><div class="">Regarding TracksLiveness, when this property is true, that means what the comment says in what you shared :).</div><div class="">More explicitly that means that the MachineFunction properly reflects the liveness information of all the values in that function:</div><div class="">- live-in sets are correct</div><div class="">- the live intervals analysis if available is correct</div><div class="">- the live variables analysis if available is correct</div><div class="">- definitions are before uses</div><div class="">- …</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">-Quentin</div><div class=""><div><blockquote type="cite" class=""><div class="">On Apr 27, 2021, at 10:09 AM, Carrot Wei via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Hi all,<br class=""><br class="">The property TracksLiveness has comment<br class=""><br class="">// TracksLiveness: True when tracking register liveness accurately.<br class="">// While this property is set, register liveness information in basic block<br class="">// live-in lists and machine instruction operands (e.g. kill flags, implicit<br class="">// defs) is accurate. This means it can be used to change the code in ways<br class="">// that affect the values in registers, for example by the register<br class="">// scavenger.<br class="">// When this property is clear, liveness is no longer reliable.<br class=""><br class="">Can I assume that when a MachineFunction has the TracksLiveness<br class="">property I can use the isKill flag of a register operand?<br class=""><br class="">But when I try the following test<br class=""><br class="">*** IR Dump After Module Verifier (verify) ***<br class="">define i32 @test2(i32* %p, i32 %a, i32 %b, i32 %c) {<br class="">entry:<br class="">  %0 = add i32 %a, %b<br class="">  %1 = add i32 %0, %c<br class="">  store i32 %1, i32* %p, align 4<br class="">  %sub1 = sub nsw i32 %a, %b<br class="">  ret i32 %sub1<br class="">}<br class=""># *** IR Dump After X86 DAG->DAG Instruction Selection (amdgpu-isel) ***:<br class=""># Machine code for function test2: IsSSA, TracksLiveness<br class="">Function Live Ins: $rdi in %0, $esi in %1, $edx in %2, $ecx in %3<br class=""><br class="">bb.0.entry:<br class="">  liveins: $rdi, $esi, $edx, $ecx<br class="">  %3:gr32 = COPY $ecx<br class="">  %2:gr32 = COPY $edx<br class="">  %1:gr32 = COPY $esi<br class="">  %0:gr64 = COPY $rdi<br class="">  %4:gr32 = ADD32rr %1:gr32(tied-def 0), %2:gr32, implicit-def dead $eflags<br class="">  %5:gr32 = ADD32rr %4:gr32(tied-def 0), %3:gr32, implicit-def dead $eflags<br class="">  MOV32mr %0:gr64, 1, $noreg, 0, $noreg, killed %5:gr32 :: (store 4 into %ir.p)<br class="">  %6:gr32 = nsw SUB32rr %1:gr32(tied-def 0), %2:gr32, implicit-def dead $eflags<br class="">  $eax = COPY %6:gr32<br class="">  RET 0, $eax<br class=""><br class=""># End machine code for function test2.<br class=""><br class="">The generated MachineFunction has TracksLiveness property, but for all<br class="">virtual registers, only %5 has the correct isKill flag, others don't<br class="">have this flag.<br class=""><br class="">Could anyone help to clarify the usage of TracksLiveness and isKill?<br class=""><br class="">thanks a lot!<br class="">Guozhi Wei<br class="">_______________________________________________<br class="">LLVM Developers mailing list<br class=""><a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class=""></div></div></blockquote></div><br class=""></div></body></html>