Lines Matching full:ci

118 static bool callHasFloatingPointArgument(const CallInst *CI) {  in callHasFloatingPointArgument()  argument
119 return any_of(CI->operands(), [](const Use &OI) { in callHasFloatingPointArgument()
124 static bool callHasFP128Argument(const CallInst *CI) { in callHasFP128Argument() argument
125 return any_of(CI->operands(), [](const Use &OI) { in callHasFP128Argument()
137 static Value *convertStrToInt(CallInst *CI, StringRef &Str, Value *EndPtr, in convertStrToInt() argument
170 Type *RetTy = CI->getType(); in convertStrToInt()
227 Value *StrBeg = CI->getArgOperand(0); in convertStrToInt()
251 static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, in canTransformToMemCmp() argument
253 if (!isOnlyUsedInComparisonWithZero(CI)) in canTransformToMemCmp()
259 if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory)) in canTransformToMemCmp()
265 static void annotateDereferenceableBytes(CallInst *CI, in annotateDereferenceableBytes() argument
268 const Function *F = CI->getCaller(); in annotateDereferenceableBytes()
273 unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateDereferenceableBytes()
275 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
276 DerefBytes = std::max(CI->getParamDereferenceableOrNullBytes(ArgNo), in annotateDereferenceableBytes()
279 if (CI->getParamDereferenceableBytes(ArgNo) < DerefBytes) { in annotateDereferenceableBytes()
280 CI->removeParamAttr(ArgNo, Attribute::Dereferenceable); in annotateDereferenceableBytes()
282 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
283 CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull); in annotateDereferenceableBytes()
284 CI->addParamAttr(ArgNo, Attribute::getWithDereferenceableBytes( in annotateDereferenceableBytes()
285 CI->getContext(), DerefBytes)); in annotateDereferenceableBytes()
290 static void annotateNonNullNoUndefBasedOnAccess(CallInst *CI, in annotateNonNullNoUndefBasedOnAccess() argument
292 Function *F = CI->getCaller(); in annotateNonNullNoUndefBasedOnAccess()
297 if (!CI->paramHasAttr(ArgNo, Attribute::NoUndef)) in annotateNonNullNoUndefBasedOnAccess()
298 CI->addParamAttr(ArgNo, Attribute::NoUndef); in annotateNonNullNoUndefBasedOnAccess()
300 if (!CI->paramHasAttr(ArgNo, Attribute::NonNull)) { in annotateNonNullNoUndefBasedOnAccess()
302 CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateNonNullNoUndefBasedOnAccess()
305 CI->addParamAttr(ArgNo, Attribute::NonNull); in annotateNonNullNoUndefBasedOnAccess()
308 annotateDereferenceableBytes(CI, ArgNo, 1); in annotateNonNullNoUndefBasedOnAccess()
312 static void annotateNonNullAndDereferenceable(CallInst *CI, ArrayRef<unsigned> ArgNos, in annotateNonNullAndDereferenceable() argument
315 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
316 annotateDereferenceableBytes(CI, ArgNos, LenC->getZExtValue()); in annotateNonNullAndDereferenceable()
318 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
323 annotateDereferenceableBytes(CI, ArgNos, DerefMin); in annotateNonNullAndDereferenceable()
357 Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrCat() argument
359 Value *Dst = CI->getArgOperand(0); in optimizeStrCat()
360 Value *Src = CI->getArgOperand(1); in optimizeStrCat()
361 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCat()
366 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCat()
375 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len, B)); in optimizeStrCat()
399 Value *LibCallSimplifier::optimizeStrNCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCat() argument
401 Value *Dst = CI->getArgOperand(0); in optimizeStrNCat()
402 Value *Src = CI->getArgOperand(1); in optimizeStrNCat()
403 Value *Size = CI->getArgOperand(2); in optimizeStrNCat()
405 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNCat()
407 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrNCat()
423 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStrNCat()
439 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen, B)); in optimizeStrNCat()
445 static Value* memChrToCharCompare(CallInst *CI, Value *NBytes, in memChrToCharCompare() argument
448 Value *Src = CI->getArgOperand(0); in memChrToCharCompare()
449 Value *CharVal = CI->getArgOperand(1); in memChrToCharCompare()
463 Value *NullPtr = Constant::getNullValue(CI->getType()); in memChrToCharCompare()
467 Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrChr() argument
468 Value *SrcStr = CI->getArgOperand(0); in optimizeStrChr()
469 Value *CharVal = CI->getArgOperand(1); in optimizeStrChr()
470 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrChr()
472 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeStrChr()
473 return memChrToCharCompare(CI, nullptr, B, DL); in optimizeStrChr()
481 annotateDereferenceableBytes(CI, 0, Len); in optimizeStrChr()
485 Function *Callee = CI->getCalledFunction(); in optimizeStrChr()
491 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeStrChr()
492 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeStrChr()
493 return copyFlags(*CI, in optimizeStrChr()
500 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeStrChr()
501 if (isOnlyUsedInEqualityComparison(CI, NullPtr)) in optimizeStrChr()
504 return B.CreateIntToPtr(B.getTrue(), CI->getType()); in optimizeStrChr()
523 return Constant::getNullValue(CI->getType()); in optimizeStrChr()
529 Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrRChr() argument
530 Value *SrcStr = CI->getArgOperand(0); in optimizeStrRChr()
531 Value *CharVal = CI->getArgOperand(1); in optimizeStrRChr()
533 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrRChr()
539 return copyFlags(*CI, emitStrChr(SrcStr, '\0', B, TLI)); in optimizeStrRChr()
543 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeStrRChr()
544 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeStrRChr()
550 return copyFlags(*CI, emitMemRChr(SrcStr, CharVal, Size, B, DL, TLI)); in optimizeStrRChr()
553 Value *LibCallSimplifier::optimizeStrCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrCmp() argument
554 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); in optimizeStrCmp()
556 return ConstantInt::get(CI->getType(), 0); in optimizeStrCmp()
564 return ConstantInt::get(CI->getType(), in optimizeStrCmp()
569 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrCmp()
573 CI->getType()); in optimizeStrCmp()
578 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrCmp()
581 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrCmp()
585 *CI, emitMemCmp(Str1P, Str2P, in optimizeStrCmp()
586 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeStrCmp()
593 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrCmp()
595 *CI, in optimizeStrCmp()
597 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), in optimizeStrCmp()
600 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrCmp()
602 *CI, in optimizeStrCmp()
604 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), in optimizeStrCmp()
608 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCmp()
612 // Optimize a memcmp or, when StrNCmp is true, strncmp call CI with constant
614 static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS,
618 Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCmp() argument
619 Value *Str1P = CI->getArgOperand(0); in optimizeStrNCmp()
620 Value *Str2P = CI->getArgOperand(1); in optimizeStrNCmp()
621 Value *Size = CI->getArgOperand(2); in optimizeStrNCmp()
623 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
626 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrNCmp()
632 return optimizeMemCmpVarSize(CI, Str1P, Str2P, Size, true, B, DL); in optimizeStrNCmp()
635 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
638 return copyFlags(*CI, emitMemCmp(Str1P, Str2P, Size, B, DL, TLI)); in optimizeStrNCmp()
649 return ConstantInt::get(CI->getType(), in optimizeStrNCmp()
655 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrNCmp()
659 CI->getType()); in optimizeStrNCmp()
663 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrNCmp()
666 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrNCmp()
671 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrNCmp()
673 *CI, in optimizeStrNCmp()
675 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), in optimizeStrNCmp()
679 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrNCmp()
681 *CI, in optimizeStrNCmp()
683 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), in optimizeStrNCmp()
690 Value *LibCallSimplifier::optimizeStrNDup(CallInst *CI, IRBuilderBase &B) { in optimizeStrNDup() argument
691 Value *Src = CI->getArgOperand(0); in optimizeStrNDup()
692 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrNDup()
695 annotateDereferenceableBytes(CI, 0, SrcLen); in optimizeStrNDup()
697 return copyFlags(*CI, emitStrDup(Src, B, TLI)); in optimizeStrNDup()
703 Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrCpy() argument
704 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStrCpy()
708 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCpy()
712 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCpy()
720 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len)); in optimizeStrCpy()
721 mergeAttributesAndFlags(NewCI, *CI); in optimizeStrCpy()
725 Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStpCpy() argument
726 Function *Callee = CI->getCalledFunction(); in optimizeStpCpy()
727 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStpCpy()
730 if (CI->use_empty()) in optimizeStpCpy()
731 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI)); in optimizeStpCpy()
741 annotateDereferenceableBytes(CI, 1, Len); in optimizeStpCpy()
753 mergeAttributesAndFlags(NewCI, *CI); in optimizeStpCpy()
759 Value *LibCallSimplifier::optimizeStrLCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrLCpy() argument
760 Value *Size = CI->getArgOperand(2); in optimizeStrLCpy()
764 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrLCpy()
767 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrLCpy()
775 Value *Dst = CI->getArgOperand(0); in optimizeStrLCpy()
776 Value *Src = CI->getArgOperand(1); in optimizeStrLCpy()
783 return copyFlags(*CI, emitStrLen(Src, B, DL, TLI)); in optimizeStrLCpy()
812 return ConstantInt::get(CI->getType(), 0); in optimizeStrLCpy()
815 Function *Callee = CI->getCalledFunction(); in optimizeStrLCpy()
822 mergeAttributesAndFlags(NewCI, *CI); in optimizeStrLCpy()
825 Value *EndOff = ConstantInt::get(CI->getType(), NBytes); in optimizeStrLCpy()
833 return ConstantInt::get(CI->getType(), SrcLen); in optimizeStrLCpy()
836 // Optimize a call CI to either stpncpy when RetEnd is true, or to strncpy
838 Value *LibCallSimplifier::optimizeStringNCpy(CallInst *CI, bool RetEnd, in optimizeStringNCpy() argument
840 Function *Callee = CI->getCalledFunction(); in optimizeStringNCpy()
841 Value *Dst = CI->getArgOperand(0); in optimizeStringNCpy()
842 Value *Src = CI->getArgOperand(1); in optimizeStringNCpy()
843 Value *Size = CI->getArgOperand(2); in optimizeStringNCpy()
848 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStringNCpy()
849 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStringNCpy()
882 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStringNCpy()
891 CI->getAttributes().getParamAttrs(0).getAlignment().valueOrOne(); in optimizeStringNCpy()
893 AttrBuilder ArgAttrs(CI->getContext(), CI->getAttributes().getParamAttrs(0)); in optimizeStringNCpy()
895 CI->getContext(), 0, ArgAttrs)); in optimizeStringNCpy()
896 copyFlags(*CI, NewCI); in optimizeStringNCpy()
921 mergeAttributesAndFlags(NewCI, *CI); in optimizeStringNCpy()
931 Value *LibCallSimplifier::optimizeStringLength(CallInst *CI, IRBuilderBase &B, in optimizeStringLength() argument
934 Value *Src = CI->getArgOperand(0); in optimizeStringLength()
937 if (isOnlyUsedInZeroEqualityComparison(CI) && in optimizeStringLength()
946 CI->getType()); in optimizeStringLength()
953 return ConstantInt::get(CI->getType(), 0); in optimizeStringLength()
960 return B.CreateZExt(Cmp, CI->getType()); in optimizeStringLength()
966 Value *LenC = ConstantInt::get(CI->getType(), Len - 1); in optimizeStringLength()
1011 KnownBits Known = computeKnownBits(Offset, DL, 0, nullptr, CI, nullptr); in optimizeStringLength()
1022 Offset = B.CreateSExtOrTrunc(Offset, CI->getType()); in optimizeStringLength()
1023 return B.CreateSub(ConstantInt::get(CI->getType(), NullTermIdx), in optimizeStringLength()
1035 return OptimizationRemark("instcombine", "simplify-libcalls", CI) in optimizeStringLength()
1039 ConstantInt::get(CI->getType(), LenTrue - 1), in optimizeStringLength()
1040 ConstantInt::get(CI->getType(), LenFalse - 1)); in optimizeStringLength()
1047 Value *LibCallSimplifier::optimizeStrLen(CallInst *CI, IRBuilderBase &B) { in optimizeStrLen() argument
1048 if (Value *V = optimizeStringLength(CI, B, 8)) in optimizeStrLen()
1050 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrLen()
1054 Value *LibCallSimplifier::optimizeStrNLen(CallInst *CI, IRBuilderBase &B) { in optimizeStrNLen() argument
1055 Value *Bound = CI->getArgOperand(1); in optimizeStrNLen()
1056 if (Value *V = optimizeStringLength(CI, B, 8, Bound)) in optimizeStrNLen()
1060 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNLen()
1064 Value *LibCallSimplifier::optimizeWcslen(CallInst *CI, IRBuilderBase &B) { in optimizeWcslen() argument
1065 Module &M = *CI->getModule(); in optimizeWcslen()
1071 return optimizeStringLength(CI, B, WCharSize); in optimizeWcslen()
1074 Value *LibCallSimplifier::optimizeStrPBrk(CallInst *CI, IRBuilderBase &B) { in optimizeStrPBrk() argument
1076 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrPBrk()
1077 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrPBrk()
1082 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
1088 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
1090 return B.CreateInBoundsGEP(B.getInt8Ty(), CI->getArgOperand(0), in optimizeStrPBrk()
1096 return copyFlags(*CI, emitStrChr(CI->getArgOperand(0), S2[0], B, TLI)); in optimizeStrPBrk()
1101 Value *LibCallSimplifier::optimizeStrTo(CallInst *CI, IRBuilderBase &B) { in optimizeStrTo() argument
1102 Value *EndPtr = CI->getArgOperand(1); in optimizeStrTo()
1106 CI->addParamAttr(0, Attribute::NoCapture); in optimizeStrTo()
1112 Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrSpn() argument
1114 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrSpn()
1115 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrSpn()
1120 return Constant::getNullValue(CI->getType()); in optimizeStrSpn()
1127 return ConstantInt::get(CI->getType(), Pos); in optimizeStrSpn()
1133 Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrCSpn() argument
1135 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrCSpn()
1136 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrCSpn()
1140 return Constant::getNullValue(CI->getType()); in optimizeStrCSpn()
1147 return ConstantInt::get(CI->getType(), Pos); in optimizeStrCSpn()
1152 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B, DL, TLI)); in optimizeStrCSpn()
1157 Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) { in optimizeStrStr() argument
1159 if (CI->getArgOperand(0) == CI->getArgOperand(1)) in optimizeStrStr()
1160 return CI->getArgOperand(0); in optimizeStrStr()
1163 if (isOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) { in optimizeStrStr()
1164 Value *StrLen = emitStrLen(CI->getArgOperand(1), B, DL, TLI); in optimizeStrStr()
1167 Value *StrNCmp = emitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrStr()
1171 for (User *U : llvm::make_early_inc_range(CI->users())) { in optimizeStrStr()
1178 return CI; in optimizeStrStr()
1183 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr); in optimizeStrStr()
1184 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr); in optimizeStrStr()
1188 return CI->getArgOperand(0); in optimizeStrStr()
1195 return Constant::getNullValue(CI->getType()); in optimizeStrStr()
1198 return B.CreateConstInBoundsGEP1_64(B.getInt8Ty(), CI->getArgOperand(0), in optimizeStrStr()
1204 return emitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TLI); in optimizeStrStr()
1207 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrStr()
1211 Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemRChr() argument
1212 Value *SrcStr = CI->getArgOperand(0); in optimizeMemRChr()
1213 Value *Size = CI->getArgOperand(2); in optimizeMemRChr()
1214 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemRChr()
1215 Value *CharVal = CI->getArgOperand(1); in optimizeMemRChr()
1217 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeMemRChr()
1299 Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemChr() argument
1300 Value *SrcStr = CI->getArgOperand(0); in optimizeMemChr()
1301 Value *Size = CI->getArgOperand(2); in optimizeMemChr()
1304 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeMemChr()
1305 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeMemChr()
1306 return memChrToCharCompare(CI, Size, B, DL); in optimizeMemChr()
1309 Value *CharVal = CI->getArgOperand(1); in optimizeMemChr()
1312 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeMemChr()
1398 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeMemChr()
1402 return memChrToCharCompare(CI, Size, B, DL); in optimizeMemChr()
1408 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeMemChr()
1409 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeMemChr()
1422 if (OptForSize || Str.empty() || !isOnlyUsedInZeroEqualityComparison(CI)) in optimizeMemChr()
1460 return B.CreateIntToPtr(B.CreateOr(CharCompares), CI->getType()); in optimizeMemChr()
1488 CI->getType()); in optimizeMemChr()
1491 // Optimize a memcmp or, when StrNCmp is true, strncmp call CI with constant
1493 static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS, in optimizeMemCmpVarSize() argument
1497 return Constant::getNullValue(CI->getType()); in optimizeMemCmpVarSize()
1510 Value *Zero = ConstantInt::get(CI->getType(), 0); in optimizeMemCmpVarSize()
1530 Value *Res = ConstantInt::get(CI->getType(), IRes); in optimizeMemCmpVarSize()
1534 // Optimize a memcmp call CI with constant size Len.
1535 static Value *optimizeMemCmpConstantSize(CallInst *CI, Value *LHS, Value *RHS, in optimizeMemCmpConstantSize() argument
1539 return Constant::getNullValue(CI->getType()); in optimizeMemCmpConstantSize()
1544 CI->getType(), "lhsv"); in optimizeMemCmpConstantSize()
1546 CI->getType(), "rhsv"); in optimizeMemCmpConstantSize()
1553 if (DL.isLegalInteger(Len * 8) && isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmpConstantSize()
1554 IntegerType *IntType = IntegerType::get(CI->getContext(), Len * 8); in optimizeMemCmpConstantSize()
1568 if ((LHSV || getKnownAlignment(LHS, DL, CI) >= PrefAlignment) && in optimizeMemCmpConstantSize()
1569 (RHSV || getKnownAlignment(RHS, DL, CI) >= PrefAlignment)) { in optimizeMemCmpConstantSize()
1574 return B.CreateZExt(B.CreateICmpNE(LHSV, RHSV), CI->getType(), "memcmp"); in optimizeMemCmpConstantSize()
1582 Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(CallInst *CI, in optimizeMemCmpBCmpCommon() argument
1584 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1); in optimizeMemCmpBCmpCommon()
1585 Value *Size = CI->getArgOperand(2); in optimizeMemCmpBCmpCommon()
1587 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCmpBCmpCommon()
1589 if (Value *Res = optimizeMemCmpVarSize(CI, LHS, RHS, Size, false, B, DL)) in optimizeMemCmpBCmpCommon()
1597 return optimizeMemCmpConstantSize(CI, LHS, RHS, LenC->getZExtValue(), B, DL); in optimizeMemCmpBCmpCommon()
1600 Value *LibCallSimplifier::optimizeMemCmp(CallInst *CI, IRBuilderBase &B) { in optimizeMemCmp() argument
1601 Module *M = CI->getModule(); in optimizeMemCmp()
1602 if (Value *V = optimizeMemCmpBCmpCommon(CI, B)) in optimizeMemCmp()
1609 isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmp()
1610 Value *LHS = CI->getArgOperand(0); in optimizeMemCmp()
1611 Value *RHS = CI->getArgOperand(1); in optimizeMemCmp()
1612 Value *Size = CI->getArgOperand(2); in optimizeMemCmp()
1613 return copyFlags(*CI, emitBCmp(LHS, RHS, Size, B, DL, TLI)); in optimizeMemCmp()
1619 Value *LibCallSimplifier::optimizeBCmp(CallInst *CI, IRBuilderBase &B) { in optimizeBCmp() argument
1620 return optimizeMemCmpBCmpCommon(CI, B); in optimizeBCmp()
1623 Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCpy() argument
1624 Value *Size = CI->getArgOperand(2); in optimizeMemCpy()
1625 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCpy()
1626 if (isa<IntrinsicInst>(CI)) in optimizeMemCpy()
1630 CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align(1), in optimizeMemCpy()
1631 CI->getArgOperand(1), Align(1), Size); in optimizeMemCpy()
1632 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemCpy()
1633 return CI->getArgOperand(0); in optimizeMemCpy()
1636 Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCCpy() argument
1637 Value *Dst = CI->getArgOperand(0); in optimizeMemCCpy()
1638 Value *Src = CI->getArgOperand(1); in optimizeMemCCpy()
1639 ConstantInt *StopChar = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeMemCCpy()
1640 ConstantInt *N = dyn_cast<ConstantInt>(CI->getArgOperand(3)); in optimizeMemCCpy()
1642 if (CI->use_empty() && Dst == Src) in optimizeMemCCpy()
1647 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1660 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1), in optimizeMemCCpy()
1661 CI->getArgOperand(3))); in optimizeMemCCpy()
1662 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1670 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1), NewN)); in optimizeMemCCpy()
1673 : Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1676 Value *LibCallSimplifier::optimizeMemPCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemPCpy() argument
1677 Value *Dst = CI->getArgOperand(0); in optimizeMemPCpy()
1678 Value *N = CI->getArgOperand(2); in optimizeMemPCpy()
1681 B.CreateMemCpy(Dst, Align(1), CI->getArgOperand(1), Align(1), N); in optimizeMemPCpy()
1685 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemPCpy()
1689 Value *LibCallSimplifier::optimizeMemMove(CallInst *CI, IRBuilderBase &B) { in optimizeMemMove() argument
1690 Value *Size = CI->getArgOperand(2); in optimizeMemMove()
1691 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemMove()
1692 if (isa<IntrinsicInst>(CI)) in optimizeMemMove()
1696 CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align(1), in optimizeMemMove()
1697 CI->getArgOperand(1), Align(1), Size); in optimizeMemMove()
1698 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemMove()
1699 return CI->getArgOperand(0); in optimizeMemMove()
1702 Value *LibCallSimplifier::optimizeMemSet(CallInst *CI, IRBuilderBase &B) { in optimizeMemSet() argument
1703 Value *Size = CI->getArgOperand(2); in optimizeMemSet()
1704 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemSet()
1705 if (isa<IntrinsicInst>(CI)) in optimizeMemSet()
1709 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSet()
1710 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, Size, Align(1)); in optimizeMemSet()
1711 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemSet()
1712 return CI->getArgOperand(0); in optimizeMemSet()
1715 Value *LibCallSimplifier::optimizeRealloc(CallInst *CI, IRBuilderBase &B) { in optimizeRealloc() argument
1716 if (isa<ConstantPointerNull>(CI->getArgOperand(0))) in optimizeRealloc()
1717 return copyFlags(*CI, emitMalloc(CI->getArgOperand(1), B, DL, TLI)); in optimizeRealloc()
1726 Value *LibCallSimplifier::optimizeNew(CallInst *CI, IRBuilderBase &B, in optimizeNew() argument
1732 if (CI->getAttributes().getFnAttr("memprof").getValueAsString() == "cold") in optimizeNew()
1734 else if (CI->getAttributes().getFnAttr("memprof").getValueAsString() == in optimizeNew()
1737 else if (CI->getAttributes().getFnAttr("memprof").getValueAsString() == "hot") in optimizeNew()
1752 return emitHotColdNew(CI->getArgOperand(0), B, TLI, in optimizeNew()
1757 return emitHotColdNew(CI->getArgOperand(0), B, TLI, in optimizeNew()
1762 return emitHotColdNew(CI->getArgOperand(0), B, TLI, in optimizeNew()
1767 return emitHotColdNew(CI->getArgOperand(0), B, TLI, in optimizeNew()
1773 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1779 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1785 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1791 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1797 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1803 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1809 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1815 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, in optimizeNew()
1821 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B, in optimizeNew()
1828 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B, in optimizeNew()
1835 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B, in optimizeNew()
1842 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B, in optimizeNew()
1856 // Replace a libcall \p CI with a call to intrinsic \p IID
1857 static Value *replaceUnaryCall(CallInst *CI, IRBuilderBase &B, in replaceUnaryCall() argument
1859 CallInst *NewCall = B.CreateUnaryIntrinsic(IID, CI->getArgOperand(0), CI); in replaceUnaryCall()
1860 NewCall->takeName(CI); in replaceUnaryCall()
1861 return copyFlags(*CI, NewCall); in replaceUnaryCall()
1887 static Value *optimizeDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeDoubleFP() argument
1890 Function *CalleeFn = CI->getCalledFunction(); in optimizeDoubleFP()
1891 if (!CI->getType()->isDoubleTy() || !CalleeFn) in optimizeDoubleFP()
1898 for (User *U : CI->users()) { in optimizeDoubleFP()
1906 V[0] = valueHasFloatPrecision(CI->getArgOperand(0)); in optimizeDoubleFP()
1907 V[1] = isBinary ? valueHasFloatPrecision(CI->getArgOperand(1)) : nullptr; in optimizeDoubleFP()
1919 StringRef CallerName = CI->getFunction()->getName(); in optimizeDoubleFP()
1928 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeDoubleFP()
1933 Module *M = CI->getModule(); in optimizeDoubleFP()
1947 static Value *optimizeUnaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeUnaryDoubleFP() argument
1950 return optimizeDoubleFP(CI, B, false, TLI, isPrecise); in optimizeUnaryDoubleFP()
1954 static Value *optimizeBinaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeBinaryDoubleFP() argument
1957 return optimizeDoubleFP(CI, B, true, TLI, isPrecise); in optimizeBinaryDoubleFP()
1961 Value *LibCallSimplifier::optimizeCAbs(CallInst *CI, IRBuilderBase &B) { in optimizeCAbs() argument
1964 if (CI->arg_size() == 1) { in optimizeCAbs()
1966 if (!CI->isFast()) in optimizeCAbs()
1969 Value *Op = CI->getArgOperand(0); in optimizeCAbs()
1976 assert(CI->arg_size() == 2 && "Unexpected signature for cabs!"); in optimizeCAbs()
1978 Real = CI->getArgOperand(0); in optimizeCAbs()
1979 Imag = CI->getArgOperand(1); in optimizeCAbs()
1995 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeCAbs()
1998 *CI, B.CreateUnaryIntrinsic(Intrinsic::fabs, AbsOp, nullptr, "cabs")); in optimizeCAbs()
2001 if (!CI->isFast()) in optimizeCAbs()
2007 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeCAbs()
2012 return copyFlags(*CI, B.CreateUnaryIntrinsic(Intrinsic::sqrt, in optimizeCAbs()
2403 Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) { in optimizeExp2() argument
2404 Module *M = CI->getModule(); in optimizeExp2()
2405 Function *Callee = CI->getCalledFunction(); in optimizeExp2()
2410 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeExp2()
2420 Type *Ty = CI->getType(); in optimizeExp2()
2426 Value *Op = CI->getArgOperand(0); in optimizeExp2()
2434 return copyFlags(*CI, B.CreateIntrinsic(Intrinsic::ldexp, in optimizeExp2()
2436 {One, Exp}, CI)); in optimizeExp2()
2440 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeExp2()
2441 return copyFlags(*CI, emitBinaryFloatFnCall( in optimizeExp2()
2450 Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilderBase &B) { in optimizeFMinFMax() argument
2451 Module *M = CI->getModule(); in optimizeFMinFMax()
2455 Function *Callee = CI->getCalledFunction(); in optimizeFMinFMax()
2458 if (Value *Ret = optimizeBinaryDoubleFP(CI, B, TLI)) in optimizeFMinFMax()
2469 FastMathFlags FMF = CI->getFastMathFlags(); in optimizeFMinFMax()
2475 return copyFlags(*CI, B.CreateBinaryIntrinsic(IID, CI->getArgOperand(0), in optimizeFMinFMax()
2476 CI->getArgOperand(1))); in optimizeFMinFMax()
2634 Value *LibCallSimplifier::mergeSqrtToExp(CallInst *CI, IRBuilderBase &B) { in mergeSqrtToExp() argument
2635 if (!CI->hasAllowReassoc()) in mergeSqrtToExp()
2638 Function *SqrtFn = CI->getCalledFunction(); in mergeSqrtToExp()
2639 CallInst *Arg = dyn_cast<CallInst>(CI->getArgOperand(0)); in mergeSqrtToExp()
2669 if (CI->getType()->getScalarType()->isFloatTy()) { in mergeSqrtToExp()
2673 } else if (CI->getType()->getScalarType()->isDoubleTy()) { in mergeSqrtToExp()
2691 CI, "merged.sqrt"); in mergeSqrtToExp()
2697 Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilderBase &B) { in optimizeSqrt() argument
2698 Module *M = CI->getModule(); in optimizeSqrt()
2699 Function *Callee = CI->getCalledFunction(); in optimizeSqrt()
2707 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeSqrt()
2709 if (Value *Opt = mergeSqrtToExp(CI, B)) in optimizeSqrt()
2712 if (!CI->isFast()) in optimizeSqrt()
2715 Instruction *I = dyn_cast<Instruction>(CI->getArgOperand(0)); in optimizeSqrt()
2763 return copyFlags(*CI, B.CreateFMul(FabsCall, SqrtCall)); in optimizeSqrt()
2765 return copyFlags(*CI, FabsCall); in optimizeSqrt()
2768 Value *LibCallSimplifier::optimizeTrigInversionPairs(CallInst *CI, in optimizeTrigInversionPairs() argument
2770 Module *M = CI->getModule(); in optimizeTrigInversionPairs()
2771 Function *Callee = CI->getCalledFunction(); in optimizeTrigInversionPairs()
2778 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeTrigInversionPairs()
2780 Value *Op1 = CI->getArgOperand(0); in optimizeTrigInversionPairs()
2786 if (!CI->isFast() || !OpC->isFast()) in optimizeTrigInversionPairs()
2821 static bool isTrigLibCall(CallInst *CI) { in isTrigLibCall() argument
2825 return CI->doesNotThrow() && CI->doesNotAccessMemory(); in isTrigLibCall()
2884 static Value *optimizeSymmetricCall(CallInst *CI, bool IsEven, in optimizeSymmetricCall() argument
2887 Value *Src = CI->getArgOperand(0); in optimizeSymmetricCall()
2891 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeSymmetricCall()
2893 auto *CallInst = copyFlags(*CI, B.CreateCall(CI->getCalledFunction(), {X})); in optimizeSymmetricCall()
2906 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeSymmetricCall()
2908 auto *CallInst = copyFlags(*CI, B.CreateCall(CI->getCalledFunction(), {X})); in optimizeSymmetricCall()
2915 Value *LibCallSimplifier::optimizeSymmetric(CallInst *CI, LibFunc Func, in optimizeSymmetric() argument
2921 return optimizeSymmetricCall(CI, /*IsEven*/ true, B); in optimizeSymmetric()
2934 return optimizeSymmetricCall(CI, /*IsEven*/ false, B); in optimizeSymmetric()
2941 Value *LibCallSimplifier::optimizeSinCosPi(CallInst *CI, bool IsSin, IRBuilderBase &B) { in optimizeSinCosPi() argument
2944 if (!isTrigLibCall(CI)) in optimizeSinCosPi()
2947 Value *Arg = CI->getArgOperand(0); in optimizeSinCosPi()
2957 Function *F = CI->getFunction(); in optimizeSinCosPi()
2966 if (!insertSinCosCall(B, CI->getCalledFunction(), Arg, IsFloat, Sin, Cos, in optimizeSinCosPi()
2988 auto *CI = dyn_cast<CallInst>(Val); in classifyArgUse() local
2989 if (!CI || CI->use_empty()) in classifyArgUse()
2993 if (CI->getFunction() != F) in classifyArgUse()
2996 Module *M = CI->getModule(); in classifyArgUse()
2997 Function *Callee = CI->getCalledFunction(); in classifyArgUse()
3001 !isTrigLibCall(CI)) in classifyArgUse()
3006 SinCalls.push_back(CI); in classifyArgUse()
3008 CosCalls.push_back(CI); in classifyArgUse()
3010 SinCosCalls.push_back(CI); in classifyArgUse()
3013 SinCalls.push_back(CI); in classifyArgUse()
3015 CosCalls.push_back(CI); in classifyArgUse()
3017 SinCosCalls.push_back(CI); in classifyArgUse()
3025 Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilderBase &B) { in optimizeFFS() argument
3028 Type *RetType = CI->getType(); in optimizeFFS()
3029 Value *Op = CI->getArgOperand(0); in optimizeFFS()
3040 Value *LibCallSimplifier::optimizeFls(CallInst *CI, IRBuilderBase &B) { in optimizeFls() argument
3043 Value *Op = CI->getArgOperand(0); in optimizeFls()
3049 return B.CreateIntCast(V, CI->getType(), false); in optimizeFls()
3052 Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilderBase &B) { in optimizeAbs() argument
3055 Value *X = CI->getArgOperand(0); in optimizeAbs()
3061 Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilderBase &B) { in optimizeIsDigit() argument
3063 Value *Op = CI->getArgOperand(0); in optimizeIsDigit()
3067 return B.CreateZExt(Op, CI->getType()); in optimizeIsDigit()
3070 Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilderBase &B) { in optimizeIsAscii() argument
3072 Value *Op = CI->getArgOperand(0); in optimizeIsAscii()
3075 return B.CreateZExt(Op, CI->getType()); in optimizeIsAscii()
3078 Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilderBase &B) { in optimizeToAscii() argument
3080 return B.CreateAnd(CI->getArgOperand(0), in optimizeToAscii()
3081 ConstantInt::get(CI->getType(), 0x7F)); in optimizeToAscii()
3085 Value *LibCallSimplifier::optimizeAtoi(CallInst *CI, IRBuilderBase &B) { in optimizeAtoi() argument
3086 CI->addParamAttr(0, Attribute::NoCapture); in optimizeAtoi()
3089 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeAtoi()
3092 return convertStrToInt(CI, Str, nullptr, 10, /*AsSigned=*/true, B); in optimizeAtoi()
3096 Value *LibCallSimplifier::optimizeStrToInt(CallInst *CI, IRBuilderBase &B, in optimizeStrToInt() argument
3098 Value *EndPtr = CI->getArgOperand(1); in optimizeStrToInt()
3102 CI->addParamAttr(0, Attribute::NoCapture); in optimizeStrToInt()
3108 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeStrToInt()
3111 if (ConstantInt *CInt = dyn_cast<ConstantInt>(CI->getArgOperand(2))) { in optimizeStrToInt()
3112 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned, B); in optimizeStrToInt()
3122 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg);
3124 Value *LibCallSimplifier::optimizeErrorReporting(CallInst *CI, IRBuilderBase &B, in optimizeErrorReporting() argument
3126 Function *Callee = CI->getCalledFunction(); in optimizeErrorReporting()
3135 if (!CI->hasFnAttr(Attribute::Cold) && in optimizeErrorReporting()
3136 isReportingError(Callee, CI, StreamArg)) { in optimizeErrorReporting()
3137 CI->addFnAttr(Attribute::Cold); in optimizeErrorReporting()
3143 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) { in isReportingError() argument
3153 if (StreamArg >= (int)CI->arg_size()) in isReportingError()
3155 LoadInst *LI = dyn_cast<LoadInst>(CI->getArgOperand(StreamArg)); in isReportingError()
3164 Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilderBase &B) { in optimizePrintFString() argument
3167 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr)) in optimizePrintFString()
3172 return CI->use_empty() ? (Value *)CI : ConstantInt::get(CI->getType(), 0); in optimizePrintFString()
3177 if (!CI->use_empty()) in optimizePrintFString()
3180 Type *IntTy = CI->getType(); in optimizePrintFString()
3187 return copyFlags(*CI, emitPutChar(IntChar, B, TLI)); in optimizePrintFString()
3191 if (FormatStr == "%s" && CI->arg_size() > 1) { in optimizePrintFString()
3193 if (!getConstantStringInfo(CI->getOperand(1), OperandStr)) in optimizePrintFString()
3197 return (Value *)CI; in optimizePrintFString()
3204 return copyFlags(*CI, emitPutChar(IntChar, B, TLI)); in optimizePrintFString()
3210 return copyFlags(*CI, emitPutS(GV, B, TLI)); in optimizePrintFString()
3222 return copyFlags(*CI, emitPutS(GV, B, TLI)); in optimizePrintFString()
3227 if (FormatStr == "%c" && CI->arg_size() > 1 && in optimizePrintFString()
3228 CI->getArgOperand(1)->getType()->isIntegerTy()) { in optimizePrintFString()
3231 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false); in optimizePrintFString()
3232 return copyFlags(*CI, emitPutChar(IntChar, B, TLI)); in optimizePrintFString()
3236 if (FormatStr == "%s\n" && CI->arg_size() > 1 && in optimizePrintFString()
3237 CI->getArgOperand(1)->getType()->isPointerTy()) in optimizePrintFString()
3238 return copyFlags(*CI, emitPutS(CI->getArgOperand(1), B, TLI)); in optimizePrintFString()
3242 Value *LibCallSimplifier::optimizePrintF(CallInst *CI, IRBuilderBase &B) { in optimizePrintF() argument
3244 Module *M = CI->getModule(); in optimizePrintF()
3245 Function *Callee = CI->getCalledFunction(); in optimizePrintF()
3247 if (Value *V = optimizePrintFString(CI, B)) { in optimizePrintF()
3251 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePrintF()
3256 !callHasFloatingPointArgument(CI)) { in optimizePrintF()
3259 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
3268 !callHasFP128Argument(CI)) { in optimizePrintF()
3271 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
3280 Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, in optimizeSPrintFString() argument
3284 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeSPrintFString()
3288 Value *Dest = CI->getArgOperand(0); in optimizeSPrintFString()
3289 if (CI->arg_size() == 2) { in optimizeSPrintFString()
3297 Dest, Align(1), CI->getArgOperand(1), Align(1), in optimizeSPrintFString()
3298 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeSPrintFString()
3300 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSPrintFString()
3305 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3) in optimizeSPrintFString()
3311 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeSPrintFString()
3313 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char"); in optimizeSPrintFString()
3319 return ConstantInt::get(CI->getType(), 1); in optimizeSPrintFString()
3325 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeSPrintFString()
3328 if (CI->use_empty()) in optimizeSPrintFString()
3330 return copyFlags(*CI, emitStrCpy(Dest, CI->getArgOperand(2), B, TLI)); in optimizeSPrintFString()
3332 uint64_t SrcLen = GetStringLength(CI->getArgOperand(2)); in optimizeSPrintFString()
3335 Dest, Align(1), CI->getArgOperand(2), Align(1), in optimizeSPrintFString()
3336 ConstantInt::get(DL.getIntPtrType(CI->getContext()), SrcLen)); in optimizeSPrintFString()
3338 return ConstantInt::get(CI->getType(), SrcLen - 1); in optimizeSPrintFString()
3339 } else if (Value *V = emitStpCpy(Dest, CI->getArgOperand(2), B, TLI)) { in optimizeSPrintFString()
3342 return B.CreateIntCast(PtrDiff, CI->getType(), false); in optimizeSPrintFString()
3345 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeSPrintFString()
3346 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeSPrintFString()
3351 Value *Len = emitStrLen(CI->getArgOperand(2), B, DL, TLI); in optimizeSPrintFString()
3356 B.CreateMemCpy(Dest, Align(1), CI->getArgOperand(2), Align(1), IncLen); in optimizeSPrintFString()
3359 return B.CreateIntCast(Len, CI->getType(), false); in optimizeSPrintFString()
3364 Value *LibCallSimplifier::optimizeSPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSPrintF() argument
3365 Module *M = CI->getModule(); in optimizeSPrintF()
3366 Function *Callee = CI->getCalledFunction(); in optimizeSPrintF()
3368 if (Value *V = optimizeSPrintFString(CI, B)) { in optimizeSPrintF()
3372 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeSPrintF()
3377 !callHasFloatingPointArgument(CI)) { in optimizeSPrintF()
3380 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
3389 !callHasFP128Argument(CI)) { in optimizeSPrintF()
3392 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
3401 // Transform an snprintf call CI with the bound N to format the string Str
3406 Value *LibCallSimplifier::emitSnPrintfMemCpy(CallInst *CI, Value *StrArg, in emitSnPrintfMemCpy() argument
3419 Value *StrLen = ConstantInt::get(CI->getType(), Str.size()); in emitSnPrintfMemCpy()
3433 Value *DstArg = CI->getArgOperand(0); in emitSnPrintfMemCpy()
3437 *CI, in emitSnPrintfMemCpy()
3440 ConstantInt::get(DL.getIntPtrType(CI->getContext()), NCopy))); in emitSnPrintfMemCpy()
3455 Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI, in optimizeSnPrintFString() argument
3458 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeSnPrintFString()
3469 Value *DstArg = CI->getArgOperand(0); in optimizeSnPrintFString()
3470 Value *FmtArg = CI->getArgOperand(2); in optimizeSnPrintFString()
3478 if (CI->arg_size() == 3) { in optimizeSnPrintFString()
3484 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr, N, B); in optimizeSnPrintFString()
3489 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() != 4) in optimizeSnPrintFString()
3499 return emitSnPrintfMemCpy(CI, nullptr, CharStr, N, B); in optimizeSnPrintFString()
3503 if (!CI->getArgOperand(3)->getType()->isIntegerTy()) in optimizeSnPrintFString()
3505 Value *V = B.CreateTrunc(CI->getArgOperand(3), B.getInt8Ty(), "char"); in optimizeSnPrintFString()
3510 return ConstantInt::get(CI->getType(), 1); in optimizeSnPrintFString()
3516 Value *StrArg = CI->getArgOperand(3); in optimizeSnPrintFString()
3522 return emitSnPrintfMemCpy(CI, StrArg, Str, N, B); in optimizeSnPrintFString()
3525 Value *LibCallSimplifier::optimizeSnPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSnPrintF() argument
3526 if (Value *V = optimizeSnPrintFString(CI, B)) { in optimizeSnPrintF()
3530 if (isKnownNonZero(CI->getOperand(1), DL)) in optimizeSnPrintF()
3531 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeSnPrintF()
3535 Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI, in optimizeFPrintFString() argument
3537 optimizeErrorReporting(CI, B, 0); in optimizeFPrintFString()
3541 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeFPrintFString()
3547 if (!CI->use_empty()) in optimizeFPrintFString()
3551 if (CI->arg_size() == 2) { in optimizeFPrintFString()
3556 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeFPrintFString()
3557 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeFPrintFString()
3559 *CI, emitFWrite(CI->getArgOperand(1), in optimizeFPrintFString()
3561 CI->getArgOperand(0), B, DL, TLI)); in optimizeFPrintFString()
3566 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3) in optimizeFPrintFString()
3572 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeFPrintFString()
3575 Value *V = B.CreateIntCast(CI->getArgOperand(2), IntTy, /*isSigned*/ true, in optimizeFPrintFString()
3577 return copyFlags(*CI, emitFPutC(V, CI->getArgOperand(0), B, TLI)); in optimizeFPrintFString()
3582 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeFPrintFString()
3585 *CI, emitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI)); in optimizeFPrintFString()
3590 Value *LibCallSimplifier::optimizeFPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeFPrintF() argument
3591 Module *M = CI->getModule(); in optimizeFPrintF()
3592 Function *Callee = CI->getCalledFunction(); in optimizeFPrintF()
3594 if (Value *V = optimizeFPrintFString(CI, B)) { in optimizeFPrintF()
3601 !callHasFloatingPointArgument(CI)) { in optimizeFPrintF()
3604 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
3613 !callHasFP128Argument(CI)) { in optimizeFPrintF()
3617 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
3626 Value *LibCallSimplifier::optimizeFWrite(CallInst *CI, IRBuilderBase &B) { in optimizeFWrite() argument
3627 optimizeErrorReporting(CI, B, 3); in optimizeFWrite()
3630 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeFWrite()
3631 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeFWrite()
3637 return ConstantInt::get(CI->getType(), 0); in optimizeFWrite()
3641 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) in optimizeFWrite()
3642 Value *Char = B.CreateLoad(B.getInt8Ty(), CI->getArgOperand(0), "char"); in optimizeFWrite()
3645 Value *NewCI = emitFPutC(Cast, CI->getArgOperand(3), B, TLI); in optimizeFWrite()
3646 return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr; in optimizeFWrite()
3653 Value *LibCallSimplifier::optimizeFPuts(CallInst *CI, IRBuilderBase &B) { in optimizeFPuts() argument
3654 optimizeErrorReporting(CI, B, 1); in optimizeFPuts()
3658 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeFPuts()
3659 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeFPuts()
3665 if (!CI->use_empty()) in optimizeFPuts()
3669 uint64_t Len = GetStringLength(CI->getArgOperand(0)); in optimizeFPuts()
3674 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeFPuts()
3675 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeFPuts()
3677 *CI, in optimizeFPuts()
3678 emitFWrite(CI->getArgOperand(0), in optimizeFPuts()
3680 CI->getArgOperand(1), B, DL, TLI)); in optimizeFPuts()
3683 Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilderBase &B) { in optimizePuts() argument
3684 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePuts()
3685 if (!CI->use_empty()) in optimizePuts()
3691 if (getConstantStringInfo(CI->getArgOperand(0), Str) && Str.empty()) { in optimizePuts()
3694 Type *IntTy = CI->getType(); in optimizePuts()
3695 return copyFlags(*CI, emitPutChar(ConstantInt::get(IntTy, '\n'), B, TLI)); in optimizePuts()
3701 Value *LibCallSimplifier::optimizeBCopy(CallInst *CI, IRBuilderBase &B) { in optimizeBCopy() argument
3703 return copyFlags(*CI, B.CreateMemMove(CI->getArgOperand(1), Align(1), in optimizeBCopy()
3704 CI->getArgOperand(0), Align(1), in optimizeBCopy()
3705 CI->getArgOperand(2))); in optimizeBCopy()
3714 Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI, in optimizeStringMemoryLibCall() argument
3716 Module *M = CI->getModule(); in optimizeStringMemoryLibCall()
3718 Function *Callee = CI->getCalledFunction(); in optimizeStringMemoryLibCall()
3724 TargetLibraryInfoImpl::isCallingConvCCompatible(CI)) && in optimizeStringMemoryLibCall()
3728 return optimizeStrCat(CI, Builder); in optimizeStringMemoryLibCall()
3730 return optimizeStrNCat(CI, Builder); in optimizeStringMemoryLibCall()
3732 return optimizeStrChr(CI, Builder); in optimizeStringMemoryLibCall()
3734 return optimizeStrRChr(CI, Builder); in optimizeStringMemoryLibCall()
3736 return optimizeStrCmp(CI, Builder); in optimizeStringMemoryLibCall()
3738 return optimizeStrNCmp(CI, Builder); in optimizeStringMemoryLibCall()
3740 return optimizeStrCpy(CI, Builder); in optimizeStringMemoryLibCall()
3742 return optimizeStpCpy(CI, Builder); in optimizeStringMemoryLibCall()
3744 return optimizeStrLCpy(CI, Builder); in optimizeStringMemoryLibCall()
3746 return optimizeStringNCpy(CI, /*RetEnd=*/true, Builder); in optimizeStringMemoryLibCall()
3748 return optimizeStringNCpy(CI, /*RetEnd=*/false, Builder); in optimizeStringMemoryLibCall()
3750 return optimizeStrLen(CI, Builder); in optimizeStringMemoryLibCall()
3752 return optimizeStrNLen(CI, Builder); in optimizeStringMemoryLibCall()
3754 return optimizeStrPBrk(CI, Builder); in optimizeStringMemoryLibCall()
3756 return optimizeStrNDup(CI, Builder); in optimizeStringMemoryLibCall()
3764 return optimizeStrTo(CI, Builder); in optimizeStringMemoryLibCall()
3766 return optimizeStrSpn(CI, Builder); in optimizeStringMemoryLibCall()
3768 return optimizeStrCSpn(CI, Builder); in optimizeStringMemoryLibCall()
3770 return optimizeStrStr(CI, Builder); in optimizeStringMemoryLibCall()
3772 return optimizeMemChr(CI, Builder); in optimizeStringMemoryLibCall()
3774 return optimizeMemRChr(CI, Builder); in optimizeStringMemoryLibCall()
3776 return optimizeBCmp(CI, Builder); in optimizeStringMemoryLibCall()
3778 return optimizeMemCmp(CI, Builder); in optimizeStringMemoryLibCall()
3780 return optimizeMemCpy(CI, Builder); in optimizeStringMemoryLibCall()
3782 return optimizeMemCCpy(CI, Builder); in optimizeStringMemoryLibCall()
3784 return optimizeMemPCpy(CI, Builder); in optimizeStringMemoryLibCall()
3786 return optimizeMemMove(CI, Builder); in optimizeStringMemoryLibCall()
3788 return optimizeMemSet(CI, Builder); in optimizeStringMemoryLibCall()
3790 return optimizeRealloc(CI, Builder); in optimizeStringMemoryLibCall()
3792 return optimizeWcslen(CI, Builder); in optimizeStringMemoryLibCall()
3794 return optimizeBCopy(CI, Builder); in optimizeStringMemoryLibCall()
3811 return optimizeNew(CI, Builder, Func); in optimizeStringMemoryLibCall()
3819 Value *LibCallSimplifier::optimizeFloatingPointLibCall(CallInst *CI, in optimizeFloatingPointLibCall() argument
3822 const Module *M = CI->getModule(); in optimizeFloatingPointLibCall()
3825 if (CI->isStrictFP()) in optimizeFloatingPointLibCall()
3828 if (Value *V = optimizeSymmetric(CI, Func, Builder)) in optimizeFloatingPointLibCall()
3834 return optimizeSinCosPi(CI, /*IsSin*/true, Builder); in optimizeFloatingPointLibCall()
3837 return optimizeSinCosPi(CI, /*IsSin*/false, Builder); in optimizeFloatingPointLibCall()
3841 return optimizePow(CI, Builder); in optimizeFloatingPointLibCall()
3845 return optimizeExp2(CI, Builder); in optimizeFloatingPointLibCall()
3849 return replaceUnaryCall(CI, Builder, Intrinsic::fabs); in optimizeFloatingPointLibCall()
3853 return optimizeSqrt(CI, Builder); in optimizeFloatingPointLibCall()
3869 return optimizeLog(CI, Builder); in optimizeFloatingPointLibCall()
3885 return optimizeTrigInversionPairs(CI, Builder); in optimizeFloatingPointLibCall()
3887 return replaceUnaryCall(CI, Builder, Intrinsic::ceil); in optimizeFloatingPointLibCall()
3889 return replaceUnaryCall(CI, Builder, Intrinsic::floor); in optimizeFloatingPointLibCall()
3891 return replaceUnaryCall(CI, Builder, Intrinsic::round); in optimizeFloatingPointLibCall()
3893 return replaceUnaryCall(CI, Builder, Intrinsic::roundeven); in optimizeFloatingPointLibCall()
3895 return replaceUnaryCall(CI, Builder, Intrinsic::nearbyint); in optimizeFloatingPointLibCall()
3897 return replaceUnaryCall(CI, Builder, Intrinsic::rint); in optimizeFloatingPointLibCall()
3899 return replaceUnaryCall(CI, Builder, Intrinsic::trunc); in optimizeFloatingPointLibCall()
3911 if (UnsafeFPShrink && hasFloatVersion(M, CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3912 return optimizeUnaryDoubleFP(CI, Builder, TLI, true); in optimizeFloatingPointLibCall()
3915 if (hasFloatVersion(M, CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3916 return optimizeBinaryDoubleFP(CI, Builder, TLI); in optimizeFloatingPointLibCall()
3924 return optimizeFMinFMax(CI, Builder); in optimizeFloatingPointLibCall()
3928 return optimizeCAbs(CI, Builder); in optimizeFloatingPointLibCall()
3934 Value *LibCallSimplifier::optimizeCall(CallInst *CI, IRBuilderBase &Builder) { in optimizeCall() argument
3935 Module *M = CI->getModule(); in optimizeCall()
3936 assert(!CI->isMustTailCall() && "These transforms aren't musttail safe."); in optimizeCall()
3941 if (CI->isNoBuiltin()) in optimizeCall()
3945 Function *Callee = CI->getCalledFunction(); in optimizeCall()
3946 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
3949 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
3959 else if (isa<FPMathOperator>(CI) && CI->isFast()) in optimizeCall()
3963 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) { in optimizeCall()
3970 return optimizePow(CI, Builder); in optimizeCall()
3972 return optimizeExp2(CI, Builder); in optimizeCall()
3976 return optimizeLog(CI, Builder); in optimizeCall()
3978 return optimizeSqrt(CI, Builder); in optimizeCall()
3980 return optimizeMemSet(CI, Builder); in optimizeCall()
3982 return optimizeMemCpy(CI, Builder); in optimizeCall()
3984 return optimizeMemMove(CI, Builder); in optimizeCall()
3992 FortifiedSimplifier.optimizeCall(CI, Builder)) in optimizeCall()
4000 if (Value *V = optimizeStringMemoryLibCall(CI, Builder)) in optimizeCall()
4002 if (Value *V = optimizeFloatingPointLibCall(CI, Func, Builder)) in optimizeCall()
4008 return optimizeFFS(CI, Builder); in optimizeCall()
4012 return optimizeFls(CI, Builder); in optimizeCall()
4016 return optimizeAbs(CI, Builder); in optimizeCall()
4018 return optimizeIsDigit(CI, Builder); in optimizeCall()
4020 return optimizeIsAscii(CI, Builder); in optimizeCall()
4022 return optimizeToAscii(CI, Builder); in optimizeCall()
4026 return optimizeAtoi(CI, Builder); in optimizeCall()
4029 return optimizeStrToInt(CI, Builder, /*AsSigned=*/true); in optimizeCall()
4032 return optimizeStrToInt(CI, Builder, /*AsSigned=*/false); in optimizeCall()
4034 return optimizePrintF(CI, Builder); in optimizeCall()
4036 return optimizeSPrintF(CI, Builder); in optimizeCall()
4038 return optimizeSnPrintF(CI, Builder); in optimizeCall()
4040 return optimizeFPrintF(CI, Builder); in optimizeCall()
4042 return optimizeFWrite(CI, Builder); in optimizeCall()
4044 return optimizeFPuts(CI, Builder); in optimizeCall()
4046 return optimizePuts(CI, Builder); in optimizeCall()
4048 return optimizeErrorReporting(CI, Builder); in optimizeCall()
4051 return optimizeErrorReporting(CI, Builder, 0); in optimizeCall()
4113 CallInst *CI, unsigned ObjSizeOp, std::optional<unsigned> SizeOp, in isFortifiedCallFoldable() argument
4118 ConstantInt *Flag = dyn_cast<ConstantInt>(CI->getArgOperand(*FlagOp)); in isFortifiedCallFoldable()
4123 if (SizeOp && CI->getArgOperand(ObjSizeOp) == CI->getArgOperand(*SizeOp)) in isFortifiedCallFoldable()
4127 dyn_cast<ConstantInt>(CI->getArgOperand(ObjSizeOp))) { in isFortifiedCallFoldable()
4134 uint64_t Len = GetStringLength(CI->getArgOperand(*StrOp)); in isFortifiedCallFoldable()
4138 annotateDereferenceableBytes(CI, *StrOp, Len); in isFortifiedCallFoldable()
4146 dyn_cast<ConstantInt>(CI->getArgOperand(*SizeOp))) in isFortifiedCallFoldable()
4153 Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI, in optimizeMemCpyChk() argument
4155 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemCpyChk()
4157 B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemCpyChk()
4158 Align(1), CI->getArgOperand(2)); in optimizeMemCpyChk()
4159 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemCpyChk()
4160 return CI->getArgOperand(0); in optimizeMemCpyChk()
4165 Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI, in optimizeMemMoveChk() argument
4167 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemMoveChk()
4169 B.CreateMemMove(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemMoveChk()
4170 Align(1), CI->getArgOperand(2)); in optimizeMemMoveChk()
4171 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemMoveChk()
4172 return CI->getArgOperand(0); in optimizeMemMoveChk()
4177 Value *FortifiedLibCallSimplifier::optimizeMemSetChk(CallInst *CI, in optimizeMemSetChk() argument
4179 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemSetChk()
4180 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSetChk()
4181 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, in optimizeMemSetChk()
4182 CI->getArgOperand(2), Align(1)); in optimizeMemSetChk()
4183 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemSetChk()
4184 return CI->getArgOperand(0); in optimizeMemSetChk()
4189 Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(CallInst *CI, in optimizeMemPCpyChk() argument
4191 const DataLayout &DL = CI->getDataLayout(); in optimizeMemPCpyChk()
4192 if (isFortifiedCallFoldable(CI, 3, 2)) in optimizeMemPCpyChk()
4193 if (Value *Call = emitMemPCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemPCpyChk()
4194 CI->getArgOperand(2), B, DL, TLI)) { in optimizeMemPCpyChk()
4195 return mergeAttributesAndFlags(cast<CallInst>(Call), *CI); in optimizeMemPCpyChk()
4200 Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(CallInst *CI, in optimizeStrpCpyChk() argument
4203 const DataLayout &DL = CI->getDataLayout(); in optimizeStrpCpyChk()
4204 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1), in optimizeStrpCpyChk()
4205 *ObjSize = CI->getArgOperand(2); in optimizeStrpCpyChk()
4218 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) { in optimizeStrpCpyChk()
4220 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI)); in optimizeStrpCpyChk()
4222 return copyFlags(*CI, emitStpCpy(Dst, Src, B, TLI)); in optimizeStrpCpyChk()
4231 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrpCpyChk()
4235 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeStrpCpyChk()
4236 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeStrpCpyChk()
4244 return copyFlags(*CI, cast<CallInst>(Ret)); in optimizeStrpCpyChk()
4247 Value *FortifiedLibCallSimplifier::optimizeStrLenChk(CallInst *CI, in optimizeStrLenChk() argument
4249 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0)) in optimizeStrLenChk()
4250 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B, in optimizeStrLenChk()
4251 CI->getDataLayout(), TLI)); in optimizeStrLenChk()
4255 Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(CallInst *CI, in optimizeStrpNCpyChk() argument
4258 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeStrpNCpyChk()
4260 return copyFlags(*CI, in optimizeStrpNCpyChk()
4261 emitStrNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
4262 CI->getArgOperand(2), B, TLI)); in optimizeStrpNCpyChk()
4264 return copyFlags(*CI, in optimizeStrpNCpyChk()
4265 emitStpNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
4266 CI->getArgOperand(2), B, TLI)); in optimizeStrpNCpyChk()
4272 Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(CallInst *CI, in optimizeMemCCpyChk() argument
4274 if (isFortifiedCallFoldable(CI, 4, 3)) in optimizeMemCCpyChk()
4276 *CI, emitMemCCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemCCpyChk()
4277 CI->getArgOperand(2), CI->getArgOperand(3), B, TLI)); in optimizeMemCCpyChk()
4282 Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(CallInst *CI, in optimizeSNPrintfChk() argument
4284 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) { in optimizeSNPrintfChk()
4285 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 5)); in optimizeSNPrintfChk()
4286 return copyFlags(*CI, in optimizeSNPrintfChk()
4287 emitSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeSNPrintfChk()
4288 CI->getArgOperand(4), VariadicArgs, B, TLI)); in optimizeSNPrintfChk()
4294 Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(CallInst *CI, in optimizeSPrintfChk() argument
4296 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) { in optimizeSPrintfChk()
4297 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 4)); in optimizeSPrintfChk()
4298 return copyFlags(*CI, in optimizeSPrintfChk()
4299 emitSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), in optimizeSPrintfChk()
4306 Value *FortifiedLibCallSimplifier::optimizeStrCatChk(CallInst *CI, in optimizeStrCatChk() argument
4308 if (isFortifiedCallFoldable(CI, 2)) in optimizeStrCatChk()
4310 *CI, emitStrCat(CI->getArgOperand(0), CI->getArgOperand(1), B, TLI)); in optimizeStrCatChk()
4315 Value *FortifiedLibCallSimplifier::optimizeStrLCat(CallInst *CI, in optimizeStrLCat() argument
4317 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCat()
4318 return copyFlags(*CI, in optimizeStrLCat()
4319 emitStrLCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCat()
4320 CI->getArgOperand(2), B, TLI)); in optimizeStrLCat()
4325 Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(CallInst *CI, in optimizeStrNCatChk() argument
4327 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrNCatChk()
4328 return copyFlags(*CI, in optimizeStrNCatChk()
4329 emitStrNCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrNCatChk()
4330 CI->getArgOperand(2), B, TLI)); in optimizeStrNCatChk()
4335 Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(CallInst *CI, in optimizeStrLCpyChk() argument
4337 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCpyChk()
4338 return copyFlags(*CI, in optimizeStrLCpyChk()
4339 emitStrLCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCpyChk()
4340 CI->getArgOperand(2), B, TLI)); in optimizeStrLCpyChk()
4345 Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(CallInst *CI, in optimizeVSNPrintfChk() argument
4347 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) in optimizeVSNPrintfChk()
4349 *CI, emitVSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeVSNPrintfChk()
4350 CI->getArgOperand(4), CI->getArgOperand(5), B, TLI)); in optimizeVSNPrintfChk()
4355 Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(CallInst *CI, in optimizeVSPrintfChk() argument
4357 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) in optimizeVSPrintfChk()
4358 return copyFlags(*CI, in optimizeVSPrintfChk()
4359 emitVSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), in optimizeVSPrintfChk()
4360 CI->getArgOperand(4), B, TLI)); in optimizeVSPrintfChk()
4365 Value *FortifiedLibCallSimplifier::optimizeCall(CallInst *CI, in optimizeCall() argument
4381 Function *Callee = CI->getCalledFunction(); in optimizeCall()
4382 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
4385 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
4401 return optimizeMemCpyChk(CI, Builder); in optimizeCall()
4403 return optimizeMemPCpyChk(CI, Builder); in optimizeCall()
4405 return optimizeMemMoveChk(CI, Builder); in optimizeCall()
4407 return optimizeMemSetChk(CI, Builder); in optimizeCall()
4410 return optimizeStrpCpyChk(CI, Builder, Func); in optimizeCall()
4412 return optimizeStrLenChk(CI, Builder); in optimizeCall()
4415 return optimizeStrpNCpyChk(CI, Builder, Func); in optimizeCall()
4417 return optimizeMemCCpyChk(CI, Builder); in optimizeCall()
4419 return optimizeSNPrintfChk(CI, Builder); in optimizeCall()
4421 return optimizeSPrintfChk(CI, Builder); in optimizeCall()
4423 return optimizeStrCatChk(CI, Builder); in optimizeCall()
4425 return optimizeStrLCat(CI, Builder); in optimizeCall()
4427 return optimizeStrNCatChk(CI, Builder); in optimizeCall()
4429 return optimizeStrLCpyChk(CI, Builder); in optimizeCall()
4431 return optimizeVSNPrintfChk(CI, Builder); in optimizeCall()
4433 return optimizeVSPrintfChk(CI, Builder); in optimizeCall()