<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/145635>145635</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Miscompile with __arm_locally_streaming with -march=armv8-a+sme
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
efriedma-quic
</td>
</tr>
</table>
<pre>
Consider:
```
__arm_locally_streaming void f(int *p, int n) {
#pragma clang loop vectorize_width(4, scalable)
for (int i = 0; i < n; ++i) {
p[i]++;
}
}
```
Compile with `-march=armv8-a+sme`. The resulting assembly starts with:
```
sub sp, sp, #96
rdsvl x9, #1
lsr x9, x9, #3
str x9, [sp, #16]
mov x9, x0
bl __arm_get_current_vg
[...]
```
The bl corrupts x30.
Demo at https://godbolt.org/z/Ga9zaWEen
Workarounds:
- Use `-march=armv8-a+sve+sme` or similar
- Use -mno-omit-leaf-frame-pointer
CC @sdesmalen-arm @MacDue
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJx0U02PozgQ_TXFpQRyzEfgwCEkmz3NbVdzjAqoEO_amLUNPd2_fgWJMlGrO7LsUh71XPWei7xXw8hcQ95AfopoDjfrar46xb2h-L9ZdVFr-_f6aEevenaQHkBsqxCPJQ6XCzlz0bYjrd8vPjgmo8YBF6t6vIIs1RgQ5GECecQ1HkFWCPsGxAERZDo5Ggxhp2kcUFs74cJdsE598OVN9eEGsszWZN-RplYzyGrLvVqHD36FkJ5QQNps4RHHNQTZgGzU632IE-SNgvx0ByF91LE_rX3d95fuQByO1kxKM76pcEMoRGzIdTdIT-TMUsYEsvGGoRAJ4l83Rsd-1mGVgLxn0-p39IFc8BvDlxqin9u1NvSbSvcdZFoVj6LXn-v9ohHxV_VAdy-g9m477-Dzk3QjD68Y5M2Tf1esQvxmMXZ5ZREvUKvx7vTA4dLNzvEYLsuwNpI3SZLciT5Jt8rRauysc_MUPP5KRXJHTmwsUsBbCJNfNZFnkOfB9q3VIbFuAHn-AHn-k6oP-vkHj_e0n9b9S87OY--fQsb4t-fvjFn4aQ9ah14Zpck9s2Iz2tgaFWLNdI2vjgzHk1VjYPdw_4iQCd-zN6R5jMmZ9Y8f1J1mxqiv075KK4q43u1zUcp9WeTRrS64o1RUMrtmMm2rLCsFEXWcUV9eO8oiVUshc1HIXOQik3ki-x0J3ueUlVTmXQGZYENKJ1ovZlUkUt7PXO-yvEjzSFPL2m-zK-XIb7ihIOU6yq5ek-J2HjxkQisf_G-aoILm-ofy3evD_m6MN_DrJx_NTtefDFThNrdJZw3I83rj44gnZ__hLoA8b3V6kOdHI0st_w8AAP__8JJWWQ">