<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">