1
- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --filter "call.*(foo|bar|baz|quux)" --version 2
1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --filter "call.*(foo|bar|baz|quux|goo )" --version 2
2
2
; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=1 -S | FileCheck %s --check-prefixes=NEON
3
3
; RUN: opt < %s -mattr=+sve -passes=loop-vectorize -force-vector-interleave=1 -S | FileCheck %s --check-prefixes=SVE_OR_NEON
4
4
; RUN: opt < %s -mattr=+sve -passes=loop-vectorize -force-vector-interleave=1 -S -prefer-predicate-over-epilogue=predicate-dont-vectorize | FileCheck %s --check-prefixes=SVE_TF
@@ -15,13 +15,13 @@ define void @test_linear8(ptr noalias %a, ptr readnone %b, i64 %n) {
15
15
;
16
16
; SVE_OR_NEON-LABEL: define void @test_linear8
17
17
; SVE_OR_NEON-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], i64 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
18
- ; SVE_OR_NEON: [[TMP13 :%.*]] = call <vscale x 2 x i64> @vec_foo_linear8_nomask_sve(ptr [[TMP12 :%.*]])
18
+ ; SVE_OR_NEON: [[TMP15 :%.*]] = call <vscale x 2 x i64> @vec_foo_linear8_nomask_sve(ptr [[TMP14 :%.*]])
19
19
; SVE_OR_NEON: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR2:[0-9]+]]
20
20
;
21
21
; SVE_TF-LABEL: define void @test_linear8
22
22
; SVE_TF-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], i64 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
23
- ; SVE_TF: [[TMP19 :%.*]] = call <vscale x 2 x i64> @vec_foo_linear8_mask_sve(ptr [[TMP18 :%.*]], <vscale x 2 x i1> [[ACTIVE_LANE_MASK:%.*]])
24
- ; SVE_TF: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR3 :[0-9]+]]
23
+ ; SVE_TF: [[TMP21 :%.*]] = call <vscale x 2 x i64> @vec_foo_linear8_mask_sve(ptr [[TMP20 :%.*]], <vscale x 2 x i1> [[ACTIVE_LANE_MASK:%.*]])
24
+ ; SVE_TF: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR4 :[0-9]+]]
25
25
;
26
26
entry:
27
27
br label %for.body
@@ -48,12 +48,12 @@ define void @test_vector_linear4(ptr noalias %a, ptr readnone %b, ptr readonly %
48
48
;
49
49
; SVE_OR_NEON-LABEL: define void @test_vector_linear4
50
50
; SVE_OR_NEON-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], ptr readonly [[C:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
51
- ; SVE_OR_NEON: [[TMP15 :%.*]] = call <vscale x 4 x i32> @vec_baz_vector_linear4_nomask_sve(<vscale x 4 x i32> [[WIDE_LOAD:%.*]], ptr [[TMP14 :%.*]])
51
+ ; SVE_OR_NEON: [[TMP17 :%.*]] = call <vscale x 4 x i32> @vec_baz_vector_linear4_nomask_sve(<vscale x 4 x i32> [[WIDE_LOAD:%.*]], ptr [[TMP16 :%.*]])
52
52
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @baz(i32 [[INPUT:%.*]], ptr [[GEPB:%.*]]) #[[ATTR3:[0-9]+]]
53
53
;
54
54
; SVE_TF-LABEL: define void @test_vector_linear4
55
55
; SVE_TF-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], ptr readonly [[C:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
56
- ; SVE_TF: [[DATA:%.*]] = call i32 @baz(i32 [[INPUT:%.*]], ptr [[GEPB:%.*]]) #[[ATTR4 :[0-9]+]]
56
+ ; SVE_TF: [[DATA:%.*]] = call i32 @baz(i32 [[INPUT:%.*]], ptr [[GEPB:%.*]]) #[[ATTR5 :[0-9]+]]
57
57
;
58
58
entry:
59
59
br label %for.body
@@ -85,7 +85,7 @@ define void @test_linear8_bad_stride(ptr noalias %a, ptr readnone %b, i64 %n) {
85
85
;
86
86
; SVE_TF-LABEL: define void @test_linear8_bad_stride
87
87
; SVE_TF-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
88
- ; SVE_TF: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR5 :[0-9]+]]
88
+ ; SVE_TF: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR6 :[0-9]+]]
89
89
;
90
90
entry:
91
91
br label %for.body
@@ -112,12 +112,12 @@ define void @test_linear16_wide_stride(ptr noalias %a, ptr readnone %b, i64 %n)
112
112
;
113
113
; SVE_OR_NEON-LABEL: define void @test_linear16_wide_stride
114
114
; SVE_OR_NEON-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
115
- ; SVE_OR_NEON: [[TMP14 :%.*]] = call <vscale x 2 x i64> @vec_foo_linear16_nomask_sve(ptr [[TMP13 :%.*]])
115
+ ; SVE_OR_NEON: [[TMP16 :%.*]] = call <vscale x 2 x i64> @vec_foo_linear16_nomask_sve(ptr [[TMP15 :%.*]])
116
116
; SVE_OR_NEON: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR4]]
117
117
;
118
118
; SVE_TF-LABEL: define void @test_linear16_wide_stride
119
119
; SVE_TF-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
120
- ; SVE_TF: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR5 ]]
120
+ ; SVE_TF: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR6 ]]
121
121
;
122
122
entry:
123
123
br label %for.body
@@ -145,13 +145,13 @@ define void @test_linear4_linear8(ptr noalias %a, ptr readnone %b, ptr readonly
145
145
;
146
146
; SVE_OR_NEON-LABEL: define void @test_linear4_linear8
147
147
; SVE_OR_NEON-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], ptr readonly [[C:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
148
- ; SVE_OR_NEON: [[TMP15 :%.*]] = call <vscale x 4 x i32> @vec_quux_linear4_linear8_mask_sve(ptr [[TMP13 :%.*]], ptr [[TMP14 :%.*]], <vscale x 4 x i1> shufflevector (<vscale x 4 x i1> insertelement (<vscale x 4 x i1> poison, i1 true, i64 0), <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer))
148
+ ; SVE_OR_NEON: [[TMP17 :%.*]] = call <vscale x 4 x i32> @vec_quux_linear4_linear8_mask_sve(ptr [[TMP15 :%.*]], ptr [[TMP16 :%.*]], <vscale x 4 x i1> shufflevector (<vscale x 4 x i1> insertelement (<vscale x 4 x i1> poison, i1 true, i64 0), <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer))
149
149
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @quux(ptr [[GEPC:%.*]], ptr [[GEPB:%.*]]) #[[ATTR5:[0-9]+]]
150
150
;
151
151
; SVE_TF-LABEL: define void @test_linear4_linear8
152
152
; SVE_TF-SAME: (ptr noalias [[A:%.*]], ptr readnone [[B:%.*]], ptr readonly [[C:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
153
- ; SVE_TF: [[TMP21 :%.*]] = call <vscale x 4 x i32> @vec_quux_linear4_linear8_mask_sve(ptr [[TMP19 :%.*]], ptr [[TMP20 :%.*]], <vscale x 4 x i1> [[ACTIVE_LANE_MASK:%.*]])
154
- ; SVE_TF: [[DATA:%.*]] = call i32 @quux(ptr [[GEPC:%.*]], ptr [[GEPB:%.*]]) #[[ATTR6 :[0-9]+]]
153
+ ; SVE_TF: [[TMP23 :%.*]] = call <vscale x 4 x i32> @vec_quux_linear4_linear8_mask_sve(ptr [[TMP21 :%.*]], ptr [[TMP22 :%.*]], <vscale x 4 x i1> [[ACTIVE_LANE_MASK:%.*]])
154
+ ; SVE_TF: [[DATA:%.*]] = call i32 @quux(ptr [[GEPC:%.*]], ptr [[GEPB:%.*]]) #[[ATTR7 :[0-9]+]]
155
155
;
156
156
entry:
157
157
br label %for.body
@@ -179,12 +179,12 @@ define void @test_linear3_non_ptr(ptr noalias %a, i64 %n) {
179
179
;
180
180
; SVE_OR_NEON-LABEL: define void @test_linear3_non_ptr
181
181
; SVE_OR_NEON-SAME: (ptr noalias [[A:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
182
- ; SVE_OR_NEON: [[TMP13 :%.*]] = call <vscale x 4 x i32> @vec_bar_linear3_nomask_sve(i32 [[TMP12 :%.*]])
182
+ ; SVE_OR_NEON: [[TMP15 :%.*]] = call <vscale x 4 x i32> @vec_bar_linear3_nomask_sve(i32 [[TMP14 :%.*]])
183
183
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @bar(i32 [[TREBLED:%.*]]) #[[ATTR6:[0-9]+]]
184
184
;
185
185
; SVE_TF-LABEL: define void @test_linear3_non_ptr
186
186
; SVE_TF-SAME: (ptr noalias [[A:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
187
- ; SVE_TF: [[DATA:%.*]] = call i32 @bar(i32 [[TREBLED:%.*]]) #[[ATTR7 :[0-9]+]]
187
+ ; SVE_TF: [[DATA:%.*]] = call i32 @bar(i32 [[TREBLED:%.*]]) #[[ATTR8 :[0-9]+]]
188
188
;
189
189
entry:
190
190
br label %for.body
@@ -212,12 +212,12 @@ define void @test_linearn5_non_ptr_neg_stride(ptr noalias %a, i64 %n) {
212
212
;
213
213
; SVE_OR_NEON-LABEL: define void @test_linearn5_non_ptr_neg_stride
214
214
; SVE_OR_NEON-SAME: (ptr noalias [[A:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
215
- ; SVE_OR_NEON: [[TMP13 :%.*]] = call <vscale x 4 x i32> @vec_bar_linearn5_nomask_sve(i32 [[TMP12 :%.*]])
215
+ ; SVE_OR_NEON: [[TMP15 :%.*]] = call <vscale x 4 x i32> @vec_bar_linearn5_nomask_sve(i32 [[TMP14 :%.*]])
216
216
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @bar(i32 [[NEGSTRIDE:%.*]]) #[[ATTR7:[0-9]+]]
217
217
;
218
218
; SVE_TF-LABEL: define void @test_linearn5_non_ptr_neg_stride
219
219
; SVE_TF-SAME: (ptr noalias [[A:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
220
- ; SVE_TF: [[DATA:%.*]] = call i32 @bar(i32 [[NEGSTRIDE:%.*]]) #[[ATTR8 :[0-9]+]]
220
+ ; SVE_TF: [[DATA:%.*]] = call i32 @bar(i32 [[NEGSTRIDE:%.*]]) #[[ATTR9 :[0-9]+]]
221
221
;
222
222
entry:
223
223
br label %for.body
@@ -237,10 +237,44 @@ for.cond.cleanup:
237
237
ret void
238
238
}
239
239
240
+ define void @test_linear8_return_void (ptr noalias %in , ptr noalias %out , i64 %n ) {
241
+ ; NEON-LABEL: define void @test_linear8_return_void
242
+ ; NEON-SAME: (ptr noalias [[IN:%.*]], ptr noalias [[OUT:%.*]], i64 [[N:%.*]]) {
243
+ ; NEON: call void @vec_goo_linear8_nomask_neon(<2 x i64> [[WIDE_LOAD:%.*]], ptr [[TMP4:%.*]])
244
+ ; NEON: call void @goo(i64 [[NUM:%.*]], ptr [[GEP_OUT:%.*]]) #[[ATTR6:[0-9]+]]
245
+ ;
246
+ ; SVE_OR_NEON-LABEL: define void @test_linear8_return_void
247
+ ; SVE_OR_NEON-SAME: (ptr noalias [[IN:%.*]], ptr noalias [[OUT:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
248
+ ; SVE_OR_NEON: call void @vec_goo_linear8_nomask_sve(<vscale x 2 x i64> [[WIDE_LOAD:%.*]], ptr [[TMP16:%.*]])
249
+ ; SVE_OR_NEON: call void @goo(i64 [[NUM:%.*]], ptr [[GEP_OUT:%.*]]) #[[ATTR8:[0-9]+]]
250
+ ;
251
+ ; SVE_TF-LABEL: define void @test_linear8_return_void
252
+ ; SVE_TF-SAME: (ptr noalias [[IN:%.*]], ptr noalias [[OUT:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
253
+ ; SVE_TF: call void @vec_goo_linear8_mask_sve(<vscale x 2 x i64> [[WIDE_MASKED_LOAD:%.*]], ptr [[TMP22:%.*]], <vscale x 2 x i1> [[ACTIVE_LANE_MASK:%.*]])
254
+ ; SVE_TF: call void @goo(i64 [[NUM:%.*]], ptr [[GEP_OUT:%.*]]) #[[ATTR10:[0-9]+]]
255
+ ;
256
+ entry:
257
+ br label %for.body
258
+
259
+ for.body:
260
+ %indvars.iv = phi i64 [ 0 , %entry ], [ %indvars.iv.next , %for.body ]
261
+ %gep.in = getelementptr i64 , ptr %in , i64 %indvars.iv
262
+ %num = load i64 , ptr %gep.in , align 8
263
+ %gep.out = getelementptr i64 , ptr %out , i64 %indvars.iv
264
+ call void @goo (i64 %num , ptr %gep.out ) #6
265
+ %indvars.iv.next = add nuw nsw i64 %indvars.iv , 1
266
+ %exitcond = icmp eq i64 %indvars.iv.next , %n
267
+ br i1 %exitcond , label %for.cond.cleanup , label %for.body
268
+
269
+ for.cond.cleanup:
270
+ ret void
271
+ }
272
+
240
273
declare i64 @foo (ptr )
241
274
declare i32 @baz (i32 , ptr )
242
275
declare i32 @quux (ptr , ptr )
243
276
declare i32 @bar (i32 )
277
+ declare void @goo (i64 , ptr )
244
278
245
279
; neon vector variants of foo
246
280
declare <2 x i64 > @vec_foo_linear8_nomask_neon (ptr )
@@ -249,6 +283,7 @@ declare <4 x i32> @vec_baz_vector_linear4_nomask_neon(<4 x i32>, ptr)
249
283
declare <4 x i32 > @vec_quux_linear4_linear8_nomask_neon (ptr , ptr )
250
284
declare <4 x i32 > @vec_bar_linear3_nomask_neon (i32 )
251
285
declare <4 x i32 > @vec_bar_linearn5_nomask_neon (i32 )
286
+ declare void @vec_goo_linear8_nomask_neon (<2 x i64 >, ptr )
252
287
253
288
; scalable vector variants of foo
254
289
declare <vscale x 2 x i64 > @vec_foo_linear8_mask_sve (ptr , <vscale x 2 x i1 >)
@@ -258,10 +293,13 @@ declare <vscale x 4 x i32> @vec_baz_vector_linear4_nomask_sve(<vscale x 4 x i32>
258
293
declare <vscale x 4 x i32 > @vec_quux_linear4_linear8_mask_sve (ptr , ptr , <vscale x 4 x i1 >)
259
294
declare <vscale x 4 x i32 > @vec_bar_linear3_nomask_sve (i32 )
260
295
declare <vscale x 4 x i32 > @vec_bar_linearn5_nomask_sve (i32 )
296
+ declare void @vec_goo_linear8_nomask_sve (<vscale x 2 x i64 >, ptr )
297
+ declare void @vec_goo_linear8_mask_sve (<vscale x 2 x i64 >, ptr , <vscale x 2 x i1 >)
261
298
262
299
attributes #0 = { nounwind "vector-function-abi-variant" ="_ZGVsNxl8_foo(vec_foo_linear8_nomask_sve),_ZGVsMxl8_foo(vec_foo_linear8_mask_sve),_ZGVnN2l8_foo(vec_foo_linear8_nomask_neon)" }
263
300
attributes #1 = { nounwind "vector-function-abi-variant" ="_ZGVsNxvl4_baz(vec_baz_vector_linear4_nomask_sve),_ZGVnN4vl4_baz(vec_baz_vector_linear4_nomask_neon)" }
264
301
attributes #2 = { nounwind "vector-function-abi-variant" ="_ZGVsNxl16_foo(vec_foo_linear16_nomask_sve),_ZGVnN2l16_foo(vec_foo_linear16_nomask_neon)" }
265
302
attributes #3 = { nounwind "vector-function-abi-variant" ="_ZGVsMxl4l8_quux(vec_quux_linear4_linear8_mask_sve),_ZGVnN4l4l8_quux(vec_quux_linear4_linear8_nomask_neon)" }
266
303
attributes #4 = { nounwind "vector-function-abi-variant" ="_ZGVsNxl3_bar(vec_bar_linear3_nomask_sve),_ZGVnN4l3_bar(vec_bar_linear3_nomask_neon)" }
267
304
attributes #5 = { nounwind "vector-function-abi-variant" ="_ZGVsNxln5_bar(vec_bar_linearn5_nomask_sve),_ZGVnN4ln5_bar(vec_bar_linearn5_nomask_neon)" }
305
+ attributes #6 = { nounwind "vector-function-abi-variant" ="_ZGVsNxvl8_goo(vec_goo_linear8_nomask_sve),_ZGVsMxvl8_goo(vec_goo_linear8_mask_sve),_ZGVsN2vl8_goo(vec_goo_linear8_nomask_neon)" }
0 commit comments