forked from OSchip/llvm-project
[LibCallSimplifier] refactor FP function signature checks ; NFCI
Use the helper function added in r258428. The check should really be hoisted to the caller of all of these optimize* functions, but that's another step. llvm-svn: 258446
This commit is contained in:
parent
042aed90ab
commit
9beec21fcf
|
@ -1044,18 +1044,14 @@ static Value *optimizeBinaryDoubleFP(CallInst *CI, IRBuilder<> &B) {
|
|||
|
||||
Value *LibCallSimplifier::optimizeCos(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 1, false))
|
||||
return nullptr;
|
||||
|
||||
Value *Ret = nullptr;
|
||||
StringRef Name = Callee->getName();
|
||||
if (UnsafeFPShrink && Name == "cos" && hasFloatVersion(Name))
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, true);
|
||||
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
// Just make sure this has 1 argument of FP type, which matches the
|
||||
// result type.
|
||||
if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return Ret;
|
||||
|
||||
// cos(-x) -> cos(x)
|
||||
Value *Op1 = CI->getArgOperand(0);
|
||||
if (BinaryOperator::isFNeg(Op1)) {
|
||||
|
@ -1092,19 +1088,14 @@ static Value *getPow(Value *InnerChain[33], unsigned Exp, IRBuilder<> &B) {
|
|||
|
||||
Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 2, false))
|
||||
return nullptr;
|
||||
|
||||
Value *Ret = nullptr;
|
||||
StringRef Name = Callee->getName();
|
||||
if (UnsafeFPShrink && Name == "pow" && hasFloatVersion(Name))
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, true);
|
||||
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
// Just make sure this has 2 arguments of the same FP type, which match the
|
||||
// result type.
|
||||
if (FT->getNumParams() != 2 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
FT->getParamType(0) != FT->getParamType(1) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return Ret;
|
||||
|
||||
Value *Op1 = CI->getArgOperand(0), *Op2 = CI->getArgOperand(1);
|
||||
if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) {
|
||||
// pow(1.0, x) -> 1.0
|
||||
|
@ -1218,18 +1209,14 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {
|
|||
|
||||
Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 1, false))
|
||||
return nullptr;
|
||||
|
||||
Value *Ret = nullptr;
|
||||
StringRef Name = Callee->getName();
|
||||
if (UnsafeFPShrink && Name == "exp2" && hasFloatVersion(Name))
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, true);
|
||||
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
// Just make sure this has 1 argument of FP type, which matches the
|
||||
// result type.
|
||||
if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return Ret;
|
||||
|
||||
Value *Op = CI->getArgOperand(0);
|
||||
// Turn exp2(sitofp(x)) -> ldexp(1.0, sext(x)) if sizeof(x) <= 32
|
||||
// Turn exp2(uitofp(x)) -> ldexp(1.0, zext(x)) if sizeof(x) < 32
|
||||
|
@ -1270,17 +1257,14 @@ Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilder<> &B) {
|
|||
|
||||
Value *LibCallSimplifier::optimizeFabs(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 1, false))
|
||||
return nullptr;
|
||||
|
||||
Value *Ret = nullptr;
|
||||
StringRef Name = Callee->getName();
|
||||
if (Name == "fabs" && hasFloatVersion(Name))
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, false);
|
||||
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
// Make sure this has 1 argument of FP type which matches the result type.
|
||||
if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return Ret;
|
||||
|
||||
Value *Op = CI->getArgOperand(0);
|
||||
if (Instruction *I = dyn_cast<Instruction>(Op)) {
|
||||
// Fold fabs(x * x) -> x * x; any squared FP value must already be positive.
|
||||
|
@ -1292,21 +1276,17 @@ Value *LibCallSimplifier::optimizeFabs(CallInst *CI, IRBuilder<> &B) {
|
|||
}
|
||||
|
||||
Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 2, false))
|
||||
return nullptr;
|
||||
|
||||
// If we can shrink the call to a float function rather than a double
|
||||
// function, do that first.
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
StringRef Name = Callee->getName();
|
||||
if ((Name == "fmin" || Name == "fmax") && hasFloatVersion(Name))
|
||||
if (Value *Ret = optimizeBinaryDoubleFP(CI, B))
|
||||
return Ret;
|
||||
|
||||
// Make sure this has 2 arguments of FP type which match the result type.
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
if (FT->getNumParams() != 2 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
FT->getParamType(0) != FT->getParamType(1) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return nullptr;
|
||||
|
||||
IRBuilder<>::FastMathFlagGuard Guard(B);
|
||||
FastMathFlags FMF;
|
||||
if (CI->hasUnsafeAlgebra()) {
|
||||
|
@ -1337,17 +1317,13 @@ Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilder<> &B) {
|
|||
|
||||
Value *LibCallSimplifier::optimizeLog(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 1, false))
|
||||
return nullptr;
|
||||
|
||||
Value *Ret = nullptr;
|
||||
StringRef Name = Callee->getName();
|
||||
if (UnsafeFPShrink && hasFloatVersion(Name))
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, true);
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
|
||||
// Just make sure this has 1 argument of FP type, which matches the
|
||||
// result type.
|
||||
if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return Ret;
|
||||
|
||||
if (!CI->hasUnsafeAlgebra())
|
||||
return Ret;
|
||||
|
@ -1389,21 +1365,14 @@ Value *LibCallSimplifier::optimizeLog(CallInst *CI, IRBuilder<> &B) {
|
|||
|
||||
Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 1, false))
|
||||
return nullptr;
|
||||
|
||||
Value *Ret = nullptr;
|
||||
if (TLI->has(LibFunc::sqrtf) && (Callee->getName() == "sqrt" ||
|
||||
Callee->getIntrinsicID() == Intrinsic::sqrt))
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, true);
|
||||
|
||||
// FIXME: Refactor - this check is repeated all over this file and even in the
|
||||
// preceding call to shrink double -> float.
|
||||
|
||||
// Make sure this has 1 argument of FP type, which matches the result type.
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return Ret;
|
||||
|
||||
if (!CI->hasUnsafeAlgebra())
|
||||
return Ret;
|
||||
|
||||
|
@ -1466,17 +1435,13 @@ Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilder<> &B) {
|
|||
// TODO: Generalize to handle any trig function and its inverse.
|
||||
Value *LibCallSimplifier::optimizeTan(CallInst *CI, IRBuilder<> &B) {
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
if (!matchesFPLibFunctionSignature(Callee, 1, false))
|
||||
return nullptr;
|
||||
|
||||
Value *Ret = nullptr;
|
||||
StringRef Name = Callee->getName();
|
||||
if (UnsafeFPShrink && Name == "tan" && hasFloatVersion(Name))
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, true);
|
||||
FunctionType *FT = Callee->getFunctionType();
|
||||
|
||||
// Just make sure this has 1 argument of FP type, which matches the
|
||||
// result type.
|
||||
if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isFloatingPointTy())
|
||||
return Ret;
|
||||
|
||||
Value *Op1 = CI->getArgOperand(0);
|
||||
auto *OpC = dyn_cast<CallInst>(Op1);
|
||||
|
@ -1506,7 +1471,6 @@ static void insertSinCosCall(IRBuilder<> &B, Function *OrigCallee, Value *Arg,
|
|||
Value *&SinCos);
|
||||
|
||||
Value *LibCallSimplifier::optimizeSinCosPi(CallInst *CI, IRBuilder<> &B) {
|
||||
|
||||
// Make sure the prototype is as expected, otherwise the rest of the
|
||||
// function is probably invalid and likely to abort.
|
||||
if (!isTrigLibCall(CI))
|
||||
|
|
Loading…
Reference in New Issue