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