diff --git a/llvm/include/llvm/Analysis/VectorUtils.h b/llvm/include/llvm/Analysis/VectorUtils.h --- a/llvm/include/llvm/Analysis/VectorUtils.h +++ b/llvm/include/llvm/Analysis/VectorUtils.h @@ -47,9 +47,14 @@ AVX, // x86 AVX AVX2, // x86 AVX2 AVX512, // x86 AVX512 - Unknown // Unknown ISA + LLVM_VF, // LLVM internal ISA for functions that are not + // attached to an existing ABI via name mangling. + Unknown // Unknown ISA }; +/// LLVM Internal ISA token for Vector Functions (VF). +static constexpr char const *_LLVM_VF_ = "_LLVM_VF_"; + /// Encapsulates information needed to describe a parameter. /// /// The description of the parameter is not linked directly to diff --git a/llvm/lib/Analysis/VFABIDemangling.cpp b/llvm/lib/Analysis/VFABIDemangling.cpp --- a/llvm/lib/Analysis/VFABIDemangling.cpp +++ b/llvm/lib/Analysis/VFABIDemangling.cpp @@ -26,16 +26,20 @@ if (MangledName.empty()) return ParseRet::Error; - ISA = StringSwitch(MangledName.take_front(1)) - .Case("n", VFISAKind::AdvancedSIMD) - .Case("s", VFISAKind::SVE) - .Case("b", VFISAKind::SSE) - .Case("c", VFISAKind::AVX) - .Case("d", VFISAKind::AVX2) - .Case("e", VFISAKind::AVX512) - .Default(VFISAKind::Unknown); - - MangledName = MangledName.drop_front(1); + if (MangledName.startswith(_LLVM_VF_)) { + MangledName = MangledName.drop_front(strlen(_LLVM_VF_)); + ISA = VFISAKind::LLVM_VF; + } else { + ISA = StringSwitch(MangledName.take_front(1)) + .Case("n", VFISAKind::AdvancedSIMD) + .Case("s", VFISAKind::SVE) + .Case("b", VFISAKind::SSE) + .Case("c", VFISAKind::AVX) + .Case("d", VFISAKind::AVX2) + .Case("e", VFISAKind::AVX512) + .Default(VFISAKind::Unknown); + MangledName = MangledName.drop_front(1); + } return ParseRet::OK; } @@ -286,6 +290,7 @@ // Format of the ABI name: // _ZGV_[()] Optional VFABI::tryDemangleForVFABI(StringRef MangledName) { + const StringRef OriginalName = MangledName; // Assume there is no custom name , and therefore the // vector name consists of // _ZGV_. @@ -369,6 +374,11 @@ return None; } + // LLVM internal mapping via the TargetLibraryInfo (TLI) must be + // redirected to an existing name. + if (ISA == VFISAKind::LLVM_VF && VectorName == OriginalName) + return None; + // When is "M", we need to add a parameter that is used as // global predicate for the function. if (IsMasked) { diff --git a/llvm/unittests/Analysis/VectorFunctionABITest.cpp b/llvm/unittests/Analysis/VectorFunctionABITest.cpp --- a/llvm/unittests/Analysis/VectorFunctionABITest.cpp +++ b/llvm/unittests/Analysis/VectorFunctionABITest.cpp @@ -344,6 +344,13 @@ __COMMON_CHECKS; EXPECT_EQ(VectorName, "_ZGVeN2vls2Ls27Us4Rs5l1L10U100R1000u2_sin"); + // LLVM_VF: = LLVM internal vector function. + EXPECT_TRUE(invokeParser( + "_ZGV_LLVM_VF_N2vls2Ls27Us4Rs5l1L10U100R1000u2_sin(vectorf)")); + EXPECT_EQ(ISA, VFISAKind::LLVM_VF); + __COMMON_CHECKS; + EXPECT_EQ(VectorName, "vectorf"); + // Unknown ISA (randomly using "q"). This test will need update if // some targets decide to use "q" as their ISA token. EXPECT_TRUE(invokeParser("_ZGVqN2vls2Ls27Us4Rs5l1L10U100R1000u2_sin")); @@ -437,3 +444,9 @@ EXPECT_EQ(Parameters[1], VFParameter({1, VFParamKind::GlobalPredicate})); EXPECT_EQ(ScalarName, "sin"); } + +TEST_F(VFABIParserTest, LLVM_TLI) { + EXPECT_FALSE(invokeParser("_ZGV_LLVM_VF_N2v_sin")); + EXPECT_TRUE(invokeParser("_ZGV_LLVM_VF_N2v_sin_(vector_name)")); + EXPECT_EQ(ISA, VFISAKind::LLVM_VF); +}