[llvm] AMDGPU: Delete redundant recursive copy handling code (PR #157032)

Jay Foad via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 26 09:03:54 PDT 2025


jayfoad wrote:

> Making the verifier block this is hard to do. Fixing the ISel or whatever code generates %4:vgpr_32 = COPY %3 should not be. Do you know what code that is?

Here's what I see, before twoaddressinstruction:
```
bb.0.bb:
  liveins: $vgpr0, $vgpr1
  %9:vgpr_32 = COPY killed $vgpr1
  %8:vgpr_32 = COPY killed $vgpr0
  %10:vgpr_32 = REG_SEQUENCE killed %8:vgpr_32, %subreg.lo16, undef %11:sreg_32, %subreg.hi16
  %13:vgpr_16 = V_MOV_B16_t16_e64 0, 15360, 0, implicit $exec
  %14:vgpr_32 = REG_SEQUENCE killed %13:vgpr_16, %subreg.lo16, undef %15:sreg_32, %subreg.hi16
  %18:vgpr_32 = V_BFI_B32_e64 32767, killed %14:vgpr_32, killed %10:vgpr_32, implicit $exec
  %21:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, killed %9:vgpr_32, implicit $exec
  %22:vgpr_16 = V_CNDMASK_B16_t16_e64 0, 15360, 0, killed %18.lo16:vgpr_32, killed %21:sreg_32_xm0_xexec, 0, implicit $exec
  %24:vgpr_32 = nofpexcept V_PACK_B32_F16_t16_e64 0, killed %22:vgpr_16, 0, 0, 0, 0, implicit $mode, implicit $exec
  $vgpr0 = COPY killed %24:vgpr_32
  SI_RETURN implicit killed $vgpr0
```
After twoaddressinstruction:
```
bb.0.bb:
  liveins: $vgpr0, $vgpr1
  %9:vgpr_32 = COPY killed $vgpr1
  %8:vgpr_32 = COPY killed $vgpr0
  undef %10.lo16:vgpr_32 = COPY killed %8:vgpr_32
  %13:vgpr_16 = V_MOV_B16_t16_e64 0, 15360, 0, implicit $exec
  undef %14.lo16:vgpr_32 = COPY killed %13:vgpr_16
  %18:vgpr_32 = V_BFI_B32_e64 32767, killed %14:vgpr_32, killed %10:vgpr_32, implicit $exec
  %21:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 0, killed %9:vgpr_32, implicit $exec
  %22:vgpr_16 = V_CNDMASK_B16_t16_e64 0, 15360, 0, killed %18.lo16:vgpr_32, killed %21:sreg_32_xm0_xexec, 0, implicit $exec
  %24:vgpr_32 = nofpexcept V_PACK_B32_F16_t16_e64 0, killed %22:vgpr_16, 0, 0, 0, 0, implicit $mode, implicit $exec
  $vgpr0 = COPY killed %24:vgpr_32
  SI_RETURN implicit killed $vgpr0
```
So two addressinstruction introduces the dubious COPY `undef %10.lo16:vgpr_32 = COPY killed %8:vgpr_32`, but it comes from an equally dubious instruction `%10:vgpr_32 = REG_SEQUENCE killed %8:vgpr_32, %subreg.lo16, undef %11:sreg_32, %subreg.hi16` (where %8 is 32-bit but it being used as a 16-bit input to the REG_SEQUENCE) that came straight out of isel.

https://github.com/llvm/llvm-project/pull/157032


More information about the llvm-commits mailing list