24 "No vector functions library"),
26 "Accelerate framework"),
28 "Darwin_libsystem_m",
"Darwin libsystem_m"),
30 "GLIBC Vector Math library"),
32 "IBM MASS vector library"),
34 "Intel SVML library")));
38 #define TLI_DEFINE_STRING
39 #include "llvm/Analysis/TargetLibraryInfo.def"
51 if (
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 9))
54 if (
T.isiOS() &&
T.isOSVersionLT(7, 0))
64 return TT.isGNUEnvironment() || TT.isMusl();
67 return TT.isOSFreeBSD() || TT.isOSSolaris();
92 if (!
Param->isPointerTy() && !
Param->isIntegerTy())
109 F->getParent()->getTargetTriple(),
110 F->getFunctionType());
122 "TargetLibraryInfoImpl function names must be sorted");
137 bool ShouldExtI32Param =
false, ShouldExtI32Return =
false,
138 ShouldSignExtI32Param =
false;
143 ShouldExtI32Param =
true;
144 ShouldExtI32Return =
true;
149 ShouldSignExtI32Param =
true;
178 if (
T.isMacOSXVersionLT(10, 5)) {
183 }
else if (
T.isiOS()) {
184 if (
T.isOSVersionLT(3, 0)) {
189 }
else if (!
T.isWatchOS()) {
208 !
T.isMacOSXVersionLT(10, 7)) {
233 if (
T.isOSWindows() && !
T.isOSCygMing()) {
239 bool hasPartialC99 =
true;
240 if (
T.isKnownWindowsMSVCEnvironment()) {
242 hasPartialC99 = (
Version.getMajor() == 0 ||
Version.getMajor() >= 19);
248 bool hasPartialFloat = (isARM ||
252 if (!hasPartialFloat) {
305 if (!hasPartialC99) {
389 if (
T.isOSWindows() && !
T.isWindowsCygwinEnvironment()) {
425 if (
T.isOSMSVCRT()) {
489 if (
T.isMacOSXVersionLT(10, 9)) {
501 if (!
T.isWatchOS() &&
502 (
T.isOSVersionLT(7, 0) || (
T.isOSVersionLT(9, 0) &&
T.isX86()))) {
562 if (!
T.isOSFreeBSD()) {
570 if (!
T.isOSLinux() || !
T.isGNUEnvironment()) {
578 if (!
T.isAndroid() && !
T.isMusl())
642 if ((
T.isOSLinux() &&
T.isGNUEnvironment()) ||
643 (
T.isAndroid() && !
T.isAndroidVersionLT(28))) {
657 if (
T.isAndroid() &&
T.isAndroidVersionLT(21)) {
834 memset(AvailableArray, -1,
sizeof(AvailableArray));
841 memset(AvailableArray, -1,
sizeof(AvailableArray));
847 : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
848 ShouldExtI32Return(TLI.ShouldExtI32Return),
849 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
850 SizeOfInt(TLI.SizeOfInt) {
851 memcpy(AvailableArray, TLI.AvailableArray,
sizeof(AvailableArray));
852 VectorDescs = TLI.VectorDescs;
853 ScalarDescs = TLI.ScalarDescs;
857 : CustomNames(
std::
move(TLI.CustomNames)),
858 ShouldExtI32Param(TLI.ShouldExtI32Param),
859 ShouldExtI32Return(TLI.ShouldExtI32Return),
860 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
861 SizeOfInt(TLI.SizeOfInt) {
864 VectorDescs = TLI.VectorDescs;
865 ScalarDescs = TLI.ScalarDescs;
869 CustomNames = TLI.CustomNames;
870 ShouldExtI32Param = TLI.ShouldExtI32Param;
871 ShouldExtI32Return = TLI.ShouldExtI32Return;
872 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
873 SizeOfInt = TLI.SizeOfInt;
874 memcpy(AvailableArray, TLI.AvailableArray,
sizeof(AvailableArray));
879 CustomNames =
std::move(TLI.CustomNames);
880 ShouldExtI32Param = TLI.ShouldExtI32Param;
881 ShouldExtI32Return = TLI.ShouldExtI32Return;
882 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
883 SizeOfInt = TLI.SizeOfInt;
902 if (funcName.
empty())
905 const auto *Start =
std::begin(StandardNames);
906 const auto *End =
std::end(StandardNames);
908 if (
I != End && *
I == funcName) {
915 bool TargetLibraryInfoImpl::isValidProtoForLibFunc(
const FunctionType &FTy,
922 unsigned SizeTBits =
M.getDataLayout().getPointerSizeInBits(0);
938 case LibFunc_execvpe:
944 case LibFunc_strlen_chk:
954 case LibFunc_strrchr:
962 case LibFunc_strtoul:
963 case LibFunc_strtoll:
964 case LibFunc_strtold:
965 case LibFunc_strtoull:
966 return ((NumParams == 2 || NumParams == 3) &&
969 case LibFunc_strcat_chk:
979 case LibFunc_strncat_chk:
984 case LibFunc_strncat:
990 case LibFunc_strcpy_chk:
991 case LibFunc_stpcpy_chk:
1002 case LibFunc_strlcat_chk:
1003 case LibFunc_strlcpy_chk:
1008 case LibFunc_strlcat:
1009 case LibFunc_strlcpy:
1015 case LibFunc_strncpy_chk:
1016 case LibFunc_stpncpy_chk:
1021 case LibFunc_strncpy:
1022 case LibFunc_stpncpy:
1028 case LibFunc_strxfrm:
1032 case LibFunc_strcmp:
1037 case LibFunc_strncmp:
1043 case LibFunc_strspn:
1044 case LibFunc_strcspn:
1049 case LibFunc_strcoll:
1050 case LibFunc_strcasecmp:
1051 case LibFunc_strncasecmp:
1055 case LibFunc_strstr:
1060 case LibFunc_strpbrk:
1065 case LibFunc_strtok:
1066 case LibFunc_strtok_r:
1069 case LibFunc_setbuf:
1070 case LibFunc_setvbuf:
1072 case LibFunc_strdup:
1073 case LibFunc_strndup:
1076 case LibFunc_sscanf:
1078 case LibFunc_statvfs:
1079 case LibFunc_siprintf:
1080 case LibFunc_small_sprintf:
1081 case LibFunc_sprintf:
1086 case LibFunc_sprintf_chk:
1093 case LibFunc_snprintf:
1099 case LibFunc_snprintf_chk:
1107 case LibFunc_setitimer:
1110 case LibFunc_system:
1112 case LibFunc___kmpc_alloc_shared:
1114 case LibFunc_malloc:
1115 case LibFunc_vec_malloc:
1118 case LibFunc_memcmp:
1124 case LibFunc_memchr:
1125 case LibFunc_memrchr:
1135 case LibFunc_memcpy_chk:
1136 case LibFunc_mempcpy_chk:
1137 case LibFunc_memmove_chk:
1142 case LibFunc_memcpy:
1143 case LibFunc_mempcpy:
1144 case LibFunc_memmove:
1150 case LibFunc_memset_chk:
1155 case LibFunc_memset:
1161 case LibFunc_memccpy_chk:
1166 case LibFunc_memccpy:
1168 case LibFunc_memalign:
1170 case LibFunc_realloc:
1171 case LibFunc_reallocf:
1172 case LibFunc_vec_realloc:
1178 case LibFunc_rewind:
1180 case LibFunc_remove:
1181 case LibFunc_realpath:
1183 case LibFunc_rename:
1186 case LibFunc_readlink:
1191 case LibFunc_aligned_alloc:
1199 case LibFunc_calloc:
1200 case LibFunc_vec_calloc:
1208 case LibFunc_ferror:
1209 case LibFunc_getenv:
1210 case LibFunc_getpwnam:
1211 case LibFunc_iprintf:
1212 case LibFunc_small_printf:
1213 case LibFunc_pclose:
1214 case LibFunc_perror:
1215 case LibFunc_printf:
1218 case LibFunc_under_IO_getc:
1219 case LibFunc_unlink:
1220 case LibFunc_unsetenv:
1223 case LibFunc_access:
1226 case LibFunc_clearerr:
1227 case LibFunc_closedir:
1228 case LibFunc_ctermid:
1229 case LibFunc_fclose:
1231 case LibFunc_fflush:
1233 case LibFunc_fgetc_unlocked:
1234 case LibFunc_fileno:
1235 case LibFunc_flockfile:
1238 case LibFunc_fseeko64:
1239 case LibFunc_fseeko:
1240 case LibFunc_fsetpos:
1242 case LibFunc_ftello64:
1243 case LibFunc_ftello:
1244 case LibFunc_ftrylockfile:
1245 case LibFunc_funlockfile:
1247 case LibFunc_getc_unlocked:
1248 case LibFunc_getlogin_r:
1250 case LibFunc_mktime:
1252 case LibFunc_vec_free:
1254 case LibFunc___kmpc_free_shared:
1264 case LibFunc_fdopen:
1268 case LibFunc_fputc_unlocked:
1271 case LibFunc_frexpf:
1272 case LibFunc_frexpl:
1273 case LibFunc_fstatvfs:
1276 case LibFunc_fgets_unlocked:
1280 case LibFunc_fread_unlocked:
1283 case LibFunc_fwrite:
1284 case LibFunc_fwrite_unlocked:
1291 case LibFunc_fputs_unlocked:
1294 case LibFunc_fscanf:
1295 case LibFunc_fiprintf:
1296 case LibFunc_small_fprintf:
1297 case LibFunc_fprintf:
1301 case LibFunc_fgetpos:
1304 case LibFunc_getchar:
1305 case LibFunc_getchar_unlocked:
1309 case LibFunc_getitimer:
1311 case LibFunc_ungetc:
1314 case LibFunc_utimes:
1318 case LibFunc_putc_unlocked:
1321 case LibFunc_pwrite:
1327 case LibFunc_vscanf:
1329 case LibFunc_vsscanf:
1332 case LibFunc_vfscanf:
1335 case LibFunc_valloc:
1337 case LibFunc_vprintf:
1339 case LibFunc_vfprintf:
1340 case LibFunc_vsprintf:
1343 case LibFunc_vsprintf_chk:
1347 case LibFunc_vsnprintf:
1350 case LibFunc_vsnprintf_chk:
1356 case LibFunc_opendir:
1359 case LibFunc_tmpfile:
1372 case LibFunc_lchown:
1376 case LibFunc_dunder_strdup:
1377 case LibFunc_dunder_strndup:
1380 case LibFunc_dunder_strtok_r:
1382 case LibFunc_under_IO_putc:
1384 case LibFunc_dunder_isoc99_scanf:
1386 case LibFunc_stat64:
1387 case LibFunc_lstat64:
1388 case LibFunc_statvfs64:
1391 case LibFunc_dunder_isoc99_sscanf:
1394 case LibFunc_fopen64:
1398 case LibFunc_tmpfile64:
1400 case LibFunc_fstat64:
1401 case LibFunc_fstatvfs64:
1403 case LibFunc_open64:
1405 case LibFunc_gettimeofday:
1418 case LibFunc_msvc_new_int:
1420 case LibFunc_msvc_new_longlong:
1422 case LibFunc_msvc_new_array_int:
1424 case LibFunc_msvc_new_array_longlong:
1428 case LibFunc_ZnwjRKSt9nothrow_t:
1430 case LibFunc_ZnwmRKSt9nothrow_t:
1432 case LibFunc_ZnajRKSt9nothrow_t:
1434 case LibFunc_ZnamRKSt9nothrow_t:
1436 case LibFunc_msvc_new_int_nothrow:
1438 case LibFunc_msvc_new_longlong_nothrow:
1440 case LibFunc_msvc_new_array_int_nothrow:
1442 case LibFunc_msvc_new_array_longlong_nothrow:
1444 case LibFunc_ZnwjSt11align_val_t:
1446 case LibFunc_ZnwmSt11align_val_t:
1448 case LibFunc_ZnajSt11align_val_t:
1450 case LibFunc_ZnamSt11align_val_t:
1454 case LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t:
1456 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1458 case LibFunc_ZnajSt11align_val_tRKSt9nothrow_t:
1460 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1468 case LibFunc_msvc_delete_array_ptr32:
1470 case LibFunc_msvc_delete_array_ptr64:
1472 case LibFunc_msvc_delete_ptr32:
1474 case LibFunc_msvc_delete_ptr64:
1478 case LibFunc_ZdaPvRKSt9nothrow_t:
1480 case LibFunc_ZdaPvj:
1482 case LibFunc_ZdaPvm:
1484 case LibFunc_ZdlPvRKSt9nothrow_t:
1486 case LibFunc_ZdlPvj:
1488 case LibFunc_ZdlPvm:
1490 case LibFunc_ZdlPvSt11align_val_t:
1492 case LibFunc_ZdaPvSt11align_val_t:
1494 case LibFunc_msvc_delete_array_ptr32_int:
1496 case LibFunc_msvc_delete_array_ptr32_nothrow:
1498 case LibFunc_msvc_delete_array_ptr64_longlong:
1500 case LibFunc_msvc_delete_array_ptr64_nothrow:
1502 case LibFunc_msvc_delete_ptr32_int:
1504 case LibFunc_msvc_delete_ptr32_nothrow:
1506 case LibFunc_msvc_delete_ptr64_longlong:
1508 case LibFunc_msvc_delete_ptr64_nothrow:
1512 case LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t:
1514 case LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t:
1516 case LibFunc_ZdlPvjSt11align_val_t:
1518 case LibFunc_ZdlPvmSt11align_val_t:
1520 case LibFunc_ZdaPvjSt11align_val_t:
1522 case LibFunc_ZdaPvmSt11align_val_t:
1526 case LibFunc_atomic_load:
1528 case LibFunc_atomic_store:
1534 case LibFunc_memset_pattern4:
1535 case LibFunc_memset_pattern8:
1536 case LibFunc_memset_pattern16:
1537 return (!FTy.
isVarArg() && NumParams == 3 &&
1542 case LibFunc_cxa_guard_abort:
1543 case LibFunc_cxa_guard_acquire:
1544 case LibFunc_cxa_guard_release:
1545 case LibFunc_nvvm_reflect:
1548 case LibFunc_sincospi_stret:
1549 case LibFunc_sincospif_stret:
1553 case LibFunc_acos_finite:
1555 case LibFunc_acosf_finite:
1557 case LibFunc_acosh_finite:
1558 case LibFunc_acoshf:
1559 case LibFunc_acoshf_finite:
1560 case LibFunc_acoshl:
1561 case LibFunc_acoshl_finite:
1563 case LibFunc_acosl_finite:
1565 case LibFunc_asin_finite:
1567 case LibFunc_asinf_finite:
1569 case LibFunc_asinhf:
1570 case LibFunc_asinhl:
1572 case LibFunc_asinl_finite:
1576 case LibFunc_atanh_finite:
1577 case LibFunc_atanhf:
1578 case LibFunc_atanhf_finite:
1579 case LibFunc_atanhl:
1580 case LibFunc_atanhl_finite:
1591 case LibFunc_cosh_finite:
1593 case LibFunc_coshf_finite:
1595 case LibFunc_coshl_finite:
1598 case LibFunc_exp10_finite:
1599 case LibFunc_exp10f:
1600 case LibFunc_exp10f_finite:
1601 case LibFunc_exp10l:
1602 case LibFunc_exp10l_finite:
1604 case LibFunc_exp2_finite:
1606 case LibFunc_exp2f_finite:
1608 case LibFunc_exp2l_finite:
1610 case LibFunc_exp_finite:
1612 case LibFunc_expf_finite:
1614 case LibFunc_expl_finite:
1616 case LibFunc_expm1f:
1617 case LibFunc_expm1l:
1622 case LibFunc_floorf:
1623 case LibFunc_floorl:
1625 case LibFunc_log10_finite:
1626 case LibFunc_log10f:
1627 case LibFunc_log10f_finite:
1628 case LibFunc_log10l:
1629 case LibFunc_log10l_finite:
1631 case LibFunc_log1pf:
1632 case LibFunc_log1pl:
1634 case LibFunc_log2_finite:
1636 case LibFunc_log2f_finite:
1638 case LibFunc_log2l_finite:
1640 case LibFunc_log_finite:
1645 case LibFunc_logf_finite:
1647 case LibFunc_logl_finite:
1648 case LibFunc_nearbyint:
1649 case LibFunc_nearbyintf:
1650 case LibFunc_nearbyintl:
1655 case LibFunc_roundf:
1656 case LibFunc_roundl:
1657 case LibFunc_roundeven:
1658 case LibFunc_roundevenf:
1659 case LibFunc_roundevenl:
1663 case LibFunc_sinh_finite:
1665 case LibFunc_sinhf_finite:
1667 case LibFunc_sinhl_finite:
1670 case LibFunc_sqrt_finite:
1672 case LibFunc_sqrtf_finite:
1674 case LibFunc_sqrtl_finite:
1682 case LibFunc_truncf:
1683 case LibFunc_truncl:
1688 case LibFunc_atan2_finite:
1689 case LibFunc_atan2f:
1690 case LibFunc_atan2f_finite:
1691 case LibFunc_atan2l:
1692 case LibFunc_atan2l_finite:
1702 case LibFunc_remainder:
1703 case LibFunc_remainderf:
1704 case LibFunc_remainderl:
1705 case LibFunc_copysign:
1706 case LibFunc_copysignf:
1707 case LibFunc_copysignl:
1709 case LibFunc_pow_finite:
1711 case LibFunc_powf_finite:
1713 case LibFunc_powl_finite:
1719 case LibFunc_ldexpf:
1720 case LibFunc_ldexpl:
1734 case LibFunc_isdigit:
1735 case LibFunc_isascii:
1736 case LibFunc_toascii:
1737 case LibFunc_putchar:
1738 case LibFunc_putchar_unlocked:
1748 case LibFunc_cxa_atexit:
1759 case LibFunc_sinpif:
1760 case LibFunc_cospif:
1764 case LibFunc_strnlen:
1769 case LibFunc_posix_memalign:
1775 case LibFunc_wcslen:
1781 case LibFunc_cabsl: {
1793 else if (NumParams == 2)
1814 assert(
M &&
"Expecting FDecl to be connected to a Module.");
1821 memset(AvailableArray, 0,
sizeof(AvailableArray));
1825 return LHS.ScalarFnName <
RHS.ScalarFnName;
1829 return LHS.VectorFnName <
RHS.VectorFnName;
1833 return LHS.ScalarFnName <
S;
1849 #define TLI_DEFINE_ACCELERATE_VECFUNCS
1850 #include "llvm/Analysis/VecFuncs.def"
1857 #define TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
1858 #include "llvm/Analysis/VecFuncs.def"
1865 #define TLI_DEFINE_LIBMVEC_X86_VECFUNCS
1866 #include "llvm/Analysis/VecFuncs.def"
1873 #define TLI_DEFINE_MASSV_VECFUNCS
1874 #include "llvm/Analysis/VecFuncs.def"
1881 #define TLI_DEFINE_SVML_VECFUNCS
1882 #include "llvm/Analysis/VecFuncs.def"
1894 if (funcName.
empty())
1897 std::vector<VecDesc>::const_iterator
I =
1899 return I != VectorDescs.end() &&
StringRef(
I->ScalarFnName) == funcName;
1908 std::vector<VecDesc>::const_iterator
I =
1910 while (
I != VectorDescs.end() &&
StringRef(
I->ScalarFnName) ==
F) {
1911 if (
I->VectorizationFactor == VF)
1912 return I->VectorFnName;
1920 if (!BaselineInfoImpl)
1927 if (
auto *ShortWChar = cast_or_null<ConstantAsMetadata>(
1928 M.getModuleFlag(
"wchar_size")))
1929 return cast<ConstantInt>(ShortWChar->getValue())->getZExtValue();
1953 "Target Library Information",
false,
true)
1966 if (ScalarF.
empty())
1969 std::vector<VecDesc>::const_iterator
I =
1971 while (
I != VectorDescs.end() &&
StringRef(
I->ScalarFnName) == ScalarF) {
1973 I->VectorizationFactor.isScalable() ? &ScalableVF : &FixedVF;
1975 *VF =
I->VectorizationFactor;