<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/139598>139598</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AMDGPU] amdgpu-postlegalizer-combiner incorrectly removes zeroing mask
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AMDGPU
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          arichardson
      </td>
    </tr>
</table>

<pre>
    It appears the amdgpu-postlegalizer-combiner pass is removing an AND operation that should still be required. I noticed this while trying to add the new `ptrtoaddr` lowering to GlobalISel, but I believe this issue should be reproducible with other code too.

Input code:
```
define i256 @ptrtoaddr_ext(ptr addrspace(8) %ignored, ptr addrspace(8) %ptr) {
  %ret = ptrtoaddr ptr addrspace(8) %ptr to i256
  ret i256 %ret
}
```

This is then lowered to the following G_PTRTOINT+G_TRUNC+G_ZEXT:

```
*** IR Dump After AMDGPUPreLegalizerCombiner (amdgpu-prelegalizer-combiner) on ptrtoaddr_ext ***
# Machine code for function ptrtoaddr_ext: IsSSA, TracksLiveness
Function Live Ins: $sgpr4_sgpr5 in %2, $sgpr6_sgpr7 in %3, $sgpr8_sgpr9 in %4, $sgpr10_sgpr11 in %5, $sgpr12 in %6, $sgpr13 in %7, $sgpr14 in %8, $sgpr15 in %9

bb.1 (%ir-block.0):
  liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7
  %14:_(s32) = COPY $vgpr4
  %15:_(s32) = COPY $vgpr5
  %16:_(s32) = COPY $vgpr6
  %17:_(s32) = COPY $vgpr7
  %1:_(p8) = G_MERGE_VALUES %14:_(s32), %15:_(s32), %16:_(s32), %17:_(s32)
  %18:_(s128) = G_PTRTOINT %1:_(p8)
  %19:_(s48) = G_TRUNC %18:_(s128)
  %20:_(s256) = G_ZEXT %19:_(s48)
  %21:_(s32), %22:_(s32), %23:_(s32), %24:_(s32), %25:_(s32), %26:_(s32), %27:_(s32), %28:_(s32) = G_UNMERGE_VALUES %20:_(s256)
  $vgpr0 = COPY %21:_(s32)
 $vgpr1 = COPY %22:_(s32)
  $vgpr2 = COPY %23:_(s32)
  $vgpr3 = COPY %24:_(s32)
  $vgpr4 = COPY %25:_(s32)
  $vgpr5 = COPY %26:_(s32)
  $vgpr6 = COPY %27:_(s32)
  $vgpr7 = COPY %28:_(s32)
  SI_RETURN implicit $vgpr0, implicit $vgpr1, implicit $vgpr2, implicit $vgpr3, implicit $vgpr4, implicit $vgpr5, implicit $vgpr6, implicit $vgpr7

# End machine code for function ptrtoaddr_ext.
```
These operations are then transformed to a G_AND of the lower 48-bits for the first part, and zeroes for the rest of the parts:

```
*** IR Dump After Legalizer (legalizer) on ptrtoaddr_ext ***
# Machine code for function ptrtoaddr_ext: IsSSA, TracksLiveness, Legalized
Function Live Ins: $sgpr4_sgpr5 in %2, $sgpr6_sgpr7 in %3, $sgpr8_sgpr9 in %4, $sgpr10_sgpr11 in %5, $sgpr12 in %6, $sgpr13 in %7, $sgpr14 in %8, $sgpr15 in %9

bb.1 (%ir-block.0):
  liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7
  %14:_(s32) = COPY $vgpr4
  %15:_(s32) = COPY $vgpr5
  %16:_(s32) = COPY $vgpr6
  %17:_(s32) = COPY $vgpr7
  %1:_(p8) = G_MERGE_VALUES %14:_(s32), %15:_(s32), %16:_(s32), %17:_(s32)
  %18:_(s128) = G_PTRTOINT %1:_(p8)
  %31:_(s64), %32:_(s64) = G_UNMERGE_VALUES %18:_(s128)
  %33:_(s64) = G_IMPLICIT_DEF
 %46:_(s64) = G_CONSTANT i64 281474976710655
  %47:_(s64) = G_CONSTANT i64 0
  %42:_(s64) = G_AND %31:_, %46:_
  %43:_(s64) = G_AND %32:_, %47:_
 %44:_(s64) = G_AND %33:_, %47:_
  %45:_(s64) = G_AND %33:_, %47:_
 %21:_(s32), %22:_(s32) = G_UNMERGE_VALUES %42:_(s64)
  %23:_(s32), %24:_(s32) = G_UNMERGE_VALUES %43:_(s64)
  %25:_(s32), %26:_(s32) = G_UNMERGE_VALUES %44:_(s64)
  %27:_(s32), %28:_(s32) = G_UNMERGE_VALUES %45:_(s64)
  $vgpr0 = COPY %21:_(s32)
  $vgpr1 = COPY %22:_(s32)
  $vgpr2 = COPY %23:_(s32)
  $vgpr3 = COPY %24:_(s32)
  $vgpr4 = COPY %25:_(s32)
 $vgpr5 = COPY %26:_(s32)
  $vgpr6 = COPY %27:_(s32)
  $vgpr7 = COPY %28:_(s32)
  SI_RETURN implicit $vgpr0, implicit $vgpr1, implicit $vgpr2, implicit $vgpr3, implicit $vgpr4, implicit $vgpr5, implicit $vgpr6, implicit $vgpr7

# End machine code for function ptrtoaddr_ext.
```

However, then AMDGPUPostLegalizerCombiner appears to break this code by removing the G_AND and just copying the first 128 bits instead of only the first 48:

```
*** IR Dump After AMDGPUPostLegalizerCombiner (amdgpu-postlegalizer-combiner) on ptrtoaddr_ext ***
# Machine code for function ptrtoaddr_ext: IsSSA, TracksLiveness, Legalized
Function Live Ins: $sgpr4_sgpr5 in %2, $sgpr6_sgpr7 in %3, $sgpr8_sgpr9 in %4, $sgpr10_sgpr11 in %5, $sgpr12 in %6, $sgpr13 in %7, $sgpr14 in %8, $sgpr15 in %9

bb.1 (%ir-block.0):
  liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7
  %14:_(s32) = COPY $vgpr4
  %15:_(s32) = COPY $vgpr5
 %16:_(s32) = COPY $vgpr6
  %17:_(s32) = COPY $vgpr7
  %1:_(p8) = G_MERGE_VALUES %14:_(s32), %15:_(s32), %16:_(s32), %17:_(s32)
  %18:_(s128) = G_PTRTOINT %1:_(p8)
  %31:_(s64), %32:_(s64) = G_UNMERGE_VALUES %18:_(s128)
  %21:_(s32), %22:_(s32) = G_UNMERGE_VALUES %31:_(s64)
 %23:_(s32), %24:_(s32) = G_UNMERGE_VALUES %32:_(s64)
  %25:_(s32) = G_CONSTANT i32 0
  %26:_(s32) = G_CONSTANT i32 0
  %27:_(s32) = G_CONSTANT i32 0
  %28:_(s32) = G_CONSTANT i32 0
  $vgpr0 = COPY %21:_(s32)
  $vgpr1 = COPY %22:_(s32)
  $vgpr2 = COPY %23:_(s32)
  $vgpr3 = COPY %24:_(s32)
 $vgpr4 = COPY %25:_(s32)
  $vgpr5 = COPY %26:_(s32)
  $vgpr6 = COPY %27:_(s32)
  $vgpr7 = COPY %28:_(s32)
  SI_RETURN implicit $vgpr0, implicit $vgpr1, implicit $vgpr2, implicit $vgpr3, implicit $vgpr4, implicit $vgpr5, implicit $vgpr6, implicit $vgpr7
# End machine code for function ptrtoaddr_ext.
```

With SDAG I get the expected result since I believe it doesn't run this pass:
```
define i256 @ptrtoaddr_ext(ptr addrspace(8) %ignored, ptr addrspace(8) %ptr) {
; GISEL-LABEL: ptrtoaddr_ext:
; GISEL: ; %bb.0:
; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GISEL-NEXT:    v_mov_b32_e32 v0, v4
; GISEL-NEXT:    v_mov_b32_e32 v1, v5
; GISEL-NEXT:    v_mov_b32_e32 v2, v6
; GISEL-NEXT:    v_mov_b32_e32 v3, v7
; GISEL-NEXT:    v_mov_b32_e32 v4, 0
; GISEL-NEXT:    v_mov_b32_e32 v5, 0
; GISEL-NEXT:    v_mov_b32_e32 v6, 0
; GISEL-NEXT:    v_mov_b32_e32 v7, 0
; GISEL-NEXT:    s_setpc_b64 s[30:31]
;
; SDAG-LABEL: ptrtoaddr_ext:
; SDAG: ; %bb.0:
; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; SDAG-NEXT:    v_mov_b32_e32 v0, v4
; SDAG-NEXT:    v_and_b32_e32 v1, 0xffff, v5
; SDAG-NEXT:    v_mov_b32_e32 v2, 0
; SDAG-NEXT:    v_mov_b32_e32 v3, 0
; SDAG-NEXT:    v_mov_b32_e32 v4, 0
; SDAG-NEXT:    v_mov_b32_e32 v5, 0
; SDAG-NEXT:    v_mov_b32_e32 v6, 0
; SDAG-NEXT:    v_mov_b32_e32 v7, 0
; SDAG-NEXT:    s_setpc_b64 s[30:31]
  %ret = ptrtoaddr ptr addrspace(8) %ptr to i256
  ret i256 %ret
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWltz4joS_jXipSuULfnGAw8OEJaqTCaVkL29UL4I0ImxvJIgk_PrtyRfMMQQ2Nk5u6cqVakZufV1q7vVoj9kIinZKqd0iNxb5I570VatuRhGgiXrSKSS572Yp-_DmYKoKGgkJKg1hWiTrortTcGlyugqytjvVNwkfBOznAooIimBSRB0w3csX0GUQ_gwBl5QESnGc1DrSIFc822WglQsyyCmIOi_tkzQtA8zyLliCU1BrZmEtzXLKCjxrm0pDlGaGi9y-gbIswolFI_SVCDPgoy_UVHhphmPo2z2TDOERxBvFcwgphmjO1oaZlJuae2H8aAQPN0mLM4ovDG1Bq7WVEDCUwqK8z6yQmSFs7zYKiNERD8jz6r-rDClS5ZTYNj1ADl73xb0h0I4KJTQ7gtZRAlFOAgQHgDCLlvlXNBU-3kKUihhRv4tskLQEkEVIDKGZpFzujoh2iujrDVLF40VHYM_PooEWeG8TJJOdl5mVm8JN8lf8izjbzrT08Xj_Gn-ffYwR_h2upg_vTyMzOifk7_PqwwdmcbVH8yeYLzdFBAuFRUQfhtPH18eBb2vi2pU1xTCQV10gn6sOR0nz-Eg3dAsY5Yk8C1K1npzzHYuuYDlNk9MPR5uEwlhJp-fQ70bcxElr_Ke7WhOpURWeFfraBnMcqnhCDtyVQhnof91geU6sVjrVzOemfGrGdKaCczMoJpxWjO2ZaZsu5pz23O4EnptIamEflvoVMKgLax9HJSbE8d9W6dYV6K4iTOevPYthAfl7gFkbEdZE-puVQirsqbHdmuMW2PSGjutsdsae62xXxe27SASLhAOJMGmgskYRt8f_7E3VgPd80C3AXrngV4D9M8D9z5WuCKoYdPFt8nTdLL4a3j_MnnuiKMM9djpWup1Sg_daRYParGNW-vX5_CDf43eoNZzWmrmxHaZrdWwVctNwdV6-nx3WG207K6IMO6Ukk5pZ_5wZ_5wZ_6w3ykNPm7ydPHycLx_x3FXkZUHoF0aH2K1moNiH-Jw136WJ-cQSE4CySHQOQl0DoHuSaB7CPROAr1DYGdxlsfkEBh8BD7PFk-T-cvTA7BNkbGEqYOPlmOh3SXEXULSJXS6hG6X0OsS-lUPwwQmeQqbyxpJ_6jtzddU0j0LkhAJWvZWJaJcLrnYlP01gunCEKalabWm84IT3MRMSbOeacBMSAVFJJT2OMpT-J0KTvcAQaWqTWiYvKoXNy1Y94Wm4f5RfRaPGgfSr6b71XT_zE2XNL3Bc_aLEHwgPdmDTvVkQrr0Z98e72ej2XwxntyVTch1vC7g6PvD8zx8mAPzHMCB7fjOwPd82_LcZv8c_1NNq8F2hqM_xFoZGLX8qfU6w6j1cFvPr_X0g3NOjXSqmSf3er1LqczJLTzKTcOPLuE8p42SbqOXkKPTRp1uoz_Foo5yfhWJ-jOwqC8S9UeSKGSFf-FvdKe5yKhkT9W1AZfq471Bc2vFIRY0ei0vfsya8fv-hkpzpPJzQBOp37ZSQcKL93qq5Fo2DsBQMJZLRaNUkyueZ-8tiBP8JxcenZ63bjw6r9m-qNgXFbuIin0xsV_LxH6OHBz7VBGOn-IG5ATh6KiWNp8jeM_nuhnDCWxH0ZzEdpKGTuz_PUP4umb5FQzhp-nB35haw_M4nMIMVlSZ7kx_FDRRNAVB5TZTIFme0NbrIKYg5VTmCPsKxDYvaUIRSfk_e8WDyC1MZ8-T-5v78HZyr3vPcc9uo0xvIrfaTBz3raPZm4fyXQwAgFy8RUwluYLdJsm1y7rV6RS1nrLVa2vylKndYsN3i5jgBSUYdqakds6FaFNrO_dCtCnCnXch2lTnzr8QbcrWuhDsXgP2rgH7Z8FyIakqkkXsOSCRe0v0HhMbueNSo9LThf9pxWjQyYIxFv4r9XJs6Wy5fARHeXpULdaP5XK5PKibT9bA7Zx-giVXYJ0rsO4VWO8KrH8Oe7ZcfvXr4146JOmADKIeHdq-41s-sTy3tx462Lawbye2O_CCZeBZy8AKXJxEZOnGfhz32BBb2LVcG9uB5WC378cDSmIc-I5LfZ_YyLHoJmJZP8t2mz4Xq555iz-0ycAdBL0simkmzc8ZMI6j5JXmKSJh-UULYYzccU8Mte5NvF1J5FgZk0rurSmmMvNziErFHX_yaweWJ1wImqis-j5JpbmJ198dN5F87W1FNlwrVZhWgu8Qvlsxtd7G_YRvEL7TK1f_3RSC_0YThfCdCUoifFfFtRvifwcAAP__jCcgnw">