<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/72640>72640</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Loading/storing an 8 aligned i128 uses two `movq` instead of a single `movups`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
LingMan
</td>
</tr>
</table>
<pre>
Consider this example:
```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define void @foo(ptr noalias %slice.0, ptr noalias %value) unnamed_addr {
start:
%0 = load i128, ptr %value, align 8
store i128 %0, ptr %slice.0, align 16
ret void
}
```
Godbolt: https://llc.godbolt.org/z/fMMPbacGx
Expected asm output:
```asm
foo: # @foo
movups xmm0, xmmword ptr [rsi]
movaps xmmword ptr [rdi], xmm0
ret
```
Actual asm output:
```asm
foo: # @foo
mov rax, qword ptr [rsi]
mov rcx, qword ptr [rsi + 8]
mov qword ptr [rdi + 8], rcx
mov qword ptr [rdi], rax
ret
```
Replacing the two occurrences of `i128` with `<2 x i64>` gives the expected output instead, so the issue appears to be specific to `i128`. Alternatively, changing the `align 8` to `align 16` causes LLVM to correctly output `movaps` instructions.
**Real world background:**
I noticed that filling a slice of `u128` in Rust doesn't optimize as well as filling a slice of `[u64; 2]`.
```rust
//type T = u128;
type T = [u64; 2];
pub fn foo(slice: &mut [T], value: &T) {
slice.fill(*value)
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVVuP2ygU_jXk5SgRxrGTechDMtOpVpqRVt1qXysMxw5bDC6XJNNfvwLiubVddSOLGHO-w3cufHDv1WAQd6Q5kOZuwWM4Wrd7UGZ45GbRWfm0u7XGK4kOwlF5wAsfJ42k3hN6R-ietLQ8Wp_G8ilwN2AAyQPX_MnGAKS-A8IYLkdS73E5sQ0l9b5meUjT6u00vbXrPCzV_NJvE6hi26XZppd2xrTr5V8V2xLG3uwfnJo0zntftu2Xdr2M5quxZ7PUysTLcjDxGVVGib0yCCerJJA17a0lbDsFB8ZyrbgHwhqvlcAVJewW3q2cuI5I2A1EY_iI8guX0gHZHIpzH7gLz5mDhKCZn7ZcgsoxFJ8vvm6BazUY2M4gH6zDbJzxrxCveBVM1c4ghyHHdA11c_eueGX60crO6sQQjiFMPlFl94Tday1WQ1lcWTcQdv-dsPv-8fHPjouPl9cJ_HCZUASUwP0INoYphh97hftrq6T81nv4jR9h9VyQEtNoT3HyAJdxzCFfxvFsnSzJaA7OK9LczfGX32hP_Ap5YyqzafFB30Ichp-mqox7ESLX_yvUH-J44VY25JfE5NtvxFLsxU_tgbADbH-J-vYu_hdzdptd_hZqtuez_X9n6xNOmgtlBghHhHC2YIWIzqER6MH2QFqaD0FL4azCMc1JfcvgAlkEPqSFQZ3QZwc4d1pJPSjjA3KZGHmbLZT3EYFPE3LnIVjoEPyEQvVKpOnLfivY64DO8KBOqJ-SD3HkZpjJpkJej2FLr9DnM9ZSEDx69PDw8PdjWhXWORRBP83cSEtL8yXjRNRFEZQ1fvU6QYSl5xNyDWfrtISOi6-Ds9HIfBTz88r-DzA2KIESwpEH6JXWiTCHrATXjMZrRpWBT9EHkBa9IWwTwE5Bjeo7AvdwRp36-Bc-SHOIqQIHYKnmLV29K7OLfq58FozwNCF8ztqW96-vCvjq-zufs8UUO-gNFOHNHMqpaceUxubw-dp0RR7L0uckuc8qW5ivUiQkKep-VuVfid9C7mp5U9_wBe6qDaWMMbqmi-Ou4rKjrGrFtsOKVn3PmqrreuwaFDdV3SzUjlFWV1W1qapmTemqreRNS7ei39ScrTdrsqY4cqVX6XZM0rnIPbnbsHZNF5p3qH2-exkzeC4Nm26k5m7hdgmz7OLgyZpq5YN_8RJU0Lh7sFwqk-Q4XQq5bAa2RfyxXCiQ-zKdtdKC3-YGRC5TcTl4ZQaN1-WYO3QRnd69vQEGFY6xWwk75uvgNP8tJ2f_QREIu8_kPWH3Obh_AwAA___fwWbW">