<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/66318>66318</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
AArch64 loads right shifted index generated redundant code
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
linzj
</td>
</tr>
</table>
<pre>
Sample C++ code:
```c++
extern void* bar();
void* get(unsigned* tag, void** array) {
unsigned class_id = tag[0] >> 12;
// if (class_id > 0x40000)
// return bar();
unsigned base = (0x7a8U + (0x9U << 16U)) >> 3;
return array[base + class_id];
}
```
Generates asm:
```asm
ldr w9, [x0]
mov w8, #1960 // =0x7a8
movk w8, #9, lsl #16
lsr x9, x9, #9
and x9, x9, #0x7ffff8
add x9, x9, x1
ldr x0, [x9, x8]
ret
```
I think `and x9, x9, #0x7ffff8` is redundant, and needs to be removed.
like the following:
```asm
ldr w8, [x0]
mov w9, #8437 // =0x20f5
movk w9, #1, lsl #16
add x8, x9, x8, lsr #12
ldr x0, [x1, x8, lsl #3]
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVNFuozoQ_ZrhZbSVsYHAAw9N01zd56s-Xxk8gLcOVLbTsvfrr2ygYbvdShtFRPE5M3PmnMTSOd2PRDXkR8hPibz6YbK10eN_35NmUj_qf-TlxRA-AD8CP2I7KQJxD-wEbHsWbHm3C2c5pdmTHfF10gr4PTbSAi-BVyBWwob05IGX1zEKiSde9sAfttJwIq2VP4BXCIe1GnGrwNZI5_7VCkGcYm1-ZJCfEMQjiEdM-ftIROBn4GfUHQIvd4WPyOaMMcaCwp-5iJb81Y6frHDT0EhHcT7wks0HWT5hcCt-q54QxAOIB0yLp1Ae9li0iZ20dcqyan5cOgbHV5WQn97ZcDh98H4fyF80kpWeHEp3-V1YAVrPK6MssOqtCq5DfpyDfe_gZXoNYBlBLtKqYPj5azUMxClasO_wvG8R5xhnYrvipsIFFXNEl2fkbrAc1a8wmw9d13W3WVJ9ZM3phz1ntu254OV-W0v-C2f_Rj_o8RmDf1_KKRhqh5bUdVRy9AGWo8KRSDn0EzaEli7TK6m7fX-jnwn9QNhNxkxveuz_IL7yq_g2hWUmDj8FxVmX_5LUxk4_T2o1udyZXC5MG5n8t46ne3JsK25it90SVQtViUomVKdFlRV5VRVFMtRVK7jgglLiopGF6rhoSeXUUidkJmSia864YFWaMZ7zrLhriq5IZamqSlGTNy1kjC5SmztjXi93k-0T7dyV6qIQaZkY2ZBx8S7kfKQ3jCBwHq5GW4eab821d5Axo513ty5ee0P1_b1thyJDM0nl0Op-8OgG3XlSqEdFM_brX1PdfhvxSk2u1tSD9y8uBB7j6bUfrs1dO12An8Og9ePbi52-U-uBn6M8B_wc5f8fAAD__wQSjkM">