diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/Analysis/VectorUtils.h | 7 | ||||
-rw-r--r-- | llvm/lib/Analysis/VFABIDemangling.cpp | 29 | ||||
-rw-r--r-- | llvm/unittests/Analysis/VectorFunctionABITest.cpp | 13 |
3 files changed, 39 insertions, 10 deletions
diff --git a/llvm/include/llvm/Analysis/VectorUtils.h b/llvm/include/llvm/Analysis/VectorUtils.h index 850bc10f037..e9c96cc96cb 100644 --- a/llvm/include/llvm/Analysis/VectorUtils.h +++ b/llvm/include/llvm/Analysis/VectorUtils.h @@ -48,7 +48,9 @@ enum class VFISAKind { AVX, // x86 AVX AVX2, // x86 AVX2 AVX512, // x86 AVX512 - Unknown // Unknown ISA + LLVM, // LLVM internal ISA for functions that are not + // attached to an existing ABI via name mangling. + Unknown // Unknown ISA }; /// Encapsulates information needed to describe a parameter. @@ -103,6 +105,9 @@ struct VFInfo { }; namespace VFABI { +/// LLVM Internal VFABI ISA token for vector functions. +static constexpr char const *_LLVM_ = "_LLVM_"; + /// Function to contruct a VFInfo out of a mangled names in the /// following format: /// diff --git a/llvm/lib/Analysis/VFABIDemangling.cpp b/llvm/lib/Analysis/VFABIDemangling.cpp index 152f7ae4667..067283d38b6 100644 --- a/llvm/lib/Analysis/VFABIDemangling.cpp +++ b/llvm/lib/Analysis/VFABIDemangling.cpp @@ -28,15 +28,20 @@ ParseRet tryParseISA(StringRef &MangledName, VFISAKind &ISA) { if (MangledName.empty()) return ParseRet::Error; - ISA = StringSwitch<VFISAKind>(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(VFABI::_LLVM_)) { + MangledName = MangledName.drop_front(strlen(VFABI::_LLVM_)); + ISA = VFISAKind::LLVM; + } else { + ISA = StringSwitch<VFISAKind>(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; } @@ -287,6 +292,7 @@ ParseRet tryParseAlign(StringRef &ParseString, Align &Alignment) { // Format of the ABI name: // _ZGV<isa><mask><vlen><parameters>_<scalarname>[(<redirection>)] Optional<VFInfo> VFABI::tryDemangleForVFABI(StringRef MangledName) { + const StringRef OriginalName = MangledName; // Assume there is no custom name <redirection>, and therefore the // vector name consists of // _ZGV<isa><mask><vlen><parameters>_<scalarname>. @@ -370,6 +376,11 @@ Optional<VFInfo> VFABI::tryDemangleForVFABI(StringRef MangledName) { return None; } + // LLVM internal mapping via the TargetLibraryInfo (TLI) must be + // redirected to an existing name. + if (ISA == VFISAKind::LLVM && VectorName == OriginalName) + return None; + // When <mask> 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 index 331f46b39b3..6fe85298d54 100644 --- a/llvm/unittests/Analysis/VectorFunctionABITest.cpp +++ b/llvm/unittests/Analysis/VectorFunctionABITest.cpp @@ -346,6 +346,13 @@ TEST_F(VFABIParserTest, ISAIndependentMangling) { __COMMON_CHECKS; EXPECT_EQ(VectorName, "_ZGVeN2vls2Ls27Us4Rs5l1L10U100R1000u2_sin"); + // LLVM: <isa> = "_LLVM_" internal vector function. + EXPECT_TRUE( + invokeParser("_ZGV_LLVM_N2vls2Ls27Us4Rs5l1L10U100R1000u2_sin(vectorf)")); + EXPECT_EQ(ISA, VFISAKind::LLVM); + __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")); @@ -473,3 +480,9 @@ TEST_F(VFABIAttrTest, Read) { Exp.push_back("_ZGVnN4v_g"); EXPECT_EQ(Mappings, Exp); } + +TEST_F(VFABIParserTest, LLVM_InternalISA) { + EXPECT_FALSE(invokeParser("_ZGV_LLVM_N2v_sin")); + EXPECT_TRUE(invokeParser("_ZGV_LLVM_N2v_sin_(vector_name)")); + EXPECT_EQ(ISA, VFISAKind::LLVM); +} |