Lines Matching refs:CI
71 static bool callHasFloatingPointArgument(const CallInst *CI) { in callHasFloatingPointArgument() argument
72 return any_of(CI->operands(), [](const Use &OI) { in callHasFloatingPointArgument()
77 static bool callHasFP128Argument(const CallInst *CI) { in callHasFP128Argument() argument
78 return any_of(CI->operands(), [](const Use &OI) { in callHasFP128Argument()
83 static Value *convertStrToNumber(CallInst *CI, StringRef &Str, int64_t Base) { in convertStrToNumber() argument
102 if (!isIntN(CI->getType()->getPrimitiveSizeInBits(), Result)) in convertStrToNumber()
105 return ConstantInt::get(CI->getType(), Result); in convertStrToNumber()
120 static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, in canTransformToMemCmp() argument
122 if (!isOnlyUsedInComparisonWithZero(CI)) in canTransformToMemCmp()
128 if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory)) in canTransformToMemCmp()
134 static void annotateDereferenceableBytes(CallInst *CI, in annotateDereferenceableBytes() argument
137 const Function *F = CI->getCaller(); in annotateDereferenceableBytes()
142 unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateDereferenceableBytes()
144 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
145 DerefBytes = std::max(CI->getDereferenceableOrNullBytes( in annotateDereferenceableBytes()
149 if (CI->getDereferenceableBytes(ArgNo + AttributeList::FirstArgIndex) < in annotateDereferenceableBytes()
151 CI->removeParamAttr(ArgNo, Attribute::Dereferenceable); in annotateDereferenceableBytes()
153 CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateDereferenceableBytes()
154 CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull); in annotateDereferenceableBytes()
155 CI->addParamAttr(ArgNo, Attribute::getWithDereferenceableBytes( in annotateDereferenceableBytes()
156 CI->getContext(), DerefBytes)); in annotateDereferenceableBytes()
161 static void annotateNonNullNoUndefBasedOnAccess(CallInst *CI, in annotateNonNullNoUndefBasedOnAccess() argument
163 Function *F = CI->getCaller(); in annotateNonNullNoUndefBasedOnAccess()
168 if (!CI->paramHasAttr(ArgNo, Attribute::NoUndef)) in annotateNonNullNoUndefBasedOnAccess()
169 CI->addParamAttr(ArgNo, Attribute::NoUndef); in annotateNonNullNoUndefBasedOnAccess()
171 if (CI->paramHasAttr(ArgNo, Attribute::NonNull)) in annotateNonNullNoUndefBasedOnAccess()
173 unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); in annotateNonNullNoUndefBasedOnAccess()
177 CI->addParamAttr(ArgNo, Attribute::NonNull); in annotateNonNullNoUndefBasedOnAccess()
178 annotateDereferenceableBytes(CI, ArgNo, 1); in annotateNonNullNoUndefBasedOnAccess()
182 static void annotateNonNullAndDereferenceable(CallInst *CI, ArrayRef<unsigned> ArgNos, in annotateNonNullAndDereferenceable() argument
185 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
186 annotateDereferenceableBytes(CI, ArgNos, LenC->getZExtValue()); in annotateNonNullAndDereferenceable()
188 annotateNonNullNoUndefBasedOnAccess(CI, ArgNos); in annotateNonNullAndDereferenceable()
193 annotateDereferenceableBytes(CI, ArgNos, DerefMin); in annotateNonNullAndDereferenceable()
202 Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrCat() argument
204 Value *Dst = CI->getArgOperand(0); in optimizeStrCat()
205 Value *Src = CI->getArgOperand(1); in optimizeStrCat()
206 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCat()
211 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCat()
244 Value *LibCallSimplifier::optimizeStrNCat(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCat() argument
246 Value *Dst = CI->getArgOperand(0); in optimizeStrNCat()
247 Value *Src = CI->getArgOperand(1); in optimizeStrNCat()
248 Value *Size = CI->getArgOperand(2); in optimizeStrNCat()
250 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNCat()
252 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrNCat()
268 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStrNCat()
287 Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrChr() argument
288 Function *Callee = CI->getCalledFunction(); in optimizeStrChr()
290 Value *SrcStr = CI->getArgOperand(0); in optimizeStrChr()
291 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrChr()
295 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrChr()
299 annotateDereferenceableBytes(CI, 0, Len); in optimizeStrChr()
305 return emitMemChr(SrcStr, CI->getArgOperand(1), // include nul. in optimizeStrChr()
306 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len), in optimizeStrChr()
326 return Constant::getNullValue(CI->getType()); in optimizeStrChr()
332 Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilderBase &B) { in optimizeStrRChr() argument
333 Value *SrcStr = CI->getArgOperand(0); in optimizeStrRChr()
334 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrRChr()
335 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrRChr()
354 return Constant::getNullValue(CI->getType()); in optimizeStrRChr()
360 Value *LibCallSimplifier::optimizeStrCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrCmp() argument
361 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); in optimizeStrCmp()
363 return ConstantInt::get(CI->getType(), 0); in optimizeStrCmp()
371 return ConstantInt::get(CI->getType(), Str1.compare(Str2)); in optimizeStrCmp()
375 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrCmp()
379 CI->getType()); in optimizeStrCmp()
384 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrCmp()
387 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrCmp()
391 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeStrCmp()
398 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrCmp()
401 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), B, DL, in optimizeStrCmp()
404 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrCmp()
407 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), B, DL, in optimizeStrCmp()
411 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCmp()
415 Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCmp() argument
416 Value *Str1P = CI->getArgOperand(0); in optimizeStrNCmp()
417 Value *Str2P = CI->getArgOperand(1); in optimizeStrNCmp()
418 Value *Size = CI->getArgOperand(2); in optimizeStrNCmp()
420 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
423 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrNCmp()
432 return ConstantInt::get(CI->getType(), 0); in optimizeStrNCmp()
445 return ConstantInt::get(CI->getType(), SubStr1.compare(SubStr2)); in optimizeStrNCmp()
450 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType())); in optimizeStrNCmp()
454 CI->getType()); in optimizeStrNCmp()
458 annotateDereferenceableBytes(CI, 0, Len1); in optimizeStrNCmp()
461 annotateDereferenceableBytes(CI, 1, Len2); in optimizeStrNCmp()
466 if (canTransformToMemCmp(CI, Str1P, Len2, DL)) in optimizeStrNCmp()
469 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len2), B, DL, in optimizeStrNCmp()
473 if (canTransformToMemCmp(CI, Str2P, Len1, DL)) in optimizeStrNCmp()
476 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len1), B, DL, in optimizeStrNCmp()
483 Value *LibCallSimplifier::optimizeStrNDup(CallInst *CI, IRBuilderBase &B) { in optimizeStrNDup() argument
484 Value *Src = CI->getArgOperand(0); in optimizeStrNDup()
485 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeStrNDup()
488 annotateDereferenceableBytes(CI, 0, SrcLen); in optimizeStrNDup()
496 Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrCpy() argument
497 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStrCpy()
501 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrCpy()
505 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrCpy()
513 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len)); in optimizeStrCpy()
514 NewCI->setAttributes(CI->getAttributes()); in optimizeStrCpy()
520 Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStpCpy() argument
521 Function *Callee = CI->getCalledFunction(); in optimizeStpCpy()
522 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); in optimizeStpCpy()
531 annotateDereferenceableBytes(CI, 1, Len); in optimizeStpCpy()
543 NewCI->setAttributes(CI->getAttributes()); in optimizeStpCpy()
549 Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilderBase &B) { in optimizeStrNCpy() argument
550 Function *Callee = CI->getCalledFunction(); in optimizeStrNCpy()
551 Value *Dst = CI->getArgOperand(0); in optimizeStrNCpy()
552 Value *Src = CI->getArgOperand(1); in optimizeStrNCpy()
553 Value *Size = CI->getArgOperand(2); in optimizeStrNCpy()
554 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrNCpy()
556 annotateNonNullNoUndefBasedOnAccess(CI, 1); in optimizeStrNCpy()
571 annotateDereferenceableBytes(CI, 1, SrcLen); in optimizeStrNCpy()
580 CI->getAttributes().getParamAttributes(0).getAlignment().valueOrOne(); in optimizeStrNCpy()
582 AttrBuilder ArgAttrs(CI->getAttributes().getParamAttributes(0)); in optimizeStrNCpy()
584 CI->getContext(), 0, ArgAttrs)); in optimizeStrNCpy()
606 NewCI->setAttributes(CI->getAttributes()); in optimizeStrNCpy()
612 Value *LibCallSimplifier::optimizeStringLength(CallInst *CI, IRBuilderBase &B, in optimizeStringLength() argument
614 Value *Src = CI->getArgOperand(0); in optimizeStringLength()
618 return ConstantInt::get(CI->getType(), Len - 1); in optimizeStringLength()
652 KnownBits Known = computeKnownBits(Offset, DL, 0, nullptr, CI, nullptr); in optimizeStringLength()
670 Offset = B.CreateSExtOrTrunc(Offset, CI->getType()); in optimizeStringLength()
671 return B.CreateSub(ConstantInt::get(CI->getType(), NullTermIdx), in optimizeStringLength()
683 return OptimizationRemark("instcombine", "simplify-libcalls", CI) in optimizeStringLength()
687 ConstantInt::get(CI->getType(), LenTrue - 1), in optimizeStringLength()
688 ConstantInt::get(CI->getType(), LenFalse - 1)); in optimizeStringLength()
694 if (isOnlyUsedInZeroEqualityComparison(CI)) in optimizeStringLength()
696 CI->getType()); in optimizeStringLength()
701 Value *LibCallSimplifier::optimizeStrLen(CallInst *CI, IRBuilderBase &B) { in optimizeStrLen() argument
702 if (Value *V = optimizeStringLength(CI, B, 8)) in optimizeStrLen()
704 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeStrLen()
708 Value *LibCallSimplifier::optimizeWcslen(CallInst *CI, IRBuilderBase &B) { in optimizeWcslen() argument
709 Module &M = *CI->getModule(); in optimizeWcslen()
715 return optimizeStringLength(CI, B, WCharSize); in optimizeWcslen()
718 Value *LibCallSimplifier::optimizeStrPBrk(CallInst *CI, IRBuilderBase &B) { in optimizeStrPBrk() argument
720 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrPBrk()
721 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrPBrk()
726 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
732 return Constant::getNullValue(CI->getType()); in optimizeStrPBrk()
734 return B.CreateGEP(B.getInt8Ty(), CI->getArgOperand(0), B.getInt64(I), in optimizeStrPBrk()
740 return emitStrChr(CI->getArgOperand(0), S2[0], B, TLI); in optimizeStrPBrk()
745 Value *LibCallSimplifier::optimizeStrTo(CallInst *CI, IRBuilderBase &B) { in optimizeStrTo() argument
746 Value *EndPtr = CI->getArgOperand(1); in optimizeStrTo()
750 CI->addParamAttr(0, Attribute::NoCapture); in optimizeStrTo()
756 Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrSpn() argument
758 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrSpn()
759 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrSpn()
764 return Constant::getNullValue(CI->getType()); in optimizeStrSpn()
771 return ConstantInt::get(CI->getType(), Pos); in optimizeStrSpn()
777 Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilderBase &B) { in optimizeStrCSpn() argument
779 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); in optimizeStrCSpn()
780 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); in optimizeStrCSpn()
784 return Constant::getNullValue(CI->getType()); in optimizeStrCSpn()
791 return ConstantInt::get(CI->getType(), Pos); in optimizeStrCSpn()
796 return emitStrLen(CI->getArgOperand(0), B, DL, TLI); in optimizeStrCSpn()
801 Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) { in optimizeStrStr() argument
803 if (CI->getArgOperand(0) == CI->getArgOperand(1)) in optimizeStrStr()
804 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); in optimizeStrStr()
807 if (isOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) { in optimizeStrStr()
808 Value *StrLen = emitStrLen(CI->getArgOperand(1), B, DL, TLI); in optimizeStrStr()
811 Value *StrNCmp = emitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrStr()
815 for (User *U : llvm::make_early_inc_range(CI->users())) { in optimizeStrStr()
822 return CI; in optimizeStrStr()
827 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr); in optimizeStrStr()
828 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr); in optimizeStrStr()
832 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); in optimizeStrStr()
839 return Constant::getNullValue(CI->getType()); in optimizeStrStr()
842 Value *Result = castToCStr(CI->getArgOperand(0), B); in optimizeStrStr()
845 return B.CreateBitCast(Result, CI->getType()); in optimizeStrStr()
850 Value *StrChr = emitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TLI); in optimizeStrStr()
851 return StrChr ? B.CreateBitCast(StrChr, CI->getType()) : nullptr; in optimizeStrStr()
854 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeStrStr()
858 Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemRChr() argument
859 if (isKnownNonZero(CI->getOperand(2), DL)) in optimizeMemRChr()
860 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeMemRChr()
864 Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) { in optimizeMemChr() argument
865 Value *SrcStr = CI->getArgOperand(0); in optimizeMemChr()
866 Value *Size = CI->getArgOperand(2); in optimizeMemChr()
867 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemChr()
868 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeMemChr()
874 return Constant::getNullValue(CI->getType()); in optimizeMemChr()
899 if (!CharC && !Str.empty() && isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemChr()
923 Value *C = B.CreateZExtOrTrunc(CI->getArgOperand(1), BitfieldC->getType()); in optimizeMemChr()
937 CI->getType()); in optimizeMemChr()
947 return Constant::getNullValue(CI->getType()); in optimizeMemChr()
953 static Value *optimizeMemCmpConstantSize(CallInst *CI, Value *LHS, Value *RHS, in optimizeMemCmpConstantSize() argument
957 return Constant::getNullValue(CI->getType()); in optimizeMemCmpConstantSize()
963 CI->getType(), "lhsv"); in optimizeMemCmpConstantSize()
966 CI->getType(), "rhsv"); in optimizeMemCmpConstantSize()
973 if (DL.isLegalInteger(Len * 8) && isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmpConstantSize()
974 IntegerType *IntType = IntegerType::get(CI->getContext(), Len * 8); in optimizeMemCmpConstantSize()
991 if ((LHSV || getKnownAlignment(LHS, DL, CI) >= PrefAlignment) && in optimizeMemCmpConstantSize()
992 (RHSV || getKnownAlignment(RHS, DL, CI) >= PrefAlignment)) { in optimizeMemCmpConstantSize()
1003 return B.CreateZExt(B.CreateICmpNE(LHSV, RHSV), CI->getType(), "memcmp"); in optimizeMemCmpConstantSize()
1023 return ConstantInt::get(CI->getType(), Ret); in optimizeMemCmpConstantSize()
1030 Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(CallInst *CI, in optimizeMemCmpBCmpCommon() argument
1032 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1); in optimizeMemCmpBCmpCommon()
1033 Value *Size = CI->getArgOperand(2); in optimizeMemCmpBCmpCommon()
1036 return Constant::getNullValue(CI->getType()); in optimizeMemCmpBCmpCommon()
1038 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCmpBCmpCommon()
1046 return Constant::getNullValue(CI->getType()); in optimizeMemCmpBCmpCommon()
1049 optimizeMemCmpConstantSize(CI, LHS, RHS, LenC->getZExtValue(), B, DL)) in optimizeMemCmpBCmpCommon()
1054 Value *LibCallSimplifier::optimizeMemCmp(CallInst *CI, IRBuilderBase &B) { in optimizeMemCmp() argument
1055 if (Value *V = optimizeMemCmpBCmpCommon(CI, B)) in optimizeMemCmp()
1061 if (TLI->has(LibFunc_bcmp) && isOnlyUsedInZeroEqualityComparison(CI)) { in optimizeMemCmp()
1062 Value *LHS = CI->getArgOperand(0); in optimizeMemCmp()
1063 Value *RHS = CI->getArgOperand(1); in optimizeMemCmp()
1064 Value *Size = CI->getArgOperand(2); in optimizeMemCmp()
1071 Value *LibCallSimplifier::optimizeBCmp(CallInst *CI, IRBuilderBase &B) { in optimizeBCmp() argument
1072 return optimizeMemCmpBCmpCommon(CI, B); in optimizeBCmp()
1075 Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCpy() argument
1076 Value *Size = CI->getArgOperand(2); in optimizeMemCpy()
1077 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemCpy()
1078 if (isa<IntrinsicInst>(CI)) in optimizeMemCpy()
1082 CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align(1), in optimizeMemCpy()
1083 CI->getArgOperand(1), Align(1), Size); in optimizeMemCpy()
1084 NewCI->setAttributes(CI->getAttributes()); in optimizeMemCpy()
1087 return CI->getArgOperand(0); in optimizeMemCpy()
1090 Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemCCpy() argument
1091 Value *Dst = CI->getArgOperand(0); in optimizeMemCCpy()
1092 Value *Src = CI->getArgOperand(1); in optimizeMemCCpy()
1093 ConstantInt *StopChar = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeMemCCpy()
1094 ConstantInt *N = dyn_cast<ConstantInt>(CI->getArgOperand(3)); in optimizeMemCCpy()
1096 if (CI->use_empty() && Dst == Src) in optimizeMemCCpy()
1101 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1114 B.CreateMemCpy(Dst, Align(1), Src, Align(1), CI->getArgOperand(3)); in optimizeMemCCpy()
1115 return Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1126 : Constant::getNullValue(CI->getType()); in optimizeMemCCpy()
1129 Value *LibCallSimplifier::optimizeMemPCpy(CallInst *CI, IRBuilderBase &B) { in optimizeMemPCpy() argument
1130 Value *Dst = CI->getArgOperand(0); in optimizeMemPCpy()
1131 Value *N = CI->getArgOperand(2); in optimizeMemPCpy()
1134 B.CreateMemCpy(Dst, Align(1), CI->getArgOperand(1), Align(1), N); in optimizeMemPCpy()
1138 NewCI->setAttributes(CI->getAttributes()); in optimizeMemPCpy()
1144 Value *LibCallSimplifier::optimizeMemMove(CallInst *CI, IRBuilderBase &B) { in optimizeMemMove() argument
1145 Value *Size = CI->getArgOperand(2); in optimizeMemMove()
1146 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL); in optimizeMemMove()
1147 if (isa<IntrinsicInst>(CI)) in optimizeMemMove()
1151 CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align(1), in optimizeMemMove()
1152 CI->getArgOperand(1), Align(1), Size); in optimizeMemMove()
1153 NewCI->setAttributes(CI->getAttributes()); in optimizeMemMove()
1156 return CI->getArgOperand(0); in optimizeMemMove()
1203 Value *LibCallSimplifier::optimizeMemSet(CallInst *CI, IRBuilderBase &B) { in optimizeMemSet() argument
1204 Value *Size = CI->getArgOperand(2); in optimizeMemSet()
1205 annotateNonNullAndDereferenceable(CI, 0, Size, DL); in optimizeMemSet()
1206 if (isa<IntrinsicInst>(CI)) in optimizeMemSet()
1209 if (auto *Calloc = foldMallocMemset(CI, B)) in optimizeMemSet()
1213 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSet()
1214 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, Size, Align(1)); in optimizeMemSet()
1215 NewCI->setAttributes(CI->getAttributes()); in optimizeMemSet()
1218 return CI->getArgOperand(0); in optimizeMemSet()
1221 Value *LibCallSimplifier::optimizeRealloc(CallInst *CI, IRBuilderBase &B) { in optimizeRealloc() argument
1222 if (isa<ConstantPointerNull>(CI->getArgOperand(0))) in optimizeRealloc()
1223 return emitMalloc(CI->getArgOperand(1), B, DL, TLI); in optimizeRealloc()
1233 static Value *replaceUnaryCall(CallInst *CI, IRBuilderBase &B, in replaceUnaryCall() argument
1237 B.setFastMathFlags(CI->getFastMathFlags()); in replaceUnaryCall()
1239 Module *M = CI->getModule(); in replaceUnaryCall()
1240 Value *V = CI->getArgOperand(0); in replaceUnaryCall()
1241 Function *F = Intrinsic::getDeclaration(M, IID, CI->getType()); in replaceUnaryCall()
1243 NewCall->takeName(CI); in replaceUnaryCall()
1270 static Value *optimizeDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeDoubleFP() argument
1272 Function *CalleeFn = CI->getCalledFunction(); in optimizeDoubleFP()
1273 if (!CI->getType()->isDoubleTy() || !CalleeFn) in optimizeDoubleFP()
1280 for (User *U : CI->users()) { in optimizeDoubleFP()
1288 V[0] = valueHasFloatPrecision(CI->getArgOperand(0)); in optimizeDoubleFP()
1289 V[1] = isBinary ? valueHasFloatPrecision(CI->getArgOperand(1)) : nullptr; in optimizeDoubleFP()
1301 StringRef CallerName = CI->getFunction()->getName(); in optimizeDoubleFP()
1310 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeDoubleFP()
1315 Module *M = CI->getModule(); in optimizeDoubleFP()
1328 static Value *optimizeUnaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeUnaryDoubleFP() argument
1330 return optimizeDoubleFP(CI, B, false, isPrecise); in optimizeUnaryDoubleFP()
1334 static Value *optimizeBinaryDoubleFP(CallInst *CI, IRBuilderBase &B, in optimizeBinaryDoubleFP() argument
1336 return optimizeDoubleFP(CI, B, true, isPrecise); in optimizeBinaryDoubleFP()
1340 Value *LibCallSimplifier::optimizeCAbs(CallInst *CI, IRBuilderBase &B) { in optimizeCAbs() argument
1341 if (!CI->isFast()) in optimizeCAbs()
1346 B.setFastMathFlags(CI->getFastMathFlags()); in optimizeCAbs()
1349 if (CI->getNumArgOperands() == 1) { in optimizeCAbs()
1350 Value *Op = CI->getArgOperand(0); in optimizeCAbs()
1355 assert(CI->getNumArgOperands() == 2 && "Unexpected signature for cabs!"); in optimizeCAbs()
1356 Real = CI->getArgOperand(0); in optimizeCAbs()
1357 Imag = CI->getArgOperand(1); in optimizeCAbs()
1363 Function *FSqrt = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::sqrt, in optimizeCAbs()
1364 CI->getType()); in optimizeCAbs()
1797 Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) { in optimizeExp2() argument
1798 Function *Callee = CI->getCalledFunction(); in optimizeExp2()
1804 Ret = optimizeUnaryDoubleFP(CI, B, true); in optimizeExp2()
1806 Type *Ty = CI->getType(); in optimizeExp2()
1807 Value *Op = CI->getArgOperand(0); in optimizeExp2()
1822 Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilderBase &B) { in optimizeFMinFMax() argument
1825 Function *Callee = CI->getCalledFunction(); in optimizeFMinFMax()
1828 if (Value *Ret = optimizeBinaryDoubleFP(CI, B)) in optimizeFMinFMax()
1839 FastMathFlags FMF = CI->getFastMathFlags(); in optimizeFMinFMax()
1845 Function *F = Intrinsic::getDeclaration(CI->getModule(), IID, CI->getType()); in optimizeFMinFMax()
1846 return B.CreateCall(F, { CI->getArgOperand(0), CI->getArgOperand(1) }); in optimizeFMinFMax()
2001 Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilderBase &B) { in optimizeSqrt() argument
2002 Function *Callee = CI->getCalledFunction(); in optimizeSqrt()
2009 Ret = optimizeUnaryDoubleFP(CI, B, true); in optimizeSqrt()
2011 if (!CI->isFast()) in optimizeSqrt()
2014 Instruction *I = dyn_cast<Instruction>(CI->getArgOperand(0)); in optimizeSqrt()
2070 Value *LibCallSimplifier::optimizeTan(CallInst *CI, IRBuilderBase &B) { in optimizeTan() argument
2071 Function *Callee = CI->getCalledFunction(); in optimizeTan()
2075 Ret = optimizeUnaryDoubleFP(CI, B, true); in optimizeTan()
2077 Value *Op1 = CI->getArgOperand(0); in optimizeTan()
2083 if (!CI->isFast() || !OpC->isFast()) in optimizeTan()
2099 static bool isTrigLibCall(CallInst *CI) { in isTrigLibCall() argument
2103 return CI->hasFnAttr(Attribute::NoUnwind) && in isTrigLibCall()
2104 CI->hasFnAttr(Attribute::ReadNone); in isTrigLibCall()
2157 Value *LibCallSimplifier::optimizeSinCosPi(CallInst *CI, IRBuilderBase &B) { in optimizeSinCosPi() argument
2160 if (!isTrigLibCall(CI)) in optimizeSinCosPi()
2163 Value *Arg = CI->getArgOperand(0); in optimizeSinCosPi()
2173 Function *F = CI->getFunction(); in optimizeSinCosPi()
2182 insertSinCosCall(B, CI->getCalledFunction(), Arg, IsFloat, Sin, Cos, SinCos); in optimizeSinCosPi()
2202 CallInst *CI = dyn_cast<CallInst>(Val); in classifyArgUse() local
2204 if (!CI || CI->use_empty()) in classifyArgUse()
2208 if (CI->getFunction() != F) in classifyArgUse()
2211 Function *Callee = CI->getCalledFunction(); in classifyArgUse()
2214 !isTrigLibCall(CI)) in classifyArgUse()
2219 SinCalls.push_back(CI); in classifyArgUse()
2221 CosCalls.push_back(CI); in classifyArgUse()
2223 SinCosCalls.push_back(CI); in classifyArgUse()
2226 SinCalls.push_back(CI); in classifyArgUse()
2228 CosCalls.push_back(CI); in classifyArgUse()
2230 SinCosCalls.push_back(CI); in classifyArgUse()
2238 Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilderBase &B) { in optimizeFFS() argument
2240 Value *Op = CI->getArgOperand(0); in optimizeFFS()
2242 Function *F = Intrinsic::getDeclaration(CI->getCalledFunction()->getParent(), in optimizeFFS()
2252 Value *LibCallSimplifier::optimizeFls(CallInst *CI, IRBuilderBase &B) { in optimizeFls() argument
2254 Value *Op = CI->getArgOperand(0); in optimizeFls()
2256 Function *F = Intrinsic::getDeclaration(CI->getCalledFunction()->getParent(), in optimizeFls()
2261 return B.CreateIntCast(V, CI->getType(), false); in optimizeFls()
2264 Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilderBase &B) { in optimizeAbs() argument
2267 Value *X = CI->getArgOperand(0); in optimizeAbs()
2273 Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilderBase &B) { in optimizeIsDigit() argument
2275 Value *Op = CI->getArgOperand(0); in optimizeIsDigit()
2278 return B.CreateZExt(Op, CI->getType()); in optimizeIsDigit()
2281 Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilderBase &B) { in optimizeIsAscii() argument
2283 Value *Op = CI->getArgOperand(0); in optimizeIsAscii()
2285 return B.CreateZExt(Op, CI->getType()); in optimizeIsAscii()
2288 Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilderBase &B) { in optimizeToAscii() argument
2290 return B.CreateAnd(CI->getArgOperand(0), in optimizeToAscii()
2291 ConstantInt::get(CI->getType(), 0x7F)); in optimizeToAscii()
2294 Value *LibCallSimplifier::optimizeAtoi(CallInst *CI, IRBuilderBase &B) { in optimizeAtoi() argument
2296 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeAtoi()
2299 return convertStrToNumber(CI, Str, 10); in optimizeAtoi()
2302 Value *LibCallSimplifier::optimizeStrtol(CallInst *CI, IRBuilderBase &B) { in optimizeStrtol() argument
2304 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) in optimizeStrtol()
2307 if (!isa<ConstantPointerNull>(CI->getArgOperand(1))) in optimizeStrtol()
2310 if (ConstantInt *CInt = dyn_cast<ConstantInt>(CI->getArgOperand(2))) { in optimizeStrtol()
2311 return convertStrToNumber(CI, Str, CInt->getSExtValue()); in optimizeStrtol()
2321 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg);
2323 Value *LibCallSimplifier::optimizeErrorReporting(CallInst *CI, IRBuilderBase &B, in optimizeErrorReporting() argument
2325 Function *Callee = CI->getCalledFunction(); in optimizeErrorReporting()
2334 if (!CI->hasFnAttr(Attribute::Cold) && in optimizeErrorReporting()
2335 isReportingError(Callee, CI, StreamArg)) { in optimizeErrorReporting()
2336 CI->addAttribute(AttributeList::FunctionIndex, Attribute::Cold); in optimizeErrorReporting()
2342 static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) { in isReportingError() argument
2352 if (StreamArg >= (int)CI->getNumArgOperands()) in isReportingError()
2354 LoadInst *LI = dyn_cast<LoadInst>(CI->getArgOperand(StreamArg)); in isReportingError()
2363 Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilderBase &B) { in optimizePrintFString() argument
2366 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr)) in optimizePrintFString()
2371 return CI->use_empty() ? (Value *)CI : ConstantInt::get(CI->getType(), 0); in optimizePrintFString()
2376 if (!CI->use_empty()) in optimizePrintFString()
2384 if (FormatStr == "%s" && CI->getNumArgOperands() > 1) { in optimizePrintFString()
2386 if (!getConstantStringInfo(CI->getOperand(1), OperandStr)) in optimizePrintFString()
2390 return (Value *)CI; in optimizePrintFString()
2415 if (FormatStr == "%c" && CI->getNumArgOperands() > 1 && in optimizePrintFString()
2416 CI->getArgOperand(1)->getType()->isIntegerTy()) in optimizePrintFString()
2417 return emitPutChar(CI->getArgOperand(1), B, TLI); in optimizePrintFString()
2420 if (FormatStr == "%s\n" && CI->getNumArgOperands() > 1 && in optimizePrintFString()
2421 CI->getArgOperand(1)->getType()->isPointerTy()) in optimizePrintFString()
2422 return emitPutS(CI->getArgOperand(1), B, TLI); in optimizePrintFString()
2426 Value *LibCallSimplifier::optimizePrintF(CallInst *CI, IRBuilderBase &B) { in optimizePrintF() argument
2428 Function *Callee = CI->getCalledFunction(); in optimizePrintF()
2430 if (Value *V = optimizePrintFString(CI, B)) { in optimizePrintF()
2436 if (TLI->has(LibFunc_iprintf) && !callHasFloatingPointArgument(CI)) { in optimizePrintF()
2440 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
2448 if (TLI->has(LibFunc_small_printf) && !callHasFP128Argument(CI)) { in optimizePrintF()
2453 CallInst *New = cast<CallInst>(CI->clone()); in optimizePrintF()
2459 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePrintF()
2463 Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, in optimizeSPrintFString() argument
2467 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeSPrintFString()
2471 Value *Dest = CI->getArgOperand(0); in optimizeSPrintFString()
2472 if (CI->getNumArgOperands() == 2) { in optimizeSPrintFString()
2480 Dest, Align(1), CI->getArgOperand(1), Align(1), in optimizeSPrintFString()
2481 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeSPrintFString()
2483 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSPrintFString()
2489 CI->getNumArgOperands() < 3) in optimizeSPrintFString()
2495 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeSPrintFString()
2497 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char"); in optimizeSPrintFString()
2503 return ConstantInt::get(CI->getType(), 1); in optimizeSPrintFString()
2509 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeSPrintFString()
2512 if (CI->use_empty()) in optimizeSPrintFString()
2514 return emitStrCpy(Dest, CI->getArgOperand(2), B, TLI); in optimizeSPrintFString()
2516 uint64_t SrcLen = GetStringLength(CI->getArgOperand(2)); in optimizeSPrintFString()
2519 Dest, Align(1), CI->getArgOperand(2), Align(1), in optimizeSPrintFString()
2520 ConstantInt::get(DL.getIntPtrType(CI->getContext()), SrcLen)); in optimizeSPrintFString()
2522 return ConstantInt::get(CI->getType(), SrcLen - 1); in optimizeSPrintFString()
2523 } else if (Value *V = emitStpCpy(Dest, CI->getArgOperand(2), B, TLI)) { in optimizeSPrintFString()
2528 return B.CreateIntCast(PtrDiff, CI->getType(), false); in optimizeSPrintFString()
2531 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeSPrintFString()
2532 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeSPrintFString()
2537 Value *Len = emitStrLen(CI->getArgOperand(2), B, DL, TLI); in optimizeSPrintFString()
2542 B.CreateMemCpy(Dest, Align(1), CI->getArgOperand(2), Align(1), IncLen); in optimizeSPrintFString()
2545 return B.CreateIntCast(Len, CI->getType(), false); in optimizeSPrintFString()
2550 Value *LibCallSimplifier::optimizeSPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSPrintF() argument
2551 Function *Callee = CI->getCalledFunction(); in optimizeSPrintF()
2553 if (Value *V = optimizeSPrintFString(CI, B)) { in optimizeSPrintF()
2559 if (TLI->has(LibFunc_siprintf) && !callHasFloatingPointArgument(CI)) { in optimizeSPrintF()
2563 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
2571 if (TLI->has(LibFunc_small_sprintf) && !callHasFP128Argument(CI)) { in optimizeSPrintF()
2576 CallInst *New = cast<CallInst>(CI->clone()); in optimizeSPrintF()
2582 annotateNonNullNoUndefBasedOnAccess(CI, {0, 1}); in optimizeSPrintF()
2586 Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI, in optimizeSnPrintFString() argument
2589 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeSnPrintFString()
2596 if (!getConstantStringInfo(CI->getArgOperand(2), FormatStr)) in optimizeSnPrintFString()
2600 if (CI->getNumArgOperands() == 3) { in optimizeSnPrintFString()
2607 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSnPrintFString()
2614 CI->getArgOperand(0), Align(1), CI->getArgOperand(2), Align(1), in optimizeSnPrintFString()
2615 ConstantInt::get(DL.getIntPtrType(CI->getContext()), in optimizeSnPrintFString()
2617 return ConstantInt::get(CI->getType(), FormatStr.size()); in optimizeSnPrintFString()
2623 CI->getNumArgOperands() == 4) { in optimizeSnPrintFString()
2628 return ConstantInt::get(CI->getType(), 1); in optimizeSnPrintFString()
2633 if (!CI->getArgOperand(3)->getType()->isIntegerTy()) in optimizeSnPrintFString()
2635 Value *V = B.CreateTrunc(CI->getArgOperand(3), B.getInt8Ty(), "char"); in optimizeSnPrintFString()
2636 Value *Ptr = castToCStr(CI->getArgOperand(0), B); in optimizeSnPrintFString()
2641 return ConstantInt::get(CI->getType(), 1); in optimizeSnPrintFString()
2647 if (!getConstantStringInfo(CI->getArgOperand(3), Str)) in optimizeSnPrintFString()
2651 return ConstantInt::get(CI->getType(), Str.size()); in optimizeSnPrintFString()
2655 B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(3), in optimizeSnPrintFString()
2656 Align(1), ConstantInt::get(CI->getType(), Str.size() + 1)); in optimizeSnPrintFString()
2659 return ConstantInt::get(CI->getType(), Str.size()); in optimizeSnPrintFString()
2665 Value *LibCallSimplifier::optimizeSnPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeSnPrintF() argument
2666 if (Value *V = optimizeSnPrintFString(CI, B)) { in optimizeSnPrintF()
2670 if (isKnownNonZero(CI->getOperand(1), DL)) in optimizeSnPrintF()
2671 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizeSnPrintF()
2675 Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI, in optimizeFPrintFString() argument
2677 optimizeErrorReporting(CI, B, 0); in optimizeFPrintFString()
2681 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) in optimizeFPrintFString()
2687 if (!CI->use_empty()) in optimizeFPrintFString()
2691 if (CI->getNumArgOperands() == 2) { in optimizeFPrintFString()
2697 CI->getArgOperand(1), in optimizeFPrintFString()
2698 ConstantInt::get(DL.getIntPtrType(CI->getContext()), FormatStr.size()), in optimizeFPrintFString()
2699 CI->getArgOperand(0), B, DL, TLI); in optimizeFPrintFString()
2705 CI->getNumArgOperands() < 3) in optimizeFPrintFString()
2711 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) in optimizeFPrintFString()
2713 return emitFPutC(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI); in optimizeFPrintFString()
2718 if (!CI->getArgOperand(2)->getType()->isPointerTy()) in optimizeFPrintFString()
2720 return emitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI); in optimizeFPrintFString()
2725 Value *LibCallSimplifier::optimizeFPrintF(CallInst *CI, IRBuilderBase &B) { in optimizeFPrintF() argument
2726 Function *Callee = CI->getCalledFunction(); in optimizeFPrintF()
2728 if (Value *V = optimizeFPrintFString(CI, B)) { in optimizeFPrintF()
2734 if (TLI->has(LibFunc_fiprintf) && !callHasFloatingPointArgument(CI)) { in optimizeFPrintF()
2738 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
2746 if (TLI->has(LibFunc_small_fprintf) && !callHasFP128Argument(CI)) { in optimizeFPrintF()
2751 CallInst *New = cast<CallInst>(CI->clone()); in optimizeFPrintF()
2760 Value *LibCallSimplifier::optimizeFWrite(CallInst *CI, IRBuilderBase &B) { in optimizeFWrite() argument
2761 optimizeErrorReporting(CI, B, 3); in optimizeFWrite()
2764 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); in optimizeFWrite()
2765 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); in optimizeFWrite()
2771 return ConstantInt::get(CI->getType(), 0); in optimizeFWrite()
2775 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) in optimizeFWrite()
2777 castToCStr(CI->getArgOperand(0), B), "char"); in optimizeFWrite()
2778 Value *NewCI = emitFPutC(Char, CI->getArgOperand(3), B, TLI); in optimizeFWrite()
2779 return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr; in optimizeFWrite()
2786 Value *LibCallSimplifier::optimizeFPuts(CallInst *CI, IRBuilderBase &B) { in optimizeFPuts() argument
2787 optimizeErrorReporting(CI, B, 1); in optimizeFPuts()
2791 bool OptForSize = CI->getFunction()->hasOptSize() || in optimizeFPuts()
2792 llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI, in optimizeFPuts()
2798 if (!CI->use_empty()) in optimizeFPuts()
2802 uint64_t Len = GetStringLength(CI->getArgOperand(0)); in optimizeFPuts()
2808 CI->getArgOperand(0), in optimizeFPuts()
2809 ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len - 1), in optimizeFPuts()
2810 CI->getArgOperand(1), B, DL, TLI); in optimizeFPuts()
2813 Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilderBase &B) { in optimizePuts() argument
2814 annotateNonNullNoUndefBasedOnAccess(CI, 0); in optimizePuts()
2815 if (!CI->use_empty()) in optimizePuts()
2821 if (getConstantStringInfo(CI->getArgOperand(0), Str) && Str.empty()) in optimizePuts()
2827 Value *LibCallSimplifier::optimizeBCopy(CallInst *CI, IRBuilderBase &B) { in optimizeBCopy() argument
2829 return B.CreateMemMove(CI->getArgOperand(1), Align(1), CI->getArgOperand(0), in optimizeBCopy()
2830 Align(1), CI->getArgOperand(2)); in optimizeBCopy()
2842 Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI, in optimizeStringMemoryLibCall() argument
2845 Function *Callee = CI->getCalledFunction(); in optimizeStringMemoryLibCall()
2851 TargetLibraryInfoImpl::isCallingConvCCompatible(CI)) && in optimizeStringMemoryLibCall()
2855 return optimizeStrCat(CI, Builder); in optimizeStringMemoryLibCall()
2857 return optimizeStrNCat(CI, Builder); in optimizeStringMemoryLibCall()
2859 return optimizeStrChr(CI, Builder); in optimizeStringMemoryLibCall()
2861 return optimizeStrRChr(CI, Builder); in optimizeStringMemoryLibCall()
2863 return optimizeStrCmp(CI, Builder); in optimizeStringMemoryLibCall()
2865 return optimizeStrNCmp(CI, Builder); in optimizeStringMemoryLibCall()
2867 return optimizeStrCpy(CI, Builder); in optimizeStringMemoryLibCall()
2869 return optimizeStpCpy(CI, Builder); in optimizeStringMemoryLibCall()
2871 return optimizeStrNCpy(CI, Builder); in optimizeStringMemoryLibCall()
2873 return optimizeStrLen(CI, Builder); in optimizeStringMemoryLibCall()
2875 return optimizeStrPBrk(CI, Builder); in optimizeStringMemoryLibCall()
2877 return optimizeStrNDup(CI, Builder); in optimizeStringMemoryLibCall()
2885 return optimizeStrTo(CI, Builder); in optimizeStringMemoryLibCall()
2887 return optimizeStrSpn(CI, Builder); in optimizeStringMemoryLibCall()
2889 return optimizeStrCSpn(CI, Builder); in optimizeStringMemoryLibCall()
2891 return optimizeStrStr(CI, Builder); in optimizeStringMemoryLibCall()
2893 return optimizeMemChr(CI, Builder); in optimizeStringMemoryLibCall()
2895 return optimizeMemRChr(CI, Builder); in optimizeStringMemoryLibCall()
2897 return optimizeBCmp(CI, Builder); in optimizeStringMemoryLibCall()
2899 return optimizeMemCmp(CI, Builder); in optimizeStringMemoryLibCall()
2901 return optimizeMemCpy(CI, Builder); in optimizeStringMemoryLibCall()
2903 return optimizeMemCCpy(CI, Builder); in optimizeStringMemoryLibCall()
2905 return optimizeMemPCpy(CI, Builder); in optimizeStringMemoryLibCall()
2907 return optimizeMemMove(CI, Builder); in optimizeStringMemoryLibCall()
2909 return optimizeMemSet(CI, Builder); in optimizeStringMemoryLibCall()
2911 return optimizeRealloc(CI, Builder); in optimizeStringMemoryLibCall()
2913 return optimizeWcslen(CI, Builder); in optimizeStringMemoryLibCall()
2915 return optimizeBCopy(CI, Builder); in optimizeStringMemoryLibCall()
2923 Value *LibCallSimplifier::optimizeFloatingPointLibCall(CallInst *CI, in optimizeFloatingPointLibCall() argument
2927 if (CI->isStrictFP()) in optimizeFloatingPointLibCall()
2930 if (Value *V = optimizeTrigReflections(CI, Func, Builder)) in optimizeFloatingPointLibCall()
2938 return optimizeSinCosPi(CI, Builder); in optimizeFloatingPointLibCall()
2942 return optimizePow(CI, Builder); in optimizeFloatingPointLibCall()
2946 return optimizeExp2(CI, Builder); in optimizeFloatingPointLibCall()
2950 return replaceUnaryCall(CI, Builder, Intrinsic::fabs); in optimizeFloatingPointLibCall()
2954 return optimizeSqrt(CI, Builder); in optimizeFloatingPointLibCall()
2970 return optimizeLog(CI, Builder); in optimizeFloatingPointLibCall()
2974 return optimizeTan(CI, Builder); in optimizeFloatingPointLibCall()
2976 return replaceUnaryCall(CI, Builder, Intrinsic::ceil); in optimizeFloatingPointLibCall()
2978 return replaceUnaryCall(CI, Builder, Intrinsic::floor); in optimizeFloatingPointLibCall()
2980 return replaceUnaryCall(CI, Builder, Intrinsic::round); in optimizeFloatingPointLibCall()
2982 return replaceUnaryCall(CI, Builder, Intrinsic::roundeven); in optimizeFloatingPointLibCall()
2984 return replaceUnaryCall(CI, Builder, Intrinsic::nearbyint); in optimizeFloatingPointLibCall()
2986 return replaceUnaryCall(CI, Builder, Intrinsic::rint); in optimizeFloatingPointLibCall()
2988 return replaceUnaryCall(CI, Builder, Intrinsic::trunc); in optimizeFloatingPointLibCall()
3004 if (UnsafeFPShrink && hasFloatVersion(CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3005 return optimizeUnaryDoubleFP(CI, Builder, true); in optimizeFloatingPointLibCall()
3008 if (hasFloatVersion(CI->getCalledFunction()->getName())) in optimizeFloatingPointLibCall()
3009 return optimizeBinaryDoubleFP(CI, Builder); in optimizeFloatingPointLibCall()
3017 return optimizeFMinFMax(CI, Builder); in optimizeFloatingPointLibCall()
3021 return optimizeCAbs(CI, Builder); in optimizeFloatingPointLibCall()
3027 Value *LibCallSimplifier::optimizeCall(CallInst *CI, IRBuilderBase &Builder) { in optimizeCall() argument
3031 if (CI->isNoBuiltin()) in optimizeCall()
3035 Function *Callee = CI->getCalledFunction(); in optimizeCall()
3036 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
3039 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
3049 else if (isa<FPMathOperator>(CI) && CI->isFast()) in optimizeCall()
3053 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) { in optimizeCall()
3060 return optimizePow(CI, Builder); in optimizeCall()
3062 return optimizeExp2(CI, Builder); in optimizeCall()
3066 return optimizeLog(CI, Builder); in optimizeCall()
3068 return optimizeSqrt(CI, Builder); in optimizeCall()
3071 return optimizeMemSet(CI, Builder); in optimizeCall()
3073 return optimizeMemCpy(CI, Builder); in optimizeCall()
3075 return optimizeMemMove(CI, Builder); in optimizeCall()
3083 FortifiedSimplifier.optimizeCall(CI, Builder)) { in optimizeCall()
3089 replaceAllUsesWith(CI, SimplifiedCI); in optimizeCall()
3109 if (Value *V = optimizeStringMemoryLibCall(CI, Builder)) in optimizeCall()
3111 if (Value *V = optimizeFloatingPointLibCall(CI, Func, Builder)) in optimizeCall()
3117 return optimizeFFS(CI, Builder); in optimizeCall()
3121 return optimizeFls(CI, Builder); in optimizeCall()
3125 return optimizeAbs(CI, Builder); in optimizeCall()
3127 return optimizeIsDigit(CI, Builder); in optimizeCall()
3129 return optimizeIsAscii(CI, Builder); in optimizeCall()
3131 return optimizeToAscii(CI, Builder); in optimizeCall()
3135 return optimizeAtoi(CI, Builder); in optimizeCall()
3138 return optimizeStrtol(CI, Builder); in optimizeCall()
3140 return optimizePrintF(CI, Builder); in optimizeCall()
3142 return optimizeSPrintF(CI, Builder); in optimizeCall()
3144 return optimizeSnPrintF(CI, Builder); in optimizeCall()
3146 return optimizeFPrintF(CI, Builder); in optimizeCall()
3148 return optimizeFWrite(CI, Builder); in optimizeCall()
3150 return optimizeFPuts(CI, Builder); in optimizeCall()
3152 return optimizePuts(CI, Builder); in optimizeCall()
3154 return optimizeErrorReporting(CI, Builder); in optimizeCall()
3157 return optimizeErrorReporting(CI, Builder, 0); in optimizeCall()
3219 FortifiedLibCallSimplifier::isFortifiedCallFoldable(CallInst *CI, in isFortifiedCallFoldable() argument
3227 ConstantInt *Flag = dyn_cast<ConstantInt>(CI->getArgOperand(*FlagOp)); in isFortifiedCallFoldable()
3232 if (SizeOp && CI->getArgOperand(ObjSizeOp) == CI->getArgOperand(*SizeOp)) in isFortifiedCallFoldable()
3236 dyn_cast<ConstantInt>(CI->getArgOperand(ObjSizeOp))) { in isFortifiedCallFoldable()
3243 uint64_t Len = GetStringLength(CI->getArgOperand(*StrOp)); in isFortifiedCallFoldable()
3247 annotateDereferenceableBytes(CI, *StrOp, Len); in isFortifiedCallFoldable()
3255 dyn_cast<ConstantInt>(CI->getArgOperand(*SizeOp))) in isFortifiedCallFoldable()
3262 Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI, in optimizeMemCpyChk() argument
3264 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemCpyChk()
3266 B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemCpyChk()
3267 Align(1), CI->getArgOperand(2)); in optimizeMemCpyChk()
3268 NewCI->setAttributes(CI->getAttributes()); in optimizeMemCpyChk()
3271 return CI->getArgOperand(0); in optimizeMemCpyChk()
3276 Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI, in optimizeMemMoveChk() argument
3278 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemMoveChk()
3280 B.CreateMemMove(CI->getArgOperand(0), Align(1), CI->getArgOperand(1), in optimizeMemMoveChk()
3281 Align(1), CI->getArgOperand(2)); in optimizeMemMoveChk()
3282 NewCI->setAttributes(CI->getAttributes()); in optimizeMemMoveChk()
3285 return CI->getArgOperand(0); in optimizeMemMoveChk()
3290 Value *FortifiedLibCallSimplifier::optimizeMemSetChk(CallInst *CI, in optimizeMemSetChk() argument
3294 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeMemSetChk()
3295 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); in optimizeMemSetChk()
3296 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, in optimizeMemSetChk()
3297 CI->getArgOperand(2), Align(1)); in optimizeMemSetChk()
3298 NewCI->setAttributes(CI->getAttributes()); in optimizeMemSetChk()
3301 return CI->getArgOperand(0); in optimizeMemSetChk()
3306 Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(CallInst *CI, in optimizeMemPCpyChk() argument
3308 const DataLayout &DL = CI->getModule()->getDataLayout(); in optimizeMemPCpyChk()
3309 if (isFortifiedCallFoldable(CI, 3, 2)) in optimizeMemPCpyChk()
3310 if (Value *Call = emitMemPCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemPCpyChk()
3311 CI->getArgOperand(2), B, DL, TLI)) { in optimizeMemPCpyChk()
3313 NewCI->setAttributes(CI->getAttributes()); in optimizeMemPCpyChk()
3322 Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(CallInst *CI, in optimizeStrpCpyChk() argument
3325 const DataLayout &DL = CI->getModule()->getDataLayout(); in optimizeStrpCpyChk()
3326 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1), in optimizeStrpCpyChk()
3327 *ObjSize = CI->getArgOperand(2); in optimizeStrpCpyChk()
3340 if (isFortifiedCallFoldable(CI, 2, None, 1)) { in optimizeStrpCpyChk()
3353 annotateDereferenceableBytes(CI, 1, Len); in optimizeStrpCpyChk()
3357 Type *SizeTTy = DL.getIntPtrType(CI->getContext()); in optimizeStrpCpyChk()
3367 Value *FortifiedLibCallSimplifier::optimizeStrLenChk(CallInst *CI, in optimizeStrLenChk() argument
3369 if (isFortifiedCallFoldable(CI, 1, None, 0)) in optimizeStrLenChk()
3370 return emitStrLen(CI->getArgOperand(0), B, CI->getModule()->getDataLayout(), in optimizeStrLenChk()
3375 Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(CallInst *CI, in optimizeStrpNCpyChk() argument
3378 if (isFortifiedCallFoldable(CI, 3, 2)) { in optimizeStrpNCpyChk()
3380 return emitStrNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
3381 CI->getArgOperand(2), B, TLI); in optimizeStrpNCpyChk()
3383 return emitStpNCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrpNCpyChk()
3384 CI->getArgOperand(2), B, TLI); in optimizeStrpNCpyChk()
3390 Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(CallInst *CI, in optimizeMemCCpyChk() argument
3392 if (isFortifiedCallFoldable(CI, 4, 3)) in optimizeMemCCpyChk()
3393 return emitMemCCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeMemCCpyChk()
3394 CI->getArgOperand(2), CI->getArgOperand(3), B, TLI); in optimizeMemCCpyChk()
3399 Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(CallInst *CI, in optimizeSNPrintfChk() argument
3401 if (isFortifiedCallFoldable(CI, 3, 1, None, 2)) { in optimizeSNPrintfChk()
3402 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 5)); in optimizeSNPrintfChk()
3403 return emitSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeSNPrintfChk()
3404 CI->getArgOperand(4), VariadicArgs, B, TLI); in optimizeSNPrintfChk()
3410 Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(CallInst *CI, in optimizeSPrintfChk() argument
3412 if (isFortifiedCallFoldable(CI, 2, None, None, 1)) { in optimizeSPrintfChk()
3413 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 4)); in optimizeSPrintfChk()
3414 return emitSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), VariadicArgs, in optimizeSPrintfChk()
3421 Value *FortifiedLibCallSimplifier::optimizeStrCatChk(CallInst *CI, in optimizeStrCatChk() argument
3423 if (isFortifiedCallFoldable(CI, 2)) in optimizeStrCatChk()
3424 return emitStrCat(CI->getArgOperand(0), CI->getArgOperand(1), B, TLI); in optimizeStrCatChk()
3429 Value *FortifiedLibCallSimplifier::optimizeStrLCat(CallInst *CI, in optimizeStrLCat() argument
3431 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCat()
3432 return emitStrLCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCat()
3433 CI->getArgOperand(2), B, TLI); in optimizeStrLCat()
3438 Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(CallInst *CI, in optimizeStrNCatChk() argument
3440 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrNCatChk()
3441 return emitStrNCat(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrNCatChk()
3442 CI->getArgOperand(2), B, TLI); in optimizeStrNCatChk()
3447 Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(CallInst *CI, in optimizeStrLCpyChk() argument
3449 if (isFortifiedCallFoldable(CI, 3)) in optimizeStrLCpyChk()
3450 return emitStrLCpy(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeStrLCpyChk()
3451 CI->getArgOperand(2), B, TLI); in optimizeStrLCpyChk()
3456 Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(CallInst *CI, in optimizeVSNPrintfChk() argument
3458 if (isFortifiedCallFoldable(CI, 3, 1, None, 2)) in optimizeVSNPrintfChk()
3459 return emitVSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1), in optimizeVSNPrintfChk()
3460 CI->getArgOperand(4), CI->getArgOperand(5), B, TLI); in optimizeVSNPrintfChk()
3465 Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(CallInst *CI, in optimizeVSPrintfChk() argument
3467 if (isFortifiedCallFoldable(CI, 2, None, None, 1)) in optimizeVSPrintfChk()
3468 return emitVSPrintf(CI->getArgOperand(0), CI->getArgOperand(3), in optimizeVSPrintfChk()
3469 CI->getArgOperand(4), B, TLI); in optimizeVSPrintfChk()
3474 Value *FortifiedLibCallSimplifier::optimizeCall(CallInst *CI, in optimizeCall() argument
3490 Function *Callee = CI->getCalledFunction(); in optimizeCall()
3491 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI); in optimizeCall()
3494 CI->getOperandBundlesAsDefs(OpBundles); in optimizeCall()
3510 return optimizeMemCpyChk(CI, Builder); in optimizeCall()
3512 return optimizeMemPCpyChk(CI, Builder); in optimizeCall()
3514 return optimizeMemMoveChk(CI, Builder); in optimizeCall()
3516 return optimizeMemSetChk(CI, Builder); in optimizeCall()
3519 return optimizeStrpCpyChk(CI, Builder, Func); in optimizeCall()
3521 return optimizeStrLenChk(CI, Builder); in optimizeCall()
3524 return optimizeStrpNCpyChk(CI, Builder, Func); in optimizeCall()
3526 return optimizeMemCCpyChk(CI, Builder); in optimizeCall()
3528 return optimizeSNPrintfChk(CI, Builder); in optimizeCall()
3530 return optimizeSPrintfChk(CI, Builder); in optimizeCall()
3532 return optimizeStrCatChk(CI, Builder); in optimizeCall()
3534 return optimizeStrLCat(CI, Builder); in optimizeCall()
3536 return optimizeStrNCatChk(CI, Builder); in optimizeCall()
3538 return optimizeStrLCpyChk(CI, Builder); in optimizeCall()
3540 return optimizeVSNPrintfChk(CI, Builder); in optimizeCall()
3542 return optimizeVSPrintfChk(CI, Builder); in optimizeCall()