[llvm] Fix implicit PesudoXVINSGR2VR error (PR #152432)

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 6 23:54:33 PDT 2025


================
@@ -6,7 +6,9 @@
 define <32 x i8> @scalar_to_32xi8(i8 %val) {
 ; CHECK-LABEL: scalar_to_32xi8:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vinsgr2vr.b $vr0, $a0, 0
+; CHECK-NEXT:    xvreplgr2vr.b $xr0, $a0
+; CHECK-NEXT:    xvpermi.q $xr0, $xr0, 18
+; CHECK-NEXT:    xvextrins.b $xr0, $xr0, 0
----------------
tangaac wrote:

Not enough.
```llvm
define <16 x i16> @test(i16 %a0, i16 %a1) {
  %v0 = insertelement <16 x i16> poison, i16 %a0, i32 0
  %v1 = insertelement <16 x i16> %v0, i16 %a1, i32 1
  ret <16 x i16> %v1
}
```
```asm
vinsgr2vr.b	$vr0, $a0, 0
xvreplgr2vr.h	$xr1, $a1
xvpermi.q	$xr1, $xr0, 18
xvextrins.h	$xr0, $xr1, 17
ret
```

We may should split `v32i8/v16i16` into two `v16i8/v8i16` as early as possible,
Then use `vinsgr2vr.{b,h}` to handle and concat them.
This is also what gcc does.

https://github.com/llvm/llvm-project/pull/152432


More information about the llvm-commits mailing list