diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.def b/llvm/include/llvm/Analysis/TargetLibraryInfo.def index 3e23e398f6a79..fd53a26ef8fc1 100644 --- a/llvm/include/llvm/Analysis/TargetLibraryInfo.def +++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.def @@ -1671,6 +1671,21 @@ TLI_DEFINE_ENUM_INTERNAL(htons) TLI_DEFINE_STRING_INTERNAL("htons") TLI_DEFINE_SIG_INTERNAL(Int16, Int16) +/// double hypot(double x, double y); +TLI_DEFINE_ENUM_INTERNAL(hypot) +TLI_DEFINE_STRING_INTERNAL("hypot") +TLI_DEFINE_SIG_INTERNAL(Dbl, Dbl, Dbl) + +/// float hypotf(float x, float y); +TLI_DEFINE_ENUM_INTERNAL(hypotf) +TLI_DEFINE_STRING_INTERNAL("hypotf") +TLI_DEFINE_SIG_INTERNAL(Flt, Flt, Flt) + +/// long double hypotl(long double x, long double y); +TLI_DEFINE_ENUM_INTERNAL(hypotl) +TLI_DEFINE_STRING_INTERNAL("hypotl") +TLI_DEFINE_SIG_INTERNAL(LDbl, LDbl, LDbl) + /// int iprintf(const char *format, ...); TLI_DEFINE_ENUM_INTERNAL(iprintf) TLI_DEFINE_STRING_INTERNAL("iprintf") diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp index 0ee83d217a500..7f0b98ab3c151 100644 --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -300,6 +300,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T, TLI.setUnavailable(LibFunc_expf); TLI.setUnavailable(LibFunc_floorf); TLI.setUnavailable(LibFunc_fmodf); + TLI.setUnavailable(LibFunc_hypotf); TLI.setUnavailable(LibFunc_log10f); TLI.setUnavailable(LibFunc_logf); TLI.setUnavailable(LibFunc_modff); @@ -331,6 +332,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T, TLI.setUnavailable(LibFunc_floorl); TLI.setUnavailable(LibFunc_fmodl); TLI.setUnavailable(LibFunc_frexpl); + TLI.setUnavailable(LibFunc_hypotl); TLI.setUnavailable(LibFunc_ldexpl); TLI.setUnavailable(LibFunc_log10l); TLI.setUnavailable(LibFunc_logl); diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp index 5fd4fd78c28a9..e039457f313b2 100644 --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -1215,6 +1215,9 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F, case LibFunc_fmod: case LibFunc_fmodf: case LibFunc_fmodl: + case LibFunc_hypot: + case LibFunc_hypotf: + case LibFunc_hypotl: case LibFunc_isascii: case LibFunc_isdigit: case LibFunc_labs: diff --git a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll index d8266f4c6703d..452d90aa98d88 100644 --- a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll +++ b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll @@ -589,6 +589,15 @@ declare ptr @gets(ptr) ; CHECK: declare noundef i32 @gettimeofday(ptr nocapture noundef, ptr nocapture noundef) [[NOFREE_NOUNWIND]] declare i32 @gettimeofday(ptr, ptr) +; CHECK: declare double @hypot(double, double) [[NOFREE_NOUNWIND_WILLRETURN_WRITEONLY]] +declare double @hypot(double, double) + +; CHECK: declare float @hypotf(float, float) [[NOFREE_NOUNWIND_WILLRETURN_WRITEONLY]] +declare float @hypotf(float, float) + +; CHECK: declare x86_fp80 @hypotl(x86_fp80, x86_fp80) [[NOFREE_NOUNWIND_WILLRETURN_WRITEONLY]] +declare x86_fp80 @hypotl(x86_fp80, x86_fp80) + ; CHECK: declare i32 @isascii(i32) [[NOFREE_NOUNWIND_WILLRETURN_WRITEONLY]] declare i32 @isascii(i32) diff --git a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml b/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml index 408b9c3993428..6702725e4fc8a 100644 --- a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml +++ b/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml @@ -34,7 +34,7 @@ # # CHECK: << Total TLI yes SDK no: 18 # CHECK: >> Total TLI no SDK yes: 0 -# CHECK: == Total TLI yes SDK yes: 268 +# CHECK: == Total TLI yes SDK yes: 271 # # WRONG_DETAIL: << TLI yes SDK no : '_ZdaPv' aka operator delete[](void*) # WRONG_DETAIL: >> TLI no SDK yes: '_ZdaPvj' aka operator delete[](void*, unsigned int) @@ -48,14 +48,14 @@ # WRONG_DETAIL: << TLI yes SDK no : 'fminimum_numl' # WRONG_SUMMARY: << Total TLI yes SDK no: 19{{$}} # WRONG_SUMMARY: >> Total TLI no SDK yes: 1{{$}} -# WRONG_SUMMARY: == Total TLI yes SDK yes: 267 +# WRONG_SUMMARY: == Total TLI yes SDK yes: 270 # ## The -COUNT suffix doesn't care if there are too many matches, so check ## the exact count first; the two directives should add up to that. ## Yes, this means additions to TLI will fail this test, but the argument ## to -COUNT can't be an expression. -# AVAIL: TLI knows 519 symbols, 286 available -# AVAIL-COUNT-286: {{^}} available +# AVAIL: TLI knows 522 symbols, 289 available +# AVAIL-COUNT-289: {{^}} available # AVAIL-NOT: {{^}} available # UNAVAIL-COUNT-233: not available # UNAVAIL-NOT: not available @@ -602,6 +602,18 @@ DynamicSymbols: Type: STT_FUNC Section: .text Binding: STB_GLOBAL + - Name: hypot + Type: STT_FUNC + Section: .text + Binding: STB_GLOBAL + - Name: hypotf + Type: STT_FUNC + Section: .text + Binding: STB_GLOBAL + - Name: hypotl + Type: STT_FUNC + Section: .text + Binding: STB_GLOBAL - Name: isdigit Type: STT_FUNC Section: .text diff --git a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp index 98f8989d4e6e9..982d00c5d3359 100644 --- a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp +++ b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp @@ -249,6 +249,9 @@ TEST_F(TargetLibraryInfoTest, ValidProto) { "declare %struct* @getpwnam(i8*)\n" "declare i8* @gets(i8*)\n" "declare i32 @gettimeofday(%struct*, i8*)\n" + "declare double @hypot(double, double)\n" + "declare float @hypotf(float, float)\n" + "declare x86_fp80 @hypotl(x86_fp80, x86_fp80)\n" "declare i32 @_Z7isasciii(i32)\n" "declare i32 @_Z7isdigiti(i32)\n" "declare i64 @labs(i64)\n"