diff options
Diffstat (limited to 'contrib/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
| -rw-r--r-- | contrib/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 445 | 
1 files changed, 323 insertions, 122 deletions
diff --git a/contrib/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/contrib/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index 6bbf8287e223..81dea6d1b9ae 100644 --- a/contrib/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/contrib/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -18,6 +18,7 @@  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/StringMap.h"  #include "llvm/ADT/Triple.h" +#include "llvm/Analysis/TargetLibraryInfo.h"  #include "llvm/Analysis/ValueTracking.h"  #include "llvm/IR/DataLayout.h"  #include "llvm/IR/DiagnosticInfo.h" @@ -30,8 +31,8 @@  #include "llvm/IR/PatternMatch.h"  #include "llvm/Support/Allocator.h"  #include "llvm/Support/CommandLine.h" -#include "llvm/Analysis/TargetLibraryInfo.h"  #include "llvm/Transforms/Utils/BuildLibCalls.h" +#include "llvm/Transforms/Utils/Local.h"  using namespace llvm;  using namespace PatternMatch; @@ -52,16 +53,8 @@ static cl::opt<bool>  //===----------------------------------------------------------------------===//  static bool ignoreCallingConv(LibFunc::Func Func) { -  switch (Func) { -  case LibFunc::abs: -  case LibFunc::labs: -  case LibFunc::llabs: -  case LibFunc::strlen: -    return true; -  default: -    return false; -  } -  llvm_unreachable("All cases should be covered in the switch."); +  return Func == LibFunc::abs || Func == LibFunc::labs || +         Func == LibFunc::llabs || Func == LibFunc::strlen;  }  /// isOnlyUsedInZeroEqualityComparison - Return true if it only matters that the @@ -93,16 +86,13 @@ static bool isOnlyUsedInEqualityComparison(Value *V, Value *With) {  }  static bool callHasFloatingPointArgument(const CallInst *CI) { -  for (CallInst::const_op_iterator it = CI->op_begin(), e = CI->op_end(); -       it != e; ++it) { -    if ((*it)->getType()->isFloatingPointTy()) -      return true; -  } -  return false; +  return std::any_of(CI->op_begin(), CI->op_end(), [](const Use &OI) { +    return OI->getType()->isFloatingPointTy(); +  });  }  /// \brief Check whether the overloaded unary floating point function -/// corresponing to \a Ty is available. +/// corresponding to \a Ty is available.  static bool hasUnaryFloatFn(const TargetLibraryInfo *TLI, Type *Ty,                              LibFunc::Func DoubleFn, LibFunc::Func FloatFn,                              LibFunc::Func LongDoubleFn) { @@ -116,6 +106,23 @@ static bool hasUnaryFloatFn(const TargetLibraryInfo *TLI, Type *Ty,    }  } +/// \brief Check whether we can use unsafe floating point math for +/// the function passed as input. +static bool canUseUnsafeFPMath(Function *F) { + +  // FIXME: For finer-grain optimization, we need intrinsics to have the same +  // fast-math flag decorations that are applied to FP instructions. For now, +  // we have to rely on the function-level unsafe-fp-math attribute to do this +  // optimization because there's no other way to express that the call can be +  // relaxed. +  if (F->hasFnAttribute("unsafe-fp-math")) { +    Attribute Attr = F->getFnAttribute("unsafe-fp-math"); +    if (Attr.getValueAsString() == "true") +      return true; +  } +  return false; +} +  /// \brief Returns whether \p F matches the signature expected for the  /// string/memory copying library function \p Func.  /// Acceptable functions are st[rp][n]?cpy, memove, memcpy, and memset. @@ -467,9 +474,6 @@ Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilder<> &B) {  Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction(); -  // Verify the "stpcpy" function prototype. -  FunctionType *FT = Callee->getFunctionType(); -    if (!checkStringCopyLibFuncSignature(Callee, LibFunc::stpcpy))      return nullptr; @@ -484,7 +488,7 @@ Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilder<> &B) {    if (Len == 0)      return nullptr; -  Type *PT = FT->getParamType(0); +  Type *PT = Callee->getFunctionType()->getParamType(0);    Value *LenV = ConstantInt::get(DL.getIntPtrType(PT), Len);    Value *DstEnd =        B.CreateGEP(B.getInt8Ty(), Dst, ConstantInt::get(DL.getIntPtrType(PT), Len - 1)); @@ -497,8 +501,6 @@ Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilder<> &B) {  Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction(); -  FunctionType *FT = Callee->getFunctionType(); -    if (!checkStringCopyLibFuncSignature(Callee, LibFunc::strncpy))      return nullptr; @@ -531,7 +533,7 @@ Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilder<> &B) {    if (Len > SrcLen + 1)      return nullptr; -  Type *PT = FT->getParamType(0); +  Type *PT = Callee->getFunctionType()->getParamType(0);    // strncpy(x, s, c) -> memcpy(x, s, c, 1) [s and c are constant]    B.CreateMemCpy(Dst, Src, ConstantInt::get(DL.getIntPtrType(PT), Len), 1); @@ -862,6 +864,27 @@ Value *LibCallSimplifier::optimizeMemCmp(CallInst *CI, IRBuilder<> &B) {      return B.CreateSub(LHSV, RHSV, "chardiff");    } +  // memcmp(S1,S2,N/8)==0 -> (*(intN_t*)S1 != *(intN_t*)S2)==0 +  if (DL.isLegalInteger(Len * 8) && isOnlyUsedInZeroEqualityComparison(CI)) { + +    IntegerType *IntType = IntegerType::get(CI->getContext(), Len * 8); +    unsigned PrefAlignment = DL.getPrefTypeAlignment(IntType); + +    if (getKnownAlignment(LHS, DL, CI) >= PrefAlignment && +        getKnownAlignment(RHS, DL, CI) >= PrefAlignment) { + +      Type *LHSPtrTy = +          IntType->getPointerTo(LHS->getType()->getPointerAddressSpace()); +      Type *RHSPtrTy = +          IntType->getPointerTo(RHS->getType()->getPointerAddressSpace()); + +      Value *LHSV = B.CreateLoad(B.CreateBitCast(LHS, LHSPtrTy, "lhsc"), "lhsv"); +      Value *RHSV = B.CreateLoad(B.CreateBitCast(RHS, RHSPtrTy, "rhsc"), "rhsv"); + +      return B.CreateZExt(B.CreateICmpNE(LHSV, RHSV), CI->getType(), "memcmp"); +    } +  } +    // Constant folding: memcmp(x, y, l) -> cnst (all arguments are constant)    StringRef LHSStr, RHSStr;    if (getConstantStringInfo(LHS, LHSStr) && @@ -972,7 +995,7 @@ Value *LibCallSimplifier::optimizeUnaryDoubleFP(CallInst *CI, IRBuilder<> &B,    // floor((double)floatval) -> (double)floorf(floatval)    if (Callee->isIntrinsic()) { -    Module *M = CI->getParent()->getParent()->getParent(); +    Module *M = CI->getModule();      Intrinsic::ID IID = Callee->getIntrinsicID();      Function *F = Intrinsic::getDeclaration(M, IID, B.getFloatTy());      V = B.CreateCall(F, V); @@ -1015,9 +1038,9 @@ Value *LibCallSimplifier::optimizeBinaryDoubleFP(CallInst *CI, IRBuilder<> &B) {  Value *LibCallSimplifier::optimizeCos(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction();    Value *Ret = nullptr; -  if (UnsafeFPShrink && Callee->getName() == "cos" && TLI->has(LibFunc::cosf)) { +  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 @@ -1035,13 +1058,37 @@ Value *LibCallSimplifier::optimizeCos(CallInst *CI, IRBuilder<> &B) {    return Ret;  } +static Value *getPow(Value *InnerChain[33], unsigned Exp, IRBuilder<> &B) { +  // Multiplications calculated using Addition Chains. +  // Refer: http://wwwhomes.uni-bielefeld.de/achim/addition_chain.html + +  assert(Exp != 0 && "Incorrect exponent 0 not handled"); + +  if (InnerChain[Exp]) +    return InnerChain[Exp]; + +  static const unsigned AddChain[33][2] = { +      {0, 0}, // Unused. +      {0, 0}, // Unused (base case = pow1). +      {1, 1}, // Unused (pre-computed). +      {1, 2},  {2, 2},   {2, 3},  {3, 3},   {2, 5},  {4, 4}, +      {1, 8},  {5, 5},   {1, 10}, {6, 6},   {4, 9},  {7, 7}, +      {3, 12}, {8, 8},   {8, 9},  {2, 16},  {1, 18}, {10, 10}, +      {6, 15}, {11, 11}, {3, 20}, {12, 12}, {8, 17}, {13, 13}, +      {3, 24}, {14, 14}, {4, 25}, {15, 15}, {3, 28}, {16, 16}, +  }; + +  InnerChain[Exp] = B.CreateFMul(getPow(InnerChain, AddChain[Exp][0], B), +                                 getPow(InnerChain, AddChain[Exp][1], B)); +  return InnerChain[Exp]; +} +  Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction(); -    Value *Ret = nullptr; -  if (UnsafeFPShrink && Callee->getName() == "pow" && TLI->has(LibFunc::powf)) { +  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 @@ -1060,7 +1107,8 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {      if (Op1C->isExactlyValue(2.0) &&          hasUnaryFloatFn(TLI, Op1->getType(), LibFunc::exp2, LibFunc::exp2f,                          LibFunc::exp2l)) -      return EmitUnaryFloatFnCall(Op2, "exp2", B, Callee->getAttributes()); +      return EmitUnaryFloatFnCall(Op2, TLI->getName(LibFunc::exp2), B, +                                  Callee->getAttributes());      // pow(10.0, x) -> exp10(x)      if (Op1C->isExactlyValue(10.0) &&          hasUnaryFloatFn(TLI, Op1->getType(), LibFunc::exp10, LibFunc::exp10f, @@ -1069,6 +1117,32 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {                                    Callee->getAttributes());    } +  bool unsafeFPMath = canUseUnsafeFPMath(CI->getParent()->getParent()); + +  // pow(exp(x), y) -> exp(x*y) +  // pow(exp2(x), y) -> exp2(x * y) +  // We enable these only under fast-math. Besides rounding +  // differences the transformation changes overflow and +  // underflow behavior quite dramatically. +  // Example: x = 1000, y = 0.001. +  // pow(exp(x), y) = pow(inf, 0.001) = inf, whereas exp(x*y) = exp(1). +  if (unsafeFPMath) { +    if (auto *OpC = dyn_cast<CallInst>(Op1)) { +      IRBuilder<>::FastMathFlagGuard Guard(B); +      FastMathFlags FMF; +      FMF.setUnsafeAlgebra(); +      B.SetFastMathFlags(FMF); + +      LibFunc::Func Func; +      Function *OpCCallee = OpC->getCalledFunction(); +      if (OpCCallee && TLI->getLibFunc(OpCCallee->getName(), Func) && +          TLI->has(Func) && (Func == LibFunc::exp || Func == LibFunc::exp2)) +        return EmitUnaryFloatFnCall( +            B.CreateFMul(OpC->getArgOperand(0), Op2, "mul"), +            OpCCallee->getName(), B, OpCCallee->getAttributes()); +    } +  } +    ConstantFP *Op2C = dyn_cast<ConstantFP>(Op2);    if (!Op2C)      return Ret; @@ -1081,10 +1155,15 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {                        LibFunc::sqrtl) &&        hasUnaryFloatFn(TLI, Op2->getType(), LibFunc::fabs, LibFunc::fabsf,                        LibFunc::fabsl)) { + +    // In -ffast-math, pow(x, 0.5) -> sqrt(x). +    if (unsafeFPMath) +      return EmitUnaryFloatFnCall(Op1, TLI->getName(LibFunc::sqrt), B, +                                  Callee->getAttributes()); +      // Expand pow(x, 0.5) to (x == -infinity ? +infinity : fabs(sqrt(x))).      // This is faster than calling pow, and still handles negative zero      // and negative infinity correctly. -    // TODO: In fast-math mode, this could be just sqrt(x).      // TODO: In finite-only mode, this could be just fabs(sqrt(x)).      Value *Inf = ConstantFP::getInfinity(CI->getType());      Value *NegInf = ConstantFP::getInfinity(CI->getType(), true); @@ -1102,18 +1181,42 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {      return B.CreateFMul(Op1, Op1, "pow2");    if (Op2C->isExactlyValue(-1.0)) // pow(x, -1.0) -> 1.0/x      return B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), Op1, "powrecip"); + +  // In -ffast-math, generate repeated fmul instead of generating pow(x, n). +  if (unsafeFPMath) { +    APFloat V = abs(Op2C->getValueAPF()); +    // We limit to a max of 7 fmul(s). Thus max exponent is 32. +    // This transformation applies to integer exponents only. +    if (V.compare(APFloat(V.getSemantics(), 32.0)) == APFloat::cmpGreaterThan || +        !V.isInteger()) +      return nullptr; + +    // We will memoize intermediate products of the Addition Chain. +    Value *InnerChain[33] = {nullptr}; +    InnerChain[1] = Op1; +    InnerChain[2] = B.CreateFMul(Op1, Op1); + +    // We cannot readily convert a non-double type (like float) to a double. +    // So we first convert V to something which could be converted to double. +    bool ignored; +    V.convert(APFloat::IEEEdouble, APFloat::rmTowardZero, &ignored); +    Value *FMul = getPow(InnerChain, V.convertToDouble(), B); +    // For negative exponents simply compute the reciprocal. +    if (Op2C->isNegative()) +      FMul = B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), FMul); +    return FMul; +  } +    return nullptr;  }  Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction();    Function *Caller = CI->getParent()->getParent(); -    Value *Ret = nullptr; -  if (UnsafeFPShrink && Callee->getName() == "exp2" && -      TLI->has(LibFunc::exp2f)) { +  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 @@ -1162,11 +1265,10 @@ Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilder<> &B) {  Value *LibCallSimplifier::optimizeFabs(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction(); -    Value *Ret = nullptr; -  if (Callee->getName() == "fabs" && TLI->has(LibFunc::fabsf)) { +  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. @@ -1184,6 +1286,105 @@ Value *LibCallSimplifier::optimizeFabs(CallInst *CI, IRBuilder<> &B) {    return Ret;  } +Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilder<> &B) { +  // 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" && hasFloatVersion(Name)) || +      (Name == "fmax" && hasFloatVersion(Name))) { +    Value *Ret = optimizeBinaryDoubleFP(CI, B); +    if (Ret) +      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; +  Function *F = CI->getParent()->getParent(); +  if (canUseUnsafeFPMath(F)) { +    // Unsafe algebra sets all fast-math-flags to true. +    FMF.setUnsafeAlgebra(); +  } else { +    // At a minimum, no-nans-fp-math must be true. +    Attribute Attr = F->getFnAttribute("no-nans-fp-math"); +    if (Attr.getValueAsString() != "true") +      return nullptr; +    // No-signed-zeros is implied by the definitions of fmax/fmin themselves: +    // "Ideally, fmax would be sensitive to the sign of zero, for example +    // fmax(-0. 0, +0. 0) would return +0; however, implementation in software +    // might be impractical." +    FMF.setNoSignedZeros(); +    FMF.setNoNaNs(); +  } +  B.SetFastMathFlags(FMF); + +  // We have a relaxed floating-point environment. We can ignore NaN-handling +  // and transform to a compare and select. We do not have to consider errno or +  // exceptions, because fmin/fmax do not have those. +  Value *Op0 = CI->getArgOperand(0); +  Value *Op1 = CI->getArgOperand(1); +  Value *Cmp = Callee->getName().startswith("fmin") ? +    B.CreateFCmpOLT(Op0, Op1) : B.CreateFCmpOGT(Op0, Op1); +  return B.CreateSelect(Cmp, Op0, Op1); +} + +Value *LibCallSimplifier::optimizeLog(CallInst *CI, IRBuilder<> &B) { +  Function *Callee = CI->getCalledFunction(); +  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 (!canUseUnsafeFPMath(CI->getParent()->getParent())) +    return Ret; +  Value *Op1 = CI->getArgOperand(0); +  auto *OpC = dyn_cast<CallInst>(Op1); +  if (!OpC) +    return Ret; + +  // log(pow(x,y)) -> y*log(x) +  // This is only applicable to log, log2, log10. +  if (Name != "log" && Name != "log2" && Name != "log10") +    return Ret; + +  IRBuilder<>::FastMathFlagGuard Guard(B); +  FastMathFlags FMF; +  FMF.setUnsafeAlgebra(); +  B.SetFastMathFlags(FMF); + +  LibFunc::Func Func; +  Function *F = OpC->getCalledFunction(); +  if (F && ((TLI->getLibFunc(F->getName(), Func) && TLI->has(Func) && +      Func == LibFunc::pow) || F->getIntrinsicID() == Intrinsic::pow)) +    return B.CreateFMul(OpC->getArgOperand(1), +      EmitUnaryFloatFnCall(OpC->getOperand(0), Callee->getName(), B, +                           Callee->getAttributes()), "mul"); + +  // log(exp2(y)) -> y*log(2) +  if (F && Name == "log" && TLI->getLibFunc(F->getName(), Func) && +      TLI->has(Func) && Func == LibFunc::exp2) +    return B.CreateFMul( +        OpC->getArgOperand(0), +        EmitUnaryFloatFnCall(ConstantFP::get(CI->getType(), 2.0), +                             Callee->getName(), B, Callee->getAttributes()), +        "logmul"); +  return Ret; +} +  Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction(); @@ -1191,19 +1392,9 @@ Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilder<> &B) {    if (TLI->has(LibFunc::sqrtf) && (Callee->getName() == "sqrt" ||                                     Callee->getIntrinsicID() == Intrinsic::sqrt))      Ret = optimizeUnaryDoubleFP(CI, B, true); +  if (!canUseUnsafeFPMath(CI->getParent()->getParent())) +    return Ret; -  // FIXME: For finer-grain optimization, we need intrinsics to have the same -  // fast-math flag decorations that are applied to FP instructions. For now, -  // we have to rely on the function-level unsafe-fp-math attribute to do this -  // optimization because there's no other way to express that the sqrt can be -  // reassociated. -  Function *F = CI->getParent()->getParent(); -  if (F->hasFnAttribute("unsafe-fp-math")) { -    // Check for unsafe-fp-math = true. -    Attribute Attr = F->getFnAttribute("unsafe-fp-math"); -    if (Attr.getValueAsString() != "true") -      return Ret; -  }    Value *Op = CI->getArgOperand(0);    if (Instruction *I = dyn_cast<Instruction>(Op)) {      if (I->getOpcode() == Instruction::FMul && I->hasUnsafeAlgebra()) { @@ -1238,8 +1429,7 @@ Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilder<> &B) {          // and multiply.          // FIXME: We're not checking the sqrt because it doesn't have          // fast-math-flags (see earlier comment). -        IRBuilder<true, ConstantFolder, -          IRBuilderDefaultInserter<true> >::FastMathFlagGuard Guard(B); +        IRBuilder<>::FastMathFlagGuard Guard(B);          B.SetFastMathFlags(I->getFastMathFlags());          // If we found a repeated factor, hoist it out of the square root and          // replace it with the fabs of that factor. @@ -1262,6 +1452,40 @@ Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilder<> &B) {    return Ret;  } +Value *LibCallSimplifier::optimizeTan(CallInst *CI, IRBuilder<> &B) { +  Function *Callee = CI->getCalledFunction(); +  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; + +  if (!canUseUnsafeFPMath(CI->getParent()->getParent())) +    return Ret; +  Value *Op1 = CI->getArgOperand(0); +  auto *OpC = dyn_cast<CallInst>(Op1); +  if (!OpC) +    return Ret; + +  // tan(atan(x)) -> x +  // tanf(atanf(x)) -> x +  // tanl(atanl(x)) -> x +  LibFunc::Func Func; +  Function *F = OpC->getCalledFunction(); +  if (F && TLI->getLibFunc(F->getName(), Func) && TLI->has(Func) && +      ((Func == LibFunc::atan && Callee->getName() == "tan") || +       (Func == LibFunc::atanf && Callee->getName() == "tanf") || +       (Func == LibFunc::atanl && Callee->getName() == "tanl"))) +    Ret = OpC->getArgOperand(0); +  return Ret; +} +  static bool isTrigLibCall(CallInst *CI);  static void insertSinCosCall(IRBuilder<> &B, Function *OrigCallee, Value *Arg,                               bool UseFloat, Value *&Sin, Value *&Cos, @@ -1329,9 +1553,9 @@ LibCallSimplifier::classifyArgUse(Value *Val, BasicBlock *BB, bool IsFloat,      return;    Function *Callee = CI->getCalledFunction(); -  StringRef FuncName = Callee->getName();    LibFunc::Func Func; -  if (!TLI->getLibFunc(FuncName, Func) || !TLI->has(Func) || !isTrigLibCall(CI)) +  if (!Callee || !TLI->getLibFunc(Callee->getName(), Func) || !TLI->has(Func) || +      !isTrigLibCall(CI))      return;    if (IsFloat) { @@ -1353,10 +1577,8 @@ LibCallSimplifier::classifyArgUse(Value *Val, BasicBlock *BB, bool IsFloat,  void LibCallSimplifier::replaceTrigInsts(SmallVectorImpl<CallInst *> &Calls,                                           Value *Res) { -  for (SmallVectorImpl<CallInst *>::iterator I = Calls.begin(), E = Calls.end(); -       I != E; ++I) { -    replaceAllUsesWith(*I, Res); -  } +  for (CallInst *C : Calls) +    replaceAllUsesWith(C, Res);  }  void insertSinCosCall(IRBuilder<> &B, Function *OrigCallee, Value *Arg, @@ -1387,8 +1609,7 @@ void insertSinCosCall(IRBuilder<> &B, Function *OrigCallee, Value *Arg,    if (Instruction *ArgInst = dyn_cast<Instruction>(Arg)) {      // If the argument is an instruction, it must dominate all uses so put our      // sincos call there. -    BasicBlock::iterator Loc = ArgInst; -    B.SetInsertPoint(ArgInst->getParent(), ++Loc); +    B.SetInsertPoint(ArgInst->getParent(), ++ArgInst->getIterator());    } else {      // Otherwise (e.g. for a constant) the beginning of the function is as      // good a place as any. @@ -1413,15 +1634,16 @@ void insertSinCosCall(IRBuilder<> &B, Function *OrigCallee, Value *Arg,  // Integer Library Call Optimizations  //===----------------------------------------------------------------------===// +static bool checkIntUnaryReturnAndParam(Function *Callee) { +  FunctionType *FT = Callee->getFunctionType(); +  return FT->getNumParams() == 1 && FT->getReturnType()->isIntegerTy(32) && +    FT->getParamType(0)->isIntegerTy(); +} +  Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilder<> &B) {    Function *Callee = CI->getCalledFunction(); -  FunctionType *FT = Callee->getFunctionType(); -  // Just make sure this has 2 arguments of the same FP type, which match the -  // result type. -  if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy(32) || -      !FT->getParamType(0)->isIntegerTy()) +  if (!checkIntUnaryReturnAndParam(Callee))      return nullptr; -    Value *Op = CI->getArgOperand(0);    // Constant fold. @@ -1436,7 +1658,7 @@ Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilder<> &B) {    Type *ArgType = Op->getType();    Value *F =        Intrinsic::getDeclaration(Callee->getParent(), Intrinsic::cttz, ArgType); -  Value *V = B.CreateCall(F, {Op, B.getFalse()}, "cttz"); +  Value *V = B.CreateCall(F, {Op, B.getTrue()}, "cttz");    V = B.CreateAdd(V, ConstantInt::get(V->getType(), 1));    V = B.CreateIntCast(V, B.getInt32Ty(), false); @@ -1461,11 +1683,7 @@ Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilder<> &B) {  }  Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilder<> &B) { -  Function *Callee = CI->getCalledFunction(); -  FunctionType *FT = Callee->getFunctionType(); -  // We require integer(i32) -  if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || -      !FT->getParamType(0)->isIntegerTy(32)) +  if (!checkIntUnaryReturnAndParam(CI->getCalledFunction()))      return nullptr;    // isdigit(c) -> (c-'0') <u 10 @@ -1476,11 +1694,7 @@ Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilder<> &B) {  }  Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilder<> &B) { -  Function *Callee = CI->getCalledFunction(); -  FunctionType *FT = Callee->getFunctionType(); -  // We require integer(i32) -  if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || -      !FT->getParamType(0)->isIntegerTy(32)) +  if (!checkIntUnaryReturnAndParam(CI->getCalledFunction()))      return nullptr;    // isascii(c) -> c <u 128 @@ -1490,11 +1704,7 @@ Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilder<> &B) {  }  Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilder<> &B) { -  Function *Callee = CI->getCalledFunction(); -  FunctionType *FT = Callee->getFunctionType(); -  // We require i32(i32) -  if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) || -      !FT->getParamType(0)->isIntegerTy(32)) +  if (!checkIntUnaryReturnAndParam(CI->getCalledFunction()))      return nullptr;    // toascii(c) -> c & 0x7f @@ -1529,10 +1739,7 @@ Value *LibCallSimplifier::optimizeErrorReporting(CallInst *CI, IRBuilder<> &B,  }  static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) { -  if (!ColdErrorCalls) -    return false; - -  if (!Callee || !Callee->isDeclaration()) +  if (!ColdErrorCalls || !Callee || !Callee->isDeclaration())      return false;    if (StreamArg < 0) @@ -1968,16 +2175,8 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) {    // Command-line parameter overrides function attribute.    if (EnableUnsafeFPShrink.getNumOccurrences() > 0)      UnsafeFPShrink = EnableUnsafeFPShrink; -  else if (Callee->hasFnAttribute("unsafe-fp-math")) { -    // FIXME: This is the same problem as described in optimizeSqrt(). -    // If calls gain access to IR-level FMF, then use that instead of a -    // function attribute. - -    // Check for unsafe-fp-math = true. -    Attribute Attr = Callee->getFnAttribute("unsafe-fp-math"); -    if (Attr.getValueAsString() == "true") -      UnsafeFPShrink = true; -  } +  else if (canUseUnsafeFPMath(Callee)) +    UnsafeFPShrink = true;    // First, check for intrinsics.    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) { @@ -1990,6 +2189,8 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) {        return optimizeExp2(CI, Builder);      case Intrinsic::fabs:        return optimizeFabs(CI, Builder); +    case Intrinsic::log: +      return optimizeLog(CI, Builder);      case Intrinsic::sqrt:        return optimizeSqrt(CI, Builder);      default: @@ -2001,13 +2202,17 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) {    if (Value *SimplifiedFortifiedCI = FortifiedSimplifier.optimizeCall(CI)) {      // Try to further simplify the result.      CallInst *SimplifiedCI = dyn_cast<CallInst>(SimplifiedFortifiedCI); -    if (SimplifiedCI && SimplifiedCI->getCalledFunction()) -      if (Value *V = optimizeStringMemoryLibCall(SimplifiedCI, Builder)) { +    if (SimplifiedCI && SimplifiedCI->getCalledFunction()) { +      // Use an IR Builder from SimplifiedCI if available instead of CI +      // to guarantee we reach all uses we might replace later on. +      IRBuilder<> TmpBuilder(SimplifiedCI); +      if (Value *V = optimizeStringMemoryLibCall(SimplifiedCI, TmpBuilder)) {          // If we were able to further simplify, remove the now redundant call.          SimplifiedCI->replaceAllUsesWith(V);          SimplifiedCI->eraseFromParent();          return V;        } +    }      return SimplifiedFortifiedCI;    } @@ -2068,8 +2273,18 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) {        return optimizeFWrite(CI, Builder);      case LibFunc::fputs:        return optimizeFPuts(CI, Builder); +    case LibFunc::log: +    case LibFunc::log10: +    case LibFunc::log1p: +    case LibFunc::log2: +    case LibFunc::logb: +      return optimizeLog(CI, Builder);      case LibFunc::puts:        return optimizePuts(CI, Builder); +    case LibFunc::tan: +    case LibFunc::tanf: +    case LibFunc::tanl: +      return optimizeTan(CI, Builder);      case LibFunc::perror:        return optimizeErrorReporting(CI, Builder);      case LibFunc::vfprintf: @@ -2097,24 +2312,23 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) {      case LibFunc::exp:      case LibFunc::exp10:      case LibFunc::expm1: -    case LibFunc::log: -    case LibFunc::log10: -    case LibFunc::log1p: -    case LibFunc::log2: -    case LibFunc::logb:      case LibFunc::sin:      case LibFunc::sinh: -    case LibFunc::tan:      case LibFunc::tanh:        if (UnsafeFPShrink && hasFloatVersion(FuncName))          return optimizeUnaryDoubleFP(CI, Builder, true);        return nullptr;      case LibFunc::copysign: -    case LibFunc::fmin: -    case LibFunc::fmax:        if (hasFloatVersion(FuncName))          return optimizeBinaryDoubleFP(CI, Builder);        return nullptr; +    case LibFunc::fminf: +    case LibFunc::fmin: +    case LibFunc::fminl: +    case LibFunc::fmaxf: +    case LibFunc::fmax: +    case LibFunc::fmaxl: +      return optimizeFMinFMax(CI, Builder);      default:        return nullptr;      } @@ -2133,37 +2347,27 @@ void LibCallSimplifier::replaceAllUsesWith(Instruction *I, Value *With) {    Replacer(I, With);  } -/*static*/ void LibCallSimplifier::replaceAllUsesWithDefault(Instruction *I, -                                                             Value *With) { -  I->replaceAllUsesWith(With); -  I->eraseFromParent(); -} -  // TODO:  //   Additional cases that we need to add to this file:  //  // cbrt:  //   * cbrt(expN(X))  -> expN(x/3)  //   * cbrt(sqrt(x))  -> pow(x,1/6) -//   * cbrt(sqrt(x))  -> pow(x,1/9) +//   * cbrt(cbrt(x))  -> pow(x,1/9)  //  // exp, expf, expl:  //   * exp(log(x))  -> x  //  // log, logf, logl:  //   * log(exp(x))   -> x -//   * log(x**y)     -> y*log(x)  //   * log(exp(y))   -> y*log(e) -//   * log(exp2(y))  -> y*log(2)  //   * log(exp10(y)) -> y*log(10)  //   * log(sqrt(x))  -> 0.5*log(x) -//   * log(pow(x,y)) -> y*log(x)  //  // lround, lroundf, lroundl:  //   * lround(cnst) -> cnst'  //  // pow, powf, powl: -//   * pow(exp(x),y)  -> exp(x*y)  //   * pow(sqrt(x),y) -> pow(x,y*0.5)  //   * pow(pow(x,y),z)-> pow(x,y*z)  // @@ -2179,9 +2383,6 @@ void LibCallSimplifier::replaceAllUsesWith(Instruction *I, Value *With) {  //   * sqrt(Nroot(x)) -> pow(x,1/(2*N))  //   * sqrt(pow(x,y)) -> pow(|x|,y*0.5)  // -// tan, tanf, tanl: -//   * tan(atan(x)) -> x -//  // trunc, truncf, truncl:  //   * trunc(cnst) -> cnst'  //  | 
