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