Lines Matching refs:CI
109 static bool callHasFloatingPointArgument(const CallInst *CI) { in callHasFloatingPointArgument() argument
110 return any_of(CI->operands(), [](const Use &OI) { in callHasFloatingPointArgument()
115 static bool callHasFP128Argument(const CallInst *CI) { in callHasFP128Argument() argument
116 return any_of(CI->operands(), [](const Use &OI) { in callHasFP128Argument()
128 static Value *convertStrToInt(CallInst *CI, StringRef &Str, Value *EndPtr, in convertStrToInt() argument
161 Type *RetTy = CI->getType(); in convertStrToInt()
218 Value *StrBeg = CI->getArgOperand(0); in convertStrToInt()
242 static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, in canTransformToMemCmp() argument
244 if (!isOnlyUsedInComparisonWithZero(CI)) in canTransformToMemCmp()
250 if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory)) in canTransformToMemCmp()
256 static void annotateDereferenceableBytes(CallInst *CI, in annotateDereferenceableBytes() argument
259 const Function *F = CI->getCaller(); in annotateDereferenceableBytes()
264 unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateDereferenceableBytes()
266 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
267 DerefBytes = std::max(CI->getParamDereferenceableOrNullBytes(ArgNo), in annotateDereferenceableBytes()
270 if (CI->getParamDereferenceableBytes(ArgNo) < DerefBytes) { in annotateDereferenceableBytes()
271 CI->removeParamAttr(ArgNo, Attribute::Dereferenceable); in annotateDereferenceableBytes()
273 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
274 CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull); in annotateDereferenceableBytes()
275 CI->addParamAttr(ArgNo, Attribute::getWithDereferenceableBytes( in annotateDereferenceableBytes()
276 CI->getContext(), DerefBytes)); in annotateDereferenceableBytes()
281 static void annotateNonNullNoUndefBasedOnAccess(CallInst *CI, in annotateNonNullNoUndefBasedOnAccess() argument
283 Function *F = CI->getCaller(); in annotateNonNullNoUndefBasedOnAccess()
288 if (!CI->paramHasAttr(ArgNo, Attribute::NoUndef)) in annotateNonNullNoUndefBasedOnAccess()
289 CI->addParamAttr(ArgNo, Attribute::NoUndef); in annotateNonNullNoUndefBasedOnAccess()
291 if (!CI->paramHasAttr(ArgNo, Attribute::NonNull)) { in annotateNonNullNoUndefBasedOnAccess()
293 CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateNonNullNoUndefBasedOnAccess()
296 CI->addParamAttr(ArgNo, Attribute::NonNull); in annotateNonNullNoUndefBasedOnAccess()
299 annotateDereferenceableBytes(CI, ArgNo, 1); in annotateNonNullNoUndefBasedOnAccess()
303 static void annotateNonNullAndDereferenceable(CallInst *CI, ArrayRef<unsigned> ArgNos, in annotateNonNullAndDereferenceable() argument
306 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
307 annotateDereferenceableBytes(CI, ArgNos, LenC->getZExtValue()); in annotateNonNullAndDereferenceable()
309 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
314 annotateDereferenceableBytes(CI, ArgNos, DerefMin); in annotateNonNullAndDereferenceable()
348 Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrCat() argument
350 Value *Dst = CI->getArgOperand(0); in optimizeStrCat()
351 Value *Src = CI->getArgOperand(1); in optimizeStrCat()
352 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCat()
357 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCat()
366 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len, B)); in optimizeStrCat()
390 Value *LibCallSimplifier::optimizeStrNCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCat() argument
392 Value *Dst = CI->getArgOperand(0); in optimizeStrNCat()
393 Value *Src = CI->getArgOperand(1); in optimizeStrNCat()
394 Value *Size = CI->getArgOperand(2); in optimizeStrNCat()
396 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNCat()
398 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrNCat()
414 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStrNCat()
430 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen, B)); in optimizeStrNCat()
436 static Value* memChrToCharCompare(CallInst *CI, Value *NBytes, in memChrToCharCompare() argument
439 Value *Src = CI->getArgOperand(0); in memChrToCharCompare()
440 Value *CharVal = CI->getArgOperand(1); in memChrToCharCompare()
454 Value *NullPtr = Constant::getNullValue(CI->getType()); in memChrToCharCompare()
458 Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrChr() argument
459 Value *SrcStr = CI->getArgOperand(0); in optimizeStrChr()
460 Value *CharVal = CI->getArgOperand(1); in optimizeStrChr()
461 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrChr()
463 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeStrChr()
464 return memChrToCharCompare(CI, nullptr, B, DL); in optimizeStrChr()
472 annotateDereferenceableBytes(CI, 0, Len); in optimizeStrChr()
476 Function *Callee = CI->getCalledFunction(); in optimizeStrChr()
482 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeStrChr()
483 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeStrChr()
484 return copyFlags(*CI, in optimizeStrChr()
491 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeStrChr()
492 if (isOnlyUsedInEqualityComparison(CI, NullPtr)) in optimizeStrChr()
495 return B.CreateIntToPtr(B.getTrue(), CI->getType()); in optimizeStrChr()
514 return Constant::getNullValue(CI->getType()); in optimizeStrChr()
520 Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrRChr() argument
521 Value *SrcStr = CI->getArgOperand(0); in optimizeStrRChr()
522 Value *CharVal = CI->getArgOperand(1); in optimizeStrRChr()
524 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrRChr()
530 return copyFlags(*CI, emitStrChr(SrcStr, '\0', B, TLI)); in optimizeStrRChr()
534 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeStrRChr()
535 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeStrRChr()
541 return copyFlags(*CI, emitMemRChr(SrcStr, CharVal, Size, B, DL, TLI)); in optimizeStrRChr()
544 Value *LibCallSimplifier::optimizeStrCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrCmp() argument
545 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); in optimizeStrCmp()
547 return ConstantInt::get(CI->getType(), 0); in optimizeStrCmp()
555 return ConstantInt::get(CI->getType(), in optimizeStrCmp()
560 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrCmp()
564 CI->getType()); in optimizeStrCmp()
569 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrCmp()
572 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrCmp()
576 *CI, emitMemCmp(Str1P, Str2P, in optimizeStrCmp()
577 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeStrCmp()
584 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrCmp()
586 *CI, in optimizeStrCmp()
588 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), in optimizeStrCmp()
591 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrCmp()
593 *CI, in optimizeStrCmp()
595 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), in optimizeStrCmp()
599 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCmp()
605 static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS,
609 Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCmp() argument
610 Value *Str1P = CI->getArgOperand(0); in optimizeStrNCmp()
611 Value *Str2P = CI->getArgOperand(1); in optimizeStrNCmp()
612 Value *Size = CI->getArgOperand(2); in optimizeStrNCmp()
614 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
617 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrNCmp()
623 return optimizeMemCmpVarSize(CI, Str1P, Str2P, Size, true, B, DL); in optimizeStrNCmp()
626 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
629 return copyFlags(*CI, emitMemCmp(Str1P, Str2P, Size, B, DL, TLI)); in optimizeStrNCmp()
640 return ConstantInt::get(CI->getType(), in optimizeStrNCmp()
646 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrNCmp()
650 CI->getType()); in optimizeStrNCmp()
654 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrNCmp()
657 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrNCmp()
662 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrNCmp()
664 *CI, in optimizeStrNCmp()
666 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), in optimizeStrNCmp()
670 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrNCmp()
672 *CI, in optimizeStrNCmp()
674 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), in optimizeStrNCmp()
681 Value *LibCallSimplifier::optimizeStrNDup(CallInst *CI, IRBuilderBase &B) { in optimizeStrNDup() argument
682 Value *Src = CI->getArgOperand(0); in optimizeStrNDup()
683 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrNDup()
686 annotateDereferenceableBytes(CI, 0, SrcLen); in optimizeStrNDup()
688 return copyFlags(*CI, emitStrDup(Src, B, TLI)); in optimizeStrNDup()
694 Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrCpy() argument
695 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStrCpy()
699 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCpy()
703 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCpy()
711 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len)); in optimizeStrCpy()
712 mergeAttributesAndFlags(NewCI, *CI); in optimizeStrCpy()
716 Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStpCpy() argument
717 Function *Callee = CI->getCalledFunction(); in optimizeStpCpy()
718 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStpCpy()
721 if (CI->use_empty()) in optimizeStpCpy()
722 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI)); in optimizeStpCpy()
732 annotateDereferenceableBytes(CI, 1, Len); in optimizeStpCpy()
744 mergeAttributesAndFlags(NewCI, *CI); in optimizeStpCpy()
750 Value *LibCallSimplifier::optimizeStrLCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrLCpy() argument
751 Value *Size = CI->getArgOperand(2); in optimizeStrLCpy()
755 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrLCpy()
758 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrLCpy()
766 Value *Dst = CI->getArgOperand(0); in optimizeStrLCpy()
767 Value *Src = CI->getArgOperand(1); in optimizeStrLCpy()
774 return copyFlags(*CI, emitStrLen(Src, B, DL, TLI)); in optimizeStrLCpy()
803 return ConstantInt::get(CI->getType(), 0); in optimizeStrLCpy()
806 Function *Callee = CI->getCalledFunction(); in optimizeStrLCpy()
813 mergeAttributesAndFlags(NewCI, *CI); in optimizeStrLCpy()
816 Value *EndOff = ConstantInt::get(CI->getType(), NBytes); in optimizeStrLCpy()
824 return ConstantInt::get(CI->getType(), SrcLen); in optimizeStrLCpy()
829 Value *LibCallSimplifier::optimizeStringNCpy(CallInst *CI, bool RetEnd, in optimizeStringNCpy() argument
831 Function *Callee = CI->getCalledFunction(); in optimizeStringNCpy()
832 Value *Dst = CI->getArgOperand(0); in optimizeStringNCpy()
833 Value *Src = CI->getArgOperand(1); in optimizeStringNCpy()
834 Value *Size = CI->getArgOperand(2); in optimizeStringNCpy()
839 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStringNCpy()
840 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStringNCpy()
873 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStringNCpy()
882 CI->getAttributes().getParamAttrs(0).getAlignment().valueOrOne(); in optimizeStringNCpy()
884 AttrBuilder ArgAttrs(CI->getContext(), CI->getAttributes().getParamAttrs(0)); in optimizeStringNCpy()
886 CI->getContext(), 0, ArgAttrs)); in optimizeStringNCpy()
887 copyFlags(*CI, NewCI); in optimizeStringNCpy()
912 mergeAttributesAndFlags(NewCI, *CI); in optimizeStringNCpy()
922 Value *LibCallSimplifier::optimizeStringLength(CallInst *CI, IRBuilderBase &B, in optimizeStringLength() argument
925 Value *Src = CI->getArgOperand(0); in optimizeStringLength()
928 if (isOnlyUsedInZeroEqualityComparison(CI) && in optimizeStringLength()
937 CI->getType()); in optimizeStringLength()
944 return ConstantInt::get(CI->getType(), 0); in optimizeStringLength()
951 return B.CreateZExt(Cmp, CI->getType()); in optimizeStringLength()
957 Value *LenC = ConstantInt::get(CI->getType(), Len - 1); in optimizeStringLength()
1002 KnownBits Known = computeKnownBits(Offset, DL, 0, nullptr, CI, nullptr); in optimizeStringLength()
1013 Offset = B.CreateSExtOrTrunc(Offset, CI->getType()); in optimizeStringLength()
1014 return B.CreateSub(ConstantInt::get(CI->getType(), NullTermIdx), in optimizeStringLength()
1026 return OptimizationRemark("instcombine", "simplify-libcalls", CI) in optimizeStringLength()
1030 ConstantInt::get(CI->getType(), LenTrue - 1), in optimizeStringLength()
1031 ConstantInt::get(CI->getType(), LenFalse - 1)); in optimizeStringLength()
1038 Value *LibCallSimplifier::optimizeStrLen(CallInst *CI, IRBuilderBase &B) { in optimizeStrLen() argument
1039 if (Value *V = optimizeStringLength(CI, B, 8)) in optimizeStrLen()
1041 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrLen()
1045 Value *LibCallSimplifier::optimizeStrNLen(CallInst *CI, IRBuilderBase &B) { in optimizeStrNLen() argument
1046 Value *Bound = CI->getArgOperand(1); in optimizeStrNLen()
1047 if (Value *V = optimizeStringLength(CI, B, 8, Bound)) in optimizeStrNLen()
1051 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNLen()
1055 Value *LibCallSimplifier::optimizeWcslen(CallInst *CI, IRBuilderBase &B) { in optimizeWcslen() argument
1056 Module &M = *CI->getModule(); in optimizeWcslen()
1062 return optimizeStringLength(CI, B, WCharSize); in optimizeWcslen()
1065 Value *LibCallSimplifier::optimizeStrPBrk(CallInst *CI, IRBuilderBase &B) { in optimizeStrPBrk() argument
1067 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrPBrk()
1068 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrPBrk()
1073 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
1079 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
1081 return B.CreateInBoundsGEP(B.getInt8Ty(), CI->getArgOperand(0), in optimizeStrPBrk()
1087 return copyFlags(*CI, emitStrChr(CI->getArgOperand(0), S2[0], B, TLI)); in optimizeStrPBrk()
1092 Value *LibCallSimplifier::optimizeStrTo(CallInst *CI, IRBuilderBase &B) { in optimizeStrTo() argument
1093 Value *EndPtr = CI->getArgOperand(1); in optimizeStrTo()
1097 CI->addParamAttr(0, Attribute::NoCapture); in optimizeStrTo()
1103 Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrSpn() argument
1105 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrSpn()
1106 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrSpn()
1111 return Constant::getNullValue(CI->getType()); in optimizeStrSpn()
1118 return ConstantInt::get(CI->getType(), Pos); in optimizeStrSpn()
1124 Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrCSpn() argument
1126 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrCSpn()
1127 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrCSpn()
1131 return Constant::getNullValue(CI->getType()); in optimizeStrCSpn()
1138 return ConstantInt::get(CI->getType(), Pos); in optimizeStrCSpn()
1143 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B, DL, TLI)); in optimizeStrCSpn()
1148 Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) { in optimizeStrStr() argument
1150 if (CI->getArgOperand(0) == CI->getArgOperand(1)) in optimizeStrStr()
1151 return CI->getArgOperand(0); in optimizeStrStr()
1154 if (isOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) { in optimizeStrStr()
1155 Value *StrLen = emitStrLen(CI->getArgOperand(1), B, DL, TLI); in optimizeStrStr()
1158 Value *StrNCmp = emitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrStr()
1162 for (User *U : llvm::make_early_inc_range(CI->users())) { in optimizeStrStr()
1169 return CI; in optimizeStrStr()
1174 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr); in optimizeStrStr()
1175 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr); in optimizeStrStr()
1179 return CI->getArgOperand(0); in optimizeStrStr()
1186 return Constant::getNullValue(CI->getType()); in optimizeStrStr()
1189 return B.CreateConstInBoundsGEP1_64(B.getInt8Ty(), CI->getArgOperand(0), in optimizeStrStr()
1195 return emitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TLI); in optimizeStrStr()
1198 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrStr()
1202 Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemRChr() argument
1203 Value *SrcStr = CI->getArgOperand(0); in optimizeMemRChr()
1204 Value *Size = CI->getArgOperand(2); in optimizeMemRChr()
1205 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemRChr()
1206 Value *CharVal = CI->getArgOperand(1); in optimizeMemRChr()
1208 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeMemRChr()
1290 Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemChr() argument
1291 Value *SrcStr = CI->getArgOperand(0); in optimizeMemChr()
1292 Value *Size = CI->getArgOperand(2); in optimizeMemChr()
1295 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeMemChr()
1296 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeMemChr()
1297 return memChrToCharCompare(CI, Size, B, DL); in optimizeMemChr()
1300 Value *CharVal = CI->getArgOperand(1); in optimizeMemChr()
1303 Value *NullPtr = Constant::getNullValue(CI->getType()); in optimizeMemChr()
1389 if (isOnlyUsedInEqualityComparison(CI, SrcStr)) in optimizeMemChr()
1393 return memChrToCharCompare(CI, Size, B, DL); in optimizeMemChr()
1399 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeMemChr()
1400 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeMemChr()
1413 if (OptForSize || Str.empty() || !isOnlyUsedInZeroEqualityComparison(CI)) in optimizeMemChr()
1451 return B.CreateIntToPtr(B.CreateOr(CharCompares), CI->getType()); in optimizeMemChr()
1479 CI->getType()); in optimizeMemChr()
1484 static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS, in optimizeMemCmpVarSize() argument
1488 return Constant::getNullValue(CI->getType()); in optimizeMemCmpVarSize()
1501 Value *Zero = ConstantInt::get(CI->getType(), 0); in optimizeMemCmpVarSize()
1521 Value *Res = ConstantInt::get(CI->getType(), IRes); in optimizeMemCmpVarSize()
1526 static Value *optimizeMemCmpConstantSize(CallInst *CI, Value *LHS, Value *RHS, in optimizeMemCmpConstantSize() argument
1530 return Constant::getNullValue(CI->getType()); in optimizeMemCmpConstantSize()
1535 CI->getType(), "lhsv"); in optimizeMemCmpConstantSize()
1537 CI->getType(), "rhsv"); in optimizeMemCmpConstantSize()
1544 if (DL.isLegalInteger(Len * 8) && isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmpConstantSize()
1545 IntegerType *IntType = IntegerType::get(CI->getContext(), Len * 8); in optimizeMemCmpConstantSize()
1559 if ((LHSV || getKnownAlignment(LHS, DL, CI) >= PrefAlignment) && in optimizeMemCmpConstantSize()
1560 (RHSV || getKnownAlignment(RHS, DL, CI) >= PrefAlignment)) { in optimizeMemCmpConstantSize()
1565 return B.CreateZExt(B.CreateICmpNE(LHSV, RHSV), CI->getType(), "memcmp"); in optimizeMemCmpConstantSize()
1573 Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(CallInst *CI, in optimizeMemCmpBCmpCommon() argument
1575 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1); in optimizeMemCmpBCmpCommon()
1576 Value *Size = CI->getArgOperand(2); in optimizeMemCmpBCmpCommon()
1578 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCmpBCmpCommon()
1580 if (Value *Res = optimizeMemCmpVarSize(CI, LHS, RHS, Size, false, B, DL)) in optimizeMemCmpBCmpCommon()
1588 return optimizeMemCmpConstantSize(CI, LHS, RHS, LenC->getZExtValue(), B, DL); in optimizeMemCmpBCmpCommon()
1591 Value *LibCallSimplifier::optimizeMemCmp(CallInst *CI, IRBuilderBase &B) { in optimizeMemCmp() argument
1592 Module *M = CI->getModule(); in optimizeMemCmp()
1593 if (Value *V = optimizeMemCmpBCmpCommon(CI, B)) in optimizeMemCmp()
1600 isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmp()
1601 Value *LHS = CI->getArgOperand(0); in optimizeMemCmp()
1602 Value *RHS = CI->getArgOperand(1); in optimizeMemCmp()
1603 Value *Size = CI->getArgOperand(2); in optimizeMemCmp()
1604 return copyFlags(*CI, emitBCmp(LHS, RHS, Size, B, DL, TLI)); in optimizeMemCmp()
1610 Value *LibCallSimplifier::optimizeBCmp(CallInst *CI, IRBuilderBase &B) { in optimizeBCmp() argument
1611 return optimizeMemCmpBCmpCommon(CI, B); in optimizeBCmp()
1614 Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCpy() argument
1615 Value *Size = CI->getArgOperand(2); in optimizeMemCpy()
1616 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCpy()
1617 if (isa<IntrinsicInst>(CI)) in optimizeMemCpy()
1621 CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align(1), in optimizeMemCpy()
1622 CI->getArgOperand(1), Align(1), Size); in optimizeMemCpy()
1623 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemCpy()
1624 return CI->getArgOperand(0); in optimizeMemCpy()
1627 Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCCpy() argument
1628 Value *Dst = CI->getArgOperand(0); in optimizeMemCCpy()
1629 Value *Src = CI->getArgOperand(1); in optimizeMemCCpy()
1630 ConstantInt *StopChar = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeMemCCpy()
1631 ConstantInt *N = dyn_cast<ConstantInt>(CI->getArgOperand(3)); in optimizeMemCCpy()
1633 if (CI->use_empty() && Dst == Src) in optimizeMemCCpy()
1638 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1651 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1), in optimizeMemCCpy()
1652 CI->getArgOperand(3))); in optimizeMemCCpy()
1653 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1661 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1), NewN)); in optimizeMemCCpy()
1664 : Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1667 Value *LibCallSimplifier::optimizeMemPCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemPCpy() argument
1668 Value *Dst = CI->getArgOperand(0); in optimizeMemPCpy()
1669 Value *N = CI->getArgOperand(2); in optimizeMemPCpy()
1672 B.CreateMemCpy(Dst, Align(1), CI->getArgOperand(1), Align(1), N); in optimizeMemPCpy()
1676 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemPCpy()
1680 Value *LibCallSimplifier::optimizeMemMove(CallInst *CI, IRBuilderBase &B) { in optimizeMemMove() argument
1681 Value *Size = CI->getArgOperand(2); in optimizeMemMove()
1682 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemMove()
1683 if (isa<IntrinsicInst>(CI)) in optimizeMemMove()
1687 CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align(1), in optimizeMemMove()
1688 CI->getArgOperand(1), Align(1), Size); in optimizeMemMove()
1689 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemMove()
1690 return CI->getArgOperand(0); in optimizeMemMove()
1693 Value *LibCallSimplifier::optimizeMemSet(CallInst *CI, IRBuilderBase &B) { in optimizeMemSet() argument
1694 Value *Size = CI->getArgOperand(2); in optimizeMemSet()
1695 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemSet()
1696 if (isa<IntrinsicInst>(CI)) in optimizeMemSet()
1700 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSet()
1701 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, Size, Align(1)); in optimizeMemSet()
1702 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemSet()
1703 return CI->getArgOperand(0); in optimizeMemSet()
1706 Value *LibCallSimplifier::optimizeRealloc(CallInst *CI, IRBuilderBase &B) { in optimizeRealloc() argument
1707 if (isa<ConstantPointerNull>(CI->getArgOperand(0))) in optimizeRealloc()
1708 return copyFlags(*CI, emitMalloc(CI->getArgOperand(1), B, DL, TLI)); in optimizeRealloc()
1717 Value *LibCallSimplifier::optimizeNew(CallInst *CI, IRBuilderBase &B, in optimizeNew() argument
1723 if (CI->getAttributes().getFnAttr("memprof").getValueAsString() == "cold") in optimizeNew()
1725 else if (CI->getAttributes().getFnAttr("memprof").getValueAsString() == "hot") in optimizeNew()
1732 return emitHotColdNew(CI->getArgOperand(0), B, TLI, in optimizeNew()
1735 return emitHotColdNew(CI->getArgOperand(0), B, TLI, in optimizeNew()
1738 return emitHotColdNewNoThrow(CI->getArgOperand(0), CI->getArgOperand(1), B, in optimizeNew()
1742 return emitHotColdNewNoThrow(CI->getArgOperand(0), CI->getArgOperand(1), B, in optimizeNew()
1746 return emitHotColdNewAligned(CI->getArgOperand(0), CI->getArgOperand(1), B, in optimizeNew()
1750 return emitHotColdNewAligned(CI->getArgOperand(0), CI->getArgOperand(1), B, in optimizeNew()
1755 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B, in optimizeNew()
1759 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B, in optimizeNew()
1771 static Value *replaceUnaryCall(CallInst *CI, IRBuilderBase &B, in replaceUnaryCall() argument
1775 B.setFastMathFlags(CI->getFastMathFlags()); in replaceUnaryCall()
1777 Module *M = CI->getModule(); in replaceUnaryCall()
1778 Value *V = CI->getArgOperand(0); in replaceUnaryCall()
1779 Function *F = Intrinsic::getDeclaration(M, IID, CI->getType()); in replaceUnaryCall()
1781 NewCall->takeName(CI); in replaceUnaryCall()
1782 return copyFlags(*CI, NewCall); in replaceUnaryCall()
1808 static Value *optimizeDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeDoubleFP() argument
1811 Function *CalleeFn = CI->getCalledFunction(); in optimizeDoubleFP()
1812 if (!CI->getType()->isDoubleTy() || !CalleeFn) in optimizeDoubleFP()
1819 for (User *U : CI->users()) { in optimizeDoubleFP()
1827 V[0] = valueHasFloatPrecision(CI->getArgOperand(0)); in optimizeDoubleFP()
1828 V[1] = isBinary ? valueHasFloatPrecision(CI->getArgOperand(1)) : nullptr; in optimizeDoubleFP()
1840 StringRef CallerName = CI->getFunction()->getName(); in optimizeDoubleFP()
1849 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeDoubleFP()
1854 Module *M = CI->getModule(); in optimizeDoubleFP()
1868 static Value *optimizeUnaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeUnaryDoubleFP() argument
1871 return optimizeDoubleFP(CI, B, false, TLI, isPrecise); in optimizeUnaryDoubleFP()
1875 static Value *optimizeBinaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeBinaryDoubleFP() argument
1878 return optimizeDoubleFP(CI, B, true, TLI, isPrecise); in optimizeBinaryDoubleFP()
1882 Value *LibCallSimplifier::optimizeCAbs(CallInst *CI, IRBuilderBase &B) { in optimizeCAbs() argument
1883 if (!CI->isFast()) in optimizeCAbs()
1888 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeCAbs()
1891 if (CI->arg_size() == 1) { in optimizeCAbs()
1892 Value *Op = CI->getArgOperand(0); in optimizeCAbs()
1897 assert(CI->arg_size() == 2 && "Unexpected signature for cabs!"); in optimizeCAbs()
1898 Real = CI->getArgOperand(0); in optimizeCAbs()
1899 Imag = CI->getArgOperand(1); in optimizeCAbs()
1905 Function *FSqrt = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::sqrt, in optimizeCAbs()
1906 CI->getType()); in optimizeCAbs()
1908 *CI, B.CreateCall(FSqrt, B.CreateFAdd(RealReal, ImagImag), "cabs")); in optimizeCAbs()
2322 Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) { in optimizeExp2() argument
2323 Module *M = CI->getModule(); in optimizeExp2()
2324 Function *Callee = CI->getCalledFunction(); in optimizeExp2()
2329 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeExp2()
2333 Type *Ty = CI->getType(); in optimizeExp2()
2339 Value *Op = CI->getArgOperand(0); in optimizeExp2()
2344 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeExp2()
2346 *CI, emitBinaryFloatFnCall(ConstantFP::get(Ty, 1.0), Exp, TLI, in optimizeExp2()
2355 Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilderBase &B) { in optimizeFMinFMax() argument
2356 Module *M = CI->getModule(); in optimizeFMinFMax()
2360 Function *Callee = CI->getCalledFunction(); in optimizeFMinFMax()
2363 if (Value *Ret = optimizeBinaryDoubleFP(CI, B, TLI)) in optimizeFMinFMax()
2374 FastMathFlags FMF = CI->getFastMathFlags(); in optimizeFMinFMax()
2380 Function *F = Intrinsic::getDeclaration(CI->getModule(), IID, CI->getType()); in optimizeFMinFMax()
2382 *CI, B.CreateCall(F, {CI->getArgOperand(0), CI->getArgOperand(1)})); in optimizeFMinFMax()
2541 Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilderBase &B) { in optimizeSqrt() argument
2542 Module *M = CI->getModule(); in optimizeSqrt()
2543 Function *Callee = CI->getCalledFunction(); in optimizeSqrt()
2551 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeSqrt()
2553 if (!CI->isFast()) in optimizeSqrt()
2556 Instruction *I = dyn_cast<Instruction>(CI->getArgOperand(0)); in optimizeSqrt()
2605 return copyFlags(*CI, B.CreateFMul(FabsCall, SqrtCall)); in optimizeSqrt()
2607 return copyFlags(*CI, FabsCall); in optimizeSqrt()
2611 Value *LibCallSimplifier::optimizeTan(CallInst *CI, IRBuilderBase &B) { in optimizeTan() argument
2612 Module *M = CI->getModule(); in optimizeTan()
2613 Function *Callee = CI->getCalledFunction(); in optimizeTan()
2617 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true); in optimizeTan()
2619 Value *Op1 = CI->getArgOperand(0); in optimizeTan()
2625 if (!CI->isFast() || !OpC->isFast()) in optimizeTan()
2642 static bool isTrigLibCall(CallInst *CI) { in isTrigLibCall() argument
2646 return CI->doesNotThrow() && CI->doesNotAccessMemory(); in isTrigLibCall()
2705 Value *LibCallSimplifier::optimizeSinCosPi(CallInst *CI, bool IsSin, IRBuilderBase &B) { in optimizeSinCosPi() argument
2708 if (!isTrigLibCall(CI)) in optimizeSinCosPi()
2711 Value *Arg = CI->getArgOperand(0); in optimizeSinCosPi()
2721 Function *F = CI->getFunction(); in optimizeSinCosPi()
2730 if (!insertSinCosCall(B, CI->getCalledFunction(), Arg, IsFloat, Sin, Cos, in optimizeSinCosPi()
2752 auto *CI = dyn_cast<CallInst>(Val); in classifyArgUse() local
2753 if (!CI || CI->use_empty()) in classifyArgUse()
2757 if (CI->getFunction() != F) in classifyArgUse()
2760 Module *M = CI->getModule(); in classifyArgUse()
2761 Function *Callee = CI->getCalledFunction(); in classifyArgUse()
2765 !isTrigLibCall(CI)) in classifyArgUse()
2770 SinCalls.push_back(CI); in classifyArgUse()
2772 CosCalls.push_back(CI); in classifyArgUse()
2774 SinCosCalls.push_back(CI); in classifyArgUse()
2777 SinCalls.push_back(CI); in classifyArgUse()
2779 CosCalls.push_back(CI); in classifyArgUse()
2781 SinCosCalls.push_back(CI); in classifyArgUse()
2789 Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilderBase &B) { in optimizeFFS() argument
2792 Type *RetType = CI->getType(); in optimizeFFS()
2793 Value *Op = CI->getArgOperand(0); in optimizeFFS()
2795 Function *F = Intrinsic::getDeclaration(CI->getCalledFunction()->getParent(), in optimizeFFS()
2805 Value *LibCallSimplifier::optimizeFls(CallInst *CI, IRBuilderBase &B) { in optimizeFls() argument
2808 Value *Op = CI->getArgOperand(0); in optimizeFls()
2810 Function *F = Intrinsic::getDeclaration(CI->getCalledFunction()->getParent(), in optimizeFls()
2815 return B.CreateIntCast(V, CI->getType(), false); in optimizeFls()
2818 Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilderBase &B) { in optimizeAbs() argument
2821 Value *X = CI->getArgOperand(0); in optimizeAbs()
2827 Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilderBase &B) { in optimizeIsDigit() argument
2829 Value *Op = CI->getArgOperand(0); in optimizeIsDigit()
2833 return B.CreateZExt(Op, CI->getType()); in optimizeIsDigit()
2836 Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilderBase &B) { in optimizeIsAscii() argument
2838 Value *Op = CI->getArgOperand(0); in optimizeIsAscii()
2841 return B.CreateZExt(Op, CI->getType()); in optimizeIsAscii()
2844 Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilderBase &B) { in optimizeToAscii() argument
2846 return B.CreateAnd(CI->getArgOperand(0), in optimizeToAscii()
2847 ConstantInt::get(CI->getType(), 0x7F)); in optimizeToAscii()
2851 Value *LibCallSimplifier::optimizeAtoi(CallInst *CI, IRBuilderBase &B) { in optimizeAtoi() argument
2852 CI->addParamAttr(0, Attribute::NoCapture); in optimizeAtoi()
2855 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeAtoi()
2858 return convertStrToInt(CI, Str, nullptr, 10, /*AsSigned=*/true, B); in optimizeAtoi()
2862 Value *LibCallSimplifier::optimizeStrToInt(CallInst *CI, IRBuilderBase &B, in optimizeStrToInt() argument
2864 Value *EndPtr = CI->getArgOperand(1); in optimizeStrToInt()
2868 CI->addParamAttr(0, Attribute::NoCapture); in optimizeStrToInt()
2874 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeStrToInt()
2877 if (ConstantInt *CInt = dyn_cast<ConstantInt>(CI->getArgOperand(2))) { in optimizeStrToInt()
2878 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned, B); in optimizeStrToInt()
2888 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg);
2890 Value *LibCallSimplifier::optimizeErrorReporting(CallInst *CI, IRBuilderBase &B, in optimizeErrorReporting() argument
2892 Function *Callee = CI->getCalledFunction(); in optimizeErrorReporting()
2901 if (!CI->hasFnAttr(Attribute::Cold) && in optimizeErrorReporting()
2902 isReportingError(Callee, CI, StreamArg)) { in optimizeErrorReporting()
2903 CI->addFnAttr(Attribute::Cold); in optimizeErrorReporting()
2909 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) { in isReportingError() argument
2919 if (StreamArg >= (int)CI->arg_size()) in isReportingError()
2921 LoadInst *LI = dyn_cast<LoadInst>(CI->getArgOperand(StreamArg)); in isReportingError()
2930 Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilderBase &B) { in optimizePrintFString() argument
2933 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr)) in optimizePrintFString()
2938 return CI->use_empty() ? (Value *)CI : ConstantInt::get(CI->getType(), 0); in optimizePrintFString()
2943 if (!CI->use_empty()) in optimizePrintFString()
2946 Type *IntTy = CI->getType(); in optimizePrintFString()
2953 return copyFlags(*CI, emitPutChar(IntChar, B, TLI)); in optimizePrintFString()
2957 if (FormatStr == "%s" && CI->arg_size() > 1) { in optimizePrintFString()
2959 if (!getConstantStringInfo(CI->getOperand(1), OperandStr)) in optimizePrintFString()
2963 return (Value *)CI; in optimizePrintFString()
2970 return copyFlags(*CI, emitPutChar(IntChar, B, TLI)); in optimizePrintFString()
2976 return copyFlags(*CI, emitPutS(GV, B, TLI)); in optimizePrintFString()
2988 return copyFlags(*CI, emitPutS(GV, B, TLI)); in optimizePrintFString()
2993 if (FormatStr == "%c" && CI->arg_size() > 1 && in optimizePrintFString()
2994 CI->getArgOperand(1)->getType()->isIntegerTy()) { in optimizePrintFString()
2997 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false); in optimizePrintFString()
2998 return copyFlags(*CI, emitPutChar(IntChar, B, TLI)); in optimizePrintFString()
3002 if (FormatStr == "%s\n" && CI->arg_size() > 1 && in optimizePrintFString()
3003 CI->getArgOperand(1)->getType()->isPointerTy()) in optimizePrintFString()
3004 return copyFlags(*CI, emitPutS(CI->getArgOperand(1), B, TLI)); in optimizePrintFString()
3008 Value *LibCallSimplifier::optimizePrintF(CallInst *CI, IRBuilderBase &B) { in optimizePrintF() argument
3010 Module *M = CI->getModule(); in optimizePrintF()
3011 Function *Callee = CI->getCalledFunction(); in optimizePrintF()
3013 if (Value *V = optimizePrintFString(CI, B)) { in optimizePrintF()
3017 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePrintF()
3022 !callHasFloatingPointArgument(CI)) { in optimizePrintF()
3025 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
3034 !callHasFP128Argument(CI)) { in optimizePrintF()
3037 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
3046 Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, in optimizeSPrintFString() argument
3050 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeSPrintFString()
3054 Value *Dest = CI->getArgOperand(0); in optimizeSPrintFString()
3055 if (CI->arg_size() == 2) { in optimizeSPrintFString()
3063 Dest, Align(1), CI->getArgOperand(1), Align(1), in optimizeSPrintFString()
3064 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeSPrintFString()
3066 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSPrintFString()
3071 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3) in optimizeSPrintFString()
3077 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeSPrintFString()
3079 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char"); in optimizeSPrintFString()
3085 return ConstantInt::get(CI->getType(), 1); in optimizeSPrintFString()
3091 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeSPrintFString()
3094 if (CI->use_empty()) in optimizeSPrintFString()
3096 return copyFlags(*CI, emitStrCpy(Dest, CI->getArgOperand(2), B, TLI)); in optimizeSPrintFString()
3098 uint64_t SrcLen = GetStringLength(CI->getArgOperand(2)); in optimizeSPrintFString()
3101 Dest, Align(1), CI->getArgOperand(2), Align(1), in optimizeSPrintFString()
3102 ConstantInt::get(DL.getIntPtrType(CI->getContext()), SrcLen)); in optimizeSPrintFString()
3104 return ConstantInt::get(CI->getType(), SrcLen - 1); in optimizeSPrintFString()
3105 } else if (Value *V = emitStpCpy(Dest, CI->getArgOperand(2), B, TLI)) { in optimizeSPrintFString()
3108 return B.CreateIntCast(PtrDiff, CI->getType(), false); in optimizeSPrintFString()
3111 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeSPrintFString()
3112 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeSPrintFString()
3117 Value *Len = emitStrLen(CI->getArgOperand(2), B, DL, TLI); in optimizeSPrintFString()
3122 B.CreateMemCpy(Dest, Align(1), CI->getArgOperand(2), Align(1), IncLen); in optimizeSPrintFString()
3125 return B.CreateIntCast(Len, CI->getType(), false); in optimizeSPrintFString()
3130 Value *LibCallSimplifier::optimizeSPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSPrintF() argument
3131 Module *M = CI->getModule(); in optimizeSPrintF()
3132 Function *Callee = CI->getCalledFunction(); in optimizeSPrintF()
3134 if (Value *V = optimizeSPrintFString(CI, B)) { in optimizeSPrintF()
3138 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeSPrintF()
3143 !callHasFloatingPointArgument(CI)) { in optimizeSPrintF()
3146 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
3155 !callHasFP128Argument(CI)) { in optimizeSPrintF()
3158 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
3172 Value *LibCallSimplifier::emitSnPrintfMemCpy(CallInst *CI, Value *StrArg, in emitSnPrintfMemCpy() argument
3185 Value *StrLen = ConstantInt::get(CI->getType(), Str.size()); in emitSnPrintfMemCpy()
3199 Value *DstArg = CI->getArgOperand(0); in emitSnPrintfMemCpy()
3203 *CI, in emitSnPrintfMemCpy()
3206 ConstantInt::get(DL.getIntPtrType(CI->getContext()), NCopy))); in emitSnPrintfMemCpy()
3221 Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI, in optimizeSnPrintFString() argument
3224 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeSnPrintFString()
3235 Value *DstArg = CI->getArgOperand(0); in optimizeSnPrintFString()
3236 Value *FmtArg = CI->getArgOperand(2); in optimizeSnPrintFString()
3244 if (CI->arg_size() == 3) { in optimizeSnPrintFString()
3250 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr, N, B); in optimizeSnPrintFString()
3255 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() != 4) in optimizeSnPrintFString()
3265 return emitSnPrintfMemCpy(CI, nullptr, CharStr, N, B); in optimizeSnPrintFString()
3269 if (!CI->getArgOperand(3)->getType()->isIntegerTy()) in optimizeSnPrintFString()
3271 Value *V = B.CreateTrunc(CI->getArgOperand(3), B.getInt8Ty(), "char"); in optimizeSnPrintFString()
3276 return ConstantInt::get(CI->getType(), 1); in optimizeSnPrintFString()
3282 Value *StrArg = CI->getArgOperand(3); in optimizeSnPrintFString()
3288 return emitSnPrintfMemCpy(CI, StrArg, Str, N, B); in optimizeSnPrintFString()
3291 Value *LibCallSimplifier::optimizeSnPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSnPrintF() argument
3292 if (Value *V = optimizeSnPrintFString(CI, B)) { in optimizeSnPrintF()
3296 if (isKnownNonZero(CI->getOperand(1), DL)) in optimizeSnPrintF()
3297 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeSnPrintF()
3301 Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI, in optimizeFPrintFString() argument
3303 optimizeErrorReporting(CI, B, 0); in optimizeFPrintFString()
3307 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeFPrintFString()
3313 if (!CI->use_empty()) in optimizeFPrintFString()
3317 if (CI->arg_size() == 2) { in optimizeFPrintFString()
3322 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeFPrintFString()
3323 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeFPrintFString()
3325 *CI, emitFWrite(CI->getArgOperand(1), in optimizeFPrintFString()
3327 CI->getArgOperand(0), B, DL, TLI)); in optimizeFPrintFString()
3332 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3) in optimizeFPrintFString()
3338 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeFPrintFString()
3341 Value *V = B.CreateIntCast(CI->getArgOperand(2), IntTy, /*isSigned*/ true, in optimizeFPrintFString()
3343 return copyFlags(*CI, emitFPutC(V, CI->getArgOperand(0), B, TLI)); in optimizeFPrintFString()
3348 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeFPrintFString()
3351 *CI, emitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI)); in optimizeFPrintFString()
3356 Value *LibCallSimplifier::optimizeFPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeFPrintF() argument
3357 Module *M = CI->getModule(); in optimizeFPrintF()
3358 Function *Callee = CI->getCalledFunction(); in optimizeFPrintF()
3360 if (Value *V = optimizeFPrintFString(CI, B)) { in optimizeFPrintF()
3367 !callHasFloatingPointArgument(CI)) { in optimizeFPrintF()
3370 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
3379 !callHasFP128Argument(CI)) { in optimizeFPrintF()
3383 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
3392 Value *LibCallSimplifier::optimizeFWrite(CallInst *CI, IRBuilderBase &B) { in optimizeFWrite() argument
3393 optimizeErrorReporting(CI, B, 3); in optimizeFWrite()
3396 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeFWrite()
3397 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeFWrite()
3403 return ConstantInt::get(CI->getType(), 0); in optimizeFWrite()
3407 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) in optimizeFWrite()
3408 Value *Char = B.CreateLoad(B.getInt8Ty(), CI->getArgOperand(0), "char"); in optimizeFWrite()
3411 Value *NewCI = emitFPutC(Cast, CI->getArgOperand(3), B, TLI); in optimizeFWrite()
3412 return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr; in optimizeFWrite()
3419 Value *LibCallSimplifier::optimizeFPuts(CallInst *CI, IRBuilderBase &B) { in optimizeFPuts() argument
3420 optimizeErrorReporting(CI, B, 1); in optimizeFPuts()
3424 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeFPuts()
3425 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeFPuts()
3431 if (!CI->use_empty()) in optimizeFPuts()
3435 uint64_t Len = GetStringLength(CI->getArgOperand(0)); in optimizeFPuts()
3440 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeFPuts()
3441 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeFPuts()
3443 *CI, in optimizeFPuts()
3444 emitFWrite(CI->getArgOperand(0), in optimizeFPuts()
3446 CI->getArgOperand(1), B, DL, TLI)); in optimizeFPuts()
3449 Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilderBase &B) { in optimizePuts() argument
3450 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePuts()
3451 if (!CI->use_empty()) in optimizePuts()
3457 if (getConstantStringInfo(CI->getArgOperand(0), Str) && Str.empty()) { in optimizePuts()
3460 Type *IntTy = CI->getType(); in optimizePuts()
3461 return copyFlags(*CI, emitPutChar(ConstantInt::get(IntTy, '\n'), B, TLI)); in optimizePuts()
3467 Value *LibCallSimplifier::optimizeBCopy(CallInst *CI, IRBuilderBase &B) { in optimizeBCopy() argument
3469 return copyFlags(*CI, B.CreateMemMove(CI->getArgOperand(1), Align(1), in optimizeBCopy()
3470 CI->getArgOperand(0), Align(1), in optimizeBCopy()
3471 CI->getArgOperand(2))); in optimizeBCopy()
3480 Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI, in optimizeStringMemoryLibCall() argument
3482 Module *M = CI->getModule(); in optimizeStringMemoryLibCall()
3484 Function *Callee = CI->getCalledFunction(); in optimizeStringMemoryLibCall()
3490 TargetLibraryInfoImpl::isCallingConvCCompatible(CI)) && in optimizeStringMemoryLibCall()
3494 return optimizeStrCat(CI, Builder); in optimizeStringMemoryLibCall()
3496 return optimizeStrNCat(CI, Builder); in optimizeStringMemoryLibCall()
3498 return optimizeStrChr(CI, Builder); in optimizeStringMemoryLibCall()
3500 return optimizeStrRChr(CI, Builder); in optimizeStringMemoryLibCall()
3502 return optimizeStrCmp(CI, Builder); in optimizeStringMemoryLibCall()
3504 return optimizeStrNCmp(CI, Builder); in optimizeStringMemoryLibCall()
3506 return optimizeStrCpy(CI, Builder); in optimizeStringMemoryLibCall()
3508 return optimizeStpCpy(CI, Builder); in optimizeStringMemoryLibCall()
3510 return optimizeStrLCpy(CI, Builder); in optimizeStringMemoryLibCall()
3512 return optimizeStringNCpy(CI, /*RetEnd=*/true, Builder); in optimizeStringMemoryLibCall()
3514 return optimizeStringNCpy(CI, /*RetEnd=*/false, Builder); in optimizeStringMemoryLibCall()
3516 return optimizeStrLen(CI, Builder); in optimizeStringMemoryLibCall()
3518 return optimizeStrNLen(CI, Builder); in optimizeStringMemoryLibCall()
3520 return optimizeStrPBrk(CI, Builder); in optimizeStringMemoryLibCall()
3522 return optimizeStrNDup(CI, Builder); in optimizeStringMemoryLibCall()
3530 return optimizeStrTo(CI, Builder); in optimizeStringMemoryLibCall()
3532 return optimizeStrSpn(CI, Builder); in optimizeStringMemoryLibCall()
3534 return optimizeStrCSpn(CI, Builder); in optimizeStringMemoryLibCall()
3536 return optimizeStrStr(CI, Builder); in optimizeStringMemoryLibCall()
3538 return optimizeMemChr(CI, Builder); in optimizeStringMemoryLibCall()
3540 return optimizeMemRChr(CI, Builder); in optimizeStringMemoryLibCall()
3542 return optimizeBCmp(CI, Builder); in optimizeStringMemoryLibCall()
3544 return optimizeMemCmp(CI, Builder); in optimizeStringMemoryLibCall()
3546 return optimizeMemCpy(CI, Builder); in optimizeStringMemoryLibCall()
3548 return optimizeMemCCpy(CI, Builder); in optimizeStringMemoryLibCall()
3550 return optimizeMemPCpy(CI, Builder); in optimizeStringMemoryLibCall()
3552 return optimizeMemMove(CI, Builder); in optimizeStringMemoryLibCall()
3554 return optimizeMemSet(CI, Builder); in optimizeStringMemoryLibCall()
3556 return optimizeRealloc(CI, Builder); in optimizeStringMemoryLibCall()
3558 return optimizeWcslen(CI, Builder); in optimizeStringMemoryLibCall()
3560 return optimizeBCopy(CI, Builder); in optimizeStringMemoryLibCall()
3569 return optimizeNew(CI, Builder, Func); in optimizeStringMemoryLibCall()
3577 Value *LibCallSimplifier::optimizeFloatingPointLibCall(CallInst *CI, in optimizeFloatingPointLibCall() argument
3580 const Module *M = CI->getModule(); in optimizeFloatingPointLibCall()
3583 if (CI->isStrictFP()) in optimizeFloatingPointLibCall()
3586 if (Value *V = optimizeTrigReflections(CI, Func, Builder)) in optimizeFloatingPointLibCall()
3592 return optimizeSinCosPi(CI, /*IsSin*/true, Builder); in optimizeFloatingPointLibCall()
3595 return optimizeSinCosPi(CI, /*IsSin*/false, Builder); in optimizeFloatingPointLibCall()
3599 return optimizePow(CI, Builder); in optimizeFloatingPointLibCall()
3603 return optimizeExp2(CI, Builder); in optimizeFloatingPointLibCall()
3607 return replaceUnaryCall(CI, Builder, Intrinsic::fabs); in optimizeFloatingPointLibCall()
3611 return optimizeSqrt(CI, Builder); in optimizeFloatingPointLibCall()
3627 return optimizeLog(CI, Builder); in optimizeFloatingPointLibCall()
3631 return optimizeTan(CI, Builder); in optimizeFloatingPointLibCall()
3633 return replaceUnaryCall(CI, Builder, Intrinsic::ceil); in optimizeFloatingPointLibCall()
3635 return replaceUnaryCall(CI, Builder, Intrinsic::floor); in optimizeFloatingPointLibCall()
3637 return replaceUnaryCall(CI, Builder, Intrinsic::round); in optimizeFloatingPointLibCall()
3639 return replaceUnaryCall(CI, Builder, Intrinsic::roundeven); in optimizeFloatingPointLibCall()
3641 return replaceUnaryCall(CI, Builder, Intrinsic::nearbyint); in optimizeFloatingPointLibCall()
3643 return replaceUnaryCall(CI, Builder, Intrinsic::rint); in optimizeFloatingPointLibCall()
3645 return replaceUnaryCall(CI, Builder, Intrinsic::trunc); in optimizeFloatingPointLibCall()
3661 if (UnsafeFPShrink && hasFloatVersion(M, CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3662 return optimizeUnaryDoubleFP(CI, Builder, TLI, true); in optimizeFloatingPointLibCall()
3665 if (hasFloatVersion(M, CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3666 return optimizeBinaryDoubleFP(CI, Builder, TLI); in optimizeFloatingPointLibCall()
3674 return optimizeFMinFMax(CI, Builder); in optimizeFloatingPointLibCall()
3678 return optimizeCAbs(CI, Builder); in optimizeFloatingPointLibCall()
3684 Value *LibCallSimplifier::optimizeCall(CallInst *CI, IRBuilderBase &Builder) { in optimizeCall() argument
3685 Module *M = CI->getModule(); in optimizeCall()
3686 assert(!CI->isMustTailCall() && "These transforms aren't musttail safe."); in optimizeCall()
3691 if (CI->isNoBuiltin()) in optimizeCall()
3695 Function *Callee = CI->getCalledFunction(); in optimizeCall()
3696 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
3699 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
3709 else if (isa<FPMathOperator>(CI) && CI->isFast()) in optimizeCall()
3713 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) { in optimizeCall()
3720 return optimizePow(CI, Builder); in optimizeCall()
3722 return optimizeExp2(CI, Builder); in optimizeCall()
3726 return optimizeLog(CI, Builder); in optimizeCall()
3728 return optimizeSqrt(CI, Builder); in optimizeCall()
3730 return optimizeMemSet(CI, Builder); in optimizeCall()
3732 return optimizeMemCpy(CI, Builder); in optimizeCall()
3734 return optimizeMemMove(CI, Builder); in optimizeCall()
3742 FortifiedSimplifier.optimizeCall(CI, Builder)) in optimizeCall()
3750 if (Value *V = optimizeStringMemoryLibCall(CI, Builder)) in optimizeCall()
3752 if (Value *V = optimizeFloatingPointLibCall(CI, Func, Builder)) in optimizeCall()
3758 return optimizeFFS(CI, Builder); in optimizeCall()
3762 return optimizeFls(CI, Builder); in optimizeCall()
3766 return optimizeAbs(CI, Builder); in optimizeCall()
3768 return optimizeIsDigit(CI, Builder); in optimizeCall()
3770 return optimizeIsAscii(CI, Builder); in optimizeCall()
3772 return optimizeToAscii(CI, Builder); in optimizeCall()
3776 return optimizeAtoi(CI, Builder); in optimizeCall()
3779 return optimizeStrToInt(CI, Builder, /*AsSigned=*/true); in optimizeCall()
3782 return optimizeStrToInt(CI, Builder, /*AsSigned=*/false); in optimizeCall()
3784 return optimizePrintF(CI, Builder); in optimizeCall()
3786 return optimizeSPrintF(CI, Builder); in optimizeCall()
3788 return optimizeSnPrintF(CI, Builder); in optimizeCall()
3790 return optimizeFPrintF(CI, Builder); in optimizeCall()
3792 return optimizeFWrite(CI, Builder); in optimizeCall()
3794 return optimizeFPuts(CI, Builder); in optimizeCall()
3796 return optimizePuts(CI, Builder); in optimizeCall()
3798 return optimizeErrorReporting(CI, Builder); in optimizeCall()
3801 return optimizeErrorReporting(CI, Builder, 0); in optimizeCall()
3863 CallInst *CI, unsigned ObjSizeOp, std::optional<unsigned> SizeOp, in isFortifiedCallFoldable() argument
3868 ConstantInt *Flag = dyn_cast<ConstantInt>(CI->getArgOperand(*FlagOp)); in isFortifiedCallFoldable()
3873 if (SizeOp && CI->getArgOperand(ObjSizeOp) == CI->getArgOperand(*SizeOp)) in isFortifiedCallFoldable()
3877 dyn_cast<ConstantInt>(CI->getArgOperand(ObjSizeOp))) { in isFortifiedCallFoldable()
3884 uint64_t Len = GetStringLength(CI->getArgOperand(*StrOp)); in isFortifiedCallFoldable()
3888 annotateDereferenceableBytes(CI, *StrOp, Len); in isFortifiedCallFoldable()
3896 dyn_cast<ConstantInt>(CI->getArgOperand(*SizeOp))) in isFortifiedCallFoldable()
3903 Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI, in optimizeMemCpyChk() argument
3905 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemCpyChk()
3907 B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemCpyChk()
3908 Align(1), CI->getArgOperand(2)); in optimizeMemCpyChk()
3909 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemCpyChk()
3910 return CI->getArgOperand(0); in optimizeMemCpyChk()
3915 Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI, in optimizeMemMoveChk() argument
3917 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemMoveChk()
3919 B.CreateMemMove(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemMoveChk()
3920 Align(1), CI->getArgOperand(2)); in optimizeMemMoveChk()
3921 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemMoveChk()
3922 return CI->getArgOperand(0); in optimizeMemMoveChk()
3927 Value *FortifiedLibCallSimplifier::optimizeMemSetChk(CallInst *CI, in optimizeMemSetChk() argument
3929 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemSetChk()
3930 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSetChk()
3931 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, in optimizeMemSetChk()
3932 CI->getArgOperand(2), Align(1)); in optimizeMemSetChk()
3933 mergeAttributesAndFlags(NewCI, *CI); in optimizeMemSetChk()
3934 return CI->getArgOperand(0); in optimizeMemSetChk()
3939 Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(CallInst *CI, in optimizeMemPCpyChk() argument
3941 const DataLayout &DL = CI->getModule()->getDataLayout(); in optimizeMemPCpyChk()
3942 if (isFortifiedCallFoldable(CI, 3, 2)) in optimizeMemPCpyChk()
3943 if (Value *Call = emitMemPCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemPCpyChk()
3944 CI->getArgOperand(2), B, DL, TLI)) { in optimizeMemPCpyChk()
3945 return mergeAttributesAndFlags(cast<CallInst>(Call), *CI); in optimizeMemPCpyChk()
3950 Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(CallInst *CI, in optimizeStrpCpyChk() argument
3953 const DataLayout &DL = CI->getModule()->getDataLayout(); in optimizeStrpCpyChk()
3954 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1), in optimizeStrpCpyChk()
3955 *ObjSize = CI->getArgOperand(2); in optimizeStrpCpyChk()
3968 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) { in optimizeStrpCpyChk()
3970 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI)); in optimizeStrpCpyChk()
3972 return copyFlags(*CI, emitStpCpy(Dst, Src, B, TLI)); in optimizeStrpCpyChk()
3981 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrpCpyChk()
3985 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule()); in optimizeStrpCpyChk()
3986 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits); in optimizeStrpCpyChk()
3994 return copyFlags(*CI, cast<CallInst>(Ret)); in optimizeStrpCpyChk()
3997 Value *FortifiedLibCallSimplifier::optimizeStrLenChk(CallInst *CI, in optimizeStrLenChk() argument
3999 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0)) in optimizeStrLenChk()
4000 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B, in optimizeStrLenChk()
4001 CI->getModule()->getDataLayout(), TLI)); in optimizeStrLenChk()
4005 Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(CallInst *CI, in optimizeStrpNCpyChk() argument
4008 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeStrpNCpyChk()
4010 return copyFlags(*CI, in optimizeStrpNCpyChk()
4011 emitStrNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
4012 CI->getArgOperand(2), B, TLI)); in optimizeStrpNCpyChk()
4014 return copyFlags(*CI, in optimizeStrpNCpyChk()
4015 emitStpNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
4016 CI->getArgOperand(2), B, TLI)); in optimizeStrpNCpyChk()
4022 Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(CallInst *CI, in optimizeMemCCpyChk() argument
4024 if (isFortifiedCallFoldable(CI, 4, 3)) in optimizeMemCCpyChk()
4026 *CI, emitMemCCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemCCpyChk()
4027 CI->getArgOperand(2), CI->getArgOperand(3), B, TLI)); in optimizeMemCCpyChk()
4032 Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(CallInst *CI, in optimizeSNPrintfChk() argument
4034 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) { in optimizeSNPrintfChk()
4035 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 5)); in optimizeSNPrintfChk()
4036 return copyFlags(*CI, in optimizeSNPrintfChk()
4037 emitSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeSNPrintfChk()
4038 CI->getArgOperand(4), VariadicArgs, B, TLI)); in optimizeSNPrintfChk()
4044 Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(CallInst *CI, in optimizeSPrintfChk() argument
4046 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) { in optimizeSPrintfChk()
4047 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 4)); in optimizeSPrintfChk()
4048 return copyFlags(*CI, in optimizeSPrintfChk()
4049 emitSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), in optimizeSPrintfChk()
4056 Value *FortifiedLibCallSimplifier::optimizeStrCatChk(CallInst *CI, in optimizeStrCatChk() argument
4058 if (isFortifiedCallFoldable(CI, 2)) in optimizeStrCatChk()
4060 *CI, emitStrCat(CI->getArgOperand(0), CI->getArgOperand(1), B, TLI)); in optimizeStrCatChk()
4065 Value *FortifiedLibCallSimplifier::optimizeStrLCat(CallInst *CI, in optimizeStrLCat() argument
4067 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCat()
4068 return copyFlags(*CI, in optimizeStrLCat()
4069 emitStrLCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCat()
4070 CI->getArgOperand(2), B, TLI)); in optimizeStrLCat()
4075 Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(CallInst *CI, in optimizeStrNCatChk() argument
4077 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrNCatChk()
4078 return copyFlags(*CI, in optimizeStrNCatChk()
4079 emitStrNCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrNCatChk()
4080 CI->getArgOperand(2), B, TLI)); in optimizeStrNCatChk()
4085 Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(CallInst *CI, in optimizeStrLCpyChk() argument
4087 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCpyChk()
4088 return copyFlags(*CI, in optimizeStrLCpyChk()
4089 emitStrLCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCpyChk()
4090 CI->getArgOperand(2), B, TLI)); in optimizeStrLCpyChk()
4095 Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(CallInst *CI, in optimizeVSNPrintfChk() argument
4097 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) in optimizeVSNPrintfChk()
4099 *CI, emitVSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeVSNPrintfChk()
4100 CI->getArgOperand(4), CI->getArgOperand(5), B, TLI)); in optimizeVSNPrintfChk()
4105 Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(CallInst *CI, in optimizeVSPrintfChk() argument
4107 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) in optimizeVSPrintfChk()
4108 return copyFlags(*CI, in optimizeVSPrintfChk()
4109 emitVSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), in optimizeVSPrintfChk()
4110 CI->getArgOperand(4), B, TLI)); in optimizeVSPrintfChk()
4115 Value *FortifiedLibCallSimplifier::optimizeCall(CallInst *CI, in optimizeCall() argument
4131 Function *Callee = CI->getCalledFunction(); in optimizeCall()
4132 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
4135 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
4151 return optimizeMemCpyChk(CI, Builder); in optimizeCall()
4153 return optimizeMemPCpyChk(CI, Builder); in optimizeCall()
4155 return optimizeMemMoveChk(CI, Builder); in optimizeCall()
4157 return optimizeMemSetChk(CI, Builder); in optimizeCall()
4160 return optimizeStrpCpyChk(CI, Builder, Func); in optimizeCall()
4162 return optimizeStrLenChk(CI, Builder); in optimizeCall()
4165 return optimizeStrpNCpyChk(CI, Builder, Func); in optimizeCall()
4167 return optimizeMemCCpyChk(CI, Builder); in optimizeCall()
4169 return optimizeSNPrintfChk(CI, Builder); in optimizeCall()
4171 return optimizeSPrintfChk(CI, Builder); in optimizeCall()
4173 return optimizeStrCatChk(CI, Builder); in optimizeCall()
4175 return optimizeStrLCat(CI, Builder); in optimizeCall()
4177 return optimizeStrNCatChk(CI, Builder); in optimizeCall()
4179 return optimizeStrLCpyChk(CI, Builder); in optimizeCall()
4181 return optimizeVSNPrintfChk(CI, Builder); in optimizeCall()
4183 return optimizeVSPrintfChk(CI, Builder); in optimizeCall()