[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / zvlsseg-zero-vl.ll
blob5818c7979f3c677ac175a5692a2a436d52fd68ac
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+zve32x \
3 ; RUN:     -verify-machineinstrs < %s | FileCheck %s
5 ; Make sure we don't select a 0 vl to X0 in the custom isel handlers we use
6 ; for these intrinsics.
8 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, i64, i64)
9 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlseg2.mask.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i1>, i64, i64, i64)
11 define <vscale x 16 x i16> @test_vlseg2_mask_nxv16i16(ptr %base, <vscale x 16 x i1> %mask) {
12 ; CHECK-LABEL: test_vlseg2_mask_nxv16i16:
13 ; CHECK:       # %bb.0: # %entry
14 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
15 ; CHECK-NEXT:    vlseg2e16.v v4, (a0)
16 ; CHECK-NEXT:    ret
17 entry:
18   %0 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) undef, ptr %base, i64 0, i64 4)
19   %1 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlseg2.mask.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %0, ptr %base, <vscale x 16 x i1> %mask, i64 0, i64 1, i64 4)
20   %2 = call <vscale x 16 x i16> @llvm.riscv.tuple.extract.nxv16i16.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %0, i32 1)
21   ret <vscale x 16 x i16> %2
24 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlsseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, i64, i64, i64)
25 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlsseg2.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, i64, <vscale x 16 x i1>, i64, i64, i64)
27 define <vscale x 16 x i16> @test_vlsseg2_mask_nxv16i16(ptr %base, i64 %offset, <vscale x 16 x i1> %mask) {
28 ; CHECK-LABEL: test_vlsseg2_mask_nxv16i16:
29 ; CHECK:       # %bb.0: # %entry
30 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, mu
31 ; CHECK-NEXT:    vlsseg2e16.v v4, (a0), a1
32 ; CHECK-NEXT:    vlsseg2e16.v v4, (a0), a1, v0.t
33 ; CHECK-NEXT:    ret
34 entry:
35   %0 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlsseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) undef, ptr %base, i64 %offset, i64 0, i64 4)
36   %1 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlsseg2.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %0, ptr %base, i64 %offset, <vscale x 16 x i1> %mask, i64 0, i64 1, i64 4)
37   %2 = call <vscale x 16 x i16> @llvm.riscv.tuple.extract.nxv16i16.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %1, i32 1)
38   ret <vscale x 16 x i16> %2
40 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vloxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, i64, i64)
41 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vloxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, <vscale x 16 x i1>, i64, i64, i64)
43 define <vscale x 16 x i16> @test_vloxseg2_mask_nxv16i16_nxv16i16(ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask) {
44 ; CHECK-LABEL: test_vloxseg2_mask_nxv16i16_nxv16i16:
45 ; CHECK:       # %bb.0: # %entry
46 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, mu
47 ; CHECK-NEXT:    vloxseg2ei16.v v12, (a0), v8
48 ; CHECK-NEXT:    vloxseg2ei16.v v12, (a0), v8, v0.t
49 ; CHECK-NEXT:    vmv4r.v v8, v16
50 ; CHECK-NEXT:    ret
51 entry:
52   %0 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vloxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) undef, ptr %base, <vscale x 16 x i16> %index, i64 0, i64 4)
53   %1 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vloxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %0, ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask, i64 0, i64 1, i64 4)
54   %2 = call <vscale x 16 x i16> @llvm.riscv.tuple.extract.nxv16i16.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %1, i32 1)
55   ret <vscale x 16 x i16> %2
58 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vluxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, i64, i64)
59 declare target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vluxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, <vscale x 16 x i1>, i64, i64, i64)
61 define <vscale x 16 x i16> @test_vluxseg2_mask_nxv16i16_nxv16i16(ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask) {
62 ; CHECK-LABEL: test_vluxseg2_mask_nxv16i16_nxv16i16:
63 ; CHECK:       # %bb.0: # %entry
64 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, mu
65 ; CHECK-NEXT:    vluxseg2ei16.v v12, (a0), v8
66 ; CHECK-NEXT:    vluxseg2ei16.v v12, (a0), v8, v0.t
67 ; CHECK-NEXT:    vmv4r.v v8, v16
68 ; CHECK-NEXT:    ret
69 entry:
70   %0 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vluxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) undef, ptr %base, <vscale x 16 x i16> %index, i64 0, i64 4)
71   %1 = tail call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vluxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %0, ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask, i64 0, i64 1, i64 4)
72   %2 = call <vscale x 16 x i16> @llvm.riscv.tuple.extract.nxv16i16.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %1, i32 1)
73   ret <vscale x 16 x i16> %2
76 declare {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} @llvm.riscv.vlseg2ff.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr , i64, i64)
77 declare {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} @llvm.riscv.vlseg2ff.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i1>, i64, i64, i64)
79 define <vscale x 16 x i16> @test_vlseg2ff_nxv16i16(ptr %base, ptr %outvl) {
80 ; CHECK-LABEL: test_vlseg2ff_nxv16i16:
81 ; CHECK:       # %bb.0: # %entry
82 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
83 ; CHECK-NEXT:    vlseg2e16ff.v v8, (a0)
84 ; CHECK-NEXT:    csrr a0, vl
85 ; CHECK-NEXT:    sd a0, 0(a1)
86 ; CHECK-NEXT:    ret
87 entry:
88   %0 = tail call {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} @llvm.riscv.vlseg2ff.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) undef, ptr %base, i64 0, i64 4)
89   %1 = extractvalue {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} %0, 0
90   %2 = call <vscale x 16 x i16> @llvm.riscv.tuple.extract.nxv16i16.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %1, i32 0)
91   %3 = extractvalue {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} %0, 1
92   store i64 %3, ptr %outvl
93   ret <vscale x 16 x i16> %2
96 define <vscale x 16 x i16> @test_vlseg2ff_mask_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i1> %mask, ptr %outvl) {
97 ; CHECK-LABEL: test_vlseg2ff_mask_nxv16i16:
98 ; CHECK:       # %bb.0: # %entry
99 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, mu
100 ; CHECK-NEXT:    vlseg2e16ff.v v8, (a0), v0.t
101 ; CHECK-NEXT:    csrr a0, vl
102 ; CHECK-NEXT:    sd a0, 0(a1)
103 ; CHECK-NEXT:    ret
104 entry:
105   %0 = tail call {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} @llvm.riscv.vlseg2ff.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i1> %mask, i64 0, i64 1, i64 4)
106   %1 = extractvalue {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} %0, 0
107   %2 = call <vscale x 16 x i16> @llvm.riscv.tuple.extract.nxv16i16.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %1, i32 0)
108   %3 = extractvalue {target("riscv.vector.tuple", <vscale x 32 x i8>, 2), i64} %0, 1
109   store i64 %3, ptr %outvl
110   ret <vscale x 16 x i16> %2
113 declare void @llvm.riscv.vsseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr , i64, i64)
114 declare void @llvm.riscv.vsseg2.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i1>, i64, i64)
116 define void @test_vsseg2_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base) {
117 ; CHECK-LABEL: test_vsseg2_nxv16i16:
118 ; CHECK:       # %bb.0: # %entry
119 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
120 ; CHECK-NEXT:    vsseg2e16.v v8, (a0)
121 ; CHECK-NEXT:    ret
122 entry:
123   tail call void @llvm.riscv.vsseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, i64 0, i64 4)
124   ret void
127 define void @test_vsseg2_mask_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i1> %mask) {
128 ; CHECK-LABEL: test_vsseg2_mask_nxv16i16:
129 ; CHECK:       # %bb.0: # %entry
130 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
131 ; CHECK-NEXT:    vsseg2e16.v v8, (a0), v0.t
132 ; CHECK-NEXT:    ret
133 entry:
134   tail call void @llvm.riscv.vsseg2.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i1> %mask, i64 0, i64 4)
135   ret void
138 declare void @llvm.riscv.vssseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, i64, i64, i64)
139 declare void @llvm.riscv.vssseg2.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, i64, <vscale x 16 x i1>, i64, i64)
141 define void @test_vssseg2_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, i64 %offset) {
142 ; CHECK-LABEL: test_vssseg2_nxv16i16:
143 ; CHECK:       # %bb.0: # %entry
144 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
145 ; CHECK-NEXT:    vssseg2e16.v v8, (a0), a1
146 ; CHECK-NEXT:    ret
147 entry:
148   tail call void @llvm.riscv.vssseg2.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, i64 %offset, i64 0, i64 4)
149   ret void
152 define void @test_vssseg2_mask_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, i64 %offset, <vscale x 16 x i1> %mask) {
153 ; CHECK-LABEL: test_vssseg2_mask_nxv16i16:
154 ; CHECK:       # %bb.0: # %entry
155 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
156 ; CHECK-NEXT:    vssseg2e16.v v8, (a0), a1, v0.t
157 ; CHECK-NEXT:    ret
158 entry:
159   tail call void @llvm.riscv.vssseg2.mask.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, i64 %offset, <vscale x 16 x i1> %mask, i64 0, i64 4)
160   ret void
163 declare void @llvm.riscv.vsoxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, i64, i64)
164 declare void @llvm.riscv.vsoxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, <vscale x 16 x i1>, i64, i64)
166 define void @test_vsoxseg2_nxv16i16_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index) {
167 ; CHECK-LABEL: test_vsoxseg2_nxv16i16_nxv16i16:
168 ; CHECK:       # %bb.0: # %entry
169 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
170 ; CHECK-NEXT:    vsoxseg2ei16.v v8, (a0), v16
171 ; CHECK-NEXT:    ret
172 entry:
173   tail call void @llvm.riscv.vsoxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index, i64 0, i64 4)
174   ret void
177 define void @test_vsoxseg2_mask_nxv16i16_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask) {
178 ; CHECK-LABEL: test_vsoxseg2_mask_nxv16i16_nxv16i16:
179 ; CHECK:       # %bb.0: # %entry
180 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
181 ; CHECK-NEXT:    vsoxseg2ei16.v v8, (a0), v16, v0.t
182 ; CHECK-NEXT:    ret
183 entry:
184   tail call void @llvm.riscv.vsoxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask, i64 0, i64 4)
185   ret void
188 declare void @llvm.riscv.vsuxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, i64, i64)
189 declare void @llvm.riscv.vsuxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2), ptr, <vscale x 16 x i16>, <vscale x 16 x i1>, i64, i64)
191 define void @test_vsuxseg2_nxv16i16_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index) {
192 ; CHECK-LABEL: test_vsuxseg2_nxv16i16_nxv16i16:
193 ; CHECK:       # %bb.0: # %entry
194 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
195 ; CHECK-NEXT:    vsuxseg2ei16.v v8, (a0), v16
196 ; CHECK-NEXT:    ret
197 entry:
198   tail call void @llvm.riscv.vsuxseg2.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index, i64 0, i64 4)
199   ret void
202 define void @test_vsuxseg2_mask_nxv16i16_nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask) {
203 ; CHECK-LABEL: test_vsuxseg2_mask_nxv16i16_nxv16i16:
204 ; CHECK:       # %bb.0: # %entry
205 ; CHECK-NEXT:    vsetivli zero, 0, e16, m4, ta, ma
206 ; CHECK-NEXT:    vsuxseg2ei16.v v8, (a0), v16, v0.t
207 ; CHECK-NEXT:    ret
208 entry:
209   tail call void @llvm.riscv.vsuxseg2.mask.triscv.vector.tuple_nxv32i8_2t.nxv16i16(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) %val, ptr %base, <vscale x 16 x i16> %index, <vscale x 16 x i1> %mask, i64 0, i64 4)
210   ret void