summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Analysis/VectorUtils.h7
-rw-r--r--llvm/lib/Analysis/VFABIDemangling.cpp29
-rw-r--r--llvm/unittests/Analysis/VectorFunctionABITest.cpp13
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);
+}
OpenPOWER on IntegriCloud