[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-intrinsics-contiguous-prefetches.ll
blob8b5f23e5b09878e5cf048acf88327c4b55057c3c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
3 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme < %s | FileCheck %s
6 ; Testing prfop encodings
8 define void @test_svprf_pldl1strm(<vscale x 16 x i1> %pg, ptr %base) {
9 ; CHECK-LABEL: test_svprf_pldl1strm:
10 ; CHECK:       // %bb.0: // %entry
11 ; CHECK-NEXT:    prfb pldl1strm, p0, [x0]
12 ; CHECK-NEXT:    ret
13 entry:
14   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 1)
15   ret void
18 define void @test_svprf_pldl2keep(<vscale x 16 x i1> %pg, ptr %base) {
19 ; CHECK-LABEL: test_svprf_pldl2keep:
20 ; CHECK:       // %bb.0: // %entry
21 ; CHECK-NEXT:    prfb pldl2keep, p0, [x0]
22 ; CHECK-NEXT:    ret
23 entry:
24   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 2)
25   ret void
28 define void @test_svprf_pldl2strm(<vscale x 16 x i1> %pg, ptr %base) {
29 ; CHECK-LABEL: test_svprf_pldl2strm:
30 ; CHECK:       // %bb.0: // %entry
31 ; CHECK-NEXT:    prfb pldl2strm, p0, [x0]
32 ; CHECK-NEXT:    ret
33 entry:
34   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 3)
35   ret void
38 define void @test_svprf_pldl3keep(<vscale x 16 x i1> %pg, ptr %base) {
39 ; CHECK-LABEL: test_svprf_pldl3keep:
40 ; CHECK:       // %bb.0: // %entry
41 ; CHECK-NEXT:    prfb pldl3keep, p0, [x0]
42 ; CHECK-NEXT:    ret
43 entry:
44   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 4)
45   ret void
48 define void @test_svprf_pldl3strm(<vscale x 16 x i1> %pg, ptr %base) {
49 ; CHECK-LABEL: test_svprf_pldl3strm:
50 ; CHECK:       // %bb.0: // %entry
51 ; CHECK-NEXT:    prfb pldl3strm, p0, [x0]
52 ; CHECK-NEXT:    ret
53 entry:
54   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 5)
55   ret void
58 define void @test_svprf_pstl1keep(<vscale x 16 x i1> %pg, ptr %base) {
59 ; CHECK-LABEL: test_svprf_pstl1keep:
60 ; CHECK:       // %bb.0: // %entry
61 ; CHECK-NEXT:    prfb pstl1keep, p0, [x0]
62 ; CHECK-NEXT:    ret
63 entry:
64   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 8)
65   ret void
68 define void @test_svprf_pstl1strm(<vscale x 16 x i1> %pg, ptr %base) {
69 ; CHECK-LABEL: test_svprf_pstl1strm:
70 ; CHECK:       // %bb.0: // %entry
71 ; CHECK-NEXT:    prfb pstl1strm, p0, [x0]
72 ; CHECK-NEXT:    ret
73 entry:
74   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 9)
75   ret void
78 define void @test_svprf_pstl2keep(<vscale x 16 x i1> %pg, ptr %base) {
79 ; CHECK-LABEL: test_svprf_pstl2keep:
80 ; CHECK:       // %bb.0: // %entry
81 ; CHECK-NEXT:    prfb pstl2keep, p0, [x0]
82 ; CHECK-NEXT:    ret
83 entry:
84   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 10)
85   ret void
88 define void @test_svprf_pstl2strm(<vscale x 16 x i1> %pg, ptr %base) {
89 ; CHECK-LABEL: test_svprf_pstl2strm:
90 ; CHECK:       // %bb.0: // %entry
91 ; CHECK-NEXT:    prfb pstl2strm, p0, [x0]
92 ; CHECK-NEXT:    ret
93 entry:
94   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 11)
95   ret void
98 define void @test_svprf_pstl3keep(<vscale x 16 x i1> %pg, ptr %base) {
99 ; CHECK-LABEL: test_svprf_pstl3keep:
100 ; CHECK:       // %bb.0: // %entry
101 ; CHECK-NEXT:    prfb pstl3keep, p0, [x0]
102 ; CHECK-NEXT:    ret
103 entry:
104   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 12)
105   ret void
108 define void @test_svprf_pstl3strm(<vscale x 16 x i1> %pg, ptr %base) {
109 ; CHECK-LABEL: test_svprf_pstl3strm:
110 ; CHECK:       // %bb.0: // %entry
111 ; CHECK-NEXT:    prfb pstl3strm, p0, [x0]
112 ; CHECK-NEXT:    ret
113 entry:
114   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 13)
115   ret void
119 ; Testing imm limits of SI form
122 define void @test_svprf_vnum_under(<vscale x 16 x i1> %pg, <vscale x 16 x i8>* %base) {
123 ; CHECK-LABEL: test_svprf_vnum_under:
124 ; CHECK:       // %bb.0: // %entry
125 ; CHECK-NEXT:    rdvl x8, #1
126 ; CHECK-NEXT:    mov x9, #-528
127 ; CHECK-NEXT:    lsr x8, x8, #4
128 ; CHECK-NEXT:    mul x8, x8, x9
129 ; CHECK-NEXT:    prfb pstl3strm, p0, [x0, x8]
130 ; CHECK-NEXT:    ret
131 entry:
132   %gep = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %base, i64 -33, i64 0
133   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)
134   ret void
137 define void @test_svprf_vnum_min(<vscale x 16 x i1> %pg, <vscale x 16 x i8>* %base) {
138 ; CHECK-LABEL: test_svprf_vnum_min:
139 ; CHECK:       // %bb.0: // %entry
140 ; CHECK-NEXT:    prfb pstl3strm, p0, [x0, #-32, mul vl]
141 ; CHECK-NEXT:    ret
142 entry:
143   %gep = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %base, i64 -32, i64 0
144   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)
145   ret void
148 define void @test_svprf_vnum_over(<vscale x 16 x i1> %pg, <vscale x 16 x i8>* %base) {
149 ; CHECK-LABEL: test_svprf_vnum_over:
150 ; CHECK:       // %bb.0: // %entry
151 ; CHECK-NEXT:    rdvl x8, #1
152 ; CHECK-NEXT:    mov w9, #512
153 ; CHECK-NEXT:    lsr x8, x8, #4
154 ; CHECK-NEXT:    mul x8, x8, x9
155 ; CHECK-NEXT:    prfb pstl3strm, p0, [x0, x8]
156 ; CHECK-NEXT:    ret
157 entry:
158   %gep = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %base, i64 32, i64 0
159   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)
160   ret void
163 define void @test_svprf_vnum_max(<vscale x 16 x i1> %pg, <vscale x 16 x i8>* %base) {
164 ; CHECK-LABEL: test_svprf_vnum_max:
165 ; CHECK:       // %bb.0: // %entry
166 ; CHECK-NEXT:    prfb pstl3strm, p0, [x0, #31, mul vl]
167 ; CHECK-NEXT:    ret
168 entry:
169   %gep = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %base, i64 31, i64 0
170   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)
171   ret void
175 ; scalar contiguous
178 define void @test_svprfb(<vscale x 16 x i1> %pg, ptr %base) {
179 ; CHECK-LABEL: test_svprfb:
180 ; CHECK:       // %bb.0: // %entry
181 ; CHECK-NEXT:    prfb pldl1keep, p0, [x0]
182 ; CHECK-NEXT:    ret
183 entry:
184   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 0)
185   ret void
188 define void @test_svprfh(<vscale x 8 x i1> %pg, ptr %base) {
189 ; CHECK-LABEL: test_svprfh:
190 ; CHECK:       // %bb.0: // %entry
191 ; CHECK-NEXT:    prfh pldl1keep, p0, [x0]
192 ; CHECK-NEXT:    ret
193 entry:
194   tail call void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1> %pg, ptr %base, i32 0)
195   ret void
198 define void @test_svprfw(<vscale x 4 x i1> %pg, ptr %base) {
199 ; CHECK-LABEL: test_svprfw:
200 ; CHECK:       // %bb.0: // %entry
201 ; CHECK-NEXT:    prfw pldl1keep, p0, [x0]
202 ; CHECK-NEXT:    ret
203 entry:
204   tail call void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1> %pg, ptr %base, i32 0)
205   ret void
208 define void @test_svprfd(<vscale x 2 x i1> %pg, ptr %base) {
209 ; CHECK-LABEL: test_svprfd:
210 ; CHECK:       // %bb.0: // %entry
211 ; CHECK-NEXT:    prfd pldl1keep, p0, [x0]
212 ; CHECK-NEXT:    ret
213 entry:
214   tail call void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %pg, ptr %base, i32 0)
215   ret void
219 ; scalar + imm contiguous
221 ; imm form of prfb is tested above
223 define void @test_svprfh_vnum(<vscale x 8 x i1> %pg, <vscale x 8 x i16>* %base) {
224 ; CHECK-LABEL: test_svprfh_vnum:
225 ; CHECK:       // %bb.0: // %entry
226 ; CHECK-NEXT:    prfh pstl3strm, p0, [x0, #31, mul vl]
227 ; CHECK-NEXT:    ret
228 entry:
229   %gep = getelementptr <vscale x 8 x i16>, <vscale x 8 x i16>* %base, i64 31
230   %addr = bitcast <vscale x 8 x i16>* %gep to ptr
231   tail call void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1> %pg, ptr %addr, i32 13)
232   ret void
235 define void @test_svprfw_vnum(<vscale x 4 x i1> %pg, <vscale x 4 x i32>* %base) {
236 ; CHECK-LABEL: test_svprfw_vnum:
237 ; CHECK:       // %bb.0: // %entry
238 ; CHECK-NEXT:    prfw pstl3strm, p0, [x0, #31, mul vl]
239 ; CHECK-NEXT:    ret
240 entry:
241   %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %base, i64 31
242   %addr = bitcast <vscale x 4 x i32>* %gep to ptr
243   tail call void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1> %pg, ptr %addr, i32 13)
244   ret void
247 define void @test_svprfd_vnum(<vscale x 2 x i1> %pg, <vscale x 2 x i64>* %base) {
248 ; CHECK-LABEL: test_svprfd_vnum:
249 ; CHECK:       // %bb.0: // %entry
250 ; CHECK-NEXT:    prfd pstl3strm, p0, [x0, #31, mul vl]
251 ; CHECK-NEXT:    ret
252 entry:
253   %gep = getelementptr <vscale x 2 x i64>, <vscale x 2 x i64>* %base, i64 31
254   %addr = bitcast <vscale x 2 x i64>* %gep to ptr
255   tail call void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %pg, ptr %addr, i32 13)
256   ret void
260 ; scalar + scaled scalar contiguous
263 define void @test_svprfb_ss(<vscale x 16 x i1> %pg, ptr %base, i64 %offset) {
264 ; CHECK-LABEL: test_svprfb_ss:
265 ; CHECK:       // %bb.0: // %entry
266 ; CHECK-NEXT:    prfb pstl3strm, p0, [x0, x1]
267 ; CHECK-NEXT:    ret
268 entry:
269   %addr = getelementptr i8, ptr %base, i64 %offset
270   tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %addr, i32 13)
271   ret void
274 define void @test_svprfh_ss(<vscale x 8 x i1> %pg, ptr %base, i64 %offset) {
275 ; CHECK-LABEL: test_svprfh_ss:
276 ; CHECK:       // %bb.0: // %entry
277 ; CHECK-NEXT:    prfh pstl3strm, p0, [x0, x1, lsl #1]
278 ; CHECK-NEXT:    ret
279 entry:
280   %gep = getelementptr i16, ptr %base, i64 %offset
281   tail call void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1> %pg, ptr %gep, i32 13)
282   ret void
285 define void @test_svprfw_ss(<vscale x 4 x i1> %pg, ptr %base, i64 %offset) {
286 ; CHECK-LABEL: test_svprfw_ss:
287 ; CHECK:       // %bb.0: // %entry
288 ; CHECK-NEXT:    prfw pstl3strm, p0, [x0, x1, lsl #2]
289 ; CHECK-NEXT:    ret
290 entry:
291   %gep = getelementptr i32, ptr %base, i64 %offset
292   tail call void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1> %pg, ptr %gep, i32 13)
293   ret void
296 define void @test_svprfd_ss(<vscale x 2 x i1> %pg, ptr %base, i64 %offset) {
297 ; CHECK-LABEL: test_svprfd_ss:
298 ; CHECK:       // %bb.0: // %entry
299 ; CHECK-NEXT:    prfd pstl3strm, p0, [x0, x1, lsl #3]
300 ; CHECK-NEXT:    ret
301 entry:
302   %gep = getelementptr i64, ptr %base, i64 %offset
303   tail call void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %pg, ptr %gep, i32 13)
304   ret void
308 declare void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1>, ptr, i32)
309 declare void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1>,  ptr, i32)
310 declare void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1>,  ptr, i32)
311 declare void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1>,  ptr, i32)