<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/56742>56742</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
X86: Minor regression from llvm 14 with single array access and lea
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
SuperCoder7979
</td>
</tr>
</table>
<pre>
## Description
When arrays are accessed once in a function, llvm14 produces a mov instruction that references the array in memory. However, trunk produces a lea that moves the array into a register, then performs the mov. This change makes sense when the array is accessed multiple times as it removes the extraneous memory reference, but it adds an additional unneeded instruction when there is only a single access of the array.
## Code
Compiling with: `-O3`
Godbolt: https://godbolt.org/z/W4saM9fha
```cpp
constexpr const static int array[5] = {1, 2, 3, 4, 5};
int get(int a) {
return array[a];
}
int get2(int a, int b) {
return array[a] + array[b];
}
```
<details>
<summary>trunk codegen</summary>
<pre>
get(int): # @get(int)
movsxd rax, edi
lea rcx, [rip + array]
mov eax, dword ptr [rcx + 4*rax]
ret
get2(int, int): # @get2(int, int)
movsxd rcx, edi
lea rdx, [rip + array]
movsxd rax, esi
mov eax, dword ptr [rdx + 4*rax]
add eax, dword ptr [rdx + 4*rcx]
ret
</pre>
</details>
<details>
<summary>llvm 14 codegen</summary>
<pre>
get(int):
movsxd rax, edi
mov eax, dword ptr [4*rax + array]
ret
get2(int, int):
movsxd rcx, edi
movsxd rax, esi
mov eax, dword ptr [4*rax + array]
add eax, dword ptr [4*rcx + array]
ret
</pre>
</details>
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVkGPmzoQ_jVwsRqBCSQ5cNhNXttL9Q6t1F6NPYBfwUa22STv13cMCSS7qySrIrCNx_N55pvBQ6HFMQ9ogjfZgeVGdk5qFUS7IHr6WYMizBh2tNgBYZyDtSCIVhyIRBkpe8UHBbolTfPSxkvSGS16XIjSVr_gMutMPywirmaOGCjBgPIrXA0jvgdrodXmuCBf9R5ewHhEVFS_LwEbYCMIIr_SdxrlBipp3UnZW9-BKbVpx6WotCA_amkJr5mqcIL9RhQLygLZ--UXgHZ2t-0bJ7sGiJOtN8MS6d2YbYCDM0yB7u3Ji9lJb0nRO6_BhEBl5Xvp6WAN6ZUCELjFJUtnS5BxtEKr5oieWamq5hwCosvZ1MUYrFM7hnKrBYwTW912skFlspeuDpInEmTRp38TbMcFX7QodOO8pHauszgI6Ge8q1Gw0KbCt__x-bm07NumrNnVjgg03Lzrxhmu0Rk4dIYMI2Idc5L7EI0GB-lzGqQ7EiT4rJ5jTxH1TeKbpW_SYLULkufLfbx6BS6g6wEooBuvPMoIXgZcb9S0A8MdZgREewtFZ6ztYF3xCCgJ6PM0Uby_y5mSK56SrQDHZIMM_zNN2b5tmTni1JjrHANXgUIJ8j0Lp_Wdgel1YgPN9uG7c_m8CJbRldbkqL8wn-1BoNPs4BkBIa_l_uMbSOGDHN3H0-KSjt0bvKGHEU_stRGkc2bQ5IdBE6P95Pd7rYvET07Ss71DlB5xdnb1re77LvM7LouHXb6i0MoPUCJuU4LHxmO6_AadY2JdZtE4805q3sxWf9YTPOz_Il8_lny3mDsxdiMu99LpY1nxN1G-b-utOJ_i-4in9yMdQh5n6XqdbdI4DUWeiE2yYaGTroH81zrzn9k3qbTxZdVg2fHFqTS6Jefo-5IyVaahbJ7qE1PCfzthb5r8VVVBlb5YcN3ii8c5dZ-wyv8HHOPxWVrbg8VBmq2WNKzz5RoSxjcxTbJEZFRkZcx4ysq4EHyZ8DJsWAGNzZGggFIFezJA4BjpCWVOI0qjFc1oHKXxcpFG66IooyhN0yKLygxPCmiRk4W3w5e70OSDSUVfWRQ2-EthZyFDIios28N2iM96V2uTf-_xX8PXXbParDbhYEE-ePAHe7y7Lg">