<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/114283>114283</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Unaligned accesses on MIPS
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
purplesyringa
</td>
</tr>
</table>
<pre>
LLVM occasionally emits unaligned `lw` calls on 32-bit MIPS. This leads to `SIGBUS` in all sorts of programs. Unaligned access is sometimes emulated by the Linux kernel, but it's opt-in and inefficient, so better not do that.
I'm having trouble reproducing this in C, because this bug only seems to be triggered on complex code. I have a Rust reproducer though:
```rust
use core::mem::ManuallyDrop;
fn noop() {}
fn meow_new<E>(cause: E) -> ManuallyDrop<E> {
noop();
ManuallyDrop::new(cause)
}
#[repr(packed)]
struct Unaligned(i32);
fn main() {
meow_new(Unaligned(123i32));
}
```
```
$ rustc -Vv
rustc 1.84.0-nightly (439284741 2024-10-21)
binary: rustc
commit-hash: 4392847410ddd67f6734dd9845f9742ff9e85c83
commit-date: 2024-10-21
host: x86_64-unknown-linux-gnu
release: 1.84.0-nightly
LLVM version: 19.1.1
$ cross run --target mips-unknown-linux-gnu -Zbuild-std
```
...and the relevant LLVM IR:
[llvm-ir.txt](https://github.com/user-attachments/files/17577199/llvm-ir.txt)
The function `meow_new` is compiled to:
<details><summary>Disassembly</summary>
```asm
000a7fb8 <_ZN7garbage8meow_new17he7e271863f5ba90fE>:
a7fb8: 3c020023 lui v0,0x23
a7fbc: 24421098 addiu v0,v0,4248
a7fc0: 27bdffb0 addiu sp,sp,-80
a7fc4: afbf004c sw ra,76(sp)
a7fc8: 00590821 addu at,v0,t9
a7fcc: afa10018 sw at,24(sp)
a7fd0: afa40020 sw a0,32(sp)
a7fd4: 8fa20020 lw v0,32(sp)
a7fd8: afa2001c sw v0,28(sp)
a7fdc: 24020000 li v0,0
a7fe0: a3a0002f sb zero,47(sp)
a7fe4: 24020001 li v0,1
a7fe8: a3a2002f sb v0,47(sp)
a7fec: 8c218038 lw at,-32712(at)
a7ff0: 24397fb0 addiu t9,at,32688
a7ff4: 0411ffee bal a7fb0 <_ZN7garbage4noop17h890d2a6d84bbb6fdE>
a7ff8: 00000000 nop
a7ffc: 1000000b b a802c <_ZN7garbage8meow_new17he7e271863f5ba90fE+0x74>
a8000: 00000000 nop
a8004: 93a1002f lbu at,47(sp)
a8008: 30210001 andi at,at,0x1
a800c: 1c20003c bgtz at,a8100 <_ZN7garbage8meow_new17he7e271863f5ba90fE+0x148>
a8010: 00000000 nop
a8014: 10000035 b a80ec <_ZN7garbage8meow_new17he7e271863f5ba90fE+0x134>
a8018: 00000000 nop
a801c: afa40030 sw a0,48(sp)
a8020: afa50034 sw a1,52(sp)
a8024: 1000fff7 b a8004 <_ZN7garbage8meow_new17he7e271863f5ba90fE+0x4c>
a8028: 00000000 nop
a802c: 8fa10018 lw at,24(sp)
a8030: 24020000 li v0,0
a8034: a3a0002f sb zero,47(sp)
a8038: 27a4002b addiu a0,sp,43
a803c: 27a5001c addiu a1,sp,28
a8040: 24060004 li a2,4
a8044: 8c39dd78 lw t9,-8840(at)
a8048: 0320f809 jalr t9
a804c: 00000000 nop
a8050: 8fa10018 lw at,24(sp)
a8054: 27a40038 addiu a0,sp,56
a8058: 27a5002b addiu a1,sp,43
a805c: 24060004 li a2,4
a8060: 8c39dd78 lw t9,-8840(at)
a8064: 0320f809 jalr t9
a8068: 00000000 nop
a806c: 8fa10018 lw at,24(sp)
a8070: 8fa20038 lw v0,56(sp)
a8074: afa20044 sw v0,68(sp)
a8078: 27a40040 addiu a0,sp,64
a807c: 27a50044 addiu a1,sp,68
a8080: 24060004 li a2,4
a8084: 8c39dd78 lw t9,-8840(at)
a8088: 0320f809 jalr t9
a808c: 00000000 nop
a8090: 8fa10018 lw at,24(sp)
a8094: 27a40048 addiu a0,sp,72
a8098: 27a50040 addiu a1,sp,64
a809c: 24060004 li a2,4
a80a0: 8c39dd78 lw t9,-8840(at)
a80a4: 0320f809 jalr t9
a80a8: 00000000 nop
a80ac: 8fa10048 lw at,72(sp)
a80b0: afa10014 sw at,20(sp)
a80b4: 8fa10018 lw at,24(sp)
a80b8: 8fa20014 lw v0,20(sp)
a80bc: afa2003c sw v0,60(sp)
a80c0: 27a40027 addiu a0,sp,39
a80c4: 27a5003c addiu a1,sp,60
a80c8: 24060004 li a2,4
a80cc: 8c39dd78 lw t9,-8840(at)
a80d0: 0320f809 jalr t9
a80d4: 00000000 nop
a80d8: 8fa20027 lw v0,39(sp)
a80dc: 8fbf004c lw ra,76(sp)
a80e0: 27bd0050 addiu sp,sp,80
a80e4: 03e00008 jr ra
a80e8: 00000000 nop
a80ec: 8fbc0018 lw gp,24(sp)
a80f0: 8fa40030 lw a0,48(sp)
a80f4: 8f99dd20 lw t9,-8928(gp)
a80f8: 0320f809 jalr t9
a80fc: 00000000 nop
a8100: 1000fffa b a80ec <_ZN7garbage8meow_new17he7e271863f5ba90fE+0x134>
a8104: 00000000 nop
```
</details>
The relevant part is this instruction:
```asm
a80d8: 8fa20027 lw v0,39(sp)
```
`sp` is aligned at this point, so this access triggers an unaligned read.
I understand this isn't a lot of helpful information, but I'm not sure what else I can provide on this bug, so please ask if you need anything for debugging.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysWUuPo7gW_jXU5iiRXwSzyKIrVXVVUvfVaHpmFrNpGWyIuwFH2NRjfv2VTUKAUKnqvoNaVMf48znnOw-_hLW6bJTaRvFtFN_diM7tTbs9dO2hUva11U0pbjIjX7efP__1BUyeC6tNI6rqFVStnYWuEZUfQkK0QdVztEGQi6qyYBqgZJVpB18ef_u6hj_22kKlhLTgjO_89fE_t39-9QDdgKgqsKZ1FkwBh9aUrajtGv4cRhd5rqwFbcGaWjldKwuq7irhlITsFdxewWfddC_wQ7WNqiKyg6xzoF1EEgvm4FZeTCNBN6oodK5V43wnayBTzqkWGuNAGnB74dYRuovQp_79GJGkhr140k0JrjVdVilo1aE1sstDmzdNN7ALQlUuOqv6xqwrwTTVK1il6mB4psC1uixVq6TnKDf1oVIvkBup1vDoxSgQ8Htn3SBDteD2piv3Ef00VizaoP5f21nXN3nJuWmV70k_1aru__NFNJ132l1rDhG9HQ9SNNAYc4gIj0gKUXIbJXez77Uyz98a9RzR3X1E7yPCg4kR_QT3HrSK6D1MRYSOYbQwCACMpAwazEBeUy_mND5Jj4pMNYoIjeJbT05E-EHkP5T0XeNjJ-vaLnfn0IkI15SMxZ4NE7oZGd7rNFhL-HgMTOhxmPFIg2YnVyz656Q3A--pHFZ_PfVN_U-85myNVo0u9656hYhwRlPCWcIwEETYCqMVwQMdmW5E--rZD_C-MTd1rd1qL6yPEhgGQFLKTVJsEsqkTDmLizRhpChSxeOc0wlYChecOpIZPu-Ndb79hW--bdiqa3405rlZVT7dVmXTHW1RlRJ9VEwN6j-HAvKkWl8_Qp90jdd46lcGeWushbZrYLVyoi2Vg1of7KVMWP2ddbqSK-vkFRes12uf8746eP2eROMgaPL4-zyZ4tuqeqpXul27F-ejifC9cwfr-5GHiDyU2u27bJ2bOiIPnVXtSjgn8n2tGmcj8lDoSvm_OImTBKdpRB7GIw7RHN5_7BUUXZM7bRpfDYeo8_XQhrKgKyXBmbmedCeVE7qyPhXpznZ1HcLh_k5bYa2qs-o1oruIPJw_LUalsHXfghASSZFxiOju29__TUrRZqJU_KQTTvYqUSTBfEOLOBMpKkIdOCkGAAHv3do_NEcEIUKh6nRoeEIR2aEXQieI_IwgjBGMUn78CUJK3Z2A4cUI40e0SIocjbBJJosiQ3OsPURkF14rjsaCc3YGiyIrEGI52Oe-oRUR2SWbiHAPTSe4kYkIxSniBI-EduGvOyns0pG6-ViiwAjhwdST4IAkbEmwRBM4Q4igM84L86VpATcylBeCBNzxqZ57ct9A8olEghDO5woHuC-fC_BgL2E-DNBZpB4BJx5RYwOpQAiRYhCXwT-qNT4EkiVZio3DKEjEixLxBBUMFDSQMpZ17v-GuJEreU4wR5SPOA1eXFGSYM-rcDN0MY5bRtNkIW5dGpFdGIeSDR8FfTGyFDGMi0KpEzgTVT9IGHGayczPvTjZ8xRJIjaSsyzLNoW8H0rDUblJfPcPNOYw6TMyH_ddskGHkyEckfynqgm5RS8Jm6jDEULvqcMRGlGSUp9YZ2dWWXdOrCVncoSCxRQRPI4a0Ug9AMMLveAJbExC7iOODtmRle6fI5JjNHfF-zRgxmc84MDDwMDxmRGB2dwvNF7wi_p5v2A6dwx-N044wvm8ZNFB9UnlYgsFhCMSbBaFiBGi7AKII7KLFwoXR2TGQ1EUyZmHEDE_zQDLZwQQ_gGPkHxSfCc1v7pa8wVHFF0UtXfLKEeULZTRU027UkR9DRvPp2GGGdL6VJeCu8J8yuhI03yCjMczxYDEJyThY6lsauUGee-czBPES5p0H09nOU2lTC4YDcVzxTlDs_Lr8eO4pQQVHKUn_HdRtUf8WGL-fqTH6Ff93MODUT3n9GL9c-Y83kxQfM763F9nzhmdIPMFzmeRdUn9Jhj506T3WPYO7VPON0vV5fjMqN8spdgHOE_QfF1EL2wK2RXP14EezOZLI3ZRoAJ4s1jZkotMY2jB3ZsJ_clFkp1lXibZhp-15Usp9q67-VKmfczb_GeSzPdfSrFld6fXM-2Kw1N2QfqVVEvIBMuPCRoHV73N-oTB9HqaXVIu0P9R3PoRgpEfK2ziQ0nmO16kGFuubsnidJyhi40Pm-140CKO_aqrx_vQPrcxmyvc71yWBefHhQcZL-qmeb0InO5IwwyaLMQWnYLYPK_plcnzdLYRkPxX8jrPfzmvx3vQj-T1eO_5Tl7LC5eRZOSyfpuaLpEuJ9F53MnPnP3mhp6jfttJkkwiFF85P-CTVZaazGfKGzbE5vfWyxt3_vhspqbG5JPZrDy8GfHFtCxOltrV1aW2B08SLU2lJBfgY2CkYa9fXohfKvjLVaf4cK3H_ebvuIIXp07_8k4Go6UgHTRZPtUNZ2ujM7jZqd5wzngQrQNtT9cD_bl0f_p5_Tzu15PirWNoezieKw7XKa5X62D0cA0SGo73LMc7CguiGV3xtErI6dUIdI1UrXX9Iau30zYRSRwIqIwDU8BeVYeiq0A3hWlrEQg43s30FyuNcWC7VsHzXjhQlVXwCLlo4NCaJy0VmGa4TDlqeggnzSDsD9AFvJoOGuWNal7dXjclFKYFqbKuLHVTrm_klsqUpuJGbXFCEcUEM3Sz3ybJBkmhWJonLEapLDIVU7IpOItpQom80VuCCMOIIsxxTPk6xYrjTAmZZRmWcRwxpGqhq3VVPdVr05Y32tpObTFmhNObSmSqsuFyjZBGPUP4GhESxXc37TacDmddaSOGKm2dPQ_jtKvUdn79pcK12pfH377edG21vXI87Qc6nT8fWvNd5S4iD0F8OKLu9Xvakv8FAAD__0E9Cac">