<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/113352>113352</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[PPC PWR10]
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Validark
</td>
</tr>
</table>
<pre>
[Godbolt](https://zig.godbolt.org/z/M4decT6sc)
This code:
```zig
export fn extract_bits1(a: u64) u64 {
return ((a >> 2) & 0b1) | ((a >> 5) & 0b110);
}
```
This LLVM IR:
```llvm
define dso_local i64 @extract_bits1(i64 %0) #0 {
1:
%2 = zext i6 2 to i64
%3 = lshr i64 %0, %2
%4 = and i64 %3, 1
%5 = zext i6 5 to i64
%6 = lshr i64 %0, %5
%7 = and i64 %6, 6
%8 = or i64 %4, %7
ret i64 %8
}
```
Gets "optimized" to this LLVM IR when `-mcpu=pwr10`:
```llvm
define dso_local i64 @extract_bits1(i64 %0) local_unnamed_addr {
Entry:
%1 = insertelement <2 x i64> poison, i64 %0, i64 0
%2 = shufflevector <2 x i64> %1, <2 x i64> poison, <2 x i32> zeroinitializer
%3 = lshr <2 x i64> %2, <i64 2, i64 5>
%4 = and <2 x i64> %3, <i64 1, i64 6>
%shift = shufflevector <2 x i64> %4, <2 x i64> poison, <2 x i32> <i32 1, i32 poison>
%5 = or <2 x i64> %4, %shift
%6 = extractelement <2 x i64> %5, i64 0
ret i64 %6
}
```
For `pwr9`, and other architecture/cpu combinations, this does not happen.
This results in this assembly:
```asm
.LCPI0_0:
.long 0
.long 2
.long 0
.long 5
.LCPI0_1:
.long 0
.long 1
.long 0
.long 6
extract_bits1:
stwu 1, -64(1)
stw 4, 32(1)
stw 3, 16(1)
xxsplti32dx 34, 0, 66051
li 3, .LCPI0_0@l
lis 4, .LCPI0_0@ha
lxv 35, 32(1)
lxv 36, 16(1)
xxsplti32dx 34, 1, 269554195
vperm 2, 4, 3, 2
lxvx 35, 4, 3
li 3, .LCPI0_1@l
lis 4, .LCPI0_1@ha
lxvx 0, 4, 3
vsrd 2, 2, 3
xxland 1, 34, 0
xxswapd 35, 1
xxeval 0, 35, 34, 0, 31
stxv 0, 48(1)
lwz 3, 48(1)
lwz 4, 52(1)
addi 1, 1, 64
blr
```
Compare that to the `pwr9` assembly, which at first glance seems a lot better:
```asm
extract_bits1:
stwu 1, -16(1)
rlwinm 5, 4, 30, 31, 31
li 3, 0
rlwimi 5, 4, 27, 29, 30
mr 4, 5
addi 1, 1, 16
blr
```
### Expected Behavior
I expect the LLVM IR to be the same as it is for the `pwr9` platform.
```llvm
define dso_local i64 @extract_bits1(i64 %0) local_unnamed_addr {
Entry:
%1 = lshr i64 %0, 2
%2 = and i64 %1, 1
%3 = lshr i64 %0, 5
%4 = and i64 %3, 6
%5 = or i64 %2, %4
ret i64 %5
}
```
Originally https://github.com/ziglang/zig/issues/18381
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMV0tv2z4S_zT0ZRBDJE3ZPvjQOklRoMUGRdE9BpREW9ylRIGkbMWffkFSimXZefSwwD8wJIXz4zx-M8MHt1buayE2iH1F7H7GW1dqs_nDlSy4-e8s08WLl33TRaaVQ-wekVXpXGMR_YLIIyKPJ7mf76N4rs3ejyDy-HNRiPx3anNE1ii5R8mX-PxdSgu5LoSfH8fTJP5Och9HRNdo42BXg-ic4bl7zqSzGJEVR_QLtOkCkbV_AVp-jVMAAIxwrakBkZVHAqIPiD4A8VhEUkgyHD6X2ymEjSA48Q7TXi1a3k-cvIrlx48_P-H7r3M4l3ilDlUcKsRO1gIKq5-VzrkC6QNYJNMYwzBhSXSKJucg8asR8AgCiN7DSXQOZAoEnPYqRwAaAMqWBs5Kt2HqCLUIKF4XA4h6EB4h2IUhdm0ofdMQG6GWU0OpB6UjxCog9KuWRa9lOWCMcINs9ZkMfRPOAiJEN05W8iQKRAJPbpQ5OJaiBpQmd1XetIjeN0eDg6L_S0oD8Lmta16J4pkXhTkn-KF25uUyyThQImsrjBNKVKJ2gOiWQBdyQB-g0dLq2jM15t5_J1fFYst2t1PiIHKnzUSPNxb4fkP7ME6JHz8Jo2UtneRKnoS5XXVXBkivyHtHBjeZb8Nb9Xg1nY6m42F6ejndlnLnPhPs4vPBepOU9CYpGXAXdtlQu28Y6j276pq-Vm7nNnTQNJujJkg_0wTw6L1Kk-Zo1l5EtoFd7UphgJu8lE7krjUCkce8aSHXVSZr7qSurQeHZim0sFBrByVvGlHPr9ZBI2yrnAVZxwncWlFl6uWtLuK2b6L5j-3T9-Q5GdV9_JsrXe8BXgMf_ifvwybD7MLKaAn9YB7-CyvpsG-N234ajnXHNpbQnd_AVvh1ZxwhIBQLJZdyL4ircnpzYtfZRjlJSdEBDRpCltM0YZMwlIyKXklfJGqKsNGJEaTkE0x3AMpueRok6V-5Gigh6ZqxBV6zS_ShEaaKK0UkJmCvnOl6b3rMexHjjyPGtyPuIqm3bBysKaKX5Ia065TvtxDnkJ0pJ0feFH0QeCoUB66i7Z7zc4Ypfq2Q7tD7t7rJuzqeIg_vyINeNskoLwoZfQ-P874f_zJl3ll6trpquBHgSu7ivitGK9F5jSBbOJYyL4E72EljHewVr3MBVojKAgelHWTCOWE-XE8-3YXTCjXqKOsKRpU0cDxmelJWk1R6HZUc6SDL8Fz3-i7AlYnvyPulbEI7Ho5J7_PdPwmNP3joGpE7UcBXUfKD1GYM-w4iiENWhsOQ05CJMGJ5JYBbkA6khZ020-w1irudNtX8n3JKujqAkqsD0Oj0iafH3DeOy-zDs3J66xjQA0i_-S9u7N7sM7v3v4zcy5or9QKX9669dGWbzXNdxUuY4vU-fiHyKK1thUXkEa_oCs-KDS3WdM1nYoOXZJ3idcrwrNwsFizLU5JkGV5maS7WhC8Zp0lORJLhIp_JDUnIAieE4CVbYDxP11SwFd6xHUkIzYXPY8Wlmvt8-_vfLJjeYEwpIzPFM6FsuF0SUosjBCkixF82zcZPusvavfWrsrTOntU46VS4lj49beHp379wgtg9zFqjNu_wEKouvu4ao_8jcnfBRvTqsCH_CwAA__98qc--">