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 @@ -48,7 +48,9 @@ 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 @@ }; namespace VFABI { +/// LLVM Internal VFABI ISA token for Vector Functions (VF). +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 --- a/llvm/lib/Analysis/VFABIDemangling.cpp +++ b/llvm/lib/Analysis/VFABIDemangling.cpp @@ -28,15 +28,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(VFABI::_LLVM_)) { + MangledName = MangledName.drop_front(strlen(VFABI::_LLVM_)); + ISA = VFISAKind::LLVM; + } 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; } @@ -287,6 +292,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_. @@ -370,6 +376,11 @@ 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 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 @@ -346,6 +346,13 @@ __COMMON_CHECKS; EXPECT_EQ(VectorName, "_ZGVeN2vls2Ls27Us4Rs5l1L10U100R1000u2_sin"); + // LLVM_VF: = 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 @@ 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); +}