<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/123212>123212</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AMDGPU][GISel] Missing (or not running) combine for `sra workitem.id.xx, 31`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
qcolombet
</td>
</tr>
</table>
<pre>
In the AMDGPU backend, GISel ends up with additional instructions because we are missing some simplification that could take advantage of the range of the `workitem.id.xx` values.
I am somewhat surprised because I see that the AMDGPU backend implements the `TargetLowering::computeKnownBitsForTargetInstr` method and has some logic to propagate the known bits for these intrinsics.
Bottom line, I haven't dug into why the simplification doesn't happen, that may be an easy fix.
Anyhow, the issue at hand is that `sra workitem.id.xx, 31` could be simplified in `shl workitem.id.xx, 31` and then further simplified in a plain `0`.
# To Reproduce #
Download the attached reproducer or copy/paste the LLVM IR at the end of this issue.
[repro.ll.txt](https://github.com/user-attachments/files/18441382/repro.ll.txt)
Then run:
```bash
llc -O3 -march=amdgcn -mcpu=gfx942 -mtriple amdgcn-amd-hmcsa -global-isel=<0|1> reduced.ll -o -
```
# Result #
With GISel we have a `sra` and `xor` in the final assembly, whereas they could be eliminated.
With GISel:
```asm
s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
v_and_b32_e32 v2, 0x3ff, v31
v_ashrrev_i32_e32 v3, 31, v2
v_xor_b32_e32 v2, v3, v2
flat_store_dword v[0:1], v2
s_waitcnt vmcnt(0) lgkmcnt(0)
s_setpc_b64 s[30:31]
```
With SDISel:
```asm
s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
v_and_b32_e32 v2, 0x3ff, v31
flat_store_dword v[0:1], v2
s_waitcnt vmcnt(0) lgkmcnt(0)
s_setpc_b64 s[30:31]
```
# Note #
Input LLVM IR:
```llvm
target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-p9:192:256:256:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9"
target triple = "amdgcn-amd-amdhsa"
declare noundef i32 @llvm.amdgcn.workgroup.id.x()
define dso_local void @foo.bb.split(ptr %out) {
newFuncRoot:
%i = tail call i32 @llvm.amdgcn.workitem.id.x()
%.lobit = ashr i32 %i, 31
%i32 = xor i32 %.lobit, %i
store i32 %i32, ptr %out
ret void
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVk-T464R_TT40iWXBJZsH3zQjOOtqewmqdlNcnQh0ZLIIFAAyfa3T4H87zeb_V23yiUZ8fp196Np4M7JViPuSP5C8v2Cj74zdvff2ijTV-gXlRGX3ZsG3yGU3_Zf_vFPqHj9gVoQ-gpf3r6jAtTCwTjASfoOuBDSS6O5Aqmdt2MdRg4qrPnoEE4I3CL00jmpW3CmR3CyH5RsZM0DFnzHPdRmVAI8_0DgYuLa8xbBNDEQy_VjQIr0ZOyH9NgvpViez6RIYeJqRLckaUnS8g14Hx2dArEb7WClQ3EP6Q0c4uz15zQhxIY9au9u7n5w26L_ak5opW4JKwkra9MPo8e_anPSL9K7g7Ez7C2IEELq0XdGANcCOu7mxJVpZQ3ewGDNwFvuMfr4CCxQSe-gMTZ8cghSeyu1k3VM68V4b3pQUmNYiDfo-ISa0LUHMbYBbODUXSLdJ3mFQTcjOz4Mweh1Tr7nF6gQuAbk7gKNPF8FLPWlM6cZhyCdGxF4MA_yuNmYFKmzHD4tBX0FloXs5-WsHsGgAKmjVad-aRUc-A41NKP1HdpP1hwGxWeWlBTpNVpCGfww8I6DNWKsEQhl88zenLQyPHIC957XHQqwN6AFY6E2w4XQw8DddTG-fv3XN3h7h2t1hJKIlSfdrET0mr9ElqVSS3_2JN8Tuum8H1yoDnog9NBK343VsjY9oYfRoU3mAGJlEXpopMLwzjarVcY2lNDDHyjplqTlj6CFHXVgTUtSpPOv4q4jaalUDcnfGSQ9t3VH2J73oq01JH09jITt2-a8XVGApPdWDgphnk94L5Kurx2HpFWm4iqRDhVhe8JeU7J-zQj7C1gMEomlUpAYSODZ_0P3d3Sj8g_F_x1awtwlThhrFPi1VG7rS4r0bOIOkXObaWRoHtw57Ct1CcVw6tAij_vv8qgkVLKXmnsUy8_OPunDXR8RW3c8celr7WHqa-0J3aSEbgHPw9NItR9Pk7PhdORaHCtGj8goTDRElZ5Z04Q_E8vuKNdZi9NR3pDsWswBRm-os7GfuGbcDdEo7o_OG4tHcTJWwETyl5SwMouV9QD-Ip__l4E7OvRDfayKFTiSv7DAxyLhTysZhfy-_41K_m4FQi3_zfhb73jTw-hvneCTJEpNQRMfuz0I7rniFzN6IGwPhFJMBsLKYhUfyZA9D2iIYH4kA3serJ5h-fNM8TxYB0mKkAjNi_szzGzCDL0-k2Eb_mzpz0B58zJlRSRLJrqap6abm2m1uWK2xZVwupMl050xmfIsfM0zmkxZGnnCK5loGinCK9GRtlgl3xlNyjz5kiVaElaGXAJoSyh9CHptVVcxnzoW70Xn-IwlaSmwVuFioc2oBTYgGQWyiquznK2W4ZRprRmHeMwQurmVRimwkRpBOHNUpuYKJiNFMG-MWVbV0g1KhmIavAVCczOGfgxk_ULSUuPpMOr63Rg_VwYEiIwRey4V1FypX4VzP_Tu0QTjpTKVnAsoNJTZmOby2ktuLsJXtoezuSNmwwCL8ACMm-jOwOJ-e0ojQCz6mHDQYv2HzbAQOya2bMsXuMvWbJ2yLSuyRbersNpQXq3WW1GshKBFtV0VlGe82WSpoJuF3NGU5mmWFdkqL9Js2RRpxprNOqtWqci3SFYp9lyqZZTE2HYRT9NdRhnN6ELxCpW7XUvtLqCSamxdEFE67x52XnoVL7DzxS3s5_xlPgbyPXy7XjQJ3RgL2vhwfupwb6NbqE1fhYUPt6w_v8AsRqt2f3Kixy4wv5LBmv9g7Qk9xJTiqT5nNe3o_wIAAP__ou5zQg">