<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/129576>129576</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
s390x: missed optimization to `vec_unpackl`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
folkertdev
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/Wxc8x8Tax
This LLVM IR
```llvm
define range(i32 -32768, 32768) <4 x i32> @unpackh(<8 x i16> %a) unnamed_addr {
start:
%0 = shufflevector <8 x i16> %a, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%1 = sext <4 x i16> %0 to <4 x i32>
ret <4 x i32> %1
}
define range(i32 -32768, 32768) <4 x i32> @unpackl(<8 x i16> %a) unnamed_addr {
start:
%0 = shufflevector <8 x i16> %a, <8 x i16> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
%1 = sext <4 x i16> %0 to <4 x i32>
ret <4 x i32> %1
}
```
optimizes to
```asm
unpackh:
vuphh %v24, %v24
br %r14
unpackl:
vmrlg %v0, %v24, %v24
vuphh %v24, %v0
br %r14
```
this is already very good, and optimal for `unpackh`, but not for `unpackl`:
https://godbolt.org/z/xfobea8ee
```c
vector signed int foo(vector signed short a) {
return vec_unpackh(a);
}
vector signed int unpack(vector signed short a) {
return vec_unpackl(a);
}
```
optimizes to
```asm
foo:
vuphh %v24, %v24
br %r14
unpack:
vuplhw %v24, %v24
br %r14
```
So it looks like a final step is missed where `vmrlg + vuphh` can be rewritten to just `vuplhw` (and similarly for the other vector types). Or maybe the shuffle vector should be recognized directly. Anyway, this seems achievable.
This came up in the context of the rust standard library
cc @uweigand
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVl-L4zYQ_zTKy7BBkRwnefCDd_cChSuF9mgfD9kax7qVpSDJSbyfvki2dze59A8thRpDJprR_EYzvxlZeK8OBrEg60eyfl6IPrTWFY3VL-iCxNOisnIoCC0JLdsQjp7wkrA9YfuDlZXVYWndgbD9K2H73y719rL9Ii6j-ZdWefj8-dcf4Yefx5X45nR8tT51hJYSG2UQnDAHJGyrOIMHzjb5lrAnmIQdEP6UwQUUZ4R_ApLR3hxF_dIStiX8aRtVqzyp2FrEDb0xokP5VUjpgGweCS19EC7E6GkJ0Y4C4c_g275pNJ6wDtbBPWdPN6tHq7w10_rHqPhTjJ5GTRRWs8BmgRP-aUZfjeh4CW9u3kApBHvtPO1yGG4h2XoVc7p5HpP7r5Kp_4fJzObUrWchn4XNf5vMmaZjYu0xqE69ok_OroksfOTxTMgpJeNz6o9tCynEE0tnmaR3k8rFNbfKRq9zKa7ddE4fJjf0g5d7_u5D0mvE9LzDXp81xLZVHoR2KOQAJ3QDHKyV0ZkwElIyhIYm1jh_a8U8hVb1AYwN10odlbz8e1Pk0tgKxRbxJs81oeXErDSzJCgTcSxh2-t131oXIFGXbB5hOrvD0DsDJ6y_vk-PaET448cm-h5jNP-nMPoezB_T6y674invMOvPeXVT5Zlc3znS7fk-Rf-KKb9YUAG0tS8etHpBENAoIzT4gMdIoU55jxLOLTqMbBiJTNjjGD_JKdTCQIXg8OxUCGhig33rfUjmKbZoFVNoJHjVKS2cHhK9QotgQ4sOprqE4YiesN0SfnLQiaHCZDNNpdnKt7bXcgSt7cGoV5QglcM66GEJpRnOYoiJSI3gETsPom4VnkSlcfnhbqtFh9AfQZmEU1sT4giyTfrr4il8EEYKJ0Grygk3jLvrOo3dM6qDMJLQciELLnd8JxZYrDbZinLK83zRFjsm6DZbC2zYjskaqWAVRck2GUpa19lCFYyydbRf7TjL1kuWYS0bpGyDAjkyklHshNLLeOHGNlso73ssVmy33uQLLSrUPl3_jBk8Q9ISxuLXgCvipoeqP3iSUa188O9uggoaC8939EJ4Odd6orIIyqZaxjJ-aIWcLnqni5sZoELbV8vadoTt03fB-PNwdPYb1oGwfYrKE7afwj4V7PcAAAD__4eZfVs">