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

    <tr>
        <th>Summary</th>
        <td>
            [RISCV] Vector binary ops of splats aren't scalarized when element type isn't legal
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:RISC-V,
            llvm:codegen,
            missed-optimization,
            llvm:SelectionDAG
      </td>
    </tr>

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

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

<pre>
    The add of two splats is successfully scalarized here when the element type is i64 on RV64:

```llvm
define <vscale x 1 x i64> @f_nxv1i64(<vscale x 1 x i64> %x, i64 %y) {
  %1 = insertelement <vscale x 1 x i64> poison, i64 %y, i32 0
  %2 = shufflevector <vscale x 1 x i64> %1, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
  %3 = add <vscale x 1 x i64> %2, shufflevector(<vscale x 1 x i64> insertelement(<vscale x 1 x i64> poison, i64 42, i32 0), <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer)
  %4 = mul <vscale x 1 x i64> %x, %3
  ret <vscale x 1 x i64> %4
}
```

With `llc -mtriple=riscv64 -mattr=+v`

```asm
f_nxv1i64:
        addi    a0, a0, 42
        vsetvli a1, zero, e64, m1, ta, ma
        vmul.vx v8, v8, a0
        ret
```

If the element type is not a legal scalar type though, e.g. i8, it doesn't get scalarized:

```llvm
define <vscale x 8 x i8> @f_nxv8i8(<vscale x 8 x i8> %x, i8 %y) {
  %1 = insertelement <vscale x 8 x i8> poison, i8 %y, i32 0
  %2 = shufflevector <vscale x 8 x i8> %1, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
  %3 = add <vscale x 8 x i8> %2, shufflevector(<vscale x 8 x i8> insertelement(<vscale x 8 x i8> poison, i8 42, i32 0), <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer)
  %4 = mul <vscale x 8 x i8> %x, %3
  ret <vscale x 8 x i8> %4
}
```

```asm
f_nxv8i8:
        vsetvli a1, zero, e8, m1, ta, ma
        vmv.v.x v9, a0
        li      a0, 42
        vadd.vx v9, v9, a0
        vmul.vv v8, v8, v9
        ret
```

For certain operations like add, it should be ok to scalarize it into an i64 (or i32 on RV32). It's not safe for all operations though, e.g. it wouldn't be correct to move a ISD:UADDSAT from a v4i8 in an i64 (at least not without properly promoting it first)


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVlFzqzgP_TXOiyYZYgiBhzyk5cs3fb29233cMSCCtwZnbEGb_vodm7Qh6SW3092ZDBAk68iyzkHCWrlvETdsdcdW2Ux0VGuzUd0zqnQ9y3V53PysEURZgq6AXjTYgxJkQVqwXVGgtVWn1BFsIZQw8g1LqNEgvNTYAtUIqLDBloCOB3SrZByBbuHHUxyxcMuCjAXv1zgYfkr1zfCqxEq2CCy87x0Awiss4dXFYOH_gEVB9Vf72i_df55MefHVK-P3Hpjx1ZHxFNj6bgAA92oJLMxAthYNvac7EeygpdXtZbh7kCGHYBSQ-4C27qpKYY8FaTO5B75auhC_xfvkEHLn8IZGy1aSFEq-oRklEfok3MlNQ3MX-SLP6Tpe1Gfa7bJCET_Xh6f_5UZ5Otpr5PfadOrGXn0TuLq8rzM4ecwu5Kkp19lVd45b9k9JNfiOLWDekJEHhSzMjLRFH0cwbwSRYWHG-F1_tfQjnrCnZj_38pkXqShL6W6By364RvzD2lukXnkH30WuSO6OjhD30PiXJPyzOK9qOrXoX91T4kzDVXyklxqkG5t-qH5J7FYTCFC4F-qkBoOJat3ta5_VYr8A6cEkQanRtoyvCfZII_34liok7uySsSgkDiiZ8HmXhOSbinAONWr35Nt6cJHZJzn4Fdgn-_fU4AL4t2Jw9r6lBRO1ua0E_2KPXxCCzyd_SwcuvL8kAxNcdi04ovIkWZObXO0X_cJzNb1iqToLw1gSRFmeyO0XfFo2sL-_Yn-ffpH9O22gQENCtqAPaARJ3VpQ8tmPCSdy21p3qoQcQT8D6TO9nVG2pEG0p09ooo1vCz8UhJzxdAEPxPh6kBQrKoRKGxBKjQGvZYXgxUEOipIjFNoYLMiBN7pHEPDwmLFw-8c2yx63P6EyugEBfSQTkO0oHUGgUFjy6C_S4RAcjINWR_fQaJLt3iFW0lj6aMDhOis3YZmGqZjhZhmnYbhMVutgVm_yNUZBGUdFWSxFEGO4FmUYimqNPE_TNJzJDQ94GCQ8XUbLeBks4ioNMM1jIYJVmccFiwJshFQLJ4ULbfYzaW2Hm3gVrPlMiRyV9ZMc57konrF1Wvrj4fF-_sS4ox_j3KtouC10iXtsP1430los5_pAspFvvsTXSx5RYeEM2fb_zrbKZmbjbPO821sWBUpasufcSJLyg6XL4ImtMngalC-XrTBH0AfrZsrTPCkMDkc3GiT9DHn1mRmc_Fdm1hm1qYkO1rGM7xjf7SXVXb4odMP4zuc93OYHo__Gghjf-ZJZxne-av8EAAD___xDM1Q">