<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/82691>82691</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
RISC-V, clang, optimization: address calculation subtracts and adds the same value
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Febbe
</td>
</tr>
</table>
<pre>
Having the code:
```
template<class To>
constexpr To copy_from_alligned_addr(uintptr_t src_addr) {
return std::bit_cast<To>(*reinterpret_cast<To*>(src_addr)); // Relies on UB check binary output! clang and gnu may differ
}
constexpr void* builtin_stack_address(void* local = nullptr) noexcept { // Missing in clang :/
auto sp = std::bit_cast<uintptr_t>(&local); // Relies on UB check binary output! clang and gnu may differ
sp = sp - 12;
return std::bit_cast<void*>(sp);
}
static uintptr_t base = 0x50000; // Prevent consecutive calls of hack_me, to read unchanged values from the cache.
extern "C" void hack_me() noexcept {
auto mybase = base;
base += 0x100;
auto active_ptr = mybase;
if (!copy_from_alligned_addr<bool>(active_ptr)) return;
auto offset_addr = mybase + REGISTER_SIZE;
auto data_addr = mybase + 2 * REGISTER_SIZE;
auto sp_addr = std::bit_cast<uintptr_t>(builtin_stack_address());
auto ra_p = uintptr_t(intptr_t(sp_addr) + copy_from_alligned_addr<intptr_t>(offset_addr));
auto data = copy_from_alligned_addr<void*>(data_addr);
*reinterpret_cast<void**>(ra_p) = data; // UB, since no compiler object is created @ra_p, optimisation to prevent 4-8 sb writes, assumes same alignment
}
```
produces
```
00000148 <hack_me>:
148: ff010113 add sp,sp,-16
14c: 000205b7 lui a1,0x20
150: 0005a503 lw a0,0(a1) # 20000 <_ZL4base>
154: 10050613 add a2,a0,256
158: 00c5a023 sw a2,0(a1)
15c: 00054583 lbu a1,0(a0)
160: 0015f593 and a1,a1,1
164: 00058c63 beqz a1,17c <hack_me+0x34>
168: 00452583 lw a1,4(a0)
16c: 00852503 lw a0,8(a0)
170: 00c10613 add a2,sp,12
174: 00b605b3 add a1,a2,a1
178: fea5aa23 sw a0,-12(a1)
17c: 01010113 add sp,sp,16
180: 00008067 ret
```
At address `0x170` `12` is added to `sp` and stored in a2
It is subtracted in `0x178` again.
A whole instruction could be saved here:
`170: 00c10613 add a2,sp,a1`
I assume this can happen more often in many other cases.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV01zG6kW_TVoc8sumv5Qe6GFJFvvueq9qiknmUU2KhquJCYIeoB27Pz6KegPyZKdZDEpVactOJdzzuVeEPde7Q3igpQrUt7PeBcO1i022DQ4a6x8XfyXPyuzh3BAEFYiyZeE3hM6Pis6fNKfAY-t5gFJvhaaew-fLckf-jFhjQ_40jr4bEHY9nW7c_a45VpHBnLLpXSE1Z0yoQ1uG8A7MXx5B2S-6qMAADgMnTPgg4xs8mWjwlZwH0i-7tdjNWFLh8oEdK3D81G27CecBY-ffAWEbQjbwBNqhR6sgS8rEAcU36BRhrtXsF1ou0BYBkJzswduJOxNB0f-ClLtdugGT-b35xaddD9bJQlbQtMpHZTZ-sDFt8QCvSesHse1FVwDye_BdFq3ITlgLL4IbEO0YuT6f-V9TI4yA6XoB9ucnOJdsODbFOs9uyazR9eqtPbgyL9nSeQy0mjhBjJG8t9L6ODJkLS2Z_auzz7woASc9k_DPaYl6UtJKaVnSf7D4TOaADE3KLqgnhEE19qD3cEhZuWIhK0hWHDIJXRGHLjZo4Rnrjv0ELduXxNcHPC2Z4AvAZ0BwtiaMJbSfQpWXybxJP8iX8fXiXl8eeNUP8JWvawsibqAcxHlbNvgUog-WtI-zVM7SISyj8owXzfW6t70U7y-VoZsvVn4goLd7TyGFOqMQ-QNTw__efz0-eFp--nx68M1eckDfxfHIFbGL9C-PWF_Y7t_VIdTT7gI7_i238OnOKw-ex2WT_2KrT7scfn6LY0ztz5aOdqSVv445ptCmWx8E-39pjgCR2xUmSTk92nds7L5sopF4ZURCCY28WOrNDqwzV8oAigPwiEPKIEUtI-zBtsGdVSeB2VNLKh2qL3ipgbfwHenAvo4kXvfHdGD50cEHtUd47zLYn974vTP1lnZCfTwk7MptgCaFTWQfD1WZf4wnWeQFTXJl7Db0YxmWQ4X_7iU0LcxwtbpcZNVE1REKACllNGymYPuVI_KCFvTF0bHmSWdZpa8pFfL6O_DcjQCY_ll_X7KgUUBkf326_-KvqgfprBFHzajtKTVx-w5I2ydYrNyYl8m4ZSKklN2BfUjI3bOaMKelJdFWeegm-5MeZxOz6ZXk_ys3JV31zyNPKHTI5ugRc-SlrWoroAN_v1jAmZzcZ5ltqIveXHmVlWPLIqSJdKjxogurkhPGuuSvZ-zZGl9CZxPakX2y6ykPZWxCTvIbSpaNh8jk0-sN2tEDup2yEvOWX7KIE27ll3mcD7qy3536592fn3az7Sm1fwS6zD8pG6XAYa2C6Si9CU6VtH4nrH4onwcRxn7Bqmob-OXcY_4YB3KePHhg2OPqf_4rgmOi9CPDTHrhNpzZW6HBrGE7werEZTxwXUitSZhOy2hQfD8GSUc0L1z2b1O6XUOeXah8nFobRAOsUVyAwfetmjgaB2C3QU0ke2Rm1ew4YAOBPfob2dykcu7_I7PcJHNaV3l86woZ4dFlc9LVmNec0Qqy0pQSbNCFEXOWEmxnqkFo6ygjDGWsbIob3eyqXdVdkfLAiXNkRQUj1zpW62fj7fW7WfK-w4XNavuspnmDWqffhMwlm52hLH488At4vybptt7UlCtfPCnCEEFjYunx0_rmz9jPx-A4wnwI50A0b0x5YJr0en-YBgT51N6uZQ-Xa_SWZDuXLPO6cUhhNYPl1y22atw6JpbYY-EbSKN4b-b1tl4IBG2Sao8YZsk7J8AAAD__9ZXoSY">