diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.def b/llvm/include/llvm/Analysis/TargetLibraryInfo.def --- a/llvm/include/llvm/Analysis/TargetLibraryInfo.def +++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.def @@ -1048,6 +1048,12 @@ /// void memset_pattern16(void *b, const void *pattern16, size_t len); TLI_DEFINE_ENUM_INTERNAL(memset_pattern16) TLI_DEFINE_STRING_INTERNAL("memset_pattern16") +/// void memset_pattern4(void *b, const void *pattern4, size_t len); +TLI_DEFINE_ENUM_INTERNAL(memset_pattern4) +TLI_DEFINE_STRING_INTERNAL("memset_pattern4") +/// void memset_pattern8(void *b, const void *pattern8, size_t len); +TLI_DEFINE_ENUM_INTERNAL(memset_pattern8) +TLI_DEFINE_STRING_INTERNAL("memset_pattern8") /// int mkdir(const char *path, mode_t mode); TLI_DEFINE_ENUM_INTERNAL(mkdir) TLI_DEFINE_STRING_INTERNAL("mkdir") diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -166,7 +166,7 @@ return; } - // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later. + // memset_pattern{4,8,16} is only available on iOS 3.0 and Mac OS X 10.5 and later. // All versions of watchOS support it. if (T.isMacOSX()) { // available IO unlocked variants on Mac OS X @@ -175,13 +175,21 @@ TLI.setAvailable(LibFunc_putc_unlocked); TLI.setAvailable(LibFunc_putchar_unlocked); - if (T.isMacOSXVersionLT(10, 5)) + if (T.isMacOSXVersionLT(10, 5)) { + TLI.setUnavailable(LibFunc_memset_pattern4); + TLI.setUnavailable(LibFunc_memset_pattern8); TLI.setUnavailable(LibFunc_memset_pattern16); + } } else if (T.isiOS()) { - if (T.isOSVersionLT(3, 0)) + if (T.isOSVersionLT(3, 0)) { + TLI.setUnavailable(LibFunc_memset_pattern4); + TLI.setUnavailable(LibFunc_memset_pattern8); TLI.setUnavailable(LibFunc_memset_pattern16); + } } else if (!T.isWatchOS()) { - TLI.setUnavailable(LibFunc_memset_pattern16); + TLI.setUnavailable(LibFunc_memset_pattern4); + TLI.setUnavailable(LibFunc_memset_pattern8); + TLI.setUnavailable(LibFunc_memset_pattern16); } if (!hasSinCosPiStret(T)) { @@ -1522,6 +1530,8 @@ FTy.getParamType(2)->isPointerTy() && FTy.getParamType(3)->isIntegerTy()); + case LibFunc_memset_pattern4: + case LibFunc_memset_pattern8: case LibFunc_memset_pattern16: return (!FTy.isVarArg() && NumParams == 3 && FTy.getParamType(0)->isPointerTy() && diff --git a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp --- a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp +++ b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp @@ -240,6 +240,8 @@ "declare i8* @memmove(i8*, i8*, i64)\n" "declare i8* @memset(i8*, i32, i64)\n" "declare void @memset_pattern16(i8*, i8*, i64)\n" + "declare void @memset_pattern4(i8*, i8*, i64)\n" + "declare void @memset_pattern8(i8*, i8*, i64)\n" "declare i32 @mkdir(i8*, i16)\n" "declare double @modf(double, double*)\n" "declare float @modff(float, float*)\n"