aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/TargetLibraryInfo.cpp
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2017-12-16 01:26:25 +0000
committerHal Finkel <hfinkel@anl.gov>2017-12-16 01:26:25 +0000
commit2ff24731bbf905faab6580de7c3e68092ca1ae17 (patch)
treeb94925a2ab5323a87d297d7e72537838e45fe366 /llvm/lib/Analysis/TargetLibraryInfo.cpp
parent7333aa9f16013bf12e9b1947f636d8a4b4586ef0 (diff)
downloadllvm-2ff24731bbf905faab6580de7c3e68092ca1ae17.zip
llvm-2ff24731bbf905faab6580de7c3e68092ca1ae17.tar.gz
llvm-2ff24731bbf905faab6580de7c3e68092ca1ae17.tar.bz2
[SimplifyLibCalls] Inline calls to cabs when it's safe to do so
When unsafe algerbra is allowed calls to cabs(r) can be replaced by: sqrt(creal(r)*creal(r) + cimag(r)*cimag(r)) Patch by Paul Walker, thanks! Differential Revision: https://reviews.llvm.org/D40069 llvm-svn: 320901
Diffstat (limited to 'llvm/lib/Analysis/TargetLibraryInfo.cpp')
-rw-r--r--llvm/lib/Analysis/TargetLibraryInfo.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp
index f8facf2..609b9961 100644
--- a/llvm/lib/Analysis/TargetLibraryInfo.cpp
+++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp
@@ -182,6 +182,9 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_atanh);
TLI.setUnavailable(LibFunc_atanhf);
TLI.setUnavailable(LibFunc_atanhl);
+ TLI.setUnavailable(LibFunc_cabs);
+ TLI.setUnavailable(LibFunc_cabsf);
+ TLI.setUnavailable(LibFunc_cabsl);
TLI.setUnavailable(LibFunc_cbrt);
TLI.setUnavailable(LibFunc_cbrtf);
TLI.setUnavailable(LibFunc_cbrtl);
@@ -1267,6 +1270,25 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
FTy.getReturnType()->isIntegerTy());
+ case LibFunc_cabs:
+ case LibFunc_cabsf:
+ case LibFunc_cabsl: {
+ Type* RetTy = FTy.getReturnType();
+ if (!RetTy->isFloatingPointTy())
+ return false;
+
+ // NOTE: These prototypes are target specific and currently support
+ // "complex" passed as an array or discrete real & imaginary parameters.
+ // Add other calling conventions to enable libcall optimizations.
+ if (NumParams == 1)
+ return (FTy.getParamType(0)->isArrayTy() &&
+ FTy.getParamType(0)->getArrayNumElements() == 2 &&
+ FTy.getParamType(0)->getArrayElementType() == RetTy);
+ else if (NumParams == 2)
+ return (FTy.getParamType(0) == RetTy && FTy.getParamType(1) == RetTy);
+ else
+ return false;
+ }
case LibFunc::NumLibFuncs:
break;
}