Lines Matching refs:CI

66 static bool callHasFloatingPointArgument(const CallInst *CI) {  in callHasFloatingPointArgument()  argument
67 return any_of(CI->operands(), [](const Use &OI) { in callHasFloatingPointArgument()
72 static bool callHasFP128Argument(const CallInst *CI) { in callHasFP128Argument() argument
73 return any_of(CI->operands(), [](const Use &OI) { in callHasFP128Argument()
85 static Value *convertStrToInt(CallInst *CI, StringRef &Str, Value *EndPtr, in convertStrToInt() argument
118 Type *RetTy = CI->getType(); in convertStrToInt()
175 Value *StrBeg = CI->getArgOperand(0); in convertStrToInt()
199 static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, in canTransformToMemCmp() argument
201 if (!isOnlyUsedInComparisonWithZero(CI)) in canTransformToMemCmp()
207 if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory)) in canTransformToMemCmp()
213 static void annotateDereferenceableBytes(CallInst *CI, in annotateDereferenceableBytes() argument
216 const Function *F = CI->getCaller(); in annotateDereferenceableBytes()
221 unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateDereferenceableBytes()
223 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
224 DerefBytes = std::max(CI->getParamDereferenceableOrNullBytes(ArgNo), in annotateDereferenceableBytes()
227 if (CI->getParamDereferenceableBytes(ArgNo) < DerefBytes) { in annotateDereferenceableBytes()
228 CI->removeParamAttr(ArgNo, Attribute::Dereferenceable); in annotateDereferenceableBytes()
230 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
231 CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull); in annotateDereferenceableBytes()
232 CI->addParamAttr(ArgNo, Attribute::getWithDereferenceableBytes( in annotateDereferenceableBytes()
233 CI->getContext(), DerefBytes)); in annotateDereferenceableBytes()
238 static void annotateNonNullNoUndefBasedOnAccess(CallInst *CI, in annotateNonNullNoUndefBasedOnAccess() argument
240 Function *F = CI->getCaller(); in annotateNonNullNoUndefBasedOnAccess()
245 if (!CI->paramHasAttr(ArgNo, Attribute::NoUndef)) in annotateNonNullNoUndefBasedOnAccess()
246 CI->addParamAttr(ArgNo, Attribute::NoUndef); in annotateNonNullNoUndefBasedOnAccess()
248 if (CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateNonNullNoUndefBasedOnAccess()
250 unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateNonNullNoUndefBasedOnAccess()
254 CI->addParamAttr(ArgNo, Attribute::NonNull); in annotateNonNullNoUndefBasedOnAccess()
255 annotateDereferenceableBytes(CI, ArgNo, 1); in annotateNonNullNoUndefBasedOnAccess()
259 static void annotateNonNullAndDereferenceable(CallInst *CI, ArrayRef<unsigned> ArgNos, in annotateNonNullAndDereferenceable() argument
262 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
263 annotateDereferenceableBytes(CI, ArgNos, LenC->getZExtValue()); in annotateNonNullAndDereferenceable()
265 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
270 annotateDereferenceableBytes(CI, ArgNos, DerefMin); in annotateNonNullAndDereferenceable()
297 Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrCat() argument
299 Value *Dst = CI->getArgOperand(0); in optimizeStrCat()
300 Value *Src = CI->getArgOperand(1); in optimizeStrCat()
301 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCat()
306 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCat()
315 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len, B)); in optimizeStrCat()
339 Value *LibCallSimplifier::optimizeStrNCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCat() argument
341 Value *Dst = CI->getArgOperand(0); in optimizeStrNCat()
342 Value *Src = CI->getArgOperand(1); in optimizeStrNCat()
343 Value *Size = CI->getArgOperand(2); in optimizeStrNCat()
345 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNCat()
347 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrNCat()
363 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStrNCat()
379 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen, B)); in optimizeStrNCat()
385 static Value* memChrToCharCompare(CallInst *CI, Value *NBytes, in memChrToCharCompare() argument
388 Value *Src = CI->getArgOperand(0); in memChrToCharCompare()
389 Value *CharVal = CI->getArgOperand(1); in memChrToCharCompare()
403 Value *NullPtr = Constant::getNullValue(CI->getType()); in memChrToCharCompare()
407 Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrChr() argument
408 Value *SrcStr = CI->getArgOperand(0); in optimizeStrChr()
409 Value *CharVal = CI->getArgOperand(1); in optimizeStrChr()
410 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrChr()
412 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeStrChr()
413 return memChrToCharCompare(CI, nullptr, B, DL); in optimizeStrChr()
421 annotateDereferenceableBytes(CI, 0, Len); in optimizeStrChr()
425 Function *Callee = CI->getCalledFunction(); in optimizeStrChr()
431 *CI, in optimizeStrChr()
433 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len), B, in optimizeStrChr()
438 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeStrChr()
439 if (isOnlyUsedInEqualityComparison(CI, NullPtr)) in optimizeStrChr()
442 return B.CreateIntToPtr(B.getTrue(), CI->getType()); in optimizeStrChr()
461 return Constant::getNullValue(CI->getType()); in optimizeStrChr()
467 Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrRChr() argument
468 Value *SrcStr = CI->getArgOperand(0); in optimizeStrRChr()
469 Value *CharVal = CI->getArgOperand(1); in optimizeStrRChr()
471 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrRChr()
477 return copyFlags(*CI, emitStrChr(SrcStr, '\0', B, TLI)); in optimizeStrRChr()
484 Type *IntPtrType = DL.getIntPtrType(CI->getContext()); in optimizeStrRChr()
486 return copyFlags(*CI, emitMemRChr(SrcStr, CharVal, Size, B, DL, TLI)); in optimizeStrRChr()
489 Value *LibCallSimplifier::optimizeStrCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrCmp() argument
490 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); in optimizeStrCmp()
492 return ConstantInt::get(CI->getType(), 0); in optimizeStrCmp()
500 return ConstantInt::get(CI->getType(), Str1.compare(Str2)); in optimizeStrCmp()
504 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrCmp()
508 CI->getType()); in optimizeStrCmp()
513 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrCmp()
516 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrCmp()
520 *CI, emitMemCmp(Str1P, Str2P, in optimizeStrCmp()
521 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeStrCmp()
528 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrCmp()
530 *CI, in optimizeStrCmp()
532 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), in optimizeStrCmp()
535 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrCmp()
537 *CI, in optimizeStrCmp()
539 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), in optimizeStrCmp()
543 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCmp()
549 static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS,
553 Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCmp() argument
554 Value *Str1P = CI->getArgOperand(0); in optimizeStrNCmp()
555 Value *Str2P = CI->getArgOperand(1); in optimizeStrNCmp()
556 Value *Size = CI->getArgOperand(2); in optimizeStrNCmp()
558 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
561 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrNCmp()
567 return optimizeMemCmpVarSize(CI, Str1P, Str2P, Size, true, B, DL); in optimizeStrNCmp()
570 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
573 return copyFlags(*CI, emitMemCmp(Str1P, Str2P, Size, B, DL, TLI)); in optimizeStrNCmp()
584 return ConstantInt::get(CI->getType(), SubStr1.compare(SubStr2)); in optimizeStrNCmp()
589 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrNCmp()
593 CI->getType()); in optimizeStrNCmp()
597 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrNCmp()
600 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrNCmp()
605 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrNCmp()
607 *CI, in optimizeStrNCmp()
609 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), in optimizeStrNCmp()
613 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrNCmp()
615 *CI, in optimizeStrNCmp()
617 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), in optimizeStrNCmp()
624 Value *LibCallSimplifier::optimizeStrNDup(CallInst *CI, IRBuilderBase &B) { in optimizeStrNDup() argument
625 Value *Src = CI->getArgOperand(0); in optimizeStrNDup()
626 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrNDup()
629 annotateDereferenceableBytes(CI, 0, SrcLen); in optimizeStrNDup()
631 return copyFlags(*CI, emitStrDup(Src, B, TLI)); in optimizeStrNDup()
637 Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrCpy() argument
638 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStrCpy()
642 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCpy()
646 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCpy()
654 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len)); in optimizeStrCpy()
655 NewCI->setAttributes(CI->getAttributes()); in optimizeStrCpy()
657 copyFlags(*CI, NewCI); in optimizeStrCpy()
661 Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStpCpy() argument
662 Function *Callee = CI->getCalledFunction(); in optimizeStpCpy()
663 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStpCpy()
666 if (CI->use_empty()) in optimizeStpCpy()
667 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI)); in optimizeStpCpy()
677 annotateDereferenceableBytes(CI, 1, Len); in optimizeStpCpy()
689 NewCI->setAttributes(CI->getAttributes()); in optimizeStpCpy()
691 copyFlags(*CI, NewCI); in optimizeStpCpy()
695 Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCpy() argument
696 Function *Callee = CI->getCalledFunction(); in optimizeStrNCpy()
697 Value *Dst = CI->getArgOperand(0); in optimizeStrNCpy()
698 Value *Src = CI->getArgOperand(1); in optimizeStrNCpy()
699 Value *Size = CI->getArgOperand(2); in optimizeStrNCpy()
700 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNCpy()
702 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrNCpy()
717 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStrNCpy()
726 CI->getAttributes().getParamAttrs(0).getAlignment().valueOrOne(); in optimizeStrNCpy()
728 AttrBuilder ArgAttrs(CI->getContext(), CI->getAttributes().getParamAttrs(0)); in optimizeStrNCpy()
730 CI->getContext(), 0, ArgAttrs)); in optimizeStrNCpy()
731 copyFlags(*CI, NewCI); in optimizeStrNCpy()
753 NewCI->setAttributes(CI->getAttributes()); in optimizeStrNCpy()
755 copyFlags(*CI, NewCI); in optimizeStrNCpy()
759 Value *LibCallSimplifier::optimizeStringLength(CallInst *CI, IRBuilderBase &B, in optimizeStringLength() argument
762 Value *Src = CI->getArgOperand(0); in optimizeStringLength()
765 if (isOnlyUsedInZeroEqualityComparison(CI) && in optimizeStringLength()
774 CI->getType()); in optimizeStringLength()
781 return ConstantInt::get(CI->getType(), 0); in optimizeStringLength()
788 return B.CreateZExt(Cmp, CI->getType()); in optimizeStringLength()
794 Value *LenC = ConstantInt::get(CI->getType(), Len - 1); in optimizeStringLength()
839 KnownBits Known = computeKnownBits(Offset, DL, 0, nullptr, CI, nullptr); in optimizeStringLength()
850 Offset = B.CreateSExtOrTrunc(Offset, CI->getType()); in optimizeStringLength()
851 return B.CreateSub(ConstantInt::get(CI->getType(), NullTermIdx), in optimizeStringLength()
863 return OptimizationRemark("instcombine", "simplify-libcalls", CI) in optimizeStringLength()
867 ConstantInt::get(CI->getType(), LenTrue - 1), in optimizeStringLength()
868 ConstantInt::get(CI->getType(), LenFalse - 1)); in optimizeStringLength()
875 Value *LibCallSimplifier::optimizeStrLen(CallInst *CI, IRBuilderBase &B) { in optimizeStrLen() argument
876 if (Value *V = optimizeStringLength(CI, B, 8)) in optimizeStrLen()
878 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrLen()
882 Value *LibCallSimplifier::optimizeStrNLen(CallInst *CI, IRBuilderBase &B) { in optimizeStrNLen() argument
883 Value *Bound = CI->getArgOperand(1); in optimizeStrNLen()
884 if (Value *V = optimizeStringLength(CI, B, 8, Bound)) in optimizeStrNLen()
888 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNLen()
892 Value *LibCallSimplifier::optimizeWcslen(CallInst *CI, IRBuilderBase &B) { in optimizeWcslen() argument
893 Module &M = *CI->getModule(); in optimizeWcslen()
899 return optimizeStringLength(CI, B, WCharSize); in optimizeWcslen()
902 Value *LibCallSimplifier::optimizeStrPBrk(CallInst *CI, IRBuilderBase &B) { in optimizeStrPBrk() argument
904 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrPBrk()
905 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrPBrk()
910 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
916 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
918 return B.CreateInBoundsGEP(B.getInt8Ty(), CI->getArgOperand(0), in optimizeStrPBrk()
924 return copyFlags(*CI, emitStrChr(CI->getArgOperand(0), S2[0], B, TLI)); in optimizeStrPBrk()
929 Value *LibCallSimplifier::optimizeStrTo(CallInst *CI, IRBuilderBase &B) { in optimizeStrTo() argument
930 Value *EndPtr = CI->getArgOperand(1); in optimizeStrTo()
934 CI->addParamAttr(0, Attribute::NoCapture); in optimizeStrTo()
940 Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrSpn() argument
942 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrSpn()
943 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrSpn()
948 return Constant::getNullValue(CI->getType()); in optimizeStrSpn()
955 return ConstantInt::get(CI->getType(), Pos); in optimizeStrSpn()
961 Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrCSpn() argument
963 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrCSpn()
964 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrCSpn()
968 return Constant::getNullValue(CI->getType()); in optimizeStrCSpn()
975 return ConstantInt::get(CI->getType(), Pos); in optimizeStrCSpn()
980 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B, DL, TLI)); in optimizeStrCSpn()
985 Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) { in optimizeStrStr() argument
987 if (CI->getArgOperand(0) == CI->getArgOperand(1)) in optimizeStrStr()
988 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); in optimizeStrStr()
991 if (isOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) { in optimizeStrStr()
992 Value *StrLen = emitStrLen(CI->getArgOperand(1), B, DL, TLI); in optimizeStrStr()
995 Value *StrNCmp = emitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrStr()
999 for (User *U : llvm::make_early_inc_range(CI->users())) { in optimizeStrStr()
1006 return CI; in optimizeStrStr()
1011 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr); in optimizeStrStr()
1012 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr); in optimizeStrStr()
1016 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); in optimizeStrStr()
1023 return Constant::getNullValue(CI->getType()); in optimizeStrStr()
1026 Value *Result = castToCStr(CI->getArgOperand(0), B); in optimizeStrStr()
1029 return B.CreateBitCast(Result, CI->getType()); in optimizeStrStr()
1034 Value *StrChr = emitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TLI); in optimizeStrStr()
1035 return StrChr ? B.CreateBitCast(StrChr, CI->getType()) : nullptr; in optimizeStrStr()
1038 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrStr()
1042 Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemRChr() argument
1043 Value *SrcStr = CI->getArgOperand(0); in optimizeMemRChr()
1044 Value *Size = CI->getArgOperand(2); in optimizeMemRChr()
1045 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemRChr()
1046 Value *CharVal = CI->getArgOperand(1); in optimizeMemRChr()
1048 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeMemRChr()
1130 Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemChr() argument
1131 Value *SrcStr = CI->getArgOperand(0); in optimizeMemChr()
1132 Value *Size = CI->getArgOperand(2); in optimizeMemChr()
1135 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeMemChr()
1136 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeMemChr()
1137 return memChrToCharCompare(CI, Size, B, DL); in optimizeMemChr()
1140 Value *CharVal = CI->getArgOperand(1); in optimizeMemChr()
1143 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeMemChr()
1229 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeMemChr()
1233 return memChrToCharCompare(CI, Size, B, DL); in optimizeMemChr()
1249 if (Str.empty() || !isOnlyUsedInZeroEqualityComparison(CI)) in optimizeMemChr()
1289 CI->getType()); in optimizeMemChr()
1294 static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS, in optimizeMemCmpVarSize() argument
1298 return Constant::getNullValue(CI->getType()); in optimizeMemCmpVarSize()
1311 Value *Zero = ConstantInt::get(CI->getType(), 0); in optimizeMemCmpVarSize()
1331 Value *Res = ConstantInt::get(CI->getType(), IRes); in optimizeMemCmpVarSize()
1336 static Value *optimizeMemCmpConstantSize(CallInst *CI, Value *LHS, Value *RHS, in optimizeMemCmpConstantSize() argument
1340 return Constant::getNullValue(CI->getType()); in optimizeMemCmpConstantSize()
1346 CI->getType(), "lhsv"); in optimizeMemCmpConstantSize()
1349 CI->getType(), "rhsv"); in optimizeMemCmpConstantSize()
1356 if (DL.isLegalInteger(Len * 8) && isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmpConstantSize()
1357 IntegerType *IntType = IntegerType::get(CI->getContext(), Len * 8); in optimizeMemCmpConstantSize()
1374 if ((LHSV || getKnownAlignment(LHS, DL, CI) >= PrefAlignment) && in optimizeMemCmpConstantSize()
1375 (RHSV || getKnownAlignment(RHS, DL, CI) >= PrefAlignment)) { in optimizeMemCmpConstantSize()
1386 return B.CreateZExt(B.CreateICmpNE(LHSV, RHSV), CI->getType(), "memcmp"); in optimizeMemCmpConstantSize()
1394 Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(CallInst *CI, in optimizeMemCmpBCmpCommon() argument
1396 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1); in optimizeMemCmpBCmpCommon()
1397 Value *Size = CI->getArgOperand(2); in optimizeMemCmpBCmpCommon()
1399 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCmpBCmpCommon()
1401 if (Value *Res = optimizeMemCmpVarSize(CI, LHS, RHS, Size, false, B, DL)) in optimizeMemCmpBCmpCommon()
1409 return optimizeMemCmpConstantSize(CI, LHS, RHS, LenC->getZExtValue(), B, DL); in optimizeMemCmpBCmpCommon()
1412 Value *LibCallSimplifier::optimizeMemCmp(CallInst *CI, IRBuilderBase &B) { in optimizeMemCmp() argument
1413 Module *M = CI->getModule(); in optimizeMemCmp()
1414 if (Value *V = optimizeMemCmpBCmpCommon(CI, B)) in optimizeMemCmp()
1421 isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmp()
1422 Value *LHS = CI->getArgOperand(0); in optimizeMemCmp()
1423 Value *RHS = CI->getArgOperand(1); in optimizeMemCmp()
1424 Value *Size = CI->getArgOperand(2); in optimizeMemCmp()
1425 return copyFlags(*CI, emitBCmp(LHS, RHS, Size, B, DL, TLI)); in optimizeMemCmp()
1431 Value *LibCallSimplifier::optimizeBCmp(CallInst *CI, IRBuilderBase &B) { in optimizeBCmp() argument
1432 return optimizeMemCmpBCmpCommon(CI, B); in optimizeBCmp()
1435 Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCpy() argument
1436 Value *Size = CI->getArgOperand(2); in optimizeMemCpy()
1437 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCpy()
1438 if (isa<IntrinsicInst>(CI)) in optimizeMemCpy()
1442 CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align(1), in optimizeMemCpy()
1443 CI->getArgOperand(1), Align(1), Size); in optimizeMemCpy()
1444 NewCI->setAttributes(CI->getAttributes()); in optimizeMemCpy()
1446 copyFlags(*CI, NewCI); in optimizeMemCpy()
1447 return CI->getArgOperand(0); in optimizeMemCpy()
1450 Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCCpy() argument
1451 Value *Dst = CI->getArgOperand(0); in optimizeMemCCpy()
1452 Value *Src = CI->getArgOperand(1); in optimizeMemCCpy()
1453 ConstantInt *StopChar = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeMemCCpy()
1454 ConstantInt *N = dyn_cast<ConstantInt>(CI->getArgOperand(3)); in optimizeMemCCpy()
1456 if (CI->use_empty() && Dst == Src) in optimizeMemCCpy()
1461 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1475 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1), in optimizeMemCCpy()
1476 CI->getArgOperand(3))); in optimizeMemCCpy()
1477 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1485 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1), NewN)); in optimizeMemCCpy()
1488 : Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1491 Value *LibCallSimplifier::optimizeMemPCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemPCpy() argument
1492 Value *Dst = CI->getArgOperand(0); in optimizeMemPCpy()
1493 Value *N = CI->getArgOperand(2); in optimizeMemPCpy()
1496 B.CreateMemCpy(Dst, Align(1), CI->getArgOperand(1), Align(1), N); in optimizeMemPCpy()
1500 NewCI->setAttributes(CI->getAttributes()); in optimizeMemPCpy()
1502 copyFlags(*CI, NewCI); in optimizeMemPCpy()
1506 Value *LibCallSimplifier::optimizeMemMove(CallInst *CI, IRBuilderBase &B) { in optimizeMemMove() argument
1507 Value *Size = CI->getArgOperand(2); in optimizeMemMove()
1508 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemMove()
1509 if (isa<IntrinsicInst>(CI)) in optimizeMemMove()
1513 CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align(1), in optimizeMemMove()
1514 CI->getArgOperand(1), Align(1), Size); in optimizeMemMove()
1515 NewCI->setAttributes(CI->getAttributes()); in optimizeMemMove()
1517 copyFlags(*CI, NewCI); in optimizeMemMove()
1518 return CI->getArgOperand(0); in optimizeMemMove()
1521 Value *LibCallSimplifier::optimizeMemSet(CallInst *CI, IRBuilderBase &B) { in optimizeMemSet() argument
1522 Value *Size = CI->getArgOperand(2); in optimizeMemSet()
1523 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemSet()
1524 if (isa<IntrinsicInst>(CI)) in optimizeMemSet()
1528 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSet()
1529 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, Size, Align(1)); in optimizeMemSet()
1530 NewCI->setAttributes(CI->getAttributes()); in optimizeMemSet()
1532 copyFlags(*CI, NewCI); in optimizeMemSet()
1533 return CI->getArgOperand(0); in optimizeMemSet()
1536 Value *LibCallSimplifier::optimizeRealloc(CallInst *CI, IRBuilderBase &B) { in optimizeRealloc() argument
1537 if (isa<ConstantPointerNull>(CI->getArgOperand(0))) in optimizeRealloc()
1538 return copyFlags(*CI, emitMalloc(CI->getArgOperand(1), B, DL, TLI)); in optimizeRealloc()
1548 static Value *replaceUnaryCall(CallInst *CI, IRBuilderBase &B, in replaceUnaryCall() argument
1552 B.setFastMathFlags(CI->getFastMathFlags()); in replaceUnaryCall()
1554 Module *M = CI->getModule(); in replaceUnaryCall()
1555 Value *V = CI->getArgOperand(0); in replaceUnaryCall()
1556 Function *F = Intrinsic::getDeclaration(M, IID, CI->getType()); in replaceUnaryCall()
1558 NewCall->takeName(CI); in replaceUnaryCall()
1559 return copyFlags(*CI, NewCall); in replaceUnaryCall()
1585 static Value *optimizeDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeDoubleFP() argument
1588 Function *CalleeFn = CI->getCalledFunction(); in optimizeDoubleFP()
1589 if (!CI->getType()->isDoubleTy() || !CalleeFn) in optimizeDoubleFP()
1596 for (User *U : CI->users()) { in optimizeDoubleFP()
1604 V[0] = valueHasFloatPrecision(CI->getArgOperand(0)); in optimizeDoubleFP()
1605 V[1] = isBinary ? valueHasFloatPrecision(CI->getArgOperand(1)) : nullptr; in optimizeDoubleFP()
1617 StringRef CallerName = CI->getFunction()->getName(); in optimizeDoubleFP()
1626 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeDoubleFP()
1631 Module *M = CI->getModule(); in optimizeDoubleFP()
1645 static Value *optimizeUnaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeUnaryDoubleFP() argument
1648 return optimizeDoubleFP(CI, B, false, TLI, isPrecise); in optimizeUnaryDoubleFP()
1652 static Value *optimizeBinaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeBinaryDoubleFP() argument
1655 return optimizeDoubleFP(CI, B, true, TLI, isPrecise); in optimizeBinaryDoubleFP()
1659 Value *LibCallSimplifier::optimizeCAbs(CallInst *CI, IRBuilderBase &B) { in optimizeCAbs() argument
1660 if (!CI->isFast()) in optimizeCAbs()
1665 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeCAbs()
1668 if (CI->arg_size() == 1) { in optimizeCAbs()
1669 Value *Op = CI->getArgOperand(0); in optimizeCAbs()
1674 assert(CI->arg_size() == 2 && "Unexpected signature for cabs!"); in optimizeCAbs()
1675 Real = CI->getArgOperand(0); in optimizeCAbs()
1676 Imag = CI->getArgOperand(1); in optimizeCAbs()
1682 Function *FSqrt = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::sqrt, in optimizeCAbs()
1683 CI->getType()); in optimizeCAbs()
1685 *CI, B.CreateCall(FSqrt, B.CreateFAdd(RealReal, ImagImag), "cabs")); in optimizeCAbs()
2094 Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) { in optimizeExp2() argument
2095 Module *M = CI->getModule(); in optimizeExp2()
2096 Function *Callee = CI->getCalledFunction(); in optimizeExp2()
2102 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeExp2()
2104 Type *Ty = CI->getType(); in optimizeExp2()
2105 Value *Op = CI->getArgOperand(0); in optimizeExp2()
2120 Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilderBase &B) { in optimizeFMinFMax() argument
2121 Module *M = CI->getModule(); in optimizeFMinFMax()
2125 Function *Callee = CI->getCalledFunction(); in optimizeFMinFMax()
2128 if (Value *Ret = optimizeBinaryDoubleFP(CI, B, TLI)) in optimizeFMinFMax()
2139 FastMathFlags FMF = CI->getFastMathFlags(); in optimizeFMinFMax()
2145 Function *F = Intrinsic::getDeclaration(CI->getModule(), IID, CI->getType()); in optimizeFMinFMax()
2147 *CI, B.CreateCall(F, {CI->getArgOperand(0), CI->getArgOperand(1)})); in optimizeFMinFMax()
2302 Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilderBase &B) { in optimizeSqrt() argument
2303 Module *M = CI->getModule(); in optimizeSqrt()
2304 Function *Callee = CI->getCalledFunction(); in optimizeSqrt()
2312 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeSqrt()
2314 if (!CI->isFast()) in optimizeSqrt()
2317 Instruction *I = dyn_cast<Instruction>(CI->getArgOperand(0)); in optimizeSqrt()
2366 return copyFlags(*CI, B.CreateFMul(FabsCall, SqrtCall)); in optimizeSqrt()
2368 return copyFlags(*CI, FabsCall); in optimizeSqrt()
2372 Value *LibCallSimplifier::optimizeTan(CallInst *CI, IRBuilderBase &B) { in optimizeTan() argument
2373 Module *M = CI->getModule(); in optimizeTan()
2374 Function *Callee = CI->getCalledFunction(); in optimizeTan()
2378 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeTan()
2380 Value *Op1 = CI->getArgOperand(0); in optimizeTan()
2386 if (!CI->isFast() || !OpC->isFast()) in optimizeTan()
2403 static bool isTrigLibCall(CallInst *CI) { in isTrigLibCall() argument
2407 return CI->hasFnAttr(Attribute::NoUnwind) && in isTrigLibCall()
2408 CI->hasFnAttr(Attribute::ReadNone); in isTrigLibCall()
2467 Value *LibCallSimplifier::optimizeSinCosPi(CallInst *CI, IRBuilderBase &B) { in optimizeSinCosPi() argument
2470 if (!isTrigLibCall(CI)) in optimizeSinCosPi()
2473 Value *Arg = CI->getArgOperand(0); in optimizeSinCosPi()
2483 Function *F = CI->getFunction(); in optimizeSinCosPi()
2492 if (!insertSinCosCall(B, CI->getCalledFunction(), Arg, IsFloat, Sin, Cos, in optimizeSinCosPi()
2514 CallInst *CI = dyn_cast<CallInst>(Val); in classifyArgUse() local
2515 Module *M = CI->getModule(); in classifyArgUse()
2517 if (!CI || CI->use_empty()) in classifyArgUse()
2521 if (CI->getFunction() != F) in classifyArgUse()
2524 Function *Callee = CI->getCalledFunction(); in classifyArgUse()
2528 !isTrigLibCall(CI)) in classifyArgUse()
2533 SinCalls.push_back(CI); in classifyArgUse()
2535 CosCalls.push_back(CI); in classifyArgUse()
2537 SinCosCalls.push_back(CI); in classifyArgUse()
2540 SinCalls.push_back(CI); in classifyArgUse()
2542 CosCalls.push_back(CI); in classifyArgUse()
2544 SinCosCalls.push_back(CI); in classifyArgUse()
2552 Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilderBase &B) { in optimizeFFS() argument
2554 Value *Op = CI->getArgOperand(0); in optimizeFFS()
2556 Function *F = Intrinsic::getDeclaration(CI->getCalledFunction()->getParent(), in optimizeFFS()
2566 Value *LibCallSimplifier::optimizeFls(CallInst *CI, IRBuilderBase &B) { in optimizeFls() argument
2568 Value *Op = CI->getArgOperand(0); in optimizeFls()
2570 Function *F = Intrinsic::getDeclaration(CI->getCalledFunction()->getParent(), in optimizeFls()
2575 return B.CreateIntCast(V, CI->getType(), false); in optimizeFls()
2578 Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilderBase &B) { in optimizeAbs() argument
2581 Value *X = CI->getArgOperand(0); in optimizeAbs()
2587 Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilderBase &B) { in optimizeIsDigit() argument
2589 Value *Op = CI->getArgOperand(0); in optimizeIsDigit()
2592 return B.CreateZExt(Op, CI->getType()); in optimizeIsDigit()
2595 Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilderBase &B) { in optimizeIsAscii() argument
2597 Value *Op = CI->getArgOperand(0); in optimizeIsAscii()
2599 return B.CreateZExt(Op, CI->getType()); in optimizeIsAscii()
2602 Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilderBase &B) { in optimizeToAscii() argument
2604 return B.CreateAnd(CI->getArgOperand(0), in optimizeToAscii()
2605 ConstantInt::get(CI->getType(), 0x7F)); in optimizeToAscii()
2609 Value *LibCallSimplifier::optimizeAtoi(CallInst *CI, IRBuilderBase &B) { in optimizeAtoi() argument
2610 CI->addParamAttr(0, Attribute::NoCapture); in optimizeAtoi()
2613 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeAtoi()
2616 return convertStrToInt(CI, Str, nullptr, 10, /*AsSigned=*/true, B); in optimizeAtoi()
2620 Value *LibCallSimplifier::optimizeStrToInt(CallInst *CI, IRBuilderBase &B, in optimizeStrToInt() argument
2622 Value *EndPtr = CI->getArgOperand(1); in optimizeStrToInt()
2626 CI->addParamAttr(0, Attribute::NoCapture); in optimizeStrToInt()
2632 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeStrToInt()
2635 if (ConstantInt *CInt = dyn_cast<ConstantInt>(CI->getArgOperand(2))) { in optimizeStrToInt()
2636 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned, B); in optimizeStrToInt()
2646 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg);
2648 Value *LibCallSimplifier::optimizeErrorReporting(CallInst *CI, IRBuilderBase &B, in optimizeErrorReporting() argument
2650 Function *Callee = CI->getCalledFunction(); in optimizeErrorReporting()
2659 if (!CI->hasFnAttr(Attribute::Cold) && in optimizeErrorReporting()
2660 isReportingError(Callee, CI, StreamArg)) { in optimizeErrorReporting()
2661 CI->addFnAttr(Attribute::Cold); in optimizeErrorReporting()
2667 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) { in isReportingError() argument
2677 if (StreamArg >= (int)CI->arg_size()) in isReportingError()
2679 LoadInst *LI = dyn_cast<LoadInst>(CI->getArgOperand(StreamArg)); in isReportingError()
2688 Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilderBase &B) { in optimizePrintFString() argument
2691 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr)) in optimizePrintFString()
2696 return CI->use_empty() ? (Value *)CI : ConstantInt::get(CI->getType(), 0); in optimizePrintFString()
2701 if (!CI->use_empty()) in optimizePrintFString()
2706 return copyFlags(*CI, emitPutChar(B.getInt32(FormatStr[0]), B, TLI)); in optimizePrintFString()
2709 if (FormatStr == "%s" && CI->arg_size() > 1) { in optimizePrintFString()
2711 if (!getConstantStringInfo(CI->getOperand(1), OperandStr)) in optimizePrintFString()
2715 return (Value *)CI; in optimizePrintFString()
2718 return copyFlags(*CI, emitPutChar(B.getInt32(OperandStr[0]), B, TLI)); in optimizePrintFString()
2723 return copyFlags(*CI, emitPutS(GV, B, TLI)); in optimizePrintFString()
2735 return copyFlags(*CI, emitPutS(GV, B, TLI)); in optimizePrintFString()
2740 if (FormatStr == "%c" && CI->arg_size() > 1 && in optimizePrintFString()
2741 CI->getArgOperand(1)->getType()->isIntegerTy()) in optimizePrintFString()
2742 return copyFlags(*CI, emitPutChar(CI->getArgOperand(1), B, TLI)); in optimizePrintFString()
2745 if (FormatStr == "%s\n" && CI->arg_size() > 1 && in optimizePrintFString()
2746 CI->getArgOperand(1)->getType()->isPointerTy()) in optimizePrintFString()
2747 return copyFlags(*CI, emitPutS(CI->getArgOperand(1), B, TLI)); in optimizePrintFString()
2751 Value *LibCallSimplifier::optimizePrintF(CallInst *CI, IRBuilderBase &B) { in optimizePrintF() argument
2753 Module *M = CI->getModule(); in optimizePrintF()
2754 Function *Callee = CI->getCalledFunction(); in optimizePrintF()
2756 if (Value *V = optimizePrintFString(CI, B)) { in optimizePrintF()
2763 !callHasFloatingPointArgument(CI)) { in optimizePrintF()
2766 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
2775 !callHasFP128Argument(CI)) { in optimizePrintF()
2778 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
2784 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePrintF()
2788 Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, in optimizeSPrintFString() argument
2792 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeSPrintFString()
2796 Value *Dest = CI->getArgOperand(0); in optimizeSPrintFString()
2797 if (CI->arg_size() == 2) { in optimizeSPrintFString()
2805 Dest, Align(1), CI->getArgOperand(1), Align(1), in optimizeSPrintFString()
2806 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeSPrintFString()
2808 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSPrintFString()
2813 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3) in optimizeSPrintFString()
2819 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeSPrintFString()
2821 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char"); in optimizeSPrintFString()
2827 return ConstantInt::get(CI->getType(), 1); in optimizeSPrintFString()
2833 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeSPrintFString()
2836 if (CI->use_empty()) in optimizeSPrintFString()
2838 return copyFlags(*CI, emitStrCpy(Dest, CI->getArgOperand(2), B, TLI)); in optimizeSPrintFString()
2840 uint64_t SrcLen = GetStringLength(CI->getArgOperand(2)); in optimizeSPrintFString()
2843 Dest, Align(1), CI->getArgOperand(2), Align(1), in optimizeSPrintFString()
2844 ConstantInt::get(DL.getIntPtrType(CI->getContext()), SrcLen)); in optimizeSPrintFString()
2846 return ConstantInt::get(CI->getType(), SrcLen - 1); in optimizeSPrintFString()
2847 } else if (Value *V = emitStpCpy(Dest, CI->getArgOperand(2), B, TLI)) { in optimizeSPrintFString()
2853 return B.CreateIntCast(PtrDiff, CI->getType(), false); in optimizeSPrintFString()
2856 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeSPrintFString()
2857 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeSPrintFString()
2862 Value *Len = emitStrLen(CI->getArgOperand(2), B, DL, TLI); in optimizeSPrintFString()
2867 B.CreateMemCpy(Dest, Align(1), CI->getArgOperand(2), Align(1), IncLen); in optimizeSPrintFString()
2870 return B.CreateIntCast(Len, CI->getType(), false); in optimizeSPrintFString()
2875 Value *LibCallSimplifier::optimizeSPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSPrintF() argument
2876 Module *M = CI->getModule(); in optimizeSPrintF()
2877 Function *Callee = CI->getCalledFunction(); in optimizeSPrintF()
2879 if (Value *V = optimizeSPrintFString(CI, B)) { in optimizeSPrintF()
2886 !callHasFloatingPointArgument(CI)) { in optimizeSPrintF()
2889 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
2898 !callHasFP128Argument(CI)) { in optimizeSPrintF()
2901 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
2907 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeSPrintF()
2911 Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI, in optimizeSnPrintFString() argument
2914 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeSnPrintFString()
2921 if (!getConstantStringInfo(CI->getArgOperand(2), FormatStr)) in optimizeSnPrintFString()
2925 if (CI->arg_size() == 3) { in optimizeSnPrintFString()
2932 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSnPrintFString()
2939 *CI, in optimizeSnPrintFString()
2941 CI->getArgOperand(0), Align(1), CI->getArgOperand(2), Align(1), in optimizeSnPrintFString()
2942 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeSnPrintFString()
2944 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSnPrintFString()
2949 if (FormatStr.size() == 2 && FormatStr[0] == '%' && CI->arg_size() == 4) { in optimizeSnPrintFString()
2954 return ConstantInt::get(CI->getType(), 1); in optimizeSnPrintFString()
2959 if (!CI->getArgOperand(3)->getType()->isIntegerTy()) in optimizeSnPrintFString()
2961 Value *V = B.CreateTrunc(CI->getArgOperand(3), B.getInt8Ty(), "char"); in optimizeSnPrintFString()
2962 Value *Ptr = castToCStr(CI->getArgOperand(0), B); in optimizeSnPrintFString()
2967 return ConstantInt::get(CI->getType(), 1); in optimizeSnPrintFString()
2973 if (!getConstantStringInfo(CI->getArgOperand(3), Str)) in optimizeSnPrintFString()
2977 return ConstantInt::get(CI->getType(), Str.size()); in optimizeSnPrintFString()
2982 *CI, B.CreateMemCpy(CI->getArgOperand(0), Align(1), in optimizeSnPrintFString()
2983 CI->getArgOperand(3), Align(1), in optimizeSnPrintFString()
2984 ConstantInt::get(CI->getType(), Str.size() + 1))); in optimizeSnPrintFString()
2987 return ConstantInt::get(CI->getType(), Str.size()); in optimizeSnPrintFString()
2993 Value *LibCallSimplifier::optimizeSnPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSnPrintF() argument
2994 if (Value *V = optimizeSnPrintFString(CI, B)) { in optimizeSnPrintF()
2998 if (isKnownNonZero(CI->getOperand(1), DL)) in optimizeSnPrintF()
2999 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeSnPrintF()
3003 Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI, in optimizeFPrintFString() argument
3005 optimizeErrorReporting(CI, B, 0); in optimizeFPrintFString()
3009 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeFPrintFString()
3015 if (!CI->use_empty()) in optimizeFPrintFString()
3019 if (CI->arg_size() == 2) { in optimizeFPrintFString()
3025 *CI, emitFWrite(CI->getArgOperand(1), in optimizeFPrintFString()
3026 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeFPrintFString()
3028 CI->getArgOperand(0), B, DL, TLI)); in optimizeFPrintFString()
3033 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3) in optimizeFPrintFString()
3039 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeFPrintFString()
3042 *CI, emitFPutC(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI)); in optimizeFPrintFString()
3047 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeFPrintFString()
3050 *CI, emitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI)); in optimizeFPrintFString()
3055 Value *LibCallSimplifier::optimizeFPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeFPrintF() argument
3056 Module *M = CI->getModule(); in optimizeFPrintF()
3057 Function *Callee = CI->getCalledFunction(); in optimizeFPrintF()
3059 if (Value *V = optimizeFPrintFString(CI, B)) { in optimizeFPrintF()
3066 !callHasFloatingPointArgument(CI)) { in optimizeFPrintF()
3069 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
3078 !callHasFP128Argument(CI)) { in optimizeFPrintF()
3082 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
3091 Value *LibCallSimplifier::optimizeFWrite(CallInst *CI, IRBuilderBase &B) { in optimizeFWrite() argument
3092 optimizeErrorReporting(CI, B, 3); in optimizeFWrite()
3095 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeFWrite()
3096 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeFWrite()
3102 return ConstantInt::get(CI->getType(), 0); in optimizeFWrite()
3106 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) in optimizeFWrite()
3108 castToCStr(CI->getArgOperand(0), B), "char"); in optimizeFWrite()
3109 Value *NewCI = emitFPutC(Char, CI->getArgOperand(3), B, TLI); in optimizeFWrite()
3110 return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr; in optimizeFWrite()
3117 Value *LibCallSimplifier::optimizeFPuts(CallInst *CI, IRBuilderBase &B) { in optimizeFPuts() argument
3118 optimizeErrorReporting(CI, B, 1); in optimizeFPuts()
3122 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeFPuts()
3123 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeFPuts()
3129 if (!CI->use_empty()) in optimizeFPuts()
3133 uint64_t Len = GetStringLength(CI->getArgOperand(0)); in optimizeFPuts()
3139 *CI, in optimizeFPuts()
3140 emitFWrite(CI->getArgOperand(0), in optimizeFPuts()
3141 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len - 1), in optimizeFPuts()
3142 CI->getArgOperand(1), B, DL, TLI)); in optimizeFPuts()
3145 Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilderBase &B) { in optimizePuts() argument
3146 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePuts()
3147 if (!CI->use_empty()) in optimizePuts()
3153 if (getConstantStringInfo(CI->getArgOperand(0), Str) && Str.empty()) in optimizePuts()
3154 return copyFlags(*CI, emitPutChar(B.getInt32('\n'), B, TLI)); in optimizePuts()
3159 Value *LibCallSimplifier::optimizeBCopy(CallInst *CI, IRBuilderBase &B) { in optimizeBCopy() argument
3161 return copyFlags(*CI, B.CreateMemMove(CI->getArgOperand(1), Align(1), in optimizeBCopy()
3162 CI->getArgOperand(0), Align(1), in optimizeBCopy()
3163 CI->getArgOperand(2))); in optimizeBCopy()
3172 Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI, in optimizeStringMemoryLibCall() argument
3174 Module *M = CI->getModule(); in optimizeStringMemoryLibCall()
3176 Function *Callee = CI->getCalledFunction(); in optimizeStringMemoryLibCall()
3182 TargetLibraryInfoImpl::isCallingConvCCompatible(CI)) && in optimizeStringMemoryLibCall()
3186 return optimizeStrCat(CI, Builder); in optimizeStringMemoryLibCall()
3188 return optimizeStrNCat(CI, Builder); in optimizeStringMemoryLibCall()
3190 return optimizeStrChr(CI, Builder); in optimizeStringMemoryLibCall()
3192 return optimizeStrRChr(CI, Builder); in optimizeStringMemoryLibCall()
3194 return optimizeStrCmp(CI, Builder); in optimizeStringMemoryLibCall()
3196 return optimizeStrNCmp(CI, Builder); in optimizeStringMemoryLibCall()
3198 return optimizeStrCpy(CI, Builder); in optimizeStringMemoryLibCall()
3200 return optimizeStpCpy(CI, Builder); in optimizeStringMemoryLibCall()
3202 return optimizeStrNCpy(CI, Builder); in optimizeStringMemoryLibCall()
3204 return optimizeStrLen(CI, Builder); in optimizeStringMemoryLibCall()
3206 return optimizeStrNLen(CI, Builder); in optimizeStringMemoryLibCall()
3208 return optimizeStrPBrk(CI, Builder); in optimizeStringMemoryLibCall()
3210 return optimizeStrNDup(CI, Builder); in optimizeStringMemoryLibCall()
3218 return optimizeStrTo(CI, Builder); in optimizeStringMemoryLibCall()
3220 return optimizeStrSpn(CI, Builder); in optimizeStringMemoryLibCall()
3222 return optimizeStrCSpn(CI, Builder); in optimizeStringMemoryLibCall()
3224 return optimizeStrStr(CI, Builder); in optimizeStringMemoryLibCall()
3226 return optimizeMemChr(CI, Builder); in optimizeStringMemoryLibCall()
3228 return optimizeMemRChr(CI, Builder); in optimizeStringMemoryLibCall()
3230 return optimizeBCmp(CI, Builder); in optimizeStringMemoryLibCall()
3232 return optimizeMemCmp(CI, Builder); in optimizeStringMemoryLibCall()
3234 return optimizeMemCpy(CI, Builder); in optimizeStringMemoryLibCall()
3236 return optimizeMemCCpy(CI, Builder); in optimizeStringMemoryLibCall()
3238 return optimizeMemPCpy(CI, Builder); in optimizeStringMemoryLibCall()
3240 return optimizeMemMove(CI, Builder); in optimizeStringMemoryLibCall()
3242 return optimizeMemSet(CI, Builder); in optimizeStringMemoryLibCall()
3244 return optimizeRealloc(CI, Builder); in optimizeStringMemoryLibCall()
3246 return optimizeWcslen(CI, Builder); in optimizeStringMemoryLibCall()
3248 return optimizeBCopy(CI, Builder); in optimizeStringMemoryLibCall()
3256 Value *LibCallSimplifier::optimizeFloatingPointLibCall(CallInst *CI, in optimizeFloatingPointLibCall() argument
3259 const Module *M = CI->getModule(); in optimizeFloatingPointLibCall()
3262 if (CI->isStrictFP()) in optimizeFloatingPointLibCall()
3265 if (Value *V = optimizeTrigReflections(CI, Func, Builder)) in optimizeFloatingPointLibCall()
3273 return optimizeSinCosPi(CI, Builder); in optimizeFloatingPointLibCall()
3277 return optimizePow(CI, Builder); in optimizeFloatingPointLibCall()
3281 return optimizeExp2(CI, Builder); in optimizeFloatingPointLibCall()
3285 return replaceUnaryCall(CI, Builder, Intrinsic::fabs); in optimizeFloatingPointLibCall()
3289 return optimizeSqrt(CI, Builder); in optimizeFloatingPointLibCall()
3305 return optimizeLog(CI, Builder); in optimizeFloatingPointLibCall()
3309 return optimizeTan(CI, Builder); in optimizeFloatingPointLibCall()
3311 return replaceUnaryCall(CI, Builder, Intrinsic::ceil); in optimizeFloatingPointLibCall()
3313 return replaceUnaryCall(CI, Builder, Intrinsic::floor); in optimizeFloatingPointLibCall()
3315 return replaceUnaryCall(CI, Builder, Intrinsic::round); in optimizeFloatingPointLibCall()
3317 return replaceUnaryCall(CI, Builder, Intrinsic::roundeven); in optimizeFloatingPointLibCall()
3319 return replaceUnaryCall(CI, Builder, Intrinsic::nearbyint); in optimizeFloatingPointLibCall()
3321 return replaceUnaryCall(CI, Builder, Intrinsic::rint); in optimizeFloatingPointLibCall()
3323 return replaceUnaryCall(CI, Builder, Intrinsic::trunc); in optimizeFloatingPointLibCall()
3339 if (UnsafeFPShrink && hasFloatVersion(M, CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3340 return optimizeUnaryDoubleFP(CI, Builder, TLI, true); in optimizeFloatingPointLibCall()
3343 if (hasFloatVersion(M, CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3344 return optimizeBinaryDoubleFP(CI, Builder, TLI); in optimizeFloatingPointLibCall()
3352 return optimizeFMinFMax(CI, Builder); in optimizeFloatingPointLibCall()
3356 return optimizeCAbs(CI, Builder); in optimizeFloatingPointLibCall()
3362 Value *LibCallSimplifier::optimizeCall(CallInst *CI, IRBuilderBase &Builder) { in optimizeCall() argument
3363 Module *M = CI->getModule(); in optimizeCall()
3364 assert(!CI->isMustTailCall() && "These transforms aren't musttail safe."); in optimizeCall()
3369 if (CI->isNoBuiltin()) in optimizeCall()
3373 Function *Callee = CI->getCalledFunction(); in optimizeCall()
3374 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
3377 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
3387 else if (isa<FPMathOperator>(CI) && CI->isFast()) in optimizeCall()
3391 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) { in optimizeCall()
3398 return optimizePow(CI, Builder); in optimizeCall()
3400 return optimizeExp2(CI, Builder); in optimizeCall()
3404 return optimizeLog(CI, Builder); in optimizeCall()
3406 return optimizeSqrt(CI, Builder); in optimizeCall()
3408 return optimizeMemSet(CI, Builder); in optimizeCall()
3410 return optimizeMemCpy(CI, Builder); in optimizeCall()
3412 return optimizeMemMove(CI, Builder); in optimizeCall()
3420 FortifiedSimplifier.optimizeCall(CI, Builder)) { in optimizeCall()
3426 replaceAllUsesWith(CI, SimplifiedCI); in optimizeCall()
3446 if (Value *V = optimizeStringMemoryLibCall(CI, Builder)) in optimizeCall()
3448 if (Value *V = optimizeFloatingPointLibCall(CI, Func, Builder)) in optimizeCall()
3454 return optimizeFFS(CI, Builder); in optimizeCall()
3458 return optimizeFls(CI, Builder); in optimizeCall()
3462 return optimizeAbs(CI, Builder); in optimizeCall()
3464 return optimizeIsDigit(CI, Builder); in optimizeCall()
3466 return optimizeIsAscii(CI, Builder); in optimizeCall()
3468 return optimizeToAscii(CI, Builder); in optimizeCall()
3472 return optimizeAtoi(CI, Builder); in optimizeCall()
3475 return optimizeStrToInt(CI, Builder, /*AsSigned=*/true); in optimizeCall()
3478 return optimizeStrToInt(CI, Builder, /*AsSigned=*/false); in optimizeCall()
3480 return optimizePrintF(CI, Builder); in optimizeCall()
3482 return optimizeSPrintF(CI, Builder); in optimizeCall()
3484 return optimizeSnPrintF(CI, Builder); in optimizeCall()
3486 return optimizeFPrintF(CI, Builder); in optimizeCall()
3488 return optimizeFWrite(CI, Builder); in optimizeCall()
3490 return optimizeFPuts(CI, Builder); in optimizeCall()
3492 return optimizePuts(CI, Builder); in optimizeCall()
3494 return optimizeErrorReporting(CI, Builder); in optimizeCall()
3497 return optimizeErrorReporting(CI, Builder, 0); in optimizeCall()
3559 FortifiedLibCallSimplifier::isFortifiedCallFoldable(CallInst *CI, in isFortifiedCallFoldable() argument
3567 ConstantInt *Flag = dyn_cast<ConstantInt>(CI->getArgOperand(*FlagOp)); in isFortifiedCallFoldable()
3572 if (SizeOp && CI->getArgOperand(ObjSizeOp) == CI->getArgOperand(*SizeOp)) in isFortifiedCallFoldable()
3576 dyn_cast<ConstantInt>(CI->getArgOperand(ObjSizeOp))) { in isFortifiedCallFoldable()
3583 uint64_t Len = GetStringLength(CI->getArgOperand(*StrOp)); in isFortifiedCallFoldable()
3587 annotateDereferenceableBytes(CI, *StrOp, Len); in isFortifiedCallFoldable()
3595 dyn_cast<ConstantInt>(CI->getArgOperand(*SizeOp))) in isFortifiedCallFoldable()
3602 Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI, in optimizeMemCpyChk() argument
3604 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemCpyChk()
3606 B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemCpyChk()
3607 Align(1), CI->getArgOperand(2)); in optimizeMemCpyChk()
3608 NewCI->setAttributes(CI->getAttributes()); in optimizeMemCpyChk()
3610 copyFlags(*CI, NewCI); in optimizeMemCpyChk()
3611 return CI->getArgOperand(0); in optimizeMemCpyChk()
3616 Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI, in optimizeMemMoveChk() argument
3618 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemMoveChk()
3620 B.CreateMemMove(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemMoveChk()
3621 Align(1), CI->getArgOperand(2)); in optimizeMemMoveChk()
3622 NewCI->setAttributes(CI->getAttributes()); in optimizeMemMoveChk()
3624 copyFlags(*CI, NewCI); in optimizeMemMoveChk()
3625 return CI->getArgOperand(0); in optimizeMemMoveChk()
3630 Value *FortifiedLibCallSimplifier::optimizeMemSetChk(CallInst *CI, in optimizeMemSetChk() argument
3632 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemSetChk()
3633 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSetChk()
3634 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, in optimizeMemSetChk()
3635 CI->getArgOperand(2), Align(1)); in optimizeMemSetChk()
3636 NewCI->setAttributes(CI->getAttributes()); in optimizeMemSetChk()
3638 copyFlags(*CI, NewCI); in optimizeMemSetChk()
3639 return CI->getArgOperand(0); in optimizeMemSetChk()
3644 Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(CallInst *CI, in optimizeMemPCpyChk() argument
3646 const DataLayout &DL = CI->getModule()->getDataLayout(); in optimizeMemPCpyChk()
3647 if (isFortifiedCallFoldable(CI, 3, 2)) in optimizeMemPCpyChk()
3648 if (Value *Call = emitMemPCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemPCpyChk()
3649 CI->getArgOperand(2), B, DL, TLI)) { in optimizeMemPCpyChk()
3651 NewCI->setAttributes(CI->getAttributes()); in optimizeMemPCpyChk()
3653 return copyFlags(*CI, NewCI); in optimizeMemPCpyChk()
3658 Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(CallInst *CI, in optimizeStrpCpyChk() argument
3661 const DataLayout &DL = CI->getModule()->getDataLayout(); in optimizeStrpCpyChk()
3662 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1), in optimizeStrpCpyChk()
3663 *ObjSize = CI->getArgOperand(2); in optimizeStrpCpyChk()
3676 if (isFortifiedCallFoldable(CI, 2, None, 1)) { in optimizeStrpCpyChk()
3678 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI)); in optimizeStrpCpyChk()
3680 return copyFlags(*CI, emitStpCpy(Dst, Src, B, TLI)); in optimizeStrpCpyChk()
3689 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrpCpyChk()
3697 Type *SizeTTy = DL.getIntPtrType(CI->getContext(), /*AddressSpace=*/0); in optimizeStrpCpyChk()
3705 return copyFlags(*CI, cast<CallInst>(Ret)); in optimizeStrpCpyChk()
3708 Value *FortifiedLibCallSimplifier::optimizeStrLenChk(CallInst *CI, in optimizeStrLenChk() argument
3710 if (isFortifiedCallFoldable(CI, 1, None, 0)) in optimizeStrLenChk()
3711 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B, in optimizeStrLenChk()
3712 CI->getModule()->getDataLayout(), TLI)); in optimizeStrLenChk()
3716 Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(CallInst *CI, in optimizeStrpNCpyChk() argument
3719 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeStrpNCpyChk()
3721 return copyFlags(*CI, in optimizeStrpNCpyChk()
3722 emitStrNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
3723 CI->getArgOperand(2), B, TLI)); in optimizeStrpNCpyChk()
3725 return copyFlags(*CI, in optimizeStrpNCpyChk()
3726 emitStpNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
3727 CI->getArgOperand(2), B, TLI)); in optimizeStrpNCpyChk()
3733 Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(CallInst *CI, in optimizeMemCCpyChk() argument
3735 if (isFortifiedCallFoldable(CI, 4, 3)) in optimizeMemCCpyChk()
3737 *CI, emitMemCCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemCCpyChk()
3738 CI->getArgOperand(2), CI->getArgOperand(3), B, TLI)); in optimizeMemCCpyChk()
3743 Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(CallInst *CI, in optimizeSNPrintfChk() argument
3745 if (isFortifiedCallFoldable(CI, 3, 1, None, 2)) { in optimizeSNPrintfChk()
3746 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 5)); in optimizeSNPrintfChk()
3747 return copyFlags(*CI, in optimizeSNPrintfChk()
3748 emitSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeSNPrintfChk()
3749 CI->getArgOperand(4), VariadicArgs, B, TLI)); in optimizeSNPrintfChk()
3755 Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(CallInst *CI, in optimizeSPrintfChk() argument
3757 if (isFortifiedCallFoldable(CI, 2, None, None, 1)) { in optimizeSPrintfChk()
3758 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 4)); in optimizeSPrintfChk()
3759 return copyFlags(*CI, in optimizeSPrintfChk()
3760 emitSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), in optimizeSPrintfChk()
3767 Value *FortifiedLibCallSimplifier::optimizeStrCatChk(CallInst *CI, in optimizeStrCatChk() argument
3769 if (isFortifiedCallFoldable(CI, 2)) in optimizeStrCatChk()
3771 *CI, emitStrCat(CI->getArgOperand(0), CI->getArgOperand(1), B, TLI)); in optimizeStrCatChk()
3776 Value *FortifiedLibCallSimplifier::optimizeStrLCat(CallInst *CI, in optimizeStrLCat() argument
3778 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCat()
3779 return copyFlags(*CI, in optimizeStrLCat()
3780 emitStrLCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCat()
3781 CI->getArgOperand(2), B, TLI)); in optimizeStrLCat()
3786 Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(CallInst *CI, in optimizeStrNCatChk() argument
3788 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrNCatChk()
3789 return copyFlags(*CI, in optimizeStrNCatChk()
3790 emitStrNCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrNCatChk()
3791 CI->getArgOperand(2), B, TLI)); in optimizeStrNCatChk()
3796 Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(CallInst *CI, in optimizeStrLCpyChk() argument
3798 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCpyChk()
3799 return copyFlags(*CI, in optimizeStrLCpyChk()
3800 emitStrLCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCpyChk()
3801 CI->getArgOperand(2), B, TLI)); in optimizeStrLCpyChk()
3806 Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(CallInst *CI, in optimizeVSNPrintfChk() argument
3808 if (isFortifiedCallFoldable(CI, 3, 1, None, 2)) in optimizeVSNPrintfChk()
3810 *CI, emitVSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeVSNPrintfChk()
3811 CI->getArgOperand(4), CI->getArgOperand(5), B, TLI)); in optimizeVSNPrintfChk()
3816 Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(CallInst *CI, in optimizeVSPrintfChk() argument
3818 if (isFortifiedCallFoldable(CI, 2, None, None, 1)) in optimizeVSPrintfChk()
3819 return copyFlags(*CI, in optimizeVSPrintfChk()
3820 emitVSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), in optimizeVSPrintfChk()
3821 CI->getArgOperand(4), B, TLI)); in optimizeVSPrintfChk()
3826 Value *FortifiedLibCallSimplifier::optimizeCall(CallInst *CI, in optimizeCall() argument
3842 Function *Callee = CI->getCalledFunction(); in optimizeCall()
3843 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
3846 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
3862 return optimizeMemCpyChk(CI, Builder); in optimizeCall()
3864 return optimizeMemPCpyChk(CI, Builder); in optimizeCall()
3866 return optimizeMemMoveChk(CI, Builder); in optimizeCall()
3868 return optimizeMemSetChk(CI, Builder); in optimizeCall()
3871 return optimizeStrpCpyChk(CI, Builder, Func); in optimizeCall()
3873 return optimizeStrLenChk(CI, Builder); in optimizeCall()
3876 return optimizeStrpNCpyChk(CI, Builder, Func); in optimizeCall()
3878 return optimizeMemCCpyChk(CI, Builder); in optimizeCall()
3880 return optimizeSNPrintfChk(CI, Builder); in optimizeCall()
3882 return optimizeSPrintfChk(CI, Builder); in optimizeCall()
3884 return optimizeStrCatChk(CI, Builder); in optimizeCall()
3886 return optimizeStrLCat(CI, Builder); in optimizeCall()
3888 return optimizeStrNCatChk(CI, Builder); in optimizeCall()
3890 return optimizeStrLCpyChk(CI, Builder); in optimizeCall()
3892 return optimizeVSNPrintfChk(CI, Builder); in optimizeCall()
3894 return optimizeVSPrintfChk(CI, Builder); in optimizeCall()