Skip to content

Commit 3574b61

Browse files
authored
[VFABI] Reject demangled variants with unexpected number of params. (#76855)
When demangling a vector variant we are not checking that the number of parameters is the same as that of the scalar function. This check is hoisted out of getScalableECFromSignature() making the equvalent check in the unittests obsolete.
1 parent 2642240 commit 3574b61

File tree

2 files changed

+11
-46
lines changed

2 files changed

+11
-46
lines changed

llvm/lib/Analysis/VFABIDemangling.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,10 +326,6 @@ getScalableECFromSignature(const FunctionType *Signature, const VFISAKind ISA,
326326
// Only vector parameters are used when determining the VF; uniform or
327327
// linear are left as scalars, so do not affect VF.
328328
if (Param.ParamKind == VFParamKind::Vector) {
329-
// If the scalar function doesn't actually have a corresponding argument,
330-
// reject the mapping.
331-
if (Param.ParamPos >= Signature->getNumParams())
332-
return std::nullopt;
333329
Type *PTy = Signature->getParamType(Param.ParamPos);
334330

335331
std::optional<ElementCount> EC = getElementCountForTy(ISA, PTy);
@@ -427,6 +423,11 @@ std::optional<VFInfo> VFABI::tryDemangleForVFABI(StringRef MangledName,
427423
if (Parameters.empty())
428424
return std::nullopt;
429425

426+
// If the number of arguments of the scalar function does not match the
427+
// vector variant we have just demangled then reject the mapping.
428+
if (Parameters.size() != FTy->getNumParams())
429+
return std::nullopt;
430+
430431
// Figure out the number of lanes in vectors for this function variant. This
431432
// is easy for fixed length, as the vlen encoding just gives us the value
432433
// directly. However, if the vlen mangling indicated that this function

llvm/unittests/Analysis/VectorFunctionABITest.cpp

Lines changed: 6 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,6 @@ class VFABIParserTest : public ::testing::Test {
8888
/// Returns whether the parsed function contains a mask.
8989
bool isMasked() const { return Info.isMasked(); }
9090

91-
/// Check if the number of vectorized parameters matches the scalar ones. This
92-
/// requires a correct scalar FunctionType string to be fed to the
93-
/// 'invokeParser'. Mask parameters that are only required by the vector
94-
/// function call are ignored.
95-
bool matchParametersNum() {
96-
return (Parameters.size() - isMasked()) == ScalarFTy->getNumParams();
97-
}
98-
9991
FunctionType *getFunctionType() {
10092
return VFABI::createFunctionType(Info, ScalarFTy);
10193
}
@@ -162,7 +154,6 @@ TEST_F(VFABIParserTest, ParamListParsing) {
162154
invokeParser("_ZGVnN2vl16Ls32R3l_foo", "void(i32, i32, i32, ptr, i32)"));
163155
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
164156
EXPECT_EQ(false, isMasked());
165-
EXPECT_TRUE(matchParametersNum());
166157
FunctionType *FTy = FunctionType::get(
167158
Type::getVoidTy(Ctx),
168159
{VectorType::get(Type::getInt32Ty(Ctx), ElementCount::getFixed(2)),
@@ -184,7 +175,6 @@ TEST_F(VFABIParserTest, ScalarNameAndVectorName_01) {
184175
EXPECT_TRUE(invokeParser("_ZGVnM2v_foo(vector_foo)", "void(i32)"));
185176
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
186177
EXPECT_EQ(true, isMasked());
187-
EXPECT_TRUE(matchParametersNum());
188178
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
189179
EXPECT_EQ(ScalarName, "foo");
190180
EXPECT_EQ(VectorName, "vector_foo");
@@ -194,7 +184,6 @@ TEST_F(VFABIParserTest, ScalarNameAndVectorName_02) {
194184
EXPECT_TRUE(invokeParser("_ZGVnM2v_foo(vector_foo)", "void(i32)"));
195185
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
196186
EXPECT_EQ(true, isMasked());
197-
EXPECT_TRUE(matchParametersNum());
198187
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
199188
EXPECT_EQ(ScalarName, "foo");
200189
EXPECT_EQ(VectorName, "vector_foo");
@@ -205,14 +194,13 @@ TEST_F(VFABIParserTest, ScalarNameAndVectorName_03) {
205194
invokeParser("_ZGVnM2v___foo_bar_abc(fooBarAbcVec)", "void(i32)"));
206195
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
207196
EXPECT_EQ(true, isMasked());
208-
EXPECT_TRUE(matchParametersNum());
209197
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
210198
EXPECT_EQ(ScalarName, "__foo_bar_abc");
211199
EXPECT_EQ(VectorName, "fooBarAbcVec");
212200
}
213201

214202
TEST_F(VFABIParserTest, ScalarNameOnly) {
215-
EXPECT_TRUE(invokeParser("_ZGVnM2v___foo_bar_abc"));
203+
EXPECT_TRUE(invokeParser("_ZGVnM2v___foo_bar_abc", "void(i32)"));
216204
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
217205
EXPECT_EQ(true, isMasked());
218206
EXPECT_EQ(ScalarName, "__foo_bar_abc");
@@ -227,7 +215,6 @@ TEST_F(VFABIParserTest, Parse) {
227215
"void(i32, i32, i32, i32, ptr, i32, i32, i32, ptr)"));
228216
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
229217
EXPECT_FALSE(isMasked());
230-
EXPECT_TRUE(matchParametersNum());
231218
FunctionType *FTy = FunctionType::get(
232219
Type::getVoidTy(Ctx),
233220
{
@@ -262,7 +249,6 @@ TEST_F(VFABIParserTest, ParseVectorName) {
262249
EXPECT_TRUE(invokeParser("_ZGVnN2v_foo(vector_foo)", "void(i32)"));
263250
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
264251
EXPECT_FALSE(isMasked());
265-
EXPECT_TRUE(matchParametersNum());
266252
EXPECT_EQ(getFunctionType(), FTyNoMaskVLen2_i32);
267253
EXPECT_EQ(VF, ElementCount::getFixed(2));
268254
EXPECT_EQ(Parameters.size(), (unsigned)1);
@@ -276,7 +262,6 @@ TEST_F(VFABIParserTest, LinearWithCompileTimeNegativeStep) {
276262
"void(i32, i32, i32, ptr)"));
277263
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
278264
EXPECT_FALSE(isMasked());
279-
EXPECT_TRUE(matchParametersNum());
280265
FunctionType *FTy = FunctionType::get(
281266
Type::getVoidTy(Ctx),
282267
{Type::getInt32Ty(Ctx), Type::getInt32Ty(Ctx), Type::getInt32Ty(Ctx),
@@ -297,7 +282,6 @@ TEST_F(VFABIParserTest, ParseScalableSVE) {
297282
EXPECT_TRUE(invokeParser("_ZGVsMxv_foo(vector_foo)", "void(i32)"));
298283
EXPECT_EQ(ISA, VFISAKind::SVE);
299284
EXPECT_TRUE(isMasked());
300-
EXPECT_TRUE(matchParametersNum());
301285
EXPECT_EQ(getFunctionType(), FTyMaskedVLA_i32);
302286
EXPECT_EQ(VF, ElementCount::getScalable(4));
303287
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -311,7 +295,6 @@ TEST_F(VFABIParserTest, ParseFixedWidthSVE) {
311295
EXPECT_TRUE(invokeParser("_ZGVsM2v_foo(vector_foo)", "void(i32)"));
312296
EXPECT_EQ(ISA, VFISAKind::SVE);
313297
EXPECT_TRUE(isMasked());
314-
EXPECT_TRUE(matchParametersNum());
315298
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
316299
EXPECT_EQ(VF, ElementCount::getFixed(2));
317300
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -329,24 +312,23 @@ TEST_F(VFABIParserTest, NotAVectorFunctionABIName) {
329312
TEST_F(VFABIParserTest, LinearWithRuntimeStep) {
330313
EXPECT_FALSE(invokeParser("_ZGVnN2ls_foo"))
331314
<< "A number should be present after \"ls\".";
332-
EXPECT_TRUE(invokeParser("_ZGVnN2ls2_foo"));
315+
EXPECT_TRUE(invokeParser("_ZGVnN2ls2_foo", "void(i32)"));
333316
EXPECT_FALSE(invokeParser("_ZGVnN2Rs_foo"))
334317
<< "A number should be present after \"Rs\".";
335-
EXPECT_TRUE(invokeParser("_ZGVnN2Rs4_foo"));
318+
EXPECT_TRUE(invokeParser("_ZGVnN2Rs4_foo", "void(i32)"));
336319
EXPECT_FALSE(invokeParser("_ZGVnN2Ls_foo"))
337320
<< "A number should be present after \"Ls\".";
338-
EXPECT_TRUE(invokeParser("_ZGVnN2Ls6_foo"));
321+
EXPECT_TRUE(invokeParser("_ZGVnN2Ls6_foo", "void(i32)"));
339322
EXPECT_FALSE(invokeParser("_ZGVnN2Us_foo"))
340323
<< "A number should be present after \"Us\".";
341-
EXPECT_TRUE(invokeParser("_ZGVnN2Us8_foo"));
324+
EXPECT_TRUE(invokeParser("_ZGVnN2Us8_foo", "void(i32)"));
342325
}
343326

344327
TEST_F(VFABIParserTest, LinearWithoutCompileTime) {
345328
EXPECT_TRUE(invokeParser("_ZGVnN3lLRUlnLnRnUn_foo(vector_foo)",
346329
"void(i32, i32, ptr, i32, i32, i32, ptr, i32)"));
347330
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
348331
EXPECT_FALSE(isMasked());
349-
EXPECT_TRUE(matchParametersNum());
350332
FunctionType *FTy = FunctionType::get(
351333
Type::getVoidTy(Ctx),
352334
{Type::getInt32Ty(Ctx), Type::getInt32Ty(Ctx),
@@ -373,7 +355,6 @@ TEST_F(VFABIParserTest, LLVM_ISA) {
373355
EXPECT_TRUE(invokeParser("_ZGV_LLVM_N2v_foo(vector_foo)", "void(i32)"));
374356
EXPECT_EQ(ISA, VFISAKind::LLVM);
375357
EXPECT_FALSE(isMasked());
376-
EXPECT_TRUE(matchParametersNum());
377358
EXPECT_EQ(getFunctionType(), FTyNoMaskVLen2_i32);
378359
EXPECT_EQ(Parameters.size(), (unsigned)1);
379360
EXPECT_EQ(Parameters[0], VFParameter({0, VFParamKind::Vector}));
@@ -393,7 +374,6 @@ TEST_F(VFABIParserTest, Align) {
393374
EXPECT_TRUE(invokeParser("_ZGVsN2l2a2_foo(vector_foo)", "void(i32)"));
394375
EXPECT_EQ(ISA, VFISAKind::SVE);
395376
EXPECT_FALSE(isMasked());
396-
EXPECT_TRUE(matchParametersNum());
397377
EXPECT_EQ(Parameters.size(), (unsigned)1);
398378
EXPECT_EQ(Parameters[0].Alignment, Align(2));
399379
EXPECT_EQ(ScalarName, "foo");
@@ -409,7 +389,7 @@ TEST_F(VFABIParserTest, Align) {
409389
EXPECT_FALSE(invokeParser("_ZGVsM2a2_foo"));
410390
// Alignment must be a power of 2.
411391
EXPECT_FALSE(invokeParser("_ZGVsN2l2a0_foo"));
412-
EXPECT_TRUE(invokeParser("_ZGVsN2l2a1_foo"));
392+
EXPECT_TRUE(invokeParser("_ZGVsN2l2a1_foo", "void(i32)"));
413393
EXPECT_FALSE(invokeParser("_ZGVsN2l2a3_foo"));
414394
EXPECT_FALSE(invokeParser("_ZGVsN2l2a6_foo"));
415395
}
@@ -418,7 +398,6 @@ TEST_F(VFABIParserTest, ParseUniform) {
418398
EXPECT_TRUE(invokeParser("_ZGVnN2u_foo(vector_foo)", "void(i32)"));
419399
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
420400
EXPECT_FALSE(isMasked());
421-
EXPECT_TRUE(matchParametersNum());
422401
FunctionType *FTy =
423402
FunctionType::get(Type::getVoidTy(Ctx), {Type::getInt32Ty(Ctx)}, false);
424403
EXPECT_EQ(getFunctionType(), FTy);
@@ -463,7 +442,6 @@ TEST_F(VFABIParserTest, ISAIndependentMangling) {
463442
do { \
464443
EXPECT_EQ(VF, ElementCount::getFixed(2)); \
465444
EXPECT_FALSE(isMasked()); \
466-
EXPECT_TRUE(matchParametersNum()); \
467445
EXPECT_EQ(getFunctionType(), FTy); \
468446
EXPECT_EQ(Parameters.size(), (unsigned)10); \
469447
EXPECT_EQ(Parameters, ExpectedParams); \
@@ -539,7 +517,6 @@ TEST_F(VFABIParserTest, ParseMaskingNEON) {
539517
EXPECT_TRUE(invokeParser("_ZGVnM2v_foo(vector_foo)", "void(i32)"));
540518
EXPECT_EQ(ISA, VFISAKind::AdvancedSIMD);
541519
EXPECT_TRUE(isMasked());
542-
EXPECT_TRUE(matchParametersNum());
543520
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
544521
EXPECT_EQ(VF, ElementCount::getFixed(2));
545522
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -553,7 +530,6 @@ TEST_F(VFABIParserTest, ParseMaskingSVE) {
553530
EXPECT_TRUE(invokeParser("_ZGVsM2v_foo(vector_foo)", "void(i32)"));
554531
EXPECT_EQ(ISA, VFISAKind::SVE);
555532
EXPECT_TRUE(isMasked());
556-
EXPECT_TRUE(matchParametersNum());
557533
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
558534
EXPECT_EQ(VF, ElementCount::getFixed(2));
559535
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -567,7 +543,6 @@ TEST_F(VFABIParserTest, ParseMaskingSSE) {
567543
EXPECT_TRUE(invokeParser("_ZGVbM2v_foo(vector_foo)", "void(i32)"));
568544
EXPECT_EQ(ISA, VFISAKind::SSE);
569545
EXPECT_TRUE(isMasked());
570-
EXPECT_TRUE(matchParametersNum());
571546
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
572547
EXPECT_EQ(VF, ElementCount::getFixed(2));
573548
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -581,7 +556,6 @@ TEST_F(VFABIParserTest, ParseMaskingAVX) {
581556
EXPECT_TRUE(invokeParser("_ZGVcM2v_foo(vector_foo)", "void(i32)"));
582557
EXPECT_EQ(ISA, VFISAKind::AVX);
583558
EXPECT_TRUE(isMasked());
584-
EXPECT_TRUE(matchParametersNum());
585559
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
586560
EXPECT_EQ(VF, ElementCount::getFixed(2));
587561
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -595,7 +569,6 @@ TEST_F(VFABIParserTest, ParseMaskingAVX2) {
595569
EXPECT_TRUE(invokeParser("_ZGVdM2v_foo(vector_foo)", "void(i32)"));
596570
EXPECT_EQ(ISA, VFISAKind::AVX2);
597571
EXPECT_TRUE(isMasked());
598-
EXPECT_TRUE(matchParametersNum());
599572
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
600573
EXPECT_EQ(VF, ElementCount::getFixed(2));
601574
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -609,7 +582,6 @@ TEST_F(VFABIParserTest, ParseMaskingAVX512) {
609582
EXPECT_TRUE(invokeParser("_ZGVeM2v_foo(vector_foo)", "void(i32)"));
610583
EXPECT_EQ(ISA, VFISAKind::AVX512);
611584
EXPECT_TRUE(isMasked());
612-
EXPECT_TRUE(matchParametersNum());
613585
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
614586
EXPECT_EQ(VF, ElementCount::getFixed(2));
615587
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -623,7 +595,6 @@ TEST_F(VFABIParserTest, ParseMaskingLLVM) {
623595
EXPECT_TRUE(invokeParser("_ZGV_LLVM_M2v_foo(vector_foo)", "void(i32)"));
624596
EXPECT_EQ(ISA, VFISAKind::LLVM);
625597
EXPECT_TRUE(isMasked());
626-
EXPECT_TRUE(matchParametersNum());
627598
EXPECT_EQ(getFunctionType(), FTyMaskVLen2_i32);
628599
EXPECT_EQ(VF, ElementCount::getFixed(2));
629600
EXPECT_EQ(Parameters.size(), (unsigned)2);
@@ -642,7 +613,6 @@ TEST_F(VFABIParserTest, LLVM_InternalISA) {
642613
EXPECT_TRUE(invokeParser("_ZGV_LLVM_N2v_foo(vector_foo)", "void(i32)"));
643614
EXPECT_EQ(ISA, VFISAKind::LLVM);
644615
EXPECT_FALSE(isMasked());
645-
EXPECT_TRUE(matchParametersNum());
646616
EXPECT_EQ(getFunctionType(), FTyNoMaskVLen2_i32);
647617
EXPECT_EQ(Parameters.size(), (unsigned)1);
648618
EXPECT_EQ(Parameters[0], VFParameter({0, VFParamKind::Vector}));
@@ -655,7 +625,6 @@ TEST_F(VFABIParserTest, LLVM_Intrinsics) {
655625
"void(float, float)"));
656626
EXPECT_EQ(ISA, VFISAKind::LLVM);
657627
EXPECT_FALSE(isMasked());
658-
EXPECT_TRUE(matchParametersNum());
659628
FunctionType *FTy = FunctionType::get(
660629
Type::getVoidTy(Ctx),
661630
{
@@ -678,7 +647,6 @@ TEST_F(VFABIParserTest, ParseScalableRequiresDeclaration) {
678647
EXPECT_TRUE(invokeParser(MangledName, "void(i32)"));
679648
EXPECT_EQ(ISA, VFISAKind::SVE);
680649
EXPECT_TRUE(isMasked());
681-
EXPECT_TRUE(matchParametersNum());
682650
EXPECT_EQ(getFunctionType(), FTyMaskedVLA_i32);
683651
EXPECT_EQ(Parameters.size(), (unsigned)2);
684652
EXPECT_EQ(Parameters[0], VFParameter({0, VFParamKind::Vector}));
@@ -698,7 +666,6 @@ TEST_F(VFABIParserTest, ParseScalableMaskingSVE) {
698666
EXPECT_TRUE(invokeParser("_ZGVsMxv_foo(vector_foo)", "i32(i32)"));
699667
EXPECT_EQ(ISA, VFISAKind::SVE);
700668
EXPECT_TRUE(isMasked());
701-
EXPECT_TRUE(matchParametersNum());
702669
FunctionType *FTy = FunctionType::get(
703670
VectorType::get(Type::getInt32Ty(Ctx), ElementCount::getScalable(4)),
704671
{VectorType::get(Type::getInt32Ty(Ctx), ElementCount::getScalable(4)),
@@ -718,7 +685,6 @@ TEST_F(VFABIParserTest, ParseScalableMaskingSVESincos) {
718685
"void(double, ptr, ptr)"));
719686
EXPECT_EQ(ISA, VFISAKind::SVE);
720687
EXPECT_TRUE(isMasked());
721-
EXPECT_TRUE(matchParametersNum());
722688
FunctionType *FTy = FunctionType::get(
723689
Type::getVoidTy(Ctx),
724690
{
@@ -745,7 +711,6 @@ TEST_F(VFABIParserTest, ParseWiderReturnTypeSVE) {
745711
EXPECT_TRUE(invokeParser("_ZGVsMxvv_foo(vector_foo)", "i64(i32, i32)"));
746712
EXPECT_EQ(ISA, VFISAKind::SVE);
747713
EXPECT_TRUE(isMasked());
748-
EXPECT_TRUE(matchParametersNum());
749714
FunctionType *FTy = FunctionType::get(
750715
VectorType::get(Type::getInt64Ty(Ctx), ElementCount::getScalable(2)),
751716
{
@@ -769,7 +734,6 @@ TEST_F(VFABIParserTest, ParseVoidReturnTypeSVE) {
769734
EXPECT_TRUE(invokeParser("_ZGVsMxv_foo(vector_foo)", "void(i16)"));
770735
EXPECT_EQ(ISA, VFISAKind::SVE);
771736
EXPECT_TRUE(isMasked());
772-
EXPECT_TRUE(matchParametersNum());
773737
FunctionType *FTy = FunctionType::get(
774738
Type::getVoidTy(Ctx),
775739
{

0 commit comments

Comments
 (0)