<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/109466>109466</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [RISCV] Unprofitable select vectorization/lowering
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          preames
      </td>
    </tr>
</table>

<pre>
    This was brought up in discussion on https://github.com/llvm/llvm-project/pull/108419.  This is the root cause of the reported regression on leela from spec2017 in the LTO configuration.

We are failing to recognize shifts disguised as selects in at least two contexts:
1) During vector lowering, as shown in test_vec4.  In this case, the vector select is a disguised vector shift of the mask vector extended to the working type.  Note that the shift amounts are not constant per lane.
2) During SLP vectorization, as shown in test_scalarized.  If passed to SLP, we produce the form in test_vec4.

```
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc -mtriple=riscv64 -mattr=+v,+zba,+zbb < %s | FileCheck %s

define i32 @test_vec4(i16 zeroext %a, i16 zeroext %b, i16 zeroext %c, i16 zeroext %d) {
; CHECK-LABEL: test_vec4:
; CHECK:       # %bb.0:
; CHECK-NEXT: slli a2, a2, 32
; CHECK-NEXT:    slli a3, a3, 48
; CHECK-NEXT:    or a2, a3, a2
; CHECK-NEXT:    slli a1, a1, 16
; CHECK-NEXT:    or a0, a0, a1
; CHECK-NEXT:    or a0, a0, a2
; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
; CHECK-NEXT:    vmv.s.x v8, a0
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
; CHECK-NEXT:    vmseq.vi v0, v8, 1
; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, mu
; CHECK-NEXT: vmv.v.i v8, 0
; CHECK-NEXT:    lui a0, %hi(.LCPI0_0)
; CHECK-NEXT: addi a0, a0, %lo(.LCPI0_0)
; CHECK-NEXT:    vle32.v v8, (a0), v0.t
; CHECK-NEXT:    vredor.vs v8, v8, v8
; CHECK-NEXT:    vmv.x.s a0, v8
; CHECK-NEXT:    ret
  %t35 = insertelement <4 x i16> poison, i16 %a, i64 0
  %t36 = insertelement <4 x i16> %t35, i16 %b, i64 1
  %t37 = insertelement <4 x i16> %t36, i16 %c, i64 2
  %t38 = insertelement <4 x i16> %t37, i16 %d, i64 3
  %t39 = icmp eq <4 x i16> %t38, <i16 1, i16 1, i16 1, i16 1>
  %t40 = select <4 x i1> %t39, <4 x i32> <i32 524288, i32 262144, i32 131072, i32 65536>, <4 x i32> zeroinitializer
  %t41 = tail call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %t40)
  ret i32 %t41
}

define i32 @test_scalarized(i16 zeroext %a, i16 zeroext %b, i16 zeroext %c, i16 zeroext %d) {
; CHECK-LABEL: test_scalarized:
; CHECK:       # %bb.0:
; CHECK-NEXT:    addi a0, a0, -1
; CHECK-NEXT: seqz a0, a0
; CHECK-NEXT:    addi a1, a1, -1
; CHECK-NEXT:    seqz a1, a1
; CHECK-NEXT:    addi a2, a2, -1
; CHECK-NEXT:    seqz a2, a2
; CHECK-NEXT:    addi a3, a3, -1
; CHECK-NEXT:    seqz a3, a3
; CHECK-NEXT:    slli a0, a0, 19
; CHECK-NEXT:    slli a1, a1, 18
; CHECK-NEXT:    slli a2, a2, 17
; CHECK-NEXT:    slli a3, a3, 16
; CHECK-NEXT:    or a0, a0, a1
; CHECK-NEXT:    or a2, a2, a3
; CHECK-NEXT:    or a0, a0, a2
; CHECK-NEXT:    ret
  %t39.i0 = icmp eq i16 %a, 1
  %t39.i1 = icmp eq i16 %b, 1
  %t39.i2 = icmp eq i16 %c, 1
  %t39.i3 = icmp eq i16 %d, 1
  %t40.i0 = select i1 %t39.i0, i32 524288, i32 0
  %t40.i1 = select i1 %t39.i1, i32 262144, i32 0
 %t40.i2 = select i1 %t39.i2, i32 131072, i32 0
  %t40.i3 = select i1 %t39.i3, i32 65536, i32 0
  %or.rdx0 = or i32 %t40.i0, %t40.i1
 %or.rdx1 = or i32 %t40.i2, %t40.i3
  %or.rdx2 = or i32 %or.rdx0, %or.rdx1
  ret i32 %or.rdx2
}
```
`./opt -S example.ll -passes=slp-vectorizer`

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWN9y4j7SfRpx04XLkoyBCy4SCN83tan5TU0yu3uXEnYD2hGWR5KdTJ5-S7IN5m8ytVu1qZTBUp9zului25awVm4KxBkZ3ZPRYiAqt9VmVhoUO7SDlc5_z5630sKrsLAyutpsHVQlyAJyabPKWqkL0AVsnSst4XeELQlbbqTbVqso0zvClkrV3cewNPpfmDnClmWlFGFLGk8SOo0Agoq04LYIRmsHmagsgl43I1hq4zAHgxuDe1WFqASsjd6BLTFjMR171zzi8fkvyHSxlpvKCCd1EZF4QeK75voPBGEQ1kIqWWzAaTCY6U0h3xHsVq6d9fFtKmkxB2HBosLMWU8uHCgU1oF71V7B4ZsLkQdiStgUFpXxrDVmThtQ-hX9PWHzQLXVr0XwEq17qTFLIoAv3mlpIRMWvZ2PoIU30j41oudTN-l97ZK0E_ZnN4FvDosccx-an3vV5meI9HeJEcBX7RDcVrgw2bCIna4KZ0NiCr8AurBOFA5KNKBEgW0GWS_Ep8dvraJ8D1m-GKTNhBJGvmPuQ11DKaxtXHt6_OYRrwil0XmVYfBnrc3uOEP9tSNp3P43t_wevv71_ED4HdxZi8a7YWEraoQVYgGicnqDBRrhN9DqN1ROKkvYsipz4fBFqewlKGVbzH7aqPwNP57nL3ff_-_Jcw6HNZqw4dhB8PuPr35OqQyGO2dkqZDwhZE2q9MEhjvhnCF8Qdh9TdicsPv3lei-rIDwORA2skDGc1hKhXOvHIb6gea4lgWC5AxIEu-TQdhE0hTe0Wh8cx7lqeFkbHVhLLswlvvVJOP7Q2zz_3-Y_234eHf_8OhjPOh2e3xv5KebP8J4EF1F8bnZ8OvDP5-9rVVKgmBhj4QrZ9dMAVprHqzDNZncsNamY-Yt_0fMNNiFK00_YI6DbdwiPm97y4vaopO1kmE1ghf-gmniP3bhxoWV3YlbLLs6stEb1JNW9orpmVqQQZoGhTX7tJzFX1EtoQ4BNqq3MuJ1-7LdJ3J2Fmd11fldHdWRbOWuxggAqpJt7gkbbSVhk-hx_u1L_BITNr2GE3kuj9aNsJHSn8P6EBVyFtWtd4RNRAD49MSRuwU0mGsT1baF7q-3l_stsq2fN00Nttr-5zlyfASEL0AWvkSiwh0WzleiBN58TSD8AUotbVPCfZHYF5Y06VLeMqUfMjWCPaZVx0SPmMafY0p7TFnHxI6YJp9jGveY8o6JHzFNG6ZsVwL-usTRLDOfexra8V36wh_6xEkciNt-vufd005b2jDMWRjnc1_9Ryxhk6Dq71jKaJJ0d5TTeMy6u3Q04t7Rcyr_u5OFdFIo-Y7myDEaHHNCKsiEUl3H8U9sUdPdI4O-O0d-tyaekU1OPA0B7n8nYfc1PEGg3abjxQf97fCk8L_ocj31_7jXAZyXleHVQmnx1_vB9CPKXue6Tun7XGClH3athrXXlz_Byj7sbw1rr39_grWz_qh395JKb5Xm805_q2KePZ_Q8Z88n_xXnyJ6XtzMx588cZx2hGkk46Ni1y_79NSUXjJdXTRll0yzi6b8kml-ZprEna_d-xA9xNBVv-M6GZ_i6RU8vVxZO3wHZ1fg7HIpPpPnV_D8uHhfgPv6m7814WtzKKtxG_s-wIPHDYRegrA-hJ_JsBNMK96CWt4LVb5Fn1b6k5e1NI4IW-rSwfAJ8E3sSoWRUjAM74SW8IVV5bB7pUSzRw7yGc-nfCoGOKNjlk5SHtPRYDtbJWMuptMRn_I1zRhfi3RFWT4W-ZiORBIP5IzFLImnLGYxjekooiIe4XqKY7pej-kkI0mMOyFVFBqeNpuBtLbCGY2nSZoOlFihsuGEhLECXyHMEsbIaDEws3Cusao21ndMaZ090DjpVDha-f7laf53MlrAj6I0ei2dWCnstsLJ-_OyOy8YVEbN_vhcJThnw8lK8L6esX8HAAD__18u37c">