<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/144561>144561</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AMDGPU][True16] si-fix-sgpr-copies: invalid sgpr_lo16 copy destination
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AMDGPU
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
frederik-h
</td>
</tr>
</table>
<pre>
Running pass `si-fix-sgpr-copies` on the following machine ir changes the `%7:vgpr_16` operand of the second ` V_CNDMASK_B16_t16_e64 ` into a register of type `sgpr_lo16` which is invalid.
## test.mir
```
---
name: sgpr_copy_invalid_type
tracksRegLiveness: true
body: |
bb.0:
%0:vgpr_32 = IMPLICIT_DEF
%1:sreg_32 = IMPLICIT_DEF
%2:sreg_32_xm0_xexec = IMPLICIT_DEF
%3:sgpr_lo16 = COPY undef %0.lo16
%4:sreg_32 = COPY undef %3
%5:sreg_32 = S_AND_B32 undef %4, killed undef %1, implicit-def dead $scc
%6:sgpr_32 = S_CVT_F32_F16 killed undef %5, implicit $mode
%7:vgpr_16 = COPY undef %3
%8:vgpr_16 = V_CNDMASK_B16_t16_e64 0, undef %7, 0, 1, killed undef %2, 0, implicit $exec
S_ENDPGM 0
bb.2:
successors: %bb.0(0x80000000)
S_CMP_LG_U32 killed undef %4, killed undef %4, implicit-def $scc
S_CBRANCH_SCC1 %bb.0, implicit undef $scc
S_ENDPGM 0
...
```
## llc invocation
`llc -mtriple=amdgcn -mcpu=gfx1150 -mattr=+real-true16 -print-changed=cdiff -run-pass=si-fix-sgpr-copies -debug-only=si-fix-sgpr-copies -verify-machineinstrs test.mir`
## Error message from machine verifier
```
*** Bad machine code: Illegal virtual register for instruction ***
- function: sgpr_copy_invalid_type
- basic block: %bb.0 (0x557e9fcd29b8)
- instruction: %8:vgpr_16 = V_CNDMASK_B16_t16_e64 0, undef %7:sgpr_lo16, 0, 1, killed undef %2:sreg_32_xm0_xexec, 0, implicit $exec
- operand 2: undef %7:sgpr_lo16
Expected a VS_16 register, but got a SGPR_LO16 register
```
## Debug output from si-fix-sgpr-copies
```
V2S copy %3:sgpr_lo16 = COPY undef %0.lo16:vgpr_32
is being turned to v_readfirstlane_b32 Score: 3
*** IR Dump After SI Fix SGPR copies (si-fix-sgpr-copies) on sgpr_copy_invalid_type ***
# Machine code for function sgpr_copy_invalid_type: IsSSA, NoPHIs, TracksLiveness
```
```diff
bb.0:
; predecessors: %bb.1
%0:vgpr_32 = IMPLICIT_DEF
%1:sreg_32 = IMPLICIT_DEF
%2:sreg_32_xm0_xexec = IMPLICIT_DEF
- %3:sgpr_lo16 = COPY undef %0.lo16:vgpr_32
- %4:sreg_32 = COPY undef %3:sgpr_lo16
+ %10:vgpr_16 = IMPLICIT_DEF
+ %9:vgpr_32 = REG_SEQUENCE %0.lo16:vgpr_32, %subreg.lo16, %10:vgpr_16, %subreg.hi16
+ %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %9:vgpr_32, implicit $exec
+ %4:sreg_32 = COPY undef %3:sreg_32_xm0
%5:sreg_32 = S_AND_B32 undef %4:sreg_32, killed undef %1:sreg_32, implicit-def dead $scc
%6:sgpr_32 = S_CVT_F32_F16 killed undef %5:sreg_32, implicit $mode
- %7:vgpr_16 = COPY undef %3:sgpr_lo16
- %8:vgpr_16 = V_CNDMASK_B16_t16_e64 0, undef %7:vgpr_16, 0, 1, killed undef %2:sreg_32_xm0_xexec, 0, implicit $exec
+ %7:sgpr_lo16 = COPY undef %3:sreg_32_xm0
+ %8:vgpr_16 = V_CNDMASK_B16_t16_e64 0, undef %7:sgpr_lo16, 0, 1, killed undef %2:sreg_32_xm0_xexec, 0, implicit $exec
S_ENDPGM 0
bb.1:
successors: %bb.0(0x80000000); %bb.0(100.00%)
S_CMP_LG_U32 killed undef %4:sreg_32, killed undef %4:sreg_32, implicit-def $scc
S_CBRANCH_SCC1 %bb.0, implicit undef $scc
S_ENDPGM 0
# End machine code for function sgpr_copy_invalid_type.
```
## Related commit
[[AMDGPU][True16][CodeGen] readfirstlane for vgpr16 copy to sgpr32 ](https://github.com/llvm/llvm-project/commit/d4706e17f55d058316d1cc3ce86bee14ad11f5d6) by @broxigarchen
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMWF1v4joa_jXmxgpy7CSUCy4CgZ5q254udEbaqyixneBtEke200P__comQKAw0zk7F6dCKrEfv34_nvcjZFqLsuF8BsI5CJNR1pmtVLNCccaVePO2o1yyj9m6axrRlLDNtIYgQlp4hdh5umyVR2UruAYRgrKBZsthIatK_mXhdUa3ouFQKEi3WVNy7QAgQgCHE0Di97JVqR-5wy1XWcOgLBxGcyobZqHwe7p4Tp7izb_SuR-lxo9SHgVuRzRGwgwqXgptuHJnP1p3gVUtreRe9l9bQbdQaCia96wSbAxQ3H8wAZhAw7UZ10LZlQj1HxR7ngdQ3GQ1BySGTiSV7Ufai0ntZQDFRmX0Ta95-SjeecO1tmijOrtn3Wcfh39gsgAohnk-RoBYLdwiDtHBIwRDQBL48PTy-LB4eE2T5eqE8gGJteLlLRTAIT5B0l2N0h3fcXoNfJJK7JGDzxx08efLf2DXMF443cbOmUd8cKHFOZqcgOEFcJPGz0k6J_iEDgBewDdRVZydFn27KOq2ElQYzy4ynjEIcKApPYmPDnofxS--v6YrgtOVH30SGg6FWlm1ZPzMDwNW3rIL4PDuAnWdosjedjw7sU9uyb9mLz5uD_WzgTvpt0mXz8nL_RNEh7U8H-MTh3RHKddaKsdAgENHMXyHdndo_wfwdChu8fSSPt6n3wj-pM_VoASfgnIWj026mK_j58Uf6Wax8E8KDGw6iDqcOjNpPD5k5iAJT1laVdRmsKSZEbLZw-yaVxsl2ooDkmQ1K2kDvZq2HSBJWex8P0TQqzNjFCAJwHPFs8qz2elH0GuVaIy3L04MkIQyURTQU13j2VoHSPK51EGP8bwrPdlUHzcA71yJ4sPr659otFH6VGQuzFoqJRWsudZZyWGhZH0snE6O4OqKV3D_gfOMHfHU0pnE8KGqeJlV8F0o02XVqUIWUkGnTketD-FRjK12sOgat9wXrJsFz4N5pgWFeSXp24Bq0HEtDCd8WlCGp_ndnm_e8M4e__dSaFCkfpZOV0rgj1LMO3YgvDf_xq0oXu5aTg1nMIPfN1b9g3et5LwzsJQGZnBz_7JOH_8c7t8idmL5BGVn2s7sCXClwZ4f_o430IbmF2r3sbnYvBMa5tz2aNOphjNoJHxPFc9YIZQ2VdbwNCcYbqhUjlHkjHMPa5h0dQvjwpJq8wBXYucMhn0GAHx3xQQ8tTPCdVqdURFarzwNSO2Ie6DnLWJa4uvNJrZxeJYvfzxo--3Vdedja_4cg8OjTf2-OA5aMyBz2Npx6FNl9Xvwlzr3b27c3q807WHgvS9173PCAzzfG4AucvZymuhx0wtvrJf36Wb572_L58Xyqlp4YZd1lytejg-5fXHhOWgrzjQj537rC8p6GSerh_Xm9TF-XrqR41y5W822F_oFJ52u7AP4pWnnCLk-95xt_3gC-hsD0FXpg1HI-9IYdE4Q7_8p6IP4_sZyfgji5Ccp8jmMh5P_tAZ1bf5zVegw_n1t-iPzwZaP0Nguh8O58Cdj4Q_ZG_yAvcOh75fnxCvGu9mpOR9-vtInxjf78JpXmW3sVNa1MP2WfTGex0_J_cs3ECYgnL-62XH_fSEZv-cNCBN41jydHpY9frRv00Y6bWyShgnAd1tjWhsngFcAr0phtl0-prIGeFVV74d_Xqvkfzk1AK96nfCKBRMUcX9ShCFD4R3xI-ZTSii_i3LO_SBjvl-ELLLdNv-AIEC5kjtRZopueQNHbEbYlEyzEZ_5kxD5k8kkCEbbGcXELwIcBMUkoJPJJOLTMAoYI6TAYYDYSMwwwiGK_Ikf4SkKxijELCgIDcPpFIeoAAHidSaqsVV9LFU5Elp3fOYHQRj5oyrLeaXdLw0Y5xl94w0DJO5dizEIk5GaObPzrtQgQJXQRp-kGWEq90vF1Whcm5lIfHjlh6ci4OLBuDaicS8So05Vs1-OhzNNA7zqrXuf4f8FAAD__6kuEbU">