aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/VFABIDemangling.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2020-01-17 20:45:01 +0000
committerDimitry Andric <dim@FreeBSD.org>2020-01-17 20:45:01 +0000
commit706b4fc47bbc608932d3b491ae19a3b9cde9497b (patch)
tree4adf86a776049cbf7f69a1929c4babcbbef925eb /llvm/lib/Analysis/VFABIDemangling.cpp
parent7cc9cf2bf09f069cb2dd947ead05d0b54301fb71 (diff)
Notes
Diffstat (limited to 'llvm/lib/Analysis/VFABIDemangling.cpp')
-rw-r--r--llvm/lib/Analysis/VFABIDemangling.cpp38
1 files changed, 25 insertions, 13 deletions
diff --git a/llvm/lib/Analysis/VFABIDemangling.cpp b/llvm/lib/Analysis/VFABIDemangling.cpp
index 6fd8ae63f5f0..a331b95e818b 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;
@@ -26,16 +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;
}
@@ -286,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>.
@@ -338,7 +345,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;
@@ -369,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) {
@@ -390,8 +402,8 @@ Optional<VFInfo> VFABI::tryDemangleForVFABI(StringRef MangledName) {
assert(Parameters.back().ParamKind == VFParamKind::GlobalPredicate &&
"The global predicate must be the last parameter");
- const VFShape Shape({VF, IsScalable, ISA, Parameters});
- return VFInfo({Shape, ScalarName, VectorName});
+ const VFShape Shape({VF, IsScalable, Parameters});
+ return VFInfo({Shape, ScalarName, VectorName, ISA});
}
VFParamKind VFABI::getVFParamKindFromString(const StringRef Token) {