|
@@ -414,53 +414,14 @@ static const char * const IntrinsicNameTable[] = {
|
|
|
#undef GET_INTRINSIC_NAME_TABLE
|
|
|
};
|
|
|
|
|
|
-static int lookupLLVMIntrinsicByName(ArrayRef<const char *> NameTable,
|
|
|
- StringRef Name) {
|
|
|
- // Do a binary search over the table of intrinsic names.
|
|
|
- const char *const *NameEntry =
|
|
|
- std::lower_bound(NameTable.begin(), NameTable.end(), Name.data(),
|
|
|
- [](const char *LHS, const char *RHS) {
|
|
|
- // Don't compare the first 5 characters, they are
|
|
|
- // always "llvm.".
|
|
|
- return strcmp(LHS + 5, RHS + 5) < 0;
|
|
|
- });
|
|
|
- unsigned Idx = NameEntry - NameTable.begin();
|
|
|
-
|
|
|
- // Check if this is a direct match.
|
|
|
- if (Idx < NameTable.size() && strcmp(Name.data(), NameTable[Idx]) == 0)
|
|
|
- return Idx;
|
|
|
-
|
|
|
- // Otherwise, back up one entry to look for a prefix of Name where the next
|
|
|
- // character in Name is a dot.
|
|
|
- if (Idx == 0)
|
|
|
- return -1;
|
|
|
- --Idx;
|
|
|
- bool CheckPrefixes = true;
|
|
|
- while (CheckPrefixes) {
|
|
|
- StringRef FoundName = NameTable[Idx];
|
|
|
- if (Name.startswith(FoundName) && Name[FoundName.size()] == '.')
|
|
|
- return Idx;
|
|
|
- if (Idx == 0)
|
|
|
- return -1;
|
|
|
- --Idx;
|
|
|
- // We have to keep scanning backwards until the previous entry is not a
|
|
|
- // prefix of the current entry. Consider a key of llvm.foo.f64 and a table
|
|
|
- // of llvm.foo and llvm.foo.bar.
|
|
|
- CheckPrefixes = FoundName.startswith(NameTable[Idx]);
|
|
|
- }
|
|
|
-
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
/// \brief This does the actual lookup of an intrinsic ID which
|
|
|
/// matches the given function name.
|
|
|
static Intrinsic::ID lookupIntrinsicID(const ValueName *ValName) {
|
|
|
StringRef Name = ValName->getKey();
|
|
|
- assert(Name.data()[Name.size()] == '\0' && "non-null terminated ValueName");
|
|
|
|
|
|
ArrayRef<const char *> NameTable(&IntrinsicNameTable[1],
|
|
|
std::end(IntrinsicNameTable));
|
|
|
- int Idx = lookupLLVMIntrinsicByName(NameTable, Name);
|
|
|
+ int Idx = Intrinsic::lookupLLVMIntrinsicByName(NameTable, Name);
|
|
|
Intrinsic::ID ID = static_cast<Intrinsic::ID>(Idx + 1);
|
|
|
if (ID == Intrinsic::not_intrinsic)
|
|
|
return ID;
|