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

    <tr>
        <th>Summary</th>
        <td>
            [RISCV] Poor lowering of shuffle of build_vector idiom
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:RISC-V
      </td>
    </tr>

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

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

<pre>
    In the examples below, we have a shuffle of a build_vector.  This is resulting in the emission of a vrgather instead of e.g. a build_vector sequence (such as 4 vmerges).  The difference between the first and second is the interaction with splitting during lowering.  

```
; RUN: llc < %s -mattr=+v
source_filename = "satd.c"
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
target triple = "riscv64-unknown-unknown"

@discard = local_unnamed_addr global <16 x i8> zeroinitializer

define void @test_zvl128(i32 %a, i32 %b, i32 %c, i32 %d) vscale_range(2,2) {
entry:
  %0 = insertelement <8 x i32> poison, i32 %a, i64 0
  %1 = insertelement <8 x i32> %0, i32 %b, i64 1
 %2 = insertelement <8 x i32> %1, i32 %c, i64 2
  %3 = insertelement <8 x i32> %2, i32 %d, i64 3
  %4 = shufflevector <8 x i32> %3, <8 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 1, i32 0, i32 2, i32 3>
  store <8 x i32> %4, ptr @discard, align 64
  ret void
}

define void @test_zlv256(i32 %a, i32 %b, i32 %c, i32 %d) vscale_range(4,4) {
entry:
  %0 = insertelement <8 x i32> poison, i32 %a, i64 0
  %1 = insertelement <8 x i32> %0, i32 %b, i64 1
  %2 = insertelement <8 x i32> %1, i32 %c, i64 2
  %3 = insertelement <8 x i32> %2, i32 %d, i64 3
  %4 = shufflevector <8 x i32> %3, <8 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 1, i32 0, i32 2, i32 3>
  store <8 x i32> %4, ptr @discard, align 64
  ret void
}
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVsGO2zYQ_RrqMrAhkZIsH3Tw2rtALkWRtLkaFDmW2FCkS1Jydr--oKR1vOsWCdBLCwQwSHo08-bN4BFD7r1qDWJNigdSHBI-hM66-uyQ9-iTxsrn-oOB0CHgV96fNXpoUNsLoXu4IHR8RODgu-F00gj2BByaQWl5HFEE69YAv3XKg_Lg0A86KNOCWgB75b2yZo4aXctDhw6U8QG5jFZct-t3gODxzwGNQCC08oPogHvIYezRtegJ3U4ZEaQ6ndBNjg2GC-Kc86ScD8CNBI_CGhmJRbsyAR0XIdK5qNCBP2sVJrZycHHT9oLxsAYg6YGku2Ut0-U3_2UP8PH3XwjbgdYCCNsDoYWHVc9DcIQdCH0YZ1dvByfweFIaDe8RCDsAodTzINeCUDp7Be5aDCB54Jo_2yG8-uGqJ2yHqzNhuzKflpW6HjJaEbbLaLUyjM62T9H2DjY4ddbX1E55MZb5ajBfjL2Y1_0atKx5KpUX3MkpTlvB9XEwsQZ55FI6aLVtuI7FZyV8BVUR9ggv6KwyKiiu1Qu6W0SJJ2UQRqskkDwN6MPxZdQT30oxGlvIo-CWc3NzFjdnSegWRi-4xqPjpkVCK0ronkY72TzM2dAE90zYkhtiYDpVooxHF1Bjjya2eV9F8rF9j3C2yltzk2vmU-aQ3uBk38WJye4qKXPIFhRCC_ojINldC8oc6A0V9iMo9G3zZhR2g5JPKMvtXi7gHQqLkf_UrnfebB_TXVtwLePKhN19Sv_Ghz2-kvTBOrznlEffc3DwTa3RwrVqDZT5a7TDMMluUePm8F1Z6pEW5b-XZeSX_39k-VOX_w1dvh02iayZ3LItT7DONummysttQZOuZikXabnBCkWFpxQruUm3YluVG9w0tGSJqmlK85RmLNsURUHXtCoFq6qsarjImmxL8hR7rvRa67FfW9cmyvsB6yorWZVo3qD205uB0oaLL2gkYbuPHz7tV5_juCgOiatj6KoZWk_yVCsf_DewoIKe3hwx5DMpDvCrte46Y-Psv3lSvJn_SirbJ4PTdRfC2ccbQ58IfWpV6IZmLWxP6FNMtGyrs7N_oAiEPk0leEKfpir-CgAA___v1YSE">