<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60375>60375</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang 16.0.0-rc1 regression: Illegal Instruction in `__init_libc` for musl on aarch64
</td>
</tr>
<tr>
<th>Labels</th>
<td>
bug,
backend:AArch64,
regression
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
andrewrk
</td>
</tr>
</table>
<pre>
When compiling musl libc with clang 15.0.7, the machine code looks like this:
```
000000000040befc <__init_libc>:
40befc: d10603ff sub sp, sp, #0x180
40bf00: a9174ff4 stp x20, x19, [sp, #0x170]
40bf04: aa0103f3 mov x19, x1
40bf08: aa0003f4 mov x20, x0
40bf0c: 9100c3e0 add x0, sp, #0x30
40bf10: 2a1f03e1 mov w1, wzr
40bf14: 52802602 mov w2, #0x130
40bf18: a9167bfd stp x29, x30, [sp, #0x160]
40bf1c: 94000ea9 bl 0x40f9c0 <memset>
40bf20: d00000c8 adrp x8, 0x425000 <Thread.LinuxThreadImpl.tls_thread_id+0x424ff8>
40bf24: f941a508 ldr x8, [x8, #0x348]
40bf28: f9000114 str x20, [x8]
40bf2c: f8408688 ldr x8, [x20], #0x8
```
With clang 16.0.0-rc1, the machine code looks like this:
```
000000000040be5c <__init_libc>:
40be5c: d105c3ff sub sp, sp, #0x170
40be60: d00000ca adrp x10, 0x425000 <Thread.LinuxThreadImpl.tls_thread_id+0x424ff8>
40be64: a9167bfd stp x29, x30, [sp, #0x160]
40be68: 52802608 mov w8, #0x130
40be6c: 9100c3e9 add x9, sp, #0x30
40be70: f9416d4a ldr x10, [x10, #0x2d8]
=>40be74: 19df0509 setp [x9]!, x8!, xzr
40be78: 19df4509 setm [x9]!, x8!, xzr
40be7c: 19df8509 sete [x9]!, x8!, xzr
40be80: f9000140 str x0, [x10]
40be84: f8408408 ldr x8, [x0], #0x8
40be88: b5ffffe8 cbnz x8, 0x40be84 <__init_libc+0x28>
```
At the `=>`, Illegal Instruction occurs. I have discovered this bug by running the zig behavior tests. I do not yet have a reduction that is limited to LLVM IR, but here are the steps to reproduce that I do have:
```
git clone https://github.com/ziglang/zig/
cd zig
git checkout llvm16
mkdir build
cd build
cmake .. -DCMAKE_PREFIX_PATH="$LLVM_16_PREFIX"
make install
stage3/bin/zig test ../test/behavior.zig -lc -target aarch64-linux-musl --test-cmd qemu-aarch64 --test-cmd-bin -I../test -femit-bin=test
```
Output:
```
$ stage3/bin/zig test ../test/behavior.zig -lc -target aarch64-linux-musl --test-cmd qemu-aarch64 --test-cmd-bin -I../test -femit-bin=test
error: the following test command crashed:
qemu-aarch64 ./test
$ qemu-aarch64 ./test
Illegal instruction (core dumped)
```
Observed with qemu-aarch64 version 7.1.0. I have also observed Illegal Instruction occurring on real aarch64 hardware.
I will attempt to work on reduction steps for this bug report that involve only C code or LLVM IR, but this is what information I have so far.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMV0tv4zgS_jXypWChRD0sHXxIJx1ssD3YwWCwszeDIksW15TopSg73b9-QcpWZCPJPtCHEQKFIvV9xXp8JZoPg9r3RNso_xLlTys-utbYLe-lpbM9rGojv2__aKkHYbqj0qrfQzcOGrSqBZyVa0Fo3u8hyWOMNxF7BNcSdFy0qicQRhJoYw4DaHUgcK0aovQhwqcIr_cCL3_hEecrw5oaAVH6uNupXrmdNxmlX2c8wPRKlD6ATLDAtGkgwmoYa38_-s1M94il-JqUuMA1iB7Hq2STNU0G_vIod4ywemXoYa9JFdD5lyXNBqP86YYpC0wcE0yb9MrUmZNnmihekxtAeQEgpk22ePli9nafwb8qQRQp4ZWdS-kBeOdjegNNgouMJw2mlNxu7Jx40PmHvQEET3JWIiuQ3QHYWwhmMwFUXgJZbOpG3gdycj_FdwJZ3AcymVzNEJF45VlqHWGFrxk2lUBfCh11AzlfBQscC37KUDWifAuRDVsovUV8zViOGDh-by1xGX9T_fg6jV-6o46dHnYuPO6UjNgXD8maprw3FmLUVFnCcyy9IS3tbCfKv1wGIR1ZeeciKyc0IibJoursW_onihkWUCEwTZlhWZSzg_d2WYjn1Xb5rrym-x8L3RYxxri2IvnZ2s3_s3bzq3Zz4bV7jcYH-t0si5uKZdL5fdIT_KlZpyK7KfL_r8CpKBf6Ku_0Vb6vLyqWDaC6awDVZw2ANnit1UJmfFEzyVxpl5HHMvlWdlH6FKVfA0fwPKlkgznO5gcK7nuGKlRdKB9fi9Pgpq_QprxyZLcc3f_AIa4cpeeY8PTf40t8U16Gd8pbhmOpPCqzWXkZfqi894R3sRo8r_OmaRoK3ULU_Y9lWwpG7pXi65C91eC7In5wQa5-NiTLD9gjvGhNe67hpR-cHYVTpgcjxGiHGF6g5ScCqQZhTmRJBlFDPe6h_g527Hv_ffesP9Qeamr5SRkLjgYX0NJAbxx8JzcRcbAkLzZcyx0o3ys65TyzgW_f_v4LvPzmd1WPDlqyBNxSMDA4Og7-JUtHa-QoaGIIRjz5561mrxwIbXqC1rlj6EvsOWLPe-XasY6F6SL2_EPtfY-bRn49QIX03i1oWhIHMzrQ-tQlxbTQHaSyUI9Kyxm1fOr4gSCOYf30-MvDX7_ufv3t6_PLP3a_Pvz-F58NxiKWefd3SXFZ83MTtYeqfnBc62lmcHxPacSea9VPmw0hhziO2LMf-aVLMmK_utYC1o7bPTng3Iq2yNbaN7Z1OJut1x60Fp2Ef1E3ri-vLObXteoB1i-zBVg31Cnn56P0Kdj8uPL-Nrrj6D5PUMQy-BP7RdYa66Xpa7ExWptzKH0PEabreC9BWD60JGc_b2zOLszefrJ81aRaaDJipTCWQI7dkWTEqs8CXg9kTySnA_eNoRPZwdNt4iTGWeFcDwbMFfVhS7DeZ9ODJa6vAYeWW3nmluLlDl7grLQG7hx1R-d1ezb2MGGvHWCSdOMbxrWrWDoa6y69oT8ZfSIwvf4Oj9Pxwtj7JhGgaoDzBGmM7Xhgv3g2GGi4jVdym8oqrfiKtkmxyTHHvMBVuy1Enm3yRmLDcqQ0F3lTF3WT102VZpQkK7VlyFJMUsQ0qxjGuUxEwapalElSpU0dZUgdVzr2_SA2dr9SwzDStsB0k680r0kP4ecSY_W4D1J_9GMuDtT7anl4CIGcVyztLQ0-S34qf1rZrade1-N-iDLUynfX2ZhTTtP2_nAGC5L04d2Mqt5_C5ZfkQJDNoJ2TH9N8Gq0evtJ1_Q7ufxbH635Jwmv0xCDIWLPIQz_DgAA__8T3QNs">