<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58385>58385</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Fast ISel on AArch64 produces an invalid relocation/relaxation sequence
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chandlerc
</td>
</tr>
</table>
<pre>
When using `-O1`, fast isel, and sanitizers on ARM64 / macOS it seems that Clang 15 miscompiles Abseil's flag parsing code.
There is code to set a global variable to a specific value which looks like this:
```
adrp x10, __ZN4absl14flags_internal12_GLOBAL__N_115specified_flagsE@PAGE
add x8, x10, __ZN4absl14flags_internal12_GLOBAL__N_115specified_flagsE@PAGEOFF
str x20, [x8]
```
While superficially this looks correct, when linked (both with LLD and LD64 as far as I can tell) the instruction sequence becomes:
```
0x10078a25c <+2812>: adrp x10, 3749
0x10078a260 <+2816>: nop
0x10078a264 <+2820>: str x20, [x8, #0x9c0]
```
Because the `str` still uses `x8` as the base register rather than `x10`, the address is based on a stale value left over from somewhere else.
My assumption is that this sequence of relocations are intended to enable this linker relaxation and are supposed to use a single register in order to make the relaxation simple to apply. At least, that seems likely given that both LLD and LD64 don't do any validity checks and produce the same result.
Unsure what the best reproducer would be here as reducing this is tricky without disturbing the pattern that allows the relaxation to apply or the registers used. I have the IR input for the whole function from Abseil that produces it, although that's somewhat large. I'm trying some ideas for further minimizing it.
[parse.onefunction.ll.zip](https://github.com/llvm/llvm-project/files/9793287/parse.onefunction.ll.zip)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVV1v2zYU_TXyC1FDH5YtPfjB-XARIG2GdkOBvRiUdGVxoUiNpOK4v36HlJLGRVZgwAxDlMjL-3F4zmWlm_P2W0eKjVaoI4vW8YeHBM8ovWYtt44JS9J_cNUwy5Vw4jsZy7Riuy-f1isWpXvW8_rhKxOOWaLeMtdxx64lh78kZ72wte4HIcmyXWVJwN3GslbyIxu4CWFr3dAyim-ieDc9f-_IEGKHFeY0PDvG2VHqikv2xI3glQwLnNmBatGKGtNyJHbqRN0xqfWjZVI8wqgTNspmx7606R8-2fzjjRn8-JyEyg-HPz-veGVlsvJ52oNQjoziMkkPH-8frnb3h8PnQ5Lkc2xqDsHuNlrFv-0-3v7svAnjc-F9_08hHvb7yyjWmSlKGvxH-RXi5Tfvlj09v3U4FGbHgQzgE1zKcwBrBq_WxlDtvLOTZ4gU6pEaHHhRadexk8Dj_v4mMOP-BlTgOFVu_HDHaq6YI4mzLuETR6mQ31g7AeJY-nskVROrCMygXx5ODLjiTcHTvGZRdh2lV2mRpFF2i02vxzZDmm1W5Ts71_GPneuXnUoP75muXk2B4mw6A3uBq39Js_i5rONfY3xFNR8tBQywBF94wqWQEpKDJPAJf5jjNhhVHNaGjsKCDsxwzBmvKBUsk3jWpjcFrwxZ62XidzVelJCD4zjVSQuSWsf0Ezy0RvfMAu1TUBZJeym4T2ckYMd-CCckZhEHNrwel26RmNQ19zaWca9QkFY1CA0lkpo0GRjkuWK8OX8O5oElfgfoNmg77fDAIGF0APmmZqGYNo2vWqOzPE7YvfFkRT_M2h8GeV6ynUOh6FUTLvylDXnxg9FH8QTyhvnA2wvKNlqhGzmMmDt71EQj3JnVHdWQgLcbjG7GesrC8t6nYkfpLtD7Q9nR-NYTMPPERuc0NG817KRH2WCWBfBx0oaw4DtfQMvDbUT9eA6i0iPyARSjqSYLQp90vjlMVUCn-mR_RuUFDmA3L01wWo9ys4QkO_40VXH3BRgPiNLOtqdOA9B2VJM-A1emVj1FnOtAogFjLn2Sxy4shmY-EQuWkpsjIRhme9R09gX4RSYa8u0BAdvRBE73QolefPcW4hJNSMxfDLTUil6SWkq5_C4GL7a06JwbQtdI9_gfgdlYLdFK8CHl08vwAWn_FRrYvvW3D8ZyU2ZpscHbvwZIywVtk_U6LzZ5uckWzTZryqzkCyecpO3e34l3X0mGG3Bn6g4sesUHKhUqkOiNUhDtLXtnNS1GI7f_uRABjYZK8iIr8kW3zWgdt3FSlGVexOsq36yTJFvxJG_qdJM064XkFcS-BaZRmio6seAC74ByIbZpnKZJnORplgCaJV-lHHcOxfm6KNK2xGVDPRdy6fNYanNcmG1IqRqPFosSHLM_FtFCxFERhXDwz0cwxWxrtK9GkqkXIfg2JP8PBeu63A">