[llvm] e9a06e0 - [VFABI] Read/Write functions for the VFABI attribute.

Francesco Petrogalli via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 12 06:26:20 PST 2019


Hi Mikael, thank you for taking care of this.

Francesco

> On Nov 12, 2019, at 1:33 AM, Mikael Holmén <mikael.holmen at ericsson.com> wrote:
> 
> 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