Skip to content

Commit e512df3

Browse files
authored
[LV] Fix crash when vectorizing function calls with linear args. (#76274)
llvm/lib/IR/Type.cpp:694: Assertion `isValidElementType(ElementType) && "Element type of a VectorType must be an integer, floating point, or pointer type."' failed. Stack dump: llvm::FixedVectorType::get(llvm::Type*, unsigned int) llvm::VPWidenCallRecipe::execute(llvm::VPTransformState&) llvm::VPBasicBlock::execute(llvm::VPTransformState*) llvm::VPRegionBlock::execute(llvm::VPTransformState*) llvm::VPlan::execute(llvm::VPTransformState*) ... Happens with function calls of void return type.
1 parent d34901f commit e512df3

File tree

4 files changed

+67
-29
lines changed

4 files changed

+67
-29
lines changed

llvm/lib/Analysis/VectorUtils.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ bool llvm::isVectorIntrinsicWithScalarOpAtArg(Intrinsic::ID ID,
123123

124124
bool llvm::isVectorIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID,
125125
int OpdIdx) {
126+
assert(ID != Intrinsic::not_intrinsic && "Not an intrinsic!");
127+
126128
switch (ID) {
127129
case Intrinsic::fptosi_sat:
128130
case Intrinsic::fptoui_sat:

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11596,10 +11596,6 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
1159611596
CallInst *CI = cast<CallInst>(VL0);
1159711597
setInsertPointAfterBundle(E);
1159811598

11599-
Intrinsic::ID IID = Intrinsic::not_intrinsic;
11600-
if (Function *FI = CI->getCalledFunction())
11601-
IID = FI->getIntrinsicID();
11602-
1160311599
Intrinsic::ID ID = getVectorIntrinsicIDForCall(CI, TLI);
1160411600

1160511601
auto VecCallCosts = getVectorCallCosts(CI, VecTy, TTI, TLI);
@@ -11610,18 +11606,18 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
1161011606
SmallVector<Value *> OpVecs;
1161111607
SmallVector<Type *, 2> TysForDecl;
1161211608
// Add return type if intrinsic is overloaded on it.
11613-
if (isVectorIntrinsicWithOverloadTypeAtArg(IID, -1))
11609+
if (UseIntrinsic && isVectorIntrinsicWithOverloadTypeAtArg(ID, -1))
1161411610
TysForDecl.push_back(
1161511611
FixedVectorType::get(CI->getType(), E->Scalars.size()));
1161611612
for (unsigned I : seq<unsigned>(0, CI->arg_size())) {
1161711613
ValueList OpVL;
1161811614
// Some intrinsics have scalar arguments. This argument should not be
1161911615
// vectorized.
11620-
if (UseIntrinsic && isVectorIntrinsicWithScalarOpAtArg(IID, I)) {
11616+
if (UseIntrinsic && isVectorIntrinsicWithScalarOpAtArg(ID, I)) {
1162111617
CallInst *CEI = cast<CallInst>(VL0);
1162211618
ScalarArg = CEI->getArgOperand(I);
1162311619
OpVecs.push_back(CEI->getArgOperand(I));
11624-
if (isVectorIntrinsicWithOverloadTypeAtArg(IID, I))
11620+
if (isVectorIntrinsicWithOverloadTypeAtArg(ID, I))
1162511621
TysForDecl.push_back(ScalarArg->getType());
1162611622
continue;
1162711623
}
@@ -11633,7 +11629,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
1163311629
}
1163411630
LLVM_DEBUG(dbgs() << "SLP: OpVec[" << I << "]: " << *OpVec << "\n");
1163511631
OpVecs.push_back(OpVec);
11636-
if (isVectorIntrinsicWithOverloadTypeAtArg(IID, I))
11632+
if (UseIntrinsic && isVectorIntrinsicWithOverloadTypeAtArg(ID, I))
1163711633
TysForDecl.push_back(OpVec->getType());
1163811634
}
1163911635

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -498,16 +498,17 @@ void VPWidenCallRecipe::execute(VPTransformState &State) {
498498
"DbgInfoIntrinsic should have been dropped during VPlan construction");
499499
State.setDebugLocFrom(CI.getDebugLoc());
500500

501+
bool UseIntrinsic = VectorIntrinsicID != Intrinsic::not_intrinsic;
501502
FunctionType *VFTy = nullptr;
502503
if (Variant)
503504
VFTy = Variant->getFunctionType();
504505
for (unsigned Part = 0; Part < State.UF; ++Part) {
505506
SmallVector<Type *, 2> TysForDecl;
506507
// Add return type if intrinsic is overloaded on it.
507-
if (isVectorIntrinsicWithOverloadTypeAtArg(VectorIntrinsicID, -1)) {
508+
if (UseIntrinsic &&
509+
isVectorIntrinsicWithOverloadTypeAtArg(VectorIntrinsicID, -1))
508510
TysForDecl.push_back(
509511
VectorType::get(CI.getType()->getScalarType(), State.VF));
510-
}
511512
SmallVector<Value *, 4> Args;
512513
for (const auto &I : enumerate(operands())) {
513514
// Some intrinsics have a scalar argument - don't replace it with a
@@ -516,18 +517,19 @@ void VPWidenCallRecipe::execute(VPTransformState &State) {
516517
// e.g. linear parameters for pointers.
517518
Value *Arg;
518519
if ((VFTy && !VFTy->getParamType(I.index())->isVectorTy()) ||
519-
(VectorIntrinsicID != Intrinsic::not_intrinsic &&
520+
(UseIntrinsic &&
520521
isVectorIntrinsicWithScalarOpAtArg(VectorIntrinsicID, I.index())))
521522
Arg = State.get(I.value(), VPIteration(0, 0));
522523
else
523524
Arg = State.get(I.value(), Part);
524-
if (isVectorIntrinsicWithOverloadTypeAtArg(VectorIntrinsicID, I.index()))
525+
if (UseIntrinsic &&
526+
isVectorIntrinsicWithOverloadTypeAtArg(VectorIntrinsicID, I.index()))
525527
TysForDecl.push_back(Arg->getType());
526528
Args.push_back(Arg);
527529
}
528530

529531
Function *VectorF;
530-
if (VectorIntrinsicID != Intrinsic::not_intrinsic) {
532+
if (UseIntrinsic) {
531533
// Use vector version of the intrinsic.
532534
Module *M = State.Builder.GetInsertBlock()->getModule();
533535
VectorF = Intrinsic::getDeclaration(M, VectorIntrinsicID, TysForDecl);

llvm/test/Transforms/LoopVectorize/AArch64/vector-call-linear-args.ll

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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
22
; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=1 -S | FileCheck %s --check-prefixes=NEON
33
; RUN: opt < %s -mattr=+sve -passes=loop-vectorize -force-vector-interleave=1 -S | FileCheck %s --check-prefixes=SVE_OR_NEON
44
; 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) {
1515
;
1616
; SVE_OR_NEON-LABEL: define void @test_linear8
1717
; 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:%.*]])
1919
; SVE_OR_NEON: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR2:[0-9]+]]
2020
;
2121
; SVE_TF-LABEL: define void @test_linear8
2222
; 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]+]]
2525
;
2626
entry:
2727
br label %for.body
@@ -48,12 +48,12 @@ define void @test_vector_linear4(ptr noalias %a, ptr readnone %b, ptr readonly %
4848
;
4949
; SVE_OR_NEON-LABEL: define void @test_vector_linear4
5050
; 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:%.*]])
5252
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @baz(i32 [[INPUT:%.*]], ptr [[GEPB:%.*]]) #[[ATTR3:[0-9]+]]
5353
;
5454
; SVE_TF-LABEL: define void @test_vector_linear4
5555
; 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]+]]
5757
;
5858
entry:
5959
br label %for.body
@@ -85,7 +85,7 @@ define void @test_linear8_bad_stride(ptr noalias %a, ptr readnone %b, i64 %n) {
8585
;
8686
; SVE_TF-LABEL: define void @test_linear8_bad_stride
8787
; 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]+]]
8989
;
9090
entry:
9191
br label %for.body
@@ -112,12 +112,12 @@ define void @test_linear16_wide_stride(ptr noalias %a, ptr readnone %b, i64 %n)
112112
;
113113
; SVE_OR_NEON-LABEL: define void @test_linear16_wide_stride
114114
; 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:%.*]])
116116
; SVE_OR_NEON: [[DATA:%.*]] = call i64 @foo(ptr [[GEPB:%.*]]) #[[ATTR4]]
117117
;
118118
; SVE_TF-LABEL: define void @test_linear16_wide_stride
119119
; 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]]
121121
;
122122
entry:
123123
br label %for.body
@@ -145,13 +145,13 @@ define void @test_linear4_linear8(ptr noalias %a, ptr readnone %b, ptr readonly
145145
;
146146
; SVE_OR_NEON-LABEL: define void @test_linear4_linear8
147147
; 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))
149149
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @quux(ptr [[GEPC:%.*]], ptr [[GEPB:%.*]]) #[[ATTR5:[0-9]+]]
150150
;
151151
; SVE_TF-LABEL: define void @test_linear4_linear8
152152
; 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]+]]
155155
;
156156
entry:
157157
br label %for.body
@@ -179,12 +179,12 @@ define void @test_linear3_non_ptr(ptr noalias %a, i64 %n) {
179179
;
180180
; SVE_OR_NEON-LABEL: define void @test_linear3_non_ptr
181181
; 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:%.*]])
183183
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @bar(i32 [[TREBLED:%.*]]) #[[ATTR6:[0-9]+]]
184184
;
185185
; SVE_TF-LABEL: define void @test_linear3_non_ptr
186186
; 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]+]]
188188
;
189189
entry:
190190
br label %for.body
@@ -212,12 +212,12 @@ define void @test_linearn5_non_ptr_neg_stride(ptr noalias %a, i64 %n) {
212212
;
213213
; SVE_OR_NEON-LABEL: define void @test_linearn5_non_ptr_neg_stride
214214
; 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:%.*]])
216216
; SVE_OR_NEON: [[DATA:%.*]] = call i32 @bar(i32 [[NEGSTRIDE:%.*]]) #[[ATTR7:[0-9]+]]
217217
;
218218
; SVE_TF-LABEL: define void @test_linearn5_non_ptr_neg_stride
219219
; 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]+]]
221221
;
222222
entry:
223223
br label %for.body
@@ -237,10 +237,44 @@ for.cond.cleanup:
237237
ret void
238238
}
239239

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+
240273
declare i64 @foo(ptr)
241274
declare i32 @baz(i32, ptr)
242275
declare i32 @quux(ptr, ptr)
243276
declare i32 @bar(i32)
277+
declare void @goo(i64, ptr)
244278

245279
; neon vector variants of foo
246280
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)
249283
declare <4 x i32> @vec_quux_linear4_linear8_nomask_neon(ptr, ptr)
250284
declare <4 x i32> @vec_bar_linear3_nomask_neon(i32)
251285
declare <4 x i32> @vec_bar_linearn5_nomask_neon(i32)
286+
declare void @vec_goo_linear8_nomask_neon(<2 x i64>, ptr)
252287

253288
; scalable vector variants of foo
254289
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>
258293
declare <vscale x 4 x i32> @vec_quux_linear4_linear8_mask_sve(ptr, ptr, <vscale x 4 x i1>)
259294
declare <vscale x 4 x i32> @vec_bar_linear3_nomask_sve(i32)
260295
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>)
261298

262299
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)" }
263300
attributes #1 = { nounwind "vector-function-abi-variant"="_ZGVsNxvl4_baz(vec_baz_vector_linear4_nomask_sve),_ZGVnN4vl4_baz(vec_baz_vector_linear4_nomask_neon)" }
264301
attributes #2 = { nounwind "vector-function-abi-variant"="_ZGVsNxl16_foo(vec_foo_linear16_nomask_sve),_ZGVnN2l16_foo(vec_foo_linear16_nomask_neon)" }
265302
attributes #3 = { nounwind "vector-function-abi-variant"="_ZGVsMxl4l8_quux(vec_quux_linear4_linear8_mask_sve),_ZGVnN4l4l8_quux(vec_quux_linear4_linear8_nomask_neon)" }
266303
attributes #4 = { nounwind "vector-function-abi-variant"="_ZGVsNxl3_bar(vec_bar_linear3_nomask_sve),_ZGVnN4l3_bar(vec_bar_linear3_nomask_neon)" }
267304
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

Comments
 (0)