<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">