[llvm] e9a06e0 - [VFABI] Read/Write functions for the VFABI attribute.
Mikael Holmén via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 11 23:33:55 PST 2019
Hi Francesco,
I pushed a fix for the testcase in c8e4b53677. Please take a look.
Thanks,
Mikael
On Mon, 2019-11-11 at 19:49 -0800, Francesco Petrogalli via llvm-
commits wrote:
> Author: Francesco Petrogalli
> Date: 2019-11-12T03:40:42Z
> New Revision: e9a06e06064145e0baf723187ab023dd91e914f9
>
> URL:
> https://protect2.fireeye.com/v1/url?k=7d012223-21d5258f-7d0162b8-8667c4afe13e-78c6efe04efe0ccd&q=1&e=998057bb-5742-44ef-b15b-7a932eadfd2e&u=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2Fe9a06e06064145e0baf723187ab023dd91e914f9
> DIFF:
> https://protect2.fireeye.com/v1/url?k=385b9861-648f9fcd-385bd8fa-8667c4afe13e-ffc21f6ad0613c23&q=1&e=998057bb-5742-44ef-b15b-7a932eadfd2e&u=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2Fe9a06e06064145e0baf723187ab023dd91e914f9.diff
>
> LOG: [VFABI] Read/Write functions for the VFABI attribute.
>
> The attribute is stored at the `FunctionIndex` attribute set, with
> the
> name "vector-function-abi-variant".
>
> The get/set methods of the attribute have assertion to verify that:
>
> 1. Each name in the attribute is a valid VFABI mangled name.
>
> 2. Each name in the attribute correspond to a function declared in
> the
> module.
>
> Differential Revision:
> https://protect2.fireeye.com/v1/url?k=92766452-cea263fe-927624c9-8667c4afe13e-8d6c914cf1a583d8&q=1&e=998057bb-5742-44ef-b15b-7a932eadfd2e&u=https%3A%2F%2Freviews.llvm.org%2FD69976
>
> Added:
> llvm/unittests/Transforms/Utils/VFABIUtils.cpp
>
> Modified:
> llvm/include/llvm/Analysis/VectorUtils.h
> llvm/include/llvm/Transforms/Utils/ModuleUtils.h
> llvm/lib/Analysis/VFABIDemangling.cpp
> llvm/lib/Analysis/VectorUtils.cpp
> llvm/lib/Transforms/Utils/ModuleUtils.cpp
> llvm/unittests/Analysis/VectorFunctionABITest.cpp
> llvm/unittests/Transforms/Utils/CMakeLists.txt
>
> Removed:
>
>
>
> #####################################################################
> ###########
> diff --git a/llvm/include/llvm/Analysis/VectorUtils.h
> b/llvm/include/llvm/Analysis/VectorUtils.h
> index 5dc14dbe6574..850bc10f0378 100644
> --- a/llvm/include/llvm/Analysis/VectorUtils.h
> +++ b/llvm/include/llvm/Analysis/VectorUtils.h
> @@ -14,6 +14,7 @@
> #define LLVM_ANALYSIS_VECTORUTILS_H
>
> #include "llvm/ADT/MapVector.h"
> +#include "llvm/ADT/SmallSet.h"
> #include "llvm/Analysis/LoopAccessAnalysis.h"
> #include "llvm/IR/IRBuilder.h"
> #include "llvm/Support/CheckedArithmetic.h"
> @@ -121,14 +122,20 @@ namespace VFABI {
> /// * x86 (libmvec):
> https://protect2.fireeye.com/v1/url?k=f9c3460c-a51741a0-f9c30697-8667c4afe13e-d8eb9e02d6d99deb&q=1&e=998057bb-5742-44ef-b15b-7a932eadfd2e&u=https%3A%2F%2Fsourceware.org%2Fglibc%2Fwiki%2Flibmvec
> and
> ///
> https://protect2.fireeye.com/v1/url?k=dfc7130b-831314a7-dfc75390-8667c4afe13e-9dd16c1815ce4745&q=1&e=998057bb-5742-44ef-b15b-7a932eadfd2e&u=https%3A%2F%2Fsourceware.org%2Fglibc%2Fwiki%2Flibmvec%3Faction%3DAttachFile%26do%3Dview%26target%3DVectorABI.txt
> ///
> -///
> -///
> /// \param MangledName -> input string in the format
> /// _ZGV<isa><mask><vlen><parameters>_<scalarname>[(<redirection>)].
> Optional<VFInfo> tryDemangleForVFABI(StringRef MangledName);
>
> /// Retrieve the `VFParamKind` from a string token.
> VFParamKind getVFParamKindFromString(const StringRef Token);
> +
> +// Name of the attribute where the variant mappings are stored.
> +static constexpr char const *MappingsAttrName = "vector-function-
> abi-variant";
> +
> +/// Populates a set of strings representing the Vector Function ABI
> variants
> +/// associated to the CallInst CI.
> +void getVectorVariantNames(const CallInst &CI,
> + SmallVectorImpl<std::string>
> &VariantMappings);
> } // end namespace VFABI
>
> template <typename T> class ArrayRef;
> @@ -137,7 +144,6 @@ class GetElementPtrInst;
> template <typename InstTy> class InterleaveGroup;
> class Loop;
> class ScalarEvolution;
> -class TargetLibraryInfo;
> class TargetTransformInfo;
> class Type;
> class Value;
>
> diff --git a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
> b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
> index c69af5588741..db6409ac078c 100644
> --- a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
> +++ b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
> @@ -13,6 +13,7 @@
> #ifndef LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
> #define LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
>
> +#include "llvm/ADT/SmallSet.h"
> #include "llvm/ADT/StringRef.h"
> #include <utility> // for std::pair
>
> @@ -108,6 +109,23 @@ void filterDeadComdatFunctions(
> /// unique identifier for this module, so we return the empty
> string.
> std::string getUniqueModuleId(Module *M);
>
> +class TargetLibraryInfo;
> +class CallInst;
> +namespace VFABI {
> +
> +/// \defgroup Vector Function ABI (VABI) Module functions.
> +///
> +/// Utility functions for VFABI data that can modify the module.
> +///
> +/// @{
> +/// Overwrite the Vector Function ABI variants attribute with the
> names provide
> +/// in \p VariantMappings.
> +void setVectorVariantNames(CallInst *CI,
> + const SmallVector<std::string, 8>
> &VariantMappings);
> +
> +/// @}
> +} // End VFABI namespace
> +
> } // End llvm namespace
>
> #endif // LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
>
> diff --git a/llvm/lib/Analysis/VFABIDemangling.cpp
> b/llvm/lib/Analysis/VFABIDemangling.cpp
> index 6fd8ae63f5f0..152f7ae4667f 100644
> --- a/llvm/lib/Analysis/VFABIDemangling.cpp
> +++ b/llvm/lib/Analysis/VFABIDemangling.cpp
> @@ -6,6 +6,8 @@
> //
> //===---------------------------------------------------------------
> -------===//
>
> +#include "llvm/ADT/SmallSet.h"
> +#include "llvm/ADT/SmallString.h"
> #include "llvm/Analysis/VectorUtils.h"
>
> using namespace llvm;
> @@ -34,7 +36,6 @@ ParseRet tryParseISA(StringRef &MangledName,
> VFISAKind &ISA) {
> .Case("d", VFISAKind::AVX2)
> .Case("e", VFISAKind::AVX512)
> .Default(VFISAKind::Unknown);
> -
> MangledName = MangledName.drop_front(1);
>
> return ParseRet::OK;
> @@ -338,7 +339,7 @@ Optional<VFInfo>
> VFABI::tryDemangleForVFABI(StringRef MangledName) {
> }
> } while (ParamFound == ParseRet::OK);
>
> - // A valid MangledName mus have at least one valid entry in the
> + // A valid MangledName must have at least one valid entry in the
> // <parameters>.
> if (Parameters.empty())
> return None;
>
> diff --git a/llvm/lib/Analysis/VectorUtils.cpp
> b/llvm/lib/Analysis/VectorUtils.cpp
> index 600f57ab9d71..90e326687f7f 100644
> --- a/llvm/lib/Analysis/VectorUtils.cpp
> +++ b/llvm/lib/Analysis/VectorUtils.cpp
> @@ -1159,3 +1159,22 @@ void
> InterleaveGroup<Instruction>::addMetadata(Instruction *NewInst) const
> {
> propagateMetadata(NewInst, VL);
> }
> }
> +
> +void VFABI::getVectorVariantNames(
> + const CallInst &CI, SmallVectorImpl<std::string>
> &VariantMappings) {
> + const StringRef S =
> + CI.getAttribute(AttributeList::FunctionIndex,
> VFABI::MappingsAttrName)
> + .getValueAsString();
> + SmallVector<StringRef, 8> ListAttr;
> + S.split(ListAttr, ",");
> +
> + for (auto &S : SetVector<StringRef>(ListAttr.begin(),
> ListAttr.end())) {
> +#ifndef NDEBUG
> + Optional<VFInfo> Info = VFABI::tryDemangleForVFABI(S);
> + assert(Info.hasValue() && "Invalid name for a VFABI variant.");
> + assert(CI.getModule()->getFunction(Info.getValue().VectorName)
> &&
> + "Vector function is missing.");
> +#endif
> + VariantMappings.push_back(S);
> + }
> +}
>
> diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
> b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
> index 1ef3757017a8..b94f57e4dc2c 100644
> --- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
> +++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
> @@ -11,6 +11,7 @@
> //===---------------------------------------------------------------
> -------===//
>
> #include "llvm/Transforms/Utils/ModuleUtils.h"
> +#include "llvm/Analysis/VectorUtils.h"
> #include "llvm/IR/DerivedTypes.h"
> #include "llvm/IR/Function.h"
> #include "llvm/IR/IRBuilder.h"
> @@ -280,3 +281,31 @@ std::string llvm::getUniqueModuleId(Module *M) {
> MD5::stringifyResult(R, Str);
> return ("$" + Str).str();
> }
> +
> +void VFABI::setVectorVariantNames(
> + CallInst *CI, const SmallVector<std::string, 8>
> &VariantMappings) {
> + if (VariantMappings.empty())
> + return;
> +
> + SmallString<256> Buffer;
> + llvm::raw_svector_ostream Out(Buffer);
> + for (const std::string &VariantMapping : VariantMappings)
> + Out << VariantMapping << ",";
> + // Get rid of the trailing ','.
> + assert(!Buffer.str().empty() && "Must have at least one char.");
> + Buffer.pop_back();
> +
> + Module *M = CI->getModule();
> +#ifndef NDEBUG
> + for (const std::string &VariantMapping : VariantMappings) {
> + Optional<VFInfo> VI =
> VFABI::tryDemangleForVFABI(VariantMapping);
> + assert(VI.hasValue() && "Canno add an invalid VFABI name.");
> + assert(M->getNamedValue(VI.getValue().VectorName) &&
> + "Cannot add variant to attribute: "
> + "vector function declaration is missing.");
> + }
> +#endif
> + CI->addAttribute(
> + AttributeList::FunctionIndex,
> + Attribute::get(M->getContext(), MappingsAttrName,
> Buffer.str()));
> +}
>
> diff --git a/llvm/unittests/Analysis/VectorFunctionABITest.cpp
> b/llvm/unittests/Analysis/VectorFunctionABITest.cpp
> index 4dbc13076618..331f46b39b34 100644
> --- a/llvm/unittests/Analysis/VectorFunctionABITest.cpp
> +++ b/llvm/unittests/Analysis/VectorFunctionABITest.cpp
> @@ -7,6 +7,8 @@
> //===---------------------------------------------------------------
> -------===//
>
> #include "llvm/Analysis/VectorUtils.h"
> +#include "llvm/AsmParser/Parser.h"
> +#include "llvm/IR/InstIterator.h"
> #include "gtest/gtest.h"
>
> using namespace llvm;
> @@ -437,3 +439,37 @@ TEST_F(VFABIParserTest, ParseMaskingAVX512) {
> EXPECT_EQ(Parameters[1], VFParameter({1,
> VFParamKind::GlobalPredicate}));
> EXPECT_EQ(ScalarName, "sin");
> }
> +
> +class VFABIAttrTest : public testing::Test {
> +protected:
> + void SetUp() override {
> + M = parseAssemblyString(IR, Err, Ctx);
> + // Get the only call instruction in the block, which is the
> first
> + // instruction.
> + CI = dyn_cast<CallInst>(&*(instructions(M-
> >getFunction("f")).begin()));
> + }
> + const char *IR = "define i32 @f(i32 %a) {\n"
> + " %1 = call i32 @g(i32 %a) #0\n"
> + " ret i32 %1\n"
> + "}\n"
> + "declare i32 @g(i32)\n"
> + "declare <2 x i32> @custom_vg(<2 x i32>)"
> + "declare <4 x i32> @_ZGVnN4v_g(<4 x i32>)"
> + "declare <8 x i32> @_ZGVnN8v_g(<8 x i32>)"
> + "attributes #0 = { "
> + "\"vector-function-abi-variant\"=\""
> + "_ZGVnN2v_g(custom_vg),_ZGVnN4v_g\" }";
> + LLVMContext Ctx;
> + SMDiagnostic Err;
> + std::unique_ptr<Module> M;
> + CallInst *CI;
> + SmallVector<std::string, 8> Mappings;
> +};
> +
> +TEST_F(VFABIAttrTest, Read) {
> + VFABI::getVectorVariantNames(*CI, Mappings);
> + SmallVector<std::string, 8> Exp;
> + Exp.push_back("_ZGVnN2v_g(custom_vg)");
> + Exp.push_back("_ZGVnN4v_g");
> + EXPECT_EQ(Mappings, Exp);
> +}
>
> diff --git a/llvm/unittests/Transforms/Utils/CMakeLists.txt
> b/llvm/unittests/Transforms/Utils/CMakeLists.txt
> index bc993a84f021..8d9d7df4f403 100644
> --- a/llvm/unittests/Transforms/Utils/CMakeLists.txt
> +++ b/llvm/unittests/Transforms/Utils/CMakeLists.txt
> @@ -18,4 +18,5 @@ add_llvm_unittest(UtilsTests
> SSAUpdaterBulkTest.cpp
> UnrollLoopTest.cpp
> ValueMapperTest.cpp
> + VFABIUtils.cpp
> )
>
> diff --git a/llvm/unittests/Transforms/Utils/VFABIUtils.cpp
> b/llvm/unittests/Transforms/Utils/VFABIUtils.cpp
> new file mode 100644
> index 000000000000..f69e31cd610b
> --- /dev/null
> +++ b/llvm/unittests/Transforms/Utils/VFABIUtils.cpp
> @@ -0,0 +1,55 @@
> +//===------- VFABIUtils.cpp - VFABI Unittests ---------------------
> -------===//
> +//
> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM
> Exceptions.
> +// See
> https://protect2.fireeye.com/v1/url?k=134bd7c0-4f9fd06c-134b975b-8667c4afe13e-e97e35cc64792dca&q=1&e=998057bb-5742-44ef-b15b-7a932eadfd2e&u=https%3A%2F%2Fllvm.org%2FLICENSE.txt
> for license information.
> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
> +//
> +//===---------------------------------------------------------------
> -------===//
> +
> +#include "llvm/AsmParser/Parser.h"
> +#include "llvm/IR/InstIterator.h"
> +#include "llvm/IR/Instructions.h"
> +#include "llvm/IR/Module.h"
> +#include "llvm/Support/SourceMgr.h"
> +#include "llvm/Transforms/Utils/ModuleUtils.h"
> +#include "gtest/gtest.h"
> +
> +using namespace llvm;
> +
> +class VFABIAttrTest : public testing::Test {
> +protected:
> + void SetUp() override {
> + M = parseAssemblyString(IR, Err, Ctx);
> + // Get the only call instruction in the block, which is the
> first
> + // instruction.
> + CI = dyn_cast<CallInst>(&*(instructions(M-
> >getFunction("f")).begin()));
> + }
> + const char *IR = "define i32 @f(i32 %a) {\n"
> + " %1 = call i32 @g(i32 %a) #0\n"
> + " ret i32 %1\n"
> + "}\n"
> + "declare i32 @g(i32)\n"
> + "declare <2 x i32> @custom_vg(<2 x i32>)"
> + "declare <4 x i32> @_ZGVnN4v_g(<4 x i32>)"
> + "declare <8 x i32> @_ZGVnN8v_g(<8 x i32>)"
> + "attributes #0 = { "
> + "\"vector-function-abi-variant\"=\""
> + "_ZGVnN2v_g(custom_vg),_ZGVnN4v_g\" }";
> + LLVMContext Ctx;
> + SMDiagnostic Err;
> + std::unique_ptr<Module> M;
> + CallInst *CI;
> + SmallVector<std::string, 8> Mappings;
> +};
> +
> +TEST_F(VFABIAttrTest, Write) {
> + Mappings.push_back("_ZGVnN8v_g");
> + Mappings.push_back("_ZGVnN2v_g(custom_vg)");
> + VFABI::setVectorVariantNames(CI, Mappings);
> + const AttributeList Attrs = CI->getAttributes();
> + const AttributeSet FnAttrs = Attrs.getFnAttributes();
> + const StringRef S = CI->getAttribute(AttributeList::FunctionIndex,
> + "vector-function-abi-
> variant")
> + .getValueAsString();
> + EXPECT_EQ(S, "_ZGVnN8v_g,_ZGVnN2v_g(custom_vg)");
> +}
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
>
https://protect2.fireeye.com/v1/url?k=7c059ff3-20d1985f-7c05df68-8667c4afe13e-aa9f5fd6e43483b1&q=1&e=998057bb-5742-44ef-b15b-7a932eadfd2e&u=https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fllvm-commits
More information about the llvm-commits
mailing list