Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / rvv-peephole-vmerge-masked-vops.ll
blob7e137d6a61969217f8a8c0dcba4b07a2e2767a59
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s
4 declare <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i1>, i64);
5 declare <vscale x 2 x float> @llvm.riscv.vmerge.nxv2f32.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x i1>, i64);
7 define <vscale x 2 x i32> @vpmerge_vadd(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %vl) {
8 ; CHECK-LABEL: vpmerge_vadd:
9 ; CHECK:       # %bb.0:
10 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
11 ; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t
12 ; CHECK-NEXT:    ret
13   %a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %vl, i64 1)
14   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
15   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
16   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
17   ret <vscale x 2 x i32> %b
19 declare <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i1>, i64, i64)
21 define <vscale x 2 x i32> @vpmerge_vsub(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %vl) {
22 ; CHECK-LABEL: vpmerge_vsub:
23 ; CHECK:       # %bb.0:
24 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
25 ; CHECK-NEXT:    vsub.vv v8, v9, v10, v0.t
26 ; CHECK-NEXT:    ret
27   %a = call <vscale x 2 x i32> @llvm.riscv.vsub.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %vl, i64 1)
28   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
29   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
30   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
31   ret <vscale x 2 x i32> %b
33 declare <vscale x 2 x i32> @llvm.riscv.vsub.mask.nxv2i32.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i1>, i64, i64)
35 define <vscale x 2 x float> @vpmerge_vfadd(<vscale x 2 x float> %passthru, <vscale x 2 x float> %x, <vscale x 2 x float> %y, <vscale x 2 x i1> %m, i64 %vl) {
36 ; CHECK-LABEL: vpmerge_vfadd:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
39 ; CHECK-NEXT:    vfadd.vv v8, v9, v10, v0.t
40 ; CHECK-NEXT:    ret
41   %a = call <vscale x 2 x float> @llvm.riscv.vfadd.mask.nxv2f32.nxv2f32(<vscale x 2 x float> %passthru, <vscale x 2 x float> %x, <vscale x 2 x float> %y, <vscale x 2 x i1> %m, i64 7, i64 %vl, i64 1)
42   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
43   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
44   %b = call <vscale x 2 x float> @llvm.riscv.vmerge.nxv2f32.nxv2f32(<vscale x 2 x float> %passthru, <vscale x 2 x float> %passthru, <vscale x 2 x float> %a, <vscale x 2 x i1> %mask, i64 %vl)
46   ret <vscale x 2 x float> %b
48 declare <vscale x 2 x float> @llvm.riscv.vfadd.mask.nxv2f32.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x i1>, i64, i64, i64)
50 define <vscale x 2 x float> @vpmerge_vfsub(<vscale x 2 x float> %passthru, <vscale x 2 x float> %x, <vscale x 2 x float> %y, <vscale x 2 x i1> %m, i64 %vl) {
51 ; CHECK-LABEL: vpmerge_vfsub:
52 ; CHECK:       # %bb.0:
53 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
54 ; CHECK-NEXT:    vfsub.vv v8, v9, v10, v0.t
55 ; CHECK-NEXT:    ret
56   %a = call <vscale x 2 x float> @llvm.riscv.vfsub.mask.nxv2f32.nxv2f32(<vscale x 2 x float> %passthru, <vscale x 2 x float> %x, <vscale x 2 x float> %y, <vscale x 2 x i1> %m, i64 7, i64 %vl, i64 1)
57   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
58   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
59   %b = call <vscale x 2 x float> @llvm.riscv.vmerge.nxv2f32.nxv2f32(<vscale x 2 x float> %passthru, <vscale x 2 x float> %passthru, <vscale x 2 x float> %a, <vscale x 2 x i1> %mask, i64 %vl)
60   ret <vscale x 2 x float> %b
62 declare <vscale x 2 x float> @llvm.riscv.vfsub.mask.nxv2f32.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x i1>, i64, i64, i64)
64 define <vscale x 2 x i32> @vpmerge_vwadd(<vscale x 2 x i32> %passthru, <vscale x 2 x i16> %x, <vscale x 2 x i16> %y, <vscale x 2 x i1> %m, i64 %vl) {
65 ; CHECK-LABEL: vpmerge_vwadd:
66 ; CHECK:       # %bb.0:
67 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, tu, mu
68 ; CHECK-NEXT:    vwadd.vv v8, v9, v10, v0.t
69 ; CHECK-NEXT:    ret
70   %a = call <vscale x 2 x i32> @llvm.riscv.vwadd.mask.nxv2i32.nxv2i16.nxv2i16(<vscale x 2 x i32> %passthru, <vscale x 2 x i16> %x, <vscale x 2 x i16> %y, <vscale x 2 x i1> %m, i64 %vl, i64 1)
71   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
72   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
73   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
74   ret <vscale x 2 x i32> %b
76 declare <vscale x 2 x i32> @llvm.riscv.vwadd.mask.nxv2i32.nxv2i16.nxv2i16(<vscale x 2 x i32>, <vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i1>, i64, i64)
78 define <vscale x 2 x i32> @vpmerge_vle(<vscale x 2 x i32> %passthru, <vscale x 2 x i32>* %p, <vscale x 2 x i1> %m, i64 %vl) {
79 ; CHECK-LABEL: vpmerge_vle:
80 ; CHECK:       # %bb.0:
81 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, mu
82 ; CHECK-NEXT:    vle32.v v8, (a0), v0.t
83 ; CHECK-NEXT:    ret
84   %a = call <vscale x 2 x i32> @llvm.riscv.vle.mask.nxv2i32(
85     <vscale x 2 x i32> %passthru,
86     <vscale x 2 x i32>* %p,
87     <vscale x 2 x i1> %m,
88     i64 %vl, i64 1)
89   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
90   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
91   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
92   ret <vscale x 2 x i32> %b
94 declare <vscale x 2 x i32> @llvm.riscv.vle.mask.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>*, <vscale x 2 x i1>, i64, i64)
96 declare <vscale x 2 x i32> @llvm.riscv.vslideup.mask.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, i64, <vscale x 2 x i1>, i64, i64)
97 define <vscale x 2 x i32> @vpmerge_vslideup(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i64 %x, <vscale x 2 x i1> %m, i64 %vl) {
98 ; CHECK-LABEL: vpmerge_vslideup:
99 ; CHECK:       # %bb.0:
100 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, mu
101 ; CHECK-NEXT:    vslideup.vx v8, v9, a0, v0.t
102 ; CHECK-NEXT:    ret
103   %a = call <vscale x 2 x i32> @llvm.riscv.vslideup.mask.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i64 %x, <vscale x 2 x i1> %m, i64 %vl, i64 0)
104   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
105   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
106   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
107   ret <vscale x 2 x i32> %b
110 declare <vscale x 2 x i32> @llvm.riscv.vslidedown.mask.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, i64, <vscale x 2 x i1>, i64, i64)
111 define <vscale x 2 x i32> @vpmerge_vslidedown(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i64 %x, <vscale x 2 x i1> %m, i64 %vl) {
112 ; CHECK-LABEL: vpmerge_vslidedown:
113 ; CHECK:       # %bb.0:
114 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, mu
115 ; CHECK-NEXT:    vslidedown.vx v8, v9, a0, v0.t
116 ; CHECK-NEXT:    ret
117   %a = call <vscale x 2 x i32> @llvm.riscv.vslidedown.mask.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i64 %x, <vscale x 2 x i1> %m, i64 %vl, i64 0)
118   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
119   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
120   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
121   ret <vscale x 2 x i32> %b
124 declare <vscale x 2 x i32> @llvm.riscv.vslide1up.mask.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, i32, <vscale x 2 x i1>, i64, i64)
125 define <vscale x 2 x i32> @vpmerge_vslide1up(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i32 %x, <vscale x 2 x i1> %m, i64 %vl) {
126 ; CHECK-LABEL: vpmerge_vslide1up:
127 ; CHECK:       # %bb.0:
128 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, mu
129 ; CHECK-NEXT:    vslide1up.vx v8, v9, a0, v0.t
130 ; CHECK-NEXT:    ret
131   %a = call <vscale x 2 x i32> @llvm.riscv.vslide1up.mask.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i32 %x, <vscale x 2 x i1> %m, i64 %vl, i64 0)
132   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
133   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
134   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
135   ret <vscale x 2 x i32> %b
138 declare <vscale x 2 x i32> @llvm.riscv.vslide1down.mask.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, i32, <vscale x 2 x i1>, i64, i64)
139 define <vscale x 2 x i32> @vpmerge_vslide1down(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i32 %x, <vscale x 2 x i1> %m, i64 %vl) {
140 ; CHECK-LABEL: vpmerge_vslide1down:
141 ; CHECK:       # %bb.0:
142 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, mu
143 ; CHECK-NEXT:    vslide1down.vx v8, v9, a0, v0.t
144 ; CHECK-NEXT:    ret
145   %a = call <vscale x 2 x i32> @llvm.riscv.vslide1down.mask.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %v, i32 %x, <vscale x 2 x i1> %m, i64 %vl, i64 0)
146   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
147   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
148   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 %vl)
149   ret <vscale x 2 x i32> %b
152 ; Tests for folding vmerge into its ops when their VLs differ
154 ; Can fold with VL=2
155 define <vscale x 2 x i32> @vmerge_smaller_vl_same_passthru(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m) {
156 ; CHECK-LABEL: vmerge_smaller_vl_same_passthru:
157 ; CHECK:       # %bb.0:
158 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, mu
159 ; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t
160 ; CHECK-NEXT:    ret
161   %a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 3, i64 0)
162   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
163   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
164   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 2)
165   ret <vscale x 2 x i32> %b
168 ; Can fold with VL=2
169 define <vscale x 2 x i32> @vmerge_larger_vl_same_passthru(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m) {
170 ; CHECK-LABEL: vmerge_larger_vl_same_passthru:
171 ; CHECK:       # %bb.0:
172 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, mu
173 ; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t
174 ; CHECK-NEXT:    ret
175   %a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 2, i64 0)
176   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
177   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
178   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 3)
179   ret <vscale x 2 x i32> %b
182 ; Can fold with VL=2
183 define <vscale x 2 x i32> @vmerge_smaller_vl_different_passthru(<vscale x 2 x i32> %pt1, <vscale x 2 x i32> %pt2, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m) {
184 ; CHECK-LABEL: vmerge_smaller_vl_different_passthru:
185 ; CHECK:       # %bb.0:
186 ; CHECK-NEXT:    vsetivli zero, 3, e32, m1, tu, mu
187 ; CHECK-NEXT:    vadd.vv v8, v10, v11, v0.t
188 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, ma
189 ; CHECK-NEXT:    vmv.v.v v9, v8
190 ; CHECK-NEXT:    vmv1r.v v8, v9
191 ; CHECK-NEXT:    ret
192   %a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %pt1, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 3, i64 0)
193   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
194   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
195   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %pt2, <vscale x 2 x i32> %pt2, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 2)
196   ret <vscale x 2 x i32> %b
199 ; Can't fold this because we need to take elements from both %pt1 and %pt2
200 define <vscale x 2 x i32> @vmerge_larger_vl_different_passthru(<vscale x 2 x i32> %pt1, <vscale x 2 x i32> %pt2, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m) {
201 ; CHECK-LABEL: vmerge_larger_vl_different_passthru:
202 ; CHECK:       # %bb.0:
203 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, mu
204 ; CHECK-NEXT:    vadd.vv v8, v10, v11, v0.t
205 ; CHECK-NEXT:    vsetivli zero, 3, e32, m1, tu, ma
206 ; CHECK-NEXT:    vmv.v.v v9, v8
207 ; CHECK-NEXT:    vmv1r.v v8, v9
208 ; CHECK-NEXT:    ret
209   %a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %pt1, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 2, i64 0)
210   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
211   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
212   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %pt2, <vscale x 2 x i32> %pt2, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 3)
213   ret <vscale x 2 x i32> %b
216 ; Can fold with VL=2
217 define <vscale x 2 x i32> @vmerge_smaller_vl_poison_passthru(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m) {
218 ; CHECK-LABEL: vmerge_smaller_vl_poison_passthru:
219 ; CHECK:       # %bb.0:
220 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, mu
221 ; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t
222 ; CHECK-NEXT:    ret
223   %a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> poison, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 3, i64 0)
224   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
225   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
226   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 2)
227   ret <vscale x 2 x i32> %b
230 ; Can fold with VL=2
231 define <vscale x 2 x i32> @vmerge_larger_vl_poison_passthru(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m) {
232 ; CHECK-LABEL: vmerge_larger_vl_poison_passthru:
233 ; CHECK:       # %bb.0:
234 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, mu
235 ; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t
236 ; CHECK-NEXT:    ret
237   %a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> poison, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 2, i64 0)
238   %splat = insertelement <vscale x 2 x i1> poison, i1 -1, i32 0
239   %mask = shufflevector <vscale x 2 x i1> %splat, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
240   %b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %passthru, <vscale x 2 x i32> %a, <vscale x 2 x i1> %mask, i64 3)
241   ret <vscale x 2 x i32> %b
244 ; Test VFCVT_RM
245 declare <vscale x 2 x float> @llvm.floor.nxv2f32(<vscale x 2 x float>)
246 declare <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1>, <vscale x 2 x i32>, <vscale x 2 x i32>, i32)
247 define <vscale x 2 x i32> @vmerge_vfcvt_rm(<vscale x 2 x i32> %passthru, <vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 zeroext %evl) {
248 ; CHECK-LABEL: vmerge_vfcvt_rm:
249 ; CHECK:       # %bb.0: # %entry
250 ; CHECK-NEXT:    fsrmi a1, 2
251 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
252 ; CHECK-NEXT:    vfcvt.x.f.v v8, v9, v0.t
253 ; CHECK-NEXT:    fsrm a1
254 ; CHECK-NEXT:    ret
255 entry:
256   %floor = call <vscale x 2 x float> @llvm.floor.nxv2f32(<vscale x 2 x float> %a)
257   %i = fptosi <vscale x 2 x float> %floor to <vscale x 2 x i32>
258   %res = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> %i, <vscale x 2 x i32> %passthru, i32 %evl)
259   ret <vscale x 2 x i32> %res