Lines Matching refs:CI
95 static bool callHasFloatingPointArgument(const CallInst *CI) { in callHasFloatingPointArgument() argument
96 for (CallInst::const_op_iterator it = CI->op_begin(), e = CI->op_end(); in callHasFloatingPointArgument()
187 Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilder<> &B) { in optimizeStrCat() argument
188 Function *Callee = CI->getCalledFunction(); in optimizeStrCat()
198 Value *Dst = CI->getArgOperand(0); in optimizeStrCat()
199 Value *Src = CI->getArgOperand(1); in optimizeStrCat()
235 Value *LibCallSimplifier::optimizeStrNCat(CallInst *CI, IRBuilder<> &B) { in optimizeStrNCat() argument
236 Function *Callee = CI->getCalledFunction(); in optimizeStrNCat()
246 Value *Dst = CI->getArgOperand(0); in optimizeStrNCat()
247 Value *Src = CI->getArgOperand(1); in optimizeStrNCat()
251 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2))) in optimizeStrNCat()
277 Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilder<> &B) { in optimizeStrChr() argument
278 Function *Callee = CI->getCalledFunction(); in optimizeStrChr()
286 Value *SrcStr = CI->getArgOperand(0); in optimizeStrChr()
290 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrChr()
296 return EmitMemChr(SrcStr, CI->getArgOperand(1), // include nul. in optimizeStrChr()
297 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len), in optimizeStrChr()
316 return Constant::getNullValue(CI->getType()); in optimizeStrChr()
322 Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilder<> &B) { in optimizeStrRChr() argument
323 Function *Callee = CI->getCalledFunction(); in optimizeStrRChr()
331 Value *SrcStr = CI->getArgOperand(0); in optimizeStrRChr()
332 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrRChr()
351 return Constant::getNullValue(CI->getType()); in optimizeStrRChr()
357 Value *LibCallSimplifier::optimizeStrCmp(CallInst *CI, IRBuilder<> &B) { in optimizeStrCmp() argument
358 Function *Callee = CI->getCalledFunction(); in optimizeStrCmp()
366 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); in optimizeStrCmp()
368 return ConstantInt::get(CI->getType(), 0); in optimizeStrCmp()
376 return ConstantInt::get(CI->getType(), Str1.compare(Str2)); in optimizeStrCmp()
380 B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), CI->getType())); in optimizeStrCmp()
383 return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType()); in optimizeStrCmp()
390 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeStrCmp()
398 Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilder<> &B) { in optimizeStrNCmp() argument
399 Function *Callee = CI->getCalledFunction(); in optimizeStrNCmp()
408 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); in optimizeStrNCmp()
410 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
414 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2))) in optimizeStrNCmp()
420 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
423 return EmitMemCmp(Str1P, Str2P, CI->getArgOperand(2), B, DL, TLI); in optimizeStrNCmp()
433 return ConstantInt::get(CI->getType(), SubStr1.compare(SubStr2)); in optimizeStrNCmp()
438 B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), CI->getType())); in optimizeStrNCmp()
441 return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType()); in optimizeStrNCmp()
446 Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilder<> &B) { in optimizeStrCpy() argument
447 Function *Callee = CI->getCalledFunction(); in optimizeStrCpy()
452 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStrCpy()
464 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len), 1); in optimizeStrCpy()
468 Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilder<> &B) { in optimizeStpCpy() argument
469 Function *Callee = CI->getCalledFunction(); in optimizeStpCpy()
476 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStpCpy()
498 Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilder<> &B) { in optimizeStrNCpy() argument
499 Function *Callee = CI->getCalledFunction(); in optimizeStrNCpy()
505 Value *Dst = CI->getArgOperand(0); in optimizeStrNCpy()
506 Value *Src = CI->getArgOperand(1); in optimizeStrNCpy()
507 Value *LenOp = CI->getArgOperand(2); in optimizeStrNCpy()
541 Value *LibCallSimplifier::optimizeStrLen(CallInst *CI, IRBuilder<> &B) { in optimizeStrLen() argument
542 Function *Callee = CI->getCalledFunction(); in optimizeStrLen()
548 Value *Src = CI->getArgOperand(0); in optimizeStrLen()
552 return ConstantInt::get(CI->getType(), Len - 1); in optimizeStrLen()
559 Function *Caller = CI->getParent()->getParent(); in optimizeStrLen()
560 emitOptimizationRemark(CI->getContext(), "simplify-libcalls", *Caller, in optimizeStrLen()
564 ConstantInt::get(CI->getType(), LenTrue - 1), in optimizeStrLen()
565 ConstantInt::get(CI->getType(), LenFalse - 1)); in optimizeStrLen()
571 if (isOnlyUsedInZeroEqualityComparison(CI)) in optimizeStrLen()
572 return B.CreateZExt(B.CreateLoad(Src, "strlenfirst"), CI->getType()); in optimizeStrLen()
577 Value *LibCallSimplifier::optimizeStrPBrk(CallInst *CI, IRBuilder<> &B) { in optimizeStrPBrk() argument
578 Function *Callee = CI->getCalledFunction(); in optimizeStrPBrk()
586 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrPBrk()
587 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrPBrk()
592 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
598 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
600 return B.CreateGEP(B.getInt8Ty(), CI->getArgOperand(0), B.getInt64(I), "strpbrk"); in optimizeStrPBrk()
605 return EmitStrChr(CI->getArgOperand(0), S2[0], B, TLI); in optimizeStrPBrk()
610 Value *LibCallSimplifier::optimizeStrTo(CallInst *CI, IRBuilder<> &B) { in optimizeStrTo() argument
611 Function *Callee = CI->getCalledFunction(); in optimizeStrTo()
618 Value *EndPtr = CI->getArgOperand(1); in optimizeStrTo()
622 CI->addAttribute(1, Attribute::NoCapture); in optimizeStrTo()
628 Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilder<> &B) { in optimizeStrSpn() argument
629 Function *Callee = CI->getCalledFunction(); in optimizeStrSpn()
637 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrSpn()
638 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrSpn()
643 return Constant::getNullValue(CI->getType()); in optimizeStrSpn()
650 return ConstantInt::get(CI->getType(), Pos); in optimizeStrSpn()
656 Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilder<> &B) { in optimizeStrCSpn() argument
657 Function *Callee = CI->getCalledFunction(); in optimizeStrCSpn()
665 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrCSpn()
666 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrCSpn()
670 return Constant::getNullValue(CI->getType()); in optimizeStrCSpn()
677 return ConstantInt::get(CI->getType(), Pos); in optimizeStrCSpn()
682 return EmitStrLen(CI->getArgOperand(0), B, DL, TLI); in optimizeStrCSpn()
687 Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilder<> &B) { in optimizeStrStr() argument
688 Function *Callee = CI->getCalledFunction(); in optimizeStrStr()
696 if (CI->getArgOperand(0) == CI->getArgOperand(1)) in optimizeStrStr()
697 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); in optimizeStrStr()
700 if (isOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) { in optimizeStrStr()
701 Value *StrLen = EmitStrLen(CI->getArgOperand(1), B, DL, TLI); in optimizeStrStr()
704 Value *StrNCmp = EmitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrStr()
708 for (auto UI = CI->user_begin(), UE = CI->user_end(); UI != UE;) { in optimizeStrStr()
715 return CI; in optimizeStrStr()
720 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr); in optimizeStrStr()
721 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr); in optimizeStrStr()
725 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); in optimizeStrStr()
732 return Constant::getNullValue(CI->getType()); in optimizeStrStr()
735 Value *Result = CastToCStr(CI->getArgOperand(0), B); in optimizeStrStr()
737 return B.CreateBitCast(Result, CI->getType()); in optimizeStrStr()
742 Value *StrChr = EmitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TLI); in optimizeStrStr()
743 return StrChr ? B.CreateBitCast(StrChr, CI->getType()) : nullptr; in optimizeStrStr()
748 Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilder<> &B) { in optimizeMemChr() argument
749 Function *Callee = CI->getCalledFunction(); in optimizeMemChr()
757 Value *SrcStr = CI->getArgOperand(0); in optimizeMemChr()
758 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeMemChr()
759 ConstantInt *LenC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeMemChr()
763 return Constant::getNullValue(CI->getType()); in optimizeMemChr()
784 if (!CharC && !Str.empty() && isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemChr()
808 Value *C = B.CreateZExtOrTrunc(CI->getArgOperand(1), BitfieldC->getType()); in optimizeMemChr()
818 return B.CreateIntToPtr(B.CreateAnd(Bounds, Bits, "memchr"), CI->getType()); in optimizeMemChr()
828 return Constant::getNullValue(CI->getType()); in optimizeMemChr()
834 Value *LibCallSimplifier::optimizeMemCmp(CallInst *CI, IRBuilder<> &B) { in optimizeMemCmp() argument
835 Function *Callee = CI->getCalledFunction(); in optimizeMemCmp()
842 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1); in optimizeMemCmp()
845 return Constant::getNullValue(CI->getType()); in optimizeMemCmp()
848 ConstantInt *LenC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeMemCmp()
854 return Constant::getNullValue(CI->getType()); in optimizeMemCmp()
859 CI->getType(), "lhsv"); in optimizeMemCmp()
861 CI->getType(), "rhsv"); in optimizeMemCmp()
880 return ConstantInt::get(CI->getType(), Ret); in optimizeMemCmp()
886 Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilder<> &B) { in optimizeMemCpy() argument
887 Function *Callee = CI->getCalledFunction(); in optimizeMemCpy()
893 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemCpy()
894 CI->getArgOperand(2), 1); in optimizeMemCpy()
895 return CI->getArgOperand(0); in optimizeMemCpy()
898 Value *LibCallSimplifier::optimizeMemMove(CallInst *CI, IRBuilder<> &B) { in optimizeMemMove() argument
899 Function *Callee = CI->getCalledFunction(); in optimizeMemMove()
905 B.CreateMemMove(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemMove()
906 CI->getArgOperand(2), 1); in optimizeMemMove()
907 return CI->getArgOperand(0); in optimizeMemMove()
910 Value *LibCallSimplifier::optimizeMemSet(CallInst *CI, IRBuilder<> &B) { in optimizeMemSet() argument
911 Function *Callee = CI->getCalledFunction(); in optimizeMemSet()
917 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSet()
918 B.CreateMemSet(CI->getArgOperand(0), Val, CI->getArgOperand(2), 1); in optimizeMemSet()
919 return CI->getArgOperand(0); in optimizeMemSet()
951 Value *LibCallSimplifier::optimizeUnaryDoubleFP(CallInst *CI, IRBuilder<> &B, in optimizeUnaryDoubleFP() argument
953 Function *Callee = CI->getCalledFunction(); in optimizeUnaryDoubleFP()
961 for (User *U : CI->users()) { in optimizeUnaryDoubleFP()
969 Value *V = valueHasFloatPrecision(CI->getArgOperand(0)); in optimizeUnaryDoubleFP()
975 Module *M = CI->getParent()->getParent()->getParent(); in optimizeUnaryDoubleFP()
988 Value *LibCallSimplifier::optimizeBinaryDoubleFP(CallInst *CI, IRBuilder<> &B) { in optimizeBinaryDoubleFP() argument
989 Function *Callee = CI->getCalledFunction(); in optimizeBinaryDoubleFP()
1000 Value *V1 = valueHasFloatPrecision(CI->getArgOperand(0)); in optimizeBinaryDoubleFP()
1003 Value *V2 = valueHasFloatPrecision(CI->getArgOperand(1)); in optimizeBinaryDoubleFP()
1015 Value *LibCallSimplifier::optimizeCos(CallInst *CI, IRBuilder<> &B) { in optimizeCos() argument
1016 Function *Callee = CI->getCalledFunction(); in optimizeCos()
1019 Ret = optimizeUnaryDoubleFP(CI, B, true); in optimizeCos()
1030 Value *Op1 = CI->getArgOperand(0); in optimizeCos()
1038 Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) { in optimizePow() argument
1039 Function *Callee = CI->getCalledFunction(); in optimizePow()
1043 Ret = optimizeUnaryDoubleFP(CI, B, true); in optimizePow()
1054 Value *Op1 = CI->getArgOperand(0), *Op2 = CI->getArgOperand(1); in optimizePow()
1077 return ConstantFP::get(CI->getType(), 1.0); in optimizePow()
1089 Value *Inf = ConstantFP::getInfinity(CI->getType()); in optimizePow()
1090 Value *NegInf = ConstantFP::getInfinity(CI->getType(), true); in optimizePow()
1104 return B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), Op1, "powrecip"); in optimizePow()
1108 Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilder<> &B) { in optimizeExp2() argument
1109 Function *Callee = CI->getCalledFunction(); in optimizeExp2()
1110 Function *Caller = CI->getParent()->getParent(); in optimizeExp2()
1115 Ret = optimizeUnaryDoubleFP(CI, B, true); in optimizeExp2()
1125 Value *Op = CI->getArgOperand(0); in optimizeExp2()
1145 Constant *One = ConstantFP::get(CI->getContext(), APFloat(1.0f)); in optimizeExp2()
1153 CallInst *CI = B.CreateCall2(Callee, One, LdExpArg); in optimizeExp2() local
1155 CI->setCallingConv(F->getCallingConv()); in optimizeExp2()
1157 return CI; in optimizeExp2()
1163 Value *LibCallSimplifier::optimizeFabs(CallInst *CI, IRBuilder<> &B) { in optimizeFabs() argument
1164 Function *Callee = CI->getCalledFunction(); in optimizeFabs()
1168 Ret = optimizeUnaryDoubleFP(CI, B, false); in optimizeFabs()
1177 Value *Op = CI->getArgOperand(0); in optimizeFabs()
1187 Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilder<> &B) { in optimizeSqrt() argument
1188 Function *Callee = CI->getCalledFunction(); in optimizeSqrt()
1193 Ret = optimizeUnaryDoubleFP(CI, B, true); in optimizeSqrt()
1200 Function *F = CI->getParent()->getParent(); in optimizeSqrt()
1207 Value *Op = CI->getArgOperand(0); in optimizeSqrt()
1265 static bool isTrigLibCall(CallInst *CI);
1270 Value *LibCallSimplifier::optimizeSinCosPi(CallInst *CI, IRBuilder<> &B) { in optimizeSinCosPi() argument
1274 if (!isTrigLibCall(CI)) in optimizeSinCosPi()
1277 Value *Arg = CI->getArgOperand(0); in optimizeSinCosPi()
1288 classifyArgUse(U, CI->getParent(), IsFloat, SinCalls, CosCalls, in optimizeSinCosPi()
1296 insertSinCosCall(B, CI->getCalledFunction(), Arg, IsFloat, Sin, Cos, SinCos); in optimizeSinCosPi()
1305 static bool isTrigLibCall(CallInst *CI) { in isTrigLibCall() argument
1306 Function *Callee = CI->getCalledFunction(); in isTrigLibCall()
1312 CI->hasFnAttr(Attribute::NoUnwind) && CI->hasFnAttr(Attribute::ReadNone); in isTrigLibCall()
1326 CallInst *CI = dyn_cast<CallInst>(Val); in classifyArgUse() local
1328 if (!CI) in classifyArgUse()
1331 Function *Callee = CI->getCalledFunction(); in classifyArgUse()
1334 if (!TLI->getLibFunc(FuncName, Func) || !TLI->has(Func) || !isTrigLibCall(CI)) in classifyArgUse()
1339 SinCalls.push_back(CI); in classifyArgUse()
1341 CosCalls.push_back(CI); in classifyArgUse()
1343 SinCosCalls.push_back(CI); in classifyArgUse()
1346 SinCalls.push_back(CI); in classifyArgUse()
1348 CosCalls.push_back(CI); in classifyArgUse()
1350 SinCosCalls.push_back(CI); in classifyArgUse()
1416 Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilder<> &B) { in optimizeFFS() argument
1417 Function *Callee = CI->getCalledFunction(); in optimizeFFS()
1425 Value *Op = CI->getArgOperand(0); in optimizeFFS()
1428 if (ConstantInt *CI = dyn_cast<ConstantInt>(Op)) { in optimizeFFS() local
1429 if (CI->isZero()) // ffs(0) -> 0. in optimizeFFS()
1432 return B.getInt32(CI->getValue().countTrailingZeros() + 1); in optimizeFFS()
1447 Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilder<> &B) { in optimizeAbs() argument
1448 Function *Callee = CI->getCalledFunction(); in optimizeAbs()
1456 Value *Op = CI->getArgOperand(0); in optimizeAbs()
1463 Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilder<> &B) { in optimizeIsDigit() argument
1464 Function *Callee = CI->getCalledFunction(); in optimizeIsDigit()
1472 Value *Op = CI->getArgOperand(0); in optimizeIsDigit()
1475 return B.CreateZExt(Op, CI->getType()); in optimizeIsDigit()
1478 Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilder<> &B) { in optimizeIsAscii() argument
1479 Function *Callee = CI->getCalledFunction(); in optimizeIsAscii()
1487 Value *Op = CI->getArgOperand(0); in optimizeIsAscii()
1489 return B.CreateZExt(Op, CI->getType()); in optimizeIsAscii()
1492 Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilder<> &B) { in optimizeToAscii() argument
1493 Function *Callee = CI->getCalledFunction(); in optimizeToAscii()
1501 return B.CreateAnd(CI->getArgOperand(0), in optimizeToAscii()
1502 ConstantInt::get(CI->getType(), 0x7F)); in optimizeToAscii()
1509 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg);
1511 Value *LibCallSimplifier::optimizeErrorReporting(CallInst *CI, IRBuilder<> &B, in optimizeErrorReporting() argument
1521 Function *Callee = CI->getCalledFunction(); in optimizeErrorReporting()
1523 if (!CI->hasFnAttr(Attribute::Cold) && in optimizeErrorReporting()
1524 isReportingError(Callee, CI, StreamArg)) { in optimizeErrorReporting()
1525 CI->addAttribute(AttributeSet::FunctionIndex, Attribute::Cold); in optimizeErrorReporting()
1531 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) { in isReportingError() argument
1544 if (StreamArg >= (int)CI->getNumArgOperands()) in isReportingError()
1546 LoadInst *LI = dyn_cast<LoadInst>(CI->getArgOperand(StreamArg)); in isReportingError()
1555 Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilder<> &B) { in optimizePrintFString() argument
1558 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr)) in optimizePrintFString()
1563 return CI->use_empty() ? (Value *)CI : ConstantInt::get(CI->getType(), 0); in optimizePrintFString()
1568 if (!CI->use_empty()) in optimizePrintFString()
1574 if (CI->use_empty() || !Res) in optimizePrintFString()
1576 return B.CreateIntCast(Res, CI->getType(), true); in optimizePrintFString()
1587 return (CI->use_empty() || !NewCI) in optimizePrintFString()
1589 : ConstantInt::get(CI->getType(), FormatStr.size() + 1); in optimizePrintFString()
1594 if (FormatStr == "%c" && CI->getNumArgOperands() > 1 && in optimizePrintFString()
1595 CI->getArgOperand(1)->getType()->isIntegerTy()) { in optimizePrintFString()
1596 Value *Res = EmitPutChar(CI->getArgOperand(1), B, TLI); in optimizePrintFString()
1598 if (CI->use_empty() || !Res) in optimizePrintFString()
1600 return B.CreateIntCast(Res, CI->getType(), true); in optimizePrintFString()
1604 if (FormatStr == "%s\n" && CI->getNumArgOperands() > 1 && in optimizePrintFString()
1605 CI->getArgOperand(1)->getType()->isPointerTy()) { in optimizePrintFString()
1606 return EmitPutS(CI->getArgOperand(1), B, TLI); in optimizePrintFString()
1611 Value *LibCallSimplifier::optimizePrintF(CallInst *CI, IRBuilder<> &B) { in optimizePrintF() argument
1613 Function *Callee = CI->getCalledFunction(); in optimizePrintF()
1620 if (Value *V = optimizePrintFString(CI, B)) { in optimizePrintF()
1626 if (TLI->has(LibFunc::iprintf) && !callHasFloatingPointArgument(CI)) { in optimizePrintF()
1630 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
1638 Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, IRBuilder<> &B) { in optimizeSPrintFString() argument
1641 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeSPrintFString()
1645 if (CI->getNumArgOperands() == 2) { in optimizeSPrintFString()
1653 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeSPrintFString()
1654 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeSPrintFString()
1657 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSPrintFString()
1663 CI->getNumArgOperands() < 3) in optimizeSPrintFString()
1669 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeSPrintFString()
1671 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char"); in optimizeSPrintFString()
1672 Value *Ptr = CastToCStr(CI->getArgOperand(0), B); in optimizeSPrintFString()
1677 return ConstantInt::get(CI->getType(), 1); in optimizeSPrintFString()
1682 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeSPrintFString()
1685 Value *Len = EmitStrLen(CI->getArgOperand(2), B, DL, TLI); in optimizeSPrintFString()
1690 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(2), IncLen, 1); in optimizeSPrintFString()
1693 return B.CreateIntCast(Len, CI->getType(), false); in optimizeSPrintFString()
1698 Value *LibCallSimplifier::optimizeSPrintF(CallInst *CI, IRBuilder<> &B) { in optimizeSPrintF() argument
1699 Function *Callee = CI->getCalledFunction(); in optimizeSPrintF()
1707 if (Value *V = optimizeSPrintFString(CI, B)) { in optimizeSPrintF()
1713 if (TLI->has(LibFunc::siprintf) && !callHasFloatingPointArgument(CI)) { in optimizeSPrintF()
1717 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
1725 Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI, IRBuilder<> &B) { in optimizeFPrintFString() argument
1726 optimizeErrorReporting(CI, B, 0); in optimizeFPrintFString()
1730 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeFPrintFString()
1736 if (!CI->use_empty()) in optimizeFPrintFString()
1740 if (CI->getNumArgOperands() == 2) { in optimizeFPrintFString()
1746 CI->getArgOperand(1), in optimizeFPrintFString()
1747 ConstantInt::get(DL.getIntPtrType(CI->getContext()), FormatStr.size()), in optimizeFPrintFString()
1748 CI->getArgOperand(0), B, DL, TLI); in optimizeFPrintFString()
1754 CI->getNumArgOperands() < 3) in optimizeFPrintFString()
1760 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeFPrintFString()
1762 return EmitFPutC(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI); in optimizeFPrintFString()
1767 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeFPrintFString()
1769 return EmitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI); in optimizeFPrintFString()
1774 Value *LibCallSimplifier::optimizeFPrintF(CallInst *CI, IRBuilder<> &B) { in optimizeFPrintF() argument
1775 Function *Callee = CI->getCalledFunction(); in optimizeFPrintF()
1783 if (Value *V = optimizeFPrintFString(CI, B)) { in optimizeFPrintF()
1789 if (TLI->has(LibFunc::fiprintf) && !callHasFloatingPointArgument(CI)) { in optimizeFPrintF()
1793 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
1801 Value *LibCallSimplifier::optimizeFWrite(CallInst *CI, IRBuilder<> &B) { in optimizeFWrite() argument
1802 optimizeErrorReporting(CI, B, 3); in optimizeFWrite()
1804 Function *Callee = CI->getCalledFunction(); in optimizeFWrite()
1815 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeFWrite()
1816 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeFWrite()
1823 return ConstantInt::get(CI->getType(), 0); in optimizeFWrite()
1827 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) in optimizeFWrite()
1828 Value *Char = B.CreateLoad(CastToCStr(CI->getArgOperand(0), B), "char"); in optimizeFWrite()
1829 Value *NewCI = EmitFPutC(Char, CI->getArgOperand(3), B, TLI); in optimizeFWrite()
1830 return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr; in optimizeFWrite()
1836 Value *LibCallSimplifier::optimizeFPuts(CallInst *CI, IRBuilder<> &B) { in optimizeFPuts() argument
1837 optimizeErrorReporting(CI, B, 1); in optimizeFPuts()
1839 Function *Callee = CI->getCalledFunction(); in optimizeFPuts()
1844 !FT->getParamType(1)->isPointerTy() || !CI->use_empty()) in optimizeFPuts()
1848 uint64_t Len = GetStringLength(CI->getArgOperand(0)); in optimizeFPuts()
1854 CI->getArgOperand(0), in optimizeFPuts()
1855 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len - 1), in optimizeFPuts()
1856 CI->getArgOperand(1), B, DL, TLI); in optimizeFPuts()
1859 Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilder<> &B) { in optimizePuts() argument
1860 Function *Callee = CI->getCalledFunction(); in optimizePuts()
1869 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizePuts()
1872 if (Str.empty() && CI->use_empty()) { in optimizePuts()
1875 if (CI->use_empty() || !Res) in optimizePuts()
1877 return B.CreateIntCast(Res, CI->getType(), true); in optimizePuts()
1892 Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI, in optimizeStringMemoryLibCall() argument
1895 Function *Callee = CI->getCalledFunction(); in optimizeStringMemoryLibCall()
1902 CI->getCallingConv() == llvm::CallingConv::C) && in optimizeStringMemoryLibCall()
1906 return optimizeStrCat(CI, Builder); in optimizeStringMemoryLibCall()
1908 return optimizeStrNCat(CI, Builder); in optimizeStringMemoryLibCall()
1910 return optimizeStrChr(CI, Builder); in optimizeStringMemoryLibCall()
1912 return optimizeStrRChr(CI, Builder); in optimizeStringMemoryLibCall()
1914 return optimizeStrCmp(CI, Builder); in optimizeStringMemoryLibCall()
1916 return optimizeStrNCmp(CI, Builder); in optimizeStringMemoryLibCall()
1918 return optimizeStrCpy(CI, Builder); in optimizeStringMemoryLibCall()
1920 return optimizeStpCpy(CI, Builder); in optimizeStringMemoryLibCall()
1922 return optimizeStrNCpy(CI, Builder); in optimizeStringMemoryLibCall()
1924 return optimizeStrLen(CI, Builder); in optimizeStringMemoryLibCall()
1926 return optimizeStrPBrk(CI, Builder); in optimizeStringMemoryLibCall()
1934 return optimizeStrTo(CI, Builder); in optimizeStringMemoryLibCall()
1936 return optimizeStrSpn(CI, Builder); in optimizeStringMemoryLibCall()
1938 return optimizeStrCSpn(CI, Builder); in optimizeStringMemoryLibCall()
1940 return optimizeStrStr(CI, Builder); in optimizeStringMemoryLibCall()
1942 return optimizeMemChr(CI, Builder); in optimizeStringMemoryLibCall()
1944 return optimizeMemCmp(CI, Builder); in optimizeStringMemoryLibCall()
1946 return optimizeMemCpy(CI, Builder); in optimizeStringMemoryLibCall()
1948 return optimizeMemMove(CI, Builder); in optimizeStringMemoryLibCall()
1950 return optimizeMemSet(CI, Builder); in optimizeStringMemoryLibCall()
1958 Value *LibCallSimplifier::optimizeCall(CallInst *CI) { in optimizeCall() argument
1959 if (CI->isNoBuiltin()) in optimizeCall()
1963 Function *Callee = CI->getCalledFunction(); in optimizeCall()
1965 IRBuilder<> Builder(CI); in optimizeCall()
1966 bool isCallingConvC = CI->getCallingConv() == llvm::CallingConv::C; in optimizeCall()
1983 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) { in optimizeCall()
1988 return optimizePow(CI, Builder); in optimizeCall()
1990 return optimizeExp2(CI, Builder); in optimizeCall()
1992 return optimizeFabs(CI, Builder); in optimizeCall()
1994 return optimizeSqrt(CI, Builder); in optimizeCall()
2001 if (Value *SimplifiedFortifiedCI = FortifiedSimplifier.optimizeCall(CI)) { in optimizeCall()
2019 if (Value *V = optimizeStringMemoryLibCall(CI, Builder)) in optimizeCall()
2025 return optimizeCos(CI, Builder); in optimizeCall()
2030 return optimizeSinCosPi(CI, Builder); in optimizeCall()
2034 return optimizePow(CI, Builder); in optimizeCall()
2038 return optimizeExp2(CI, Builder); in optimizeCall()
2042 return optimizeFabs(CI, Builder); in optimizeCall()
2046 return optimizeSqrt(CI, Builder); in optimizeCall()
2050 return optimizeFFS(CI, Builder); in optimizeCall()
2054 return optimizeAbs(CI, Builder); in optimizeCall()
2056 return optimizeIsDigit(CI, Builder); in optimizeCall()
2058 return optimizeIsAscii(CI, Builder); in optimizeCall()
2060 return optimizeToAscii(CI, Builder); in optimizeCall()
2062 return optimizePrintF(CI, Builder); in optimizeCall()
2064 return optimizeSPrintF(CI, Builder); in optimizeCall()
2066 return optimizeFPrintF(CI, Builder); in optimizeCall()
2068 return optimizeFWrite(CI, Builder); in optimizeCall()
2070 return optimizeFPuts(CI, Builder); in optimizeCall()
2072 return optimizePuts(CI, Builder); in optimizeCall()
2074 return optimizeErrorReporting(CI, Builder); in optimizeCall()
2077 return optimizeErrorReporting(CI, Builder, 0); in optimizeCall()
2079 return optimizeErrorReporting(CI, Builder, 1); in optimizeCall()
2087 return optimizeUnaryDoubleFP(CI, Builder, false); in optimizeCall()
2110 return optimizeUnaryDoubleFP(CI, Builder, true); in optimizeCall()
2116 return optimizeBinaryDoubleFP(CI, Builder); in optimizeCall()
2194 bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(CallInst *CI, in isFortifiedCallFoldable() argument
2198 if (CI->getArgOperand(ObjSizeOp) == CI->getArgOperand(SizeOp)) in isFortifiedCallFoldable()
2201 dyn_cast<ConstantInt>(CI->getArgOperand(ObjSizeOp))) { in isFortifiedCallFoldable()
2208 uint64_t Len = GetStringLength(CI->getArgOperand(SizeOp)); in isFortifiedCallFoldable()
2215 if (ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getArgOperand(SizeOp))) in isFortifiedCallFoldable()
2221 Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI, IRBuilder<> &B) { in optimizeMemCpyChk() argument
2222 Function *Callee = CI->getCalledFunction(); in optimizeMemCpyChk()
2227 if (isFortifiedCallFoldable(CI, 3, 2, false)) { in optimizeMemCpyChk()
2228 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemCpyChk()
2229 CI->getArgOperand(2), 1); in optimizeMemCpyChk()
2230 return CI->getArgOperand(0); in optimizeMemCpyChk()
2235 Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI, IRBuilder<> &B) { in optimizeMemMoveChk() argument
2236 Function *Callee = CI->getCalledFunction(); in optimizeMemMoveChk()
2241 if (isFortifiedCallFoldable(CI, 3, 2, false)) { in optimizeMemMoveChk()
2242 B.CreateMemMove(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemMoveChk()
2243 CI->getArgOperand(2), 1); in optimizeMemMoveChk()
2244 return CI->getArgOperand(0); in optimizeMemMoveChk()
2249 Value *FortifiedLibCallSimplifier::optimizeMemSetChk(CallInst *CI, IRBuilder<> &B) { in optimizeMemSetChk() argument
2250 Function *Callee = CI->getCalledFunction(); in optimizeMemSetChk()
2255 if (isFortifiedCallFoldable(CI, 3, 2, false)) { in optimizeMemSetChk()
2256 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSetChk()
2257 B.CreateMemSet(CI->getArgOperand(0), Val, CI->getArgOperand(2), 1); in optimizeMemSetChk()
2258 return CI->getArgOperand(0); in optimizeMemSetChk()
2263 Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(CallInst *CI, in optimizeStrpCpyChk() argument
2266 Function *Callee = CI->getCalledFunction(); in optimizeStrpCpyChk()
2268 const DataLayout &DL = CI->getModule()->getDataLayout(); in optimizeStrpCpyChk()
2273 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1), in optimizeStrpCpyChk()
2274 *ObjSize = CI->getArgOperand(2); in optimizeStrpCpyChk()
2287 if (isFortifiedCallFoldable(CI, 2, 1, true)) in optimizeStrpCpyChk()
2298 Type *SizeTTy = DL.getIntPtrType(CI->getContext()); in optimizeStrpCpyChk()
2308 Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(CallInst *CI, in optimizeStrpNCpyChk() argument
2311 Function *Callee = CI->getCalledFunction(); in optimizeStrpNCpyChk()
2316 if (isFortifiedCallFoldable(CI, 3, 2, false)) { in optimizeStrpNCpyChk()
2317 Value *Ret = EmitStrNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
2318 CI->getArgOperand(2), B, TLI, Name.substr(2, 7)); in optimizeStrpNCpyChk()
2324 Value *FortifiedLibCallSimplifier::optimizeCall(CallInst *CI) { in optimizeCall() argument
2339 Function *Callee = CI->getCalledFunction(); in optimizeCall()
2341 IRBuilder<> Builder(CI); in optimizeCall()
2342 bool isCallingConvC = CI->getCallingConv() == llvm::CallingConv::C; in optimizeCall()
2354 return optimizeMemCpyChk(CI, Builder); in optimizeCall()
2356 return optimizeMemMoveChk(CI, Builder); in optimizeCall()
2358 return optimizeMemSetChk(CI, Builder); in optimizeCall()
2361 return optimizeStrpCpyChk(CI, Builder, Func); in optimizeCall()
2364 return optimizeStrpNCpyChk(CI, Builder, Func); in optimizeCall()