<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/122709>122709</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AMDGPU][GISel] GlobalISel doesn’t make use enough of _e64 instructions
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tyb0807
</td>
</tr>
</table>
<pre>
Given the input IR in [input_ir.txt](https://github.com/user-attachments/files/18397617/input_ir.txt), GISel is generating code using mostly `_e32` instructions, while SelectionDAG is able to make use of `_e64` instructions, which resulted in much more compact code:
```
; Function info: (SelectionDAG)
; codeLenInByte = 212
; NumSgprs: 38
; NumVgprs: 32
; NumAgprs: 0
; TotalNumVgprs: 32
; ScratchSize: 324
; MemoryBound: 0
; Function info: (GlobalISel)
; codeLenInByte = 292
; NumSgprs: 38
; NumVgprs: 32
; NumAgprs: 0
; TotalNumVgprs: 32
; ScratchSize: 324
; MemoryBound: 0
```
Using `llc -O3 -march=amdgcn -mcpu=gfx942 -print-after-all -mtriple amdgcn-amd-hmcsa --asm-verbose --asm-show-inst input_ir.txt -o seldag.s 2> seldag.mir` and `llc -O3 -march=amdgcn -mcpu=gfx942 -print-after-all -mtriple amdgcn-amd-hmcsa -global-isel --asm-verbose --asm-show-inst input_ir.txtl -o gisel.s 2> gisel.mir`, we can see from the final MIR that, for instance, to compute the value to be stored at `$vgpr12`:
SelectionDAG makes extensive use of `_e64` instructions
```
renamable $vgpr7 = V_MOV_B32_e32 0, implicit $exec
renamable $vgpr0 = V_AND_B32_e32 -2, killed $vgpr0, implicit $exec
renamable $vgpr2 = V_LSHRREV_B32_e32 2, $vgpr0, implicit $exec
$vgpr1 = V_MOV_B32_e32 $vgpr7, implicit $exec, implicit $exec
$vgpr5 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec
renamable $vgpr48 = V_SUB_CO_U32_e32 killed $sgpr12, killed $vgpr2, implicit-def $vcc, implicit $exec
renamable $vgpr6 = V_AND_B32_e32 1023, $vgpr31, implicit $exec
renamable $vgpr0_vgpr1 = V_LSHLREV_B64_e64 5, killed $vgpr0_vgpr1, implicit $exec
renamable $vgpr49 = V_SUBBREV_U32_e32 0, killed $vgpr5, implicit-def dead $vcc, implicit killed $vcc, implicit $exec
renamable $vgpr48_vgpr49 = nsw V_LSHLREV_B64_e64 7, killed $vgpr48_vgpr49, implicit $exec
renamable $vgpr0_vgpr1 = V_LSHL_ADD_U64_e64 killed $vgpr0_vgpr1, 0, $vgpr6_vgpr7, implicit $exec
renamable $vgpr48_vgpr49 = V_LSHL_ADD_U64_e64 killed $vgpr0_vgpr1, 0, killed $vgpr48_vgpr49, implicit $exec
SCRATCH_STORE_DWORDX2 killed renamable $vgpr48_vgpr49, killed renamable $vgpr12, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64) into %ir.i44.out, addrspace 5)
```
While GlobalISel does not and thus generates much more verbose code
```
renamable $vgpr8 = V_AND_B32_e32 1023, $vgpr31, implicit $exec
renamable $vgpr48 = V_ASHRREV_I32_e32 31, $vgpr8, implicit $exec
renamable $vgpr49 = V_XOR_B32_e32 $vgpr48, $vgpr8, implicit $exec
renamable $vgpr50 = V_ASHRREV_I32_e32 31, $vgpr49, implicit $exec
renamable $vgpr6 = V_LSHRREV_B32_e32 26, $vgpr50, implicit $exec
renamable $vgpr6 = V_ADD_U32_e32 $vgpr49, killed $vgpr6, implicit $exec
renamable $vgpr6 = V_ASHRREV_I32_e32 6, killed $vgpr6, implicit $exec
renamable $vgpr31 = V_BFE_U32_e64 killed $vgpr31, 10, 10, implicit $exec
renamable $vgpr6 = V_XOR_B32_e32 killed $vgpr6, $vgpr48, implicit $exec
renamable $vgpr5 = V_ASHRREV_I32_e32 31, $vgpr31, implicit $exec
renamable $vgpr7 = V_ASHRREV_I32_e32 31, $vgpr6, implicit $exec
renamable $vgpr33 = V_ADD_U32_e32 killed $vgpr7, killed $vgpr5, implicit $exec
renamable $vgpr5 = V_ASHRREV_I32_e32 31, $vgpr33, implicit $exec
renamable $vgpr6 = V_XOR_B32_e32 killed $vgpr6, $vgpr48, implicit $exec
renamable $vgpr32 = nuw V_ADD_U32_e32 killed $vgpr6, $vgpr31, implicit $exec
renamable $vgpr6 = V_SUB_CO_U32_e32 killed $vgpr32, $vgpr5, implicit-def $vcc, implicit $exec
renamable $vgpr6_vgpr7 = nsw V_LSHLREV_B64_e64 5, killed $vgpr6_vgpr7, implicit $exec
renamable $vgpr6 = V_ADD_CO_U32_e32 killed $vgpr6, $vgpr8, implicit-def $vcc, implicit $exec
renamable $vgpr32_vgpr33 = nsw V_LSHLREV_B64_e64 7, killed $vgpr32_vgpr33, implicit $exec
renamable $vgpr34 = V_ADD_CO_U32_e32 killed $vgpr6, killed $vgpr32, implicit-def $vcc, implicit $exec
renamable $vgpr5 = V_LSHRREV_B32_e32 27, $vgpr50, implicit $exec
renamable $vgpr5 = V_ADD_U32_e32 $vgpr49, killed $vgpr5, implicit $exec
renamable $vgpr5 = V_ASHRREV_I32_e32 5, killed $vgpr5, implicit $exec
renamable $vgpr5 = V_XOR_B32_e32 killed $vgpr5, $vgpr48, implicit $exec
renamable $vgpr36 = V_ASHRREV_I32_e32 31, $vgpr5, implicit $exec
renamable $vgpr7 = V_SUBB_U32_e32 killed $vgpr33, $vgpr36, implicit-def dead $vcc, implicit killed $vcc, implicit $exec
renamable $vgpr6_vgpr7 = nsw V_LSHLREV_B64_e64 5, killed $vgpr6_vgpr7, implicit $exec
renamable $vgpr7 = V_ADDC_U32_e32 killed $vgpr7, $vgpr48, implicit-def dead $vcc, implicit killed $vcc, implicit $exec
renamable $vgpr7 = V_ADDC_U32_e32 0, killed $vgpr7, implicit-def dead $vcc, implicit killed $vcc, implicit $exec
renamable $vgpr6_vgpr7 = V_ASHRREV_I64_e64 2, killed $vgpr6_vgpr7, implicit $exec
renamable $vgpr35 = V_XOR_B32_e32 killed $vgpr7, killed $vgpr5, implicit $exec
$vgpr33 = V_MOV_B32_e32 killed $sgpr1, implicit $exec, implicit $exec
renamable $vgpr33 = V_SUBB_U32_e32 killed $vgpr33, killed $vgpr35, implicit-def dead $vcc, implicit killed $vcc, implicit $exec
renamable $vgpr32_vgpr33 = nsw V_LSHLREV_B64_e64 7, killed $vgpr32_vgpr33, implicit $exec
renamable $vgpr35 = V_ADDC_U32_e32 killed $vgpr7, killed $vgpr33, implicit-def dead $vcc, implicit killed $vcc, implicit $exec
SCRATCH_STORE_DWORDX2 killed renamable $vgpr34_vgpr35, killed renamable $vgpr12, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64) into %ir.i44.out, addrspace 5)
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMWVtv4j4W_zTm5Sgo2LmQBx6glE6ldrqC6cy8RSYxxDtOgmKnl_30K5tbKAkQprv_SlUhic_P5_I7FxMqJV9mjA2QO0LuuENLleTFQL3P7b7td-Z5_D644y8sA5Uw4NmqVHA_BZ4BckfmMuRFV70p5I4R7idKrSQiQ4QnCE-WXCXlvBvlKcKTUrLCokrRKElZpiTCkwUXTH_2-iTwvZ6P8OQAEgcI38Dd_YwJ4BKWLGMFVTxbQpTHDEqpv6a5VOIdkGeHjGDk2cAzqYoyUjzPpAZ4TbhgMGOCmXvj4Z1Go3PBQOWQ0j8aikG-WIN4TgNIlEDBZCkUi7UD0jJKIM0LBlGermikjFbaeNv8efbmzx4CIiOYlJmBA54tckSGgHC_qpQ2d7NUAz2w7D4bvSsGiIwB9_D24fcynS1XhXYzkH7l7s_d3era4fbuTpEfuaKifv0sKqiKkhn_D1s_cLZPHlmaF--jvMziLdgpw-5EPqdCR-60WcEXNKsSOGQPnw3LkGcLEYH1RMBKaREliIxpGi-jDKw0WpWIjJeLt8DBANaq4Jmy6EJpwgsBVqoKvhIM1gIWTWMrSSNJwbKoTK0XVsxzyTZXMslfLc0-qOYCWDlIJmK67ErAiNxur1JeaLrSLP5f6bg0obS4ZKKFwkJrvNRCW4XXF2t9TUYxiGgGkjFYFHlqCsyCZ1TA4_0UVEKVXrXIC5OLNIuYvla5SbdSMSPwQkVp0njOQKq8YDFQBWYH52W5Knq6Iuxy8qAG6MSXwN4UyyR_OVsDDolRsIympoRsNvINn3-Gj08_wxHBuhaBMZOnK8EjrvRC9saiOmF7Izz8Pt4JW1hL_-FCsHi37lJAvAF8mH2bTm_3GhnMM2Bbz9UYtLW1VvIkmluDtrdNNqpzob1Of4M_ex6FN0_hc-0WvRqX4uoWVswW5kHUaE7N5l5N9Ho2JhVfk97FVAirzn-YfXsw8fMcTUpwazixFrjYU8HeUyMN_Vwl6yG0e-SbmNG4zkEVuVauc_phRalMvtbY7B8rthO73qvhcDwOnzdbNHrUrsTQC5u5f4l1rfdtZ7MubzfT4Y-bb-Hsx9P0Nhz_epqOf-9yoFm7yl5Hi9YpY-_-nUvQhaAqlFEBuuauRwFTls0Xz0E4AJ6pHBB2edHljtPNS1PnaRwXckUjpjkeHLfhX2aI248VEOdMQpYr0_pUUu7mQyYro9m2VZnR7MNQdmRs_y8SGaDOw1vATRm-34CuUba7tkHcUun30_RjVXb6V4K69iVqNhKvDtJr6j9eBdFt6kCnEE36fDA8OM4W7xroD-Z7fwdLtuVmNLldq3yU8WsH9-z9_5YqV2lQo-kBMy5lwyVkaJUG_iWIrTxLashwaH5N03A_3Qnka0SMrKe9rHw96RLv2vh552artRLVzG49VNXuG-7ZUz8a1IxDp7v0ucrSaJ7XVFuvto7gsMLli0efnVjL3ZyLrayL6-XWwpmMOuoI_rUdwW3XET4j_Wv4dg1scw1wr64BTU3soGK1UdavnBOacv5gMvI--7TwD9YEf8-tm1MdpjZUf217Uw7ValVzVPD_35Go0G4ThZqTdvsokPMJ067Pf5wfmn-NqO-PV4woZ9Pnw71PP3N_gd7jXphNde75ZFe0OyITJ9wH5QsfkTvxgMQBCWiHDXo-8XzftwnpJAMcM9fxfOL3XccNiBMvfGYH83jBPGdBYq_DB9jGrt3rkZ5jE5d0PRr0vV7sznFEqN8nyLFZSrnoCvGSdvNi2eFSlmzQw9i3g46gcyakeXuEccZewTxFGCN33CkGWsial0uJHFtwqeQeRnElzGun4eP47l_PyB0jd2Te9SB3_PGgn6FbjPo2CgK1f2HDsrxcJpAvwBC2-mttpyzE4MTLKK3F5sNaFfm_WaQQnhjdzQuptXEvA_zfAAAA__8Y6k0h">