From 7cc3769adb15f7347e28df65b16d6e6464fd3c70 Mon Sep 17 00:00:00 2001 From: Anna Thomas Date: Wed, 13 May 2020 11:01:23 -0400 Subject: [PATCH] [VectorUtils] Expose vector-function-abi-variant mangling as a utility. Summary: This change exposes the vector name mangling with LLVM ISA (used as part of vector-function-abi-variant) as a utility. This can then be used by front-ends that add this attribute. Note that all parameters passed in to the function will be mangled with the "v" token to identify that they are of of vector type. So, it is the responsibility of the caller to confirm that all parameters in the vectorized variant is of vector type. Added unit test to show vector name mangling. Reviewed-By: fpetrogalli, simoll Differential Revision: https://reviews.llvm.org/D79867 --- llvm/include/llvm/Analysis/VectorUtils.h | 19 +++++++++++++++ llvm/lib/Analysis/VectorUtils.cpp | 12 ++++++++++ llvm/lib/Transforms/Utils/InjectTLIMappings.cpp | 28 ++--------------------- llvm/unittests/Analysis/VectorFunctionABITest.cpp | 9 ++++++++ 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/llvm/include/llvm/Analysis/VectorUtils.h b/llvm/include/llvm/Analysis/VectorUtils.h index 2c28503..ed0937e 100644 --- a/llvm/include/llvm/Analysis/VectorUtils.h +++ b/llvm/include/llvm/Analysis/VectorUtils.h @@ -173,6 +173,25 @@ static constexpr char const *_LLVM_Scalarize_ = "_LLVM_Scalarize_"; /// respective IR declarations. Optional tryDemangleForVFABI(StringRef MangledName, const Module &M); +/// This routine mangles the given VectorName according to the LangRef +/// specification for vector-function-abi-variant attribute and is specific to +/// the TLI mappings. It is the responsibility of the caller to make sure that +/// this is only used if all parameters in the vector function are vector type. +/// This returned string holds scalar-to-vector mapping: +/// _ZGV_() +/// +/// where: +/// +/// = "_LLVM_" +/// = "N". Note: TLI does not support masked interfaces. +/// = Number of concurrent lanes, stored in the `VectorizationFactor` +/// field of the `VecDesc` struct. +/// = "v", as many as are the numArgs. +/// = the name of the scalar function. +/// = the name of the vector function. +std::string mangleTLIVectorName(StringRef VectorName, StringRef ScalarName, + unsigned numArgs, unsigned VF); + /// Retrieve the `VFParamKind` from a string token. VFParamKind getVFParamKindFromString(const StringRef Token); diff --git a/llvm/lib/Analysis/VectorUtils.cpp b/llvm/lib/Analysis/VectorUtils.cpp index f16b04e..4c2f900 100644 --- a/llvm/lib/Analysis/VectorUtils.cpp +++ b/llvm/lib/Analysis/VectorUtils.cpp @@ -1273,6 +1273,18 @@ void InterleaveGroup::addMetadata(Instruction *NewInst) const { } } +std::string VFABI::mangleTLIVectorName(StringRef VectorName, + StringRef ScalarName, unsigned numArgs, + unsigned VF) { + SmallString<256> Buffer; + llvm::raw_svector_ostream Out(Buffer); + Out << "_ZGV" << VFABI::_LLVM_ << "N" << VF; + for (unsigned I = 0; I < numArgs; ++I) + Out << "v"; + Out << "_" << ScalarName << "(" << VectorName << ")"; + return std::string(Out.str()); +} + void VFABI::getVectorVariantNames( const CallInst &CI, SmallVectorImpl &VariantMappings) { const StringRef S = diff --git a/llvm/lib/Transforms/Utils/InjectTLIMappings.cpp b/llvm/lib/Transforms/Utils/InjectTLIMappings.cpp index f0c5bc2..83616f0 100644 --- a/llvm/lib/Transforms/Utils/InjectTLIMappings.cpp +++ b/llvm/lib/Transforms/Utils/InjectTLIMappings.cpp @@ -33,31 +33,6 @@ STATISTIC(NumVFDeclAdded, STATISTIC(NumCompUsedAdded, "Number of `@llvm.compiler.used` operands that have been added."); -/// Helper function to map the TLI name to a strings that holds -/// scalar-to-vector mapping. -/// -/// _ZGV_() -/// -/// where: -/// -/// = "_LLVM_" -/// = "N". Note: TLI does not support masked interfaces. -/// = Number of concurrent lanes, stored in the `VectorizationFactor` -/// field of the `VecDesc` struct. -/// = "v", as many as are the number of parameters of CI. -/// = the name of the scalar function called by CI. -/// = the name of the vector function mapped by the TLI. -static std::string mangleTLIName(StringRef VectorName, const CallInst &CI, - unsigned VF) { - SmallString<256> Buffer; - llvm::raw_svector_ostream Out(Buffer); - Out << "_ZGV" << VFABI::_LLVM_ << "N" << VF; - for (unsigned I = 0; I < CI.getNumArgOperands(); ++I) - Out << "v"; - Out << "_" << CI.getCalledFunction()->getName() << "(" << VectorName << ")"; - return std::string(Out.str()); -} - /// A helper function that adds the vector function declaration that /// vectorizes the CallInst CI with a vectorization factor of VF /// lanes. The TLI assumes that all parameters and the return type of @@ -117,7 +92,8 @@ static void addMappingsFromTLI(const TargetLibraryInfo &TLI, CallInst &CI) { const std::string TLIName = std::string(TLI.getVectorizedFunction(ScalarName, VF)); if (!TLIName.empty()) { - std::string MangledName = mangleTLIName(TLIName, CI, VF); + std::string MangledName = VFABI::mangleTLIVectorName( + TLIName, ScalarName, CI.getNumArgOperands(), VF); if (!OriginalSetOfMappings.count(MangledName)) { Mappings.push_back(MangledName); ++NumCallInjected; diff --git a/llvm/unittests/Analysis/VectorFunctionABITest.cpp b/llvm/unittests/Analysis/VectorFunctionABITest.cpp index e6e1c8a..cc6dbe8 100644 --- a/llvm/unittests/Analysis/VectorFunctionABITest.cpp +++ b/llvm/unittests/Analysis/VectorFunctionABITest.cpp @@ -83,6 +83,7 @@ protected: return false; } + // Checks that 1. the last Parameter in the Shape is of type // VFParamKind::GlobalPredicate and 2. it is the only one of such // type. @@ -98,6 +99,14 @@ protected: }; } // unnamed namespace +// This test makes sure correct mangling occurs for given string. +TEST_F(VFABIParserTest, ManglingVectorTLINames) { + EXPECT_EQ(VFABI::mangleTLIVectorName("vec", "scalar", 3, 4), + "_ZGV_LLVM_N4vvv_scalar(vec)"); + EXPECT_EQ(VFABI::mangleTLIVectorName("custom.call.v5", "custom.call", 1, 5), + "_ZGV_LLVM_N5v_custom.call(custom.call.v5)"); +} + // This test makes sure that the demangling method succeeds only on // valid values of the string. TEST_F(VFABIParserTest, OnlyValidNames) { -- 2.7.4