[PATCH] D112731: [AMDGPU] Really preserve LiveVariables in SILowerControlFlow

Ruiling, Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 1 05:00:29 PDT 2021


ruiling added inline comments.


================
Comment at: llvm/lib/CodeGen/LiveVariables.cpp:732
+    MachineBasicBlock &UseBB = *MF->getBlockNumbered(UseBBNum);
+    // Only add kills in DefBB if all uses are in DefBB.
+    if (&UseBB == &DefBB && UseBlocks.count() != 1)
----------------
why do we need this?


================
Comment at: llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp:719-720
   Register CountReg = MRI->createVirtualRegister(&AMDGPU::SGPR_32RegClass);
   auto BfeMI = BuildMI(*MBB, FirstMI, DL, TII->get(AMDGPU::S_BFE_U32), CountReg)
                    .addReg(InputReg)
                    .addImm((MI.getOperand(1).getImm() & Mask) | 0x70000);
----------------
foad wrote:
> ruiling wrote:
> > Here I think the use of `InputReg` can be a possible kill. Actually we should inherit the possible KILL state from original pseudo instruction. and also replace the `Kills` of `InputReg`.
> The problem here is that we are inserting new instructions in a different place from the original  SI_INIT_EXEC_FROM_INPUT instruction. For example, before this pass:
> ```
> bb.0.main_body:
>   liveins: $sgpr0, $vgpr0
>   %1:vgpr_32 = COPY killed $vgpr0
>   %0:sgpr_32 = COPY killed $sgpr0
>   %3:vgpr_32 = V_ADD_U32_e32 %0:sgpr_32, killed %1:vgpr_32, implicit $exec
>   %4:vgpr_32 = V_CVT_F32_I32_e32 killed %3:vgpr_32, implicit $mode, implicit $exec
>   SI_INIT_EXEC_FROM_INPUT killed %0:sgpr_32, 19, implicit-def dead $exec
>   $vgpr0 = COPY killed %4:vgpr_32
>   SI_RETURN_TO_EPILOG killed $vgpr0
> ```
> Note that SI_INIT_EXEC_FROM_INPUT kills %0. But if we copy the kill flag to the S_BFE_U32 instruction we get this:
> ```
> bb.0.main_body:
>   liveins: $sgpr0, $vgpr0
>   %0:sgpr_32 = COPY killed $sgpr0
>   %5:sgpr_32 = S_BFE_U32 killed %0:sgpr_32, 458771, implicit-def $scc
>   $exec = S_BFM_B64 %5:sgpr_32, 0
>   S_CMP_EQ_U32 killed %5:sgpr_32, 64, implicit-def $scc
>   $exec = S_CMOV_B64 -1, implicit $scc
>   %1:vgpr_32 = COPY killed $vgpr0
>   %3:vgpr_32 = V_ADD_U32_e32 %0:sgpr_32, killed %1:vgpr_32, implicit $exec
>   %4:vgpr_32 = V_CVT_F32_I32_e32 killed %3:vgpr_32, implicit $mode, implicit $exec
>   $vgpr0 = COPY killed %4:vgpr_32
>   SI_RETURN_TO_EPILOG killed $vgpr0
> ```
> which is wrong, because %0 is used in the V_ADD_U32 instruction after the kill.
> 
> What do you think we should do here? Is it OK to drop the kill flag?
I did not notice that, re-computing like in this new version sounds good idea.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112731/new/

https://reviews.llvm.org/D112731



More information about the llvm-commits mailing list