<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/143215>143215</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISCV] missed optimization: use sh or sw when can infer the offset from alignment
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
BaoshanPang
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/YP9WP9rET
For the C code:
```
typedef struct {
char a;
char b;
char c;
int len;
char e;
int len2;
} __attribute__((packed)) str_t;
void foo(str_t *p __attribute__((aligned(4)))) {
p->len = 0;
p->len2 = 0;
}
```
The asm generated is:
```
foo:
sb zero, 3(a0)
sb zero, 4(a0)
sb zero, 5(a0)
sb zero, 6(a0)
sb zero, 8(a0)
sb zero, 9(a0)
sb zero, 10(a0)
sb zero, 11(a0)
ret
```
For 'len', the middle two 'sb' can be converted to one 'sh'; for 'len2', the four sb can be converted to one 'sw'.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVE2P4zYM_TX0hZhAob_igw_OZA30NmgXLXoKZIuO1dpWIMkJdn59ISfbZDLTIkEAgXyPD080RemcPkzMJaRbSHeRnH1vbLmVxvVyepPTIWqM-lH23h8dxBVQDVQfjGrM4FfGHoDqd6D6z7fij7fCfvsOogJR1cai7xlfsTWKQ52oIBPXv6j8jyMr7tB5O7ceId-CqBAR215alBB_iJuHuL3FevI48PRA4E8EumQg3-F-L723upk97_dAG6DNUbZ_swIqgIrgae-vdFGdjFbYGQO0WQAEqo5facghNFIBbZKL0FXudrfjC8TfBp4Q4h2Km8WfeboHIN899AxE9b1nlG7EA09spWeF2l2b-5EbDC95vP5ccznf2RqgV4yDYxEs_jcneYKTfs35CWdPSGye4BT3nEdwLZ5QWK_vSZb95-6GoQXKwzhRHmrCBI9aqYHRn03AXAOUYysnbBhbM53Yhq_gDZqJF0IfauMtdv-K0Z1aZ2YbrP2fwhkoX0WqjFURFzLicp0nBaUiEVnUl20sskJJpbo8T5supTRmytKka9ftpshFpEsSlIpMZERpTNmqlTGliRKkUpE33EIieJR6WA3DaQxPONLOzVyuk5jWaTTIhge37AOiic-4oEAU1oMtQ9FLMx8cJGLQzrubjNd-WBbJr7_89vo7pDsctXOs0By9HvW79NpMEFc4O0bXo7HoznjueVr6oaeOL1vDdJ1jj501Iy7PauTJR7MdHteQ9v3crFozAtXBxvV4OVrzF7ceqF7MO6D6ertTSf8EAAD___UfY2k">