51 cl::desc(
"Enable unsafe double to float "
52 "shrinking for math lib calls"));
59 cl::desc(
"Enable hot/cold operator new library calls"));
63 "Enable optimization of existing hot/cold operator new library calls"));
66 cl::desc(
"Enable transformation of nobuiltin operator new library calls"));
73struct HotColdHintParser :
public cl::parser<unsigned> {
76 bool parse(cl::Option &O, StringRef ArgName, StringRef Arg,
unsigned &
Value) {
78 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
81 return O.error(
"'" + Arg +
"' value must be in the range [0, 255]!");
95 cl::desc(
"Value to pass to hot/cold operator new for cold allocation"));
98 cl::desc(
"Value to pass to hot/cold operator new for "
99 "notcold (warm) allocation"));
102 cl::desc(
"Value to pass to hot/cold operator new for hot allocation"));
106 "Value to pass to hot/cold operator new for ambiguous allocation"));
113 return Func == LibFunc_abs || Func == LibFunc_labs ||
114 Func == LibFunc_llabs || Func == LibFunc_strlen;
121 if (IC->isEquality() && IC->getOperand(1) == With)
131 return OI->getType()->isFloatingPointTy();
137 return OI->getType()->isFP128Ty();
170 bool Negate = Str[0] ==
'-';
171 if (Str[0] ==
'-' || Str[0] ==
'+') {
172 Str = Str.drop_front();
183 uint64_t Max = AsSigned && Negate ? 1 : 0;
187 if (Str.size() > 1) {
189 if (
toUpper((
unsigned char)Str[1]) ==
'X') {
190 if (Str.size() == 2 || (
Base &&
Base != 16))
195 Str = Str.drop_front(2);
201 }
else if (
Base == 0)
211 for (
unsigned i = 0; i != Str.size(); ++i) {
212 unsigned char DigVal = Str[i];
214 DigVal = DigVal -
'0';
218 DigVal = DigVal -
'A' + 10;
231 if (VFlow || Result > Max)
239 Value *StrEnd =
B.CreateInBoundsGEP(
B.getInt8Ty(), StrBeg, Off,
"endptr");
240 B.CreateStore(StrEnd, EndPtr);
247 return ConstantInt::get(RetTy, Result);
254 if (
C->isNullValue())
282 for (
unsigned ArgNo : ArgNos) {
283 uint64_t DerefBytes = DereferenceableBytes;
288 DereferenceableBytes);
307 for (
unsigned ArgNo : ArgNos) {
333 DerefMin = std::min(
X,
Y);
354 NewCI->
getContext(), {NewCI->getAttributes(), Old.getAttributes()}));
367 return Len >= Str.size() ? Str : Str.substr(0, Len);
392 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len,
B));
395Value *LibCallSimplifier::emitStrLenMemCpy(
Value *Src,
Value *Dst, uint64_t Len,
406 Value *CpyDst =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, DstLen,
"endptr");
411 TLI->getAsSizeT(Len + 1, *
B.GetInsertBlock()->getModule()));
455 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen,
B));
468 Type *CharTy =
B.getInt8Ty();
469 Value *Char0 =
B.CreateLoad(CharTy, Src);
470 CharVal =
B.CreateTrunc(CharVal, CharTy);
471 Value *Cmp =
B.CreateICmpEQ(Char0, CharVal,
"char0cmp");
475 Value *
And =
B.CreateICmpNE(NBytes, Zero);
476 Cmp =
B.CreateLogicalAnd(
And, Cmp);
480 return B.CreateSelect(Cmp, Src, NullPtr);
502 FunctionType *FT =
Callee->getFunctionType();
503 unsigned IntBits = TLI->getIntSize();
504 if (!FT->getParamType(1)->isIntegerTy(IntBits))
507 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
511 ConstantInt::get(SizeTTy, Len),
B,
520 return B.CreateIntToPtr(
B.getTrue(), CI->
getType());
529 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, StrLen,
"strchr");
542 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(
I),
"strchr");
554 if (CharC && CharC->
isZero())
559 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
564 uint64_t NBytes = Str.size() + 1;
565 Value *
Size = ConstantInt::get(SizeTTy, NBytes);
572 return ConstantInt::get(CI->
getType(), 0);
574 StringRef Str1, Str2;
579 if (HasStr1 && HasStr2)
581 std::clamp(Str1.
compare(Str2), -1, 1));
583 if (HasStr1 && Str1.
empty())
584 return B.CreateNeg(
B.CreateZExt(
585 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
587 if (HasStr2 && Str2.
empty())
588 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
602 TLI->getAsSizeT(std::min(Len1, Len2), *CI->
getModule()),
607 if (!HasStr1 && HasStr2) {
612 }
else if (HasStr1 && !HasStr2) {
634 return ConstantInt::get(CI->
getType(), 0);
646 return ConstantInt::get(CI->
getType(), 0);
651 StringRef Str1, Str2;
656 if (HasStr1 && HasStr2) {
661 std::clamp(SubStr1.
compare(SubStr2), -1, 1));
664 if (HasStr1 && Str1.
empty())
665 return B.CreateNeg(
B.CreateZExt(
666 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
668 if (HasStr2 && Str2.
empty())
669 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
680 if (!HasStr1 && HasStr2) {
681 Len2 = std::min(Len2,
Length);
686 }
else if (HasStr1 && !HasStr2) {
687 Len1 = std::min(Len1,
Length);
701 if (SrcLen &&
Size) {
703 if (SrcLen <= Size->getZExtValue() + 1)
725 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
740 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
751 Value *DstEnd =
B.CreateInBoundsGEP(
752 B.getInt8Ty(), Dst, TLI->getAsSizeT(Len - 1, *CI->
getModule()));
756 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1), LenV);
775 NBytes = SizeC->getZExtValue();
784 B.CreateStore(
B.getInt8(0), Dst);
797 uint64_t SrcLen = Str.find(
'\0');
800 bool NulTerm = SrcLen < NBytes;
809 SrcLen = std::min(SrcLen, uint64_t(Str.size()));
810 NBytes = std::min(NBytes - 1, SrcLen);
815 B.CreateStore(
B.getInt8(0), Dst);
816 return ConstantInt::get(CI->
getType(), 0);
822 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
823 TLI->getAsSizeT(NBytes, *CI->
getModule()));
827 Value *EndOff = ConstantInt::get(CI->
getType(), NBytes);
828 Value *EndPtr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, EndOff);
829 B.CreateStore(
B.getInt8(0), EndPtr);
835 return ConstantInt::get(CI->
getType(), SrcLen);
840Value *LibCallSimplifier::optimizeStringNCpy(
CallInst *CI,
bool RetEnd,
857 N = SizeC->getZExtValue();
864 Type *CharTy =
B.getInt8Ty();
865 Value *CharVal =
B.CreateLoad(CharTy, Src,
"stxncpy.char0");
866 B.CreateStore(CharVal, Dst);
872 Value *ZeroChar = ConstantInt::get(CharTy, 0);
873 Value *
Cmp =
B.CreateICmpEQ(CharVal, ZeroChar,
"stpncpy.char0cmp");
875 Value *Off1 =
B.getInt32(1);
876 Value *EndPtr =
B.CreateInBoundsGEP(CharTy, Dst, Off1,
"stpncpy.end");
877 return B.CreateSelect(Cmp, Dst, EndPtr,
"stpncpy.sel");
892 CI->
getAttributes().getParamAttrs(0).getAlignment().valueOrOne();
893 CallInst *NewCI =
B.CreateMemSet(Dst,
B.getInt8(
'\0'),
Size, MemSetAlign);
901 if (
N > SrcLen + 1) {
910 std::string SrcStr = Str.str();
913 SrcStr.resize(
N,
'\0');
914 Src =
B.CreateGlobalString(SrcStr,
"str", 0,
920 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
929 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, Off,
"endptr");
946 return B.CreateZExt(
B.CreateLoad(CharTy, Src,
"char0"),
952 if (BoundCst->isZero())
954 return ConstantInt::get(CI->
getType(), 0);
956 if (BoundCst->isOne()) {
958 Value *CharVal =
B.CreateLoad(CharTy, Src,
"strnlen.char0");
959 Value *ZeroChar = ConstantInt::get(CharTy, 0);
960 Value *
Cmp =
B.CreateICmpNE(CharVal, ZeroChar,
"strnlen.char0cmp");
961 return B.CreateZExt(Cmp, CI->
getType());
971 return B.CreateBinaryIntrinsic(Intrinsic::umin, LenC, Bound);
988 unsigned BW = DL.getIndexTypeSizeInBits(
GEP->getType());
989 SmallMapVector<Value *, APInt, 4> VarOffsets;
990 APInt ConstOffset(BW, 0);
991 assert(CharSize % 8 == 0 &&
"Expected a multiple of 8 sized CharSize");
993 if (!
GEP->collectOffset(DL, BW, VarOffsets, ConstOffset) ||
994 VarOffsets.
size() != 1 || ConstOffset != 0 ||
995 VarOffsets.
begin()->second != CharSize / 8)
998 ConstantDataArraySlice Slice;
1000 uint64_t NullTermIdx;
1001 if (Slice.
Array ==
nullptr) {
1004 NullTermIdx = ~((uint64_t)0);
1005 for (uint64_t
I = 0,
E = Slice.
Length;
I <
E; ++
I) {
1013 if (NullTermIdx == ~((uint64_t)0))
1026 NullTermIdx == Slice.
Length - 1)) {
1028 return B.CreateSub(ConstantInt::get(CI->
getType(), NullTermIdx),
1038 if (LenTrue && LenFalse) {
1040 return OptimizationRemark(
"instcombine",
"simplify-libcalls", CI)
1041 <<
"folded strlen(select) to select of constants";
1043 return B.CreateSelect(
SI->getCondition(),
1044 ConstantInt::get(CI->
getType(), LenTrue - 1),
1045 ConstantInt::get(CI->
getType(), LenFalse - 1));
1053 if (
Value *V = optimizeStringLength(CI,
B, 8))
1061 if (
Value *V = optimizeStringLength(CI,
B, 8, Bound))
1071 unsigned WCharSize = TLI->getWCharSize(M) * 8;
1076 return optimizeStringLength(CI,
B, WCharSize);
1086 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1090 if (HasS1 && HasS2) {
1091 size_t I =
S1.find_first_of(S2);
1096 B.getInt64(
I),
"strpbrk");
1100 if (HasS2 && S2.
size() == 1)
1125 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1129 if (HasS1 && HasS2) {
1130 size_t Pos =
S1.find_first_not_of(S2);
1133 return ConstantInt::get(CI->
getType(), Pos);
1145 if (HasS1 &&
S1.empty())
1149 if (HasS1 && HasS2) {
1150 size_t Pos =
S1.find_first_of(S2);
1153 return ConstantInt::get(CI->
getType(), Pos);
1157 if (HasS2 && S2.
empty())
1174 StrLen,
B, DL, TLI);
1182 replaceAllUsesWith(Old, Cmp);
1188 StringRef SearchStr, ToFindStr;
1193 if (HasStr2 && ToFindStr.
empty())
1197 if (HasStr1 && HasStr2) {
1204 return B.CreateConstInBoundsGEP1_64(
B.getInt8Ty(), CI->
getArgOperand(0),
1209 if (HasStr2 && ToFindStr.
size() == 1) {
1230 if (LenC->
isOne()) {
1233 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memrchr.char0");
1235 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1236 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memrchr.char0cmp");
1237 return B.CreateSelect(Cmp, SrcStr, NullPtr,
"memrchr.sel");
1245 if (Str.size() == 0)
1254 if (Str.size() < EndOff)
1269 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos));
1271 if (Str.find(Str[Pos]) == Pos) {
1278 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
1279 B.getInt64(Pos),
"memrchr.ptr_plus");
1280 return B.CreateSelect(Cmp, NullPtr, SrcPlus,
"memrchr.sel");
1285 Str = Str.substr(0, EndOff);
1293 Type *Int8Ty =
B.getInt8Ty();
1294 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1296 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1297 Value *CEqS0 =
B.CreateICmpEQ(ConstantInt::get(Int8Ty, Str[0]), CharVal);
1298 Value *
And =
B.CreateLogicalAnd(NNeZ, CEqS0);
1299 Value *SizeM1 =
B.CreateSub(
Size, ConstantInt::get(SizeTy, 1));
1301 B.CreateInBoundsGEP(Int8Ty, SrcStr, SizeM1,
"memrchr.ptr_plus");
1302 return B.CreateSelect(
And, SrcPlus, NullPtr,
"memrchr.sel");
1325 if (LenC->
isOne()) {
1328 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memchr.char0");
1330 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1331 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memchr.char0cmp");
1332 return B.CreateSelect(Cmp, SrcStr, NullPtr,
"memchr.sel");
1352 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos),
1354 return B.CreateSelect(Cmp, NullPtr, SrcPlus);
1357 if (Str.size() == 0)
1366 size_t Pos = Str.find_first_not_of(Str[0]);
1382 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1384 Value *Sel1 = NullPtr;
1387 Value *PosVal = ConstantInt::get(SizeTy, Pos);
1388 Value *StrPos = ConstantInt::get(Int8Ty, Str[Pos]);
1389 Value *CEqSPos =
B.CreateICmpEQ(CharVal, StrPos);
1391 Value *
And =
B.CreateAnd(CEqSPos, NGtPos);
1392 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, PosVal);
1393 Sel1 =
B.CreateSelect(
And, SrcPlus, NullPtr,
"memchr.sel1");
1396 Value *Str0 = ConstantInt::get(Int8Ty, Str[0]);
1397 Value *CEqS0 =
B.CreateICmpEQ(Str0, CharVal);
1398 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1400 return B.CreateSelect(
And, SrcStr, Sel1,
"memchr.sel2");
1431 *std::max_element(
reinterpret_cast<const unsigned char *
>(Str.begin()),
1432 reinterpret_cast<const unsigned char *
>(Str.end()));
1439 if (!DL.fitsInLegalInteger(Max + 1)) {
1445 std::string SortedStr = Str.str();
1448 unsigned NonContRanges = 1;
1449 for (
size_t i = 1; i < SortedStr.size(); ++i) {
1450 if (SortedStr[i] > SortedStr[i - 1] + 1) {
1457 if (NonContRanges > 2)
1461 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1464 for (
unsigned char C : SortedStr)
1465 CharCompares.
push_back(
B.CreateICmpEQ(CharVal,
B.getInt8(
C)));
1467 return B.CreateIntToPtr(
B.CreateOr(CharCompares), CI->
getType());
1472 unsigned char Width =
NextPowerOf2(std::max((
unsigned char)7, Max));
1478 Value *BitfieldC =
B.getInt(Bitfield);
1482 C =
B.CreateAnd(
C,
B.getIntN(Width, 0xFF));
1489 Value *Shl =
B.CreateShl(
B.getIntN(Width, 1ULL),
C);
1490 Value *
Bits =
B.CreateIsNotNull(
B.CreateAnd(Shl, BitfieldC),
"memchr.bits");
1494 return B.CreateIntToPtr(
B.CreateLogicalAnd(Bounds, Bits,
"memchr"),
1519 if (Pos == MinSize ||
1520 (StrNCmp && (LStr[Pos] ==
'\0' && RStr[Pos] ==
'\0'))) {
1528 if (LStr[Pos] != RStr[Pos])
1533 typedef unsigned char UChar;
1534 int IRes = UChar(LStr[Pos]) < UChar(RStr[Pos]) ? -1 : 1;
1535 Value *MaxSize = ConstantInt::get(
Size->getType(), Pos);
1538 return B.CreateSelect(Cmp, Zero, Res);
1550 Value *LHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
LHS,
"lhsc"),
1552 Value *RHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
RHS,
"rhsc"),
1554 return B.CreateSub(LHSV, RHSV,
"chardiff");
1562 Align PrefAlignment =
DL.getPrefTypeAlign(IntType);
1565 Value *LHSV =
nullptr;
1569 Value *RHSV =
nullptr;
1578 LHSV =
B.CreateLoad(IntType,
LHS,
"lhsv");
1580 RHSV =
B.CreateLoad(IntType,
RHS,
"rhsv");
1581 return B.CreateZExt(
B.CreateICmpNE(LHSV, RHSV), CI->
getType(),
"memcmp");
1589Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(
CallInst *CI,
1609 if (
Value *V = optimizeMemCmpBCmpCommon(CI,
B))
1627 return optimizeMemCmpBCmpCommon(CI,
B);
1653 if (
N->isNullValue())
1666 if (
N->getZExtValue() <= SrcStr.
size()) {
1675 ConstantInt::get(
N->getType(), std::min(uint64_t(Pos + 1),
N->getZExtValue()));
1678 return Pos + 1 <=
N->getZExtValue()
1679 ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, NewN)
1693 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
N);
1731Value *LibCallSimplifier::maybeOptimizeNoBuiltinOperatorNew(
CallInst *CI,
1739 if (!TLI->getLibFunc(*Callee, Func))
1743 case LibFunc_ZnwmRKSt9nothrow_t:
1744 case LibFunc_ZnwmSt11align_val_t:
1745 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1747 case LibFunc_ZnamRKSt9nothrow_t:
1748 case LibFunc_ZnamSt11align_val_t:
1749 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1750 case LibFunc_size_returning_new:
1751 case LibFunc_size_returning_new_aligned:
1758 case LibFunc_Znwm12__hot_cold_t:
1759 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1760 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1761 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1762 case LibFunc_Znam12__hot_cold_t:
1763 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1764 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1765 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1766 case LibFunc_size_returning_new_hot_cold:
1767 case LibFunc_size_returning_new_aligned_hot_cold:
1776 return optimizeNew(CI,
B, Func);
1789 if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"cold")
1791 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1794 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"hot")
1796 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1809 Value *NewCall =
nullptr;
1811 case LibFunc_Znwm12__hot_cold_t:
1814 LibFunc_Znwm12__hot_cold_t, HotCold);
1818 LibFunc_Znwm12__hot_cold_t, HotCold);
1820 case LibFunc_Znam12__hot_cold_t:
1823 LibFunc_Znam12__hot_cold_t, HotCold);
1827 LibFunc_Znam12__hot_cold_t, HotCold);
1829 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1833 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1835 case LibFunc_ZnwmRKSt9nothrow_t:
1838 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1840 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1844 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1846 case LibFunc_ZnamRKSt9nothrow_t:
1849 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1851 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1855 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1857 case LibFunc_ZnwmSt11align_val_t:
1860 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1862 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1866 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1868 case LibFunc_ZnamSt11align_val_t:
1871 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1873 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1877 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1880 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1883 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t, HotCold);
1885 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1889 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1892 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1895 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t, HotCold);
1897 case LibFunc_size_returning_new:
1899 LibFunc_size_returning_new_hot_cold,
1902 case LibFunc_size_returning_new_hot_cold:
1905 LibFunc_size_returning_new_hot_cold,
1908 case LibFunc_size_returning_new_aligned:
1911 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1913 case LibFunc_size_returning_new_aligned_hot_cold:
1917 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1948 Value *
Op = Cast->getOperand(0);
1949 if (
Op->getType()->isFloatTy())
1958 return ConstantFP::get(Const->getContext(),
F);
1966 bool isPrecise =
false) {
1998 CallerName.
size() == (CalleeName.
size() + 1) &&
2011 R =
isBinary ?
B.CreateIntrinsic(IID,
B.getFloatTy(), V)
2012 :
B.CreateIntrinsic(IID,
B.getFloatTy(), V[0]);
2019 return B.CreateFPExt(R,
B.getDoubleTy());
2025 bool isPrecise =
false) {
2032 bool isPrecise =
false) {
2046 assert(
Op->getType()->isArrayTy() &&
"Unexpected signature for cabs!");
2048 Real =
B.CreateExtractValue(
Op, 0,
"real");
2049 Imag =
B.CreateExtractValue(
Op, 1,
"imag");
2059 Value *AbsOp =
nullptr;
2061 if (ConstReal->isZero())
2065 if (ConstImag->isZero())
2071 *CI,
B.CreateUnaryIntrinsic(Intrinsic::fabs, AbsOp, CI,
"cabs"));
2078 Value *RealReal =
B.CreateFMulFMF(Real, Real, CI);
2079 Value *ImagImag =
B.CreateFMulFMF(Imag, Imag, CI);
2081 *CI,
B.CreateUnaryIntrinsic(Intrinsic::sqrt,
2082 B.CreateFAddFMF(RealReal, ImagImag, CI), CI,
2093 unsigned BitWidth =
Op->getType()->getScalarSizeInBits();
2095 Type *IntTy =
Op->getType()->getWithNewBitWidth(DstWidth);
2097 :
B.CreateZExt(
Op, IntTy);
2133 if (CalleeFn && TLI->getLibFunc(CalleeFn->
getName(), LibFn) &&
2138 LibFunc LibFnFloat, LibFnDouble, LibFnLongDouble;
2146 ExpName = TLI->getName(LibFunc_exp);
2147 ID = Intrinsic::exp;
2148 LibFnFloat = LibFunc_expf;
2149 LibFnDouble = LibFunc_exp;
2150 LibFnLongDouble = LibFunc_expl;
2155 ExpName = TLI->getName(LibFunc_exp2);
2156 ID = Intrinsic::exp2;
2157 LibFnFloat = LibFunc_exp2f;
2158 LibFnDouble = LibFunc_exp2;
2159 LibFnLongDouble = LibFunc_exp2l;
2166 ?
B.CreateUnaryIntrinsic(
ID,
FMul,
nullptr, ExpName)
2175 substituteInParent(BaseFn, ExpFn);
2186 AttributeList NoAttrs;
2194 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2199 Constant *One = ConstantFP::get(Ty, 1.0);
2202 return copyFlags(*Pow,
B.CreateIntrinsic(Intrinsic::ldexp,
2203 {Ty, ExpoI->getType()},
2204 {One, ExpoI}, Pow,
"exp2"));
2208 One, ExpoI, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2209 LibFunc_ldexpl,
B, NoAttrs));
2214 if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f, LibFunc_exp2l)) {
2217 BaseR = BaseR / *BaseF;
2219 const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
2221 if ((IsInteger || IsReciprocal) &&
2224 NI > 1 && NI.isPowerOf2()) {
2225 double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
2226 Value *
FMul =
B.CreateFMul(Expo, ConstantFP::get(Ty,
N),
"mul");
2228 return copyFlags(*Pow,
B.CreateUnaryIntrinsic(Intrinsic::exp2,
FMul,
2233 LibFunc_exp2l,
B, NoAttrs));
2239 hasFloatFn(M, TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) {
2242 CallInst *NewExp10 =
2243 B.CreateIntrinsic(Intrinsic::exp10, {Ty}, {Expo}, Pow,
"exp10");
2248 LibFunc_exp10f, LibFunc_exp10l,
2258 "pow(1.0, y) should have been simplified earlier!");
2267 Value *
FMul =
B.CreateFMul(Log, Expo,
"mul");
2269 return copyFlags(*Pow,
B.CreateUnaryIntrinsic(Intrinsic::exp2,
FMul,
2271 else if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f,
2275 LibFunc_exp2l,
B, NoAttrs));
2287 return B.CreateUnaryIntrinsic(Intrinsic::sqrt, V,
nullptr,
"sqrt");
2290 if (
hasFloatFn(M, TLI, V->getType(), LibFunc_sqrt, LibFunc_sqrtf,
2296 LibFunc_sqrtl,
B, Attrs);
2323 Base, SimplifyQuery(DL, TLI, DT, AC, Pow,
true,
true, DC)))
2333 Sqrt =
B.CreateUnaryIntrinsic(Intrinsic::fabs, Sqrt,
nullptr,
"abs");
2342 Value *FCmp =
B.CreateFCmpOEQ(
Base, NegInf,
"isinf");
2343 Sqrt =
B.CreateSelect(FCmp, PosInf, Sqrt);
2348 Sqrt =
B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt,
"reciprocal");
2357 return B.CreateIntrinsic(Intrinsic::powi, Types, Args);
2371 IRBuilderBase::FastMathFlagGuard Guard(
B);
2379 if (
Value *Exp = replacePowWithExp(Pow,
B))
2386 return B.CreateFDiv(ConstantFP::get(Ty, 1.0),
Base,
"reciprocal");
2390 return ConstantFP::get(Ty, 1.0);
2398 return B.CreateFMul(
Base,
Base,
"square");
2400 if (
Value *Sqrt = replacePowWithSqrt(Pow,
B))
2411 Value *Sqrt =
nullptr;
2412 if (!ExpoA.isInteger()) {
2426 if (!ExpoI.isInteger())
2438 APSInt IntExpo(TLI->getIntSize(),
false);
2445 Base, ConstantInt::get(
B.getIntNTy(TLI->getIntSize()), IntExpo),
2449 return B.CreateFMul(PowI, Sqrt);
2463 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
2464 hasFloatVersion(M, Name)) {
2476 Value *Ret =
nullptr;
2477 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_exp2) &&
2478 hasFloatVersion(M, Name))
2487 const bool UseIntrinsic =
Callee->isIntrinsic();
2498 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2500 Constant *One = ConstantFP::get(Ty, 1.0);
2503 return copyFlags(*CI,
B.CreateIntrinsic(Intrinsic::ldexp,
2504 {Ty, Exp->getType()},
2508 IRBuilderBase::FastMathFlagGuard Guard(
B);
2511 One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2512 LibFunc_ldexpl,
B, AttributeList()));
2526 if ((Name ==
"fmin" || Name ==
"fmax") && hasFloatVersion(M, Name))
2541 : Intrinsic::maxnum;
2546Value *LibCallSimplifier::optimizeFMinimumnumFMaximumnum(
CallInst *CI,
2554 if ((Name ==
"fminimum_num" || Name ==
"fmaximum_num") &&
2555 hasFloatVersion(M, Name))
2564 ? Intrinsic::minimumnum
2565 : Intrinsic::maximumnum;
2572 StringRef LogNm = LogFn->
getName();
2577 if (UnsafeFPShrink && hasFloatVersion(
Mod, LogNm))
2581 LibFunc LogLb, ExpLb, Exp2Lb, Exp10Lb, PowLb;
2584 if (TLI->getLibFunc(LogNm, LogLb)) {
2587 LogID = Intrinsic::log;
2588 ExpLb = LibFunc_expf;
2589 Exp2Lb = LibFunc_exp2f;
2590 Exp10Lb = LibFunc_exp10f;
2591 PowLb = LibFunc_powf;
2594 LogID = Intrinsic::log;
2595 ExpLb = LibFunc_exp;
2596 Exp2Lb = LibFunc_exp2;
2597 Exp10Lb = LibFunc_exp10;
2598 PowLb = LibFunc_pow;
2601 LogID = Intrinsic::log;
2602 ExpLb = LibFunc_expl;
2603 Exp2Lb = LibFunc_exp2l;
2604 Exp10Lb = LibFunc_exp10l;
2605 PowLb = LibFunc_powl;
2608 LogID = Intrinsic::log2;
2609 ExpLb = LibFunc_expf;
2610 Exp2Lb = LibFunc_exp2f;
2611 Exp10Lb = LibFunc_exp10f;
2612 PowLb = LibFunc_powf;
2615 LogID = Intrinsic::log2;
2616 ExpLb = LibFunc_exp;
2617 Exp2Lb = LibFunc_exp2;
2618 Exp10Lb = LibFunc_exp10;
2619 PowLb = LibFunc_pow;
2622 LogID = Intrinsic::log2;
2623 ExpLb = LibFunc_expl;
2624 Exp2Lb = LibFunc_exp2l;
2625 Exp10Lb = LibFunc_exp10l;
2626 PowLb = LibFunc_powl;
2628 case LibFunc_log10f:
2629 LogID = Intrinsic::log10;
2630 ExpLb = LibFunc_expf;
2631 Exp2Lb = LibFunc_exp2f;
2632 Exp10Lb = LibFunc_exp10f;
2633 PowLb = LibFunc_powf;
2636 LogID = Intrinsic::log10;
2637 ExpLb = LibFunc_exp;
2638 Exp2Lb = LibFunc_exp2;
2639 Exp10Lb = LibFunc_exp10;
2640 PowLb = LibFunc_pow;
2642 case LibFunc_log10l:
2643 LogID = Intrinsic::log10;
2644 ExpLb = LibFunc_expl;
2645 Exp2Lb = LibFunc_exp2l;
2646 Exp10Lb = LibFunc_exp10l;
2647 PowLb = LibFunc_powl;
2654 bool IsKnownNoErrno =
Log->hasNoNaNs() &&
Log->hasNoInfs();
2655 if (!IsKnownNoErrno) {
2656 SimplifyQuery SQ(DL, TLI, DT, AC, Log,
true,
true, DC);
2666 if (IsKnownNoErrno) {
2667 auto *NewLog =
B.CreateUnaryIntrinsic(LogID,
Log->getArgOperand(0), Log);
2668 NewLog->copyMetadata(*Log);
2671 }
else if (LogID == Intrinsic::log || LogID == Intrinsic::log2 ||
2672 LogID == Intrinsic::log10) {
2674 ExpLb = LibFunc_expf;
2675 Exp2Lb = LibFunc_exp2f;
2676 Exp10Lb = LibFunc_exp10f;
2677 PowLb = LibFunc_powf;
2679 ExpLb = LibFunc_exp;
2680 Exp2Lb = LibFunc_exp2;
2681 Exp10Lb = LibFunc_exp10;
2682 PowLb = LibFunc_pow;
2693 IRBuilderBase::FastMathFlagGuard Guard(
B);
2697 LibFunc ArgLb = NotLibFunc;
2698 TLI->getLibFunc(*Arg, ArgLb);
2701 AttributeList NoAttrs;
2702 if (ArgLb == PowLb || ArgID == Intrinsic::pow || ArgID == Intrinsic::powi) {
2704 Log->doesNotAccessMemory()
2705 ?
B.CreateUnaryIntrinsic(LogID, Arg->
getOperand(0),
nullptr,
"log")
2709 if (ArgID == Intrinsic::powi)
2710 Y =
B.CreateSIToFP(
Y, Ty,
"cast");
2711 Value *MulY =
B.CreateFMul(
Y, LogX,
"mul");
2714 substituteInParent(Arg, MulY);
2720 if (ArgLb == ExpLb || ArgLb == Exp2Lb || ArgLb == Exp10Lb ||
2721 ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) {
2723 if (ArgLb == ExpLb || ArgID == Intrinsic::exp)
2726 else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2)
2727 Eul = ConstantFP::get(
Log->getType(), 2.0);
2729 Eul = ConstantFP::get(
Log->getType(), 10.0);
2730 Value *LogE =
Log->doesNotAccessMemory()
2731 ?
B.CreateUnaryIntrinsic(LogID, Eul,
nullptr,
"log")
2736 substituteInParent(Arg, MulY);
2753 LibFunc ArgLb = NotLibFunc;
2754 TLI->getLibFunc(*Arg, ArgLb);
2756 LibFunc SqrtLb, ExpLb, Exp2Lb, Exp10Lb;
2758 if (TLI->getLibFunc(SqrtFn->
getName(), SqrtLb))
2761 ExpLb = LibFunc_expf;
2762 Exp2Lb = LibFunc_exp2f;
2763 Exp10Lb = LibFunc_exp10f;
2766 ExpLb = LibFunc_exp;
2767 Exp2Lb = LibFunc_exp2;
2768 Exp10Lb = LibFunc_exp10;
2771 ExpLb = LibFunc_expl;
2772 Exp2Lb = LibFunc_exp2l;
2773 Exp10Lb = LibFunc_exp10l;
2780 ExpLb = LibFunc_expf;
2781 Exp2Lb = LibFunc_exp2f;
2782 Exp10Lb = LibFunc_exp10f;
2784 ExpLb = LibFunc_exp;
2785 Exp2Lb = LibFunc_exp2;
2786 Exp10Lb = LibFunc_exp10;
2792 if (ArgLb != ExpLb && ArgLb != Exp2Lb && ArgLb != Exp10Lb &&
2793 ArgID != Intrinsic::exp && ArgID != Intrinsic::exp2)
2796 IRBuilderBase::InsertPointGuard Guard(
B);
2797 B.SetInsertPoint(Arg);
2800 B.CreateFMulFMF(ExpOperand, ConstantFP::get(ExpOperand->getType(), 0.5),
2810 Value *Ret =
nullptr;
2815 (
Callee->getName() ==
"sqrt" ||
2816 Callee->getIntrinsicID() == Intrinsic::sqrt))
2819 if (
Value *Opt = mergeSqrtToExp(CI,
B))
2826 if (!
I ||
I->getOpcode() != Instruction::FMul || !
I->isFast())
2832 Value *Op0 =
I->getOperand(0);
2833 Value *Op1 =
I->getOperand(1);
2834 Value *RepeatOp =
nullptr;
2835 Value *OtherOp =
nullptr;
2867 B.CreateUnaryIntrinsic(Intrinsic::fabs, RepeatOp,
I,
"fabs");
2873 B.CreateUnaryIntrinsic(Intrinsic::sqrt, OtherOp,
I,
"sqrt");
2874 return copyFlags(*CI,
B.CreateFMulFMF(FabsCall, SqrtCall,
I));
2886 SimplifyQuery SQ(DL, TLI, DT, AC, CI,
true,
true, DC);
2889 KnownFPClass Known1 =
2892 const fltSemantics &FltSem =
2901 FRemI->setHasNoNaNs(
true);
2907Value *LibCallSimplifier::optimizeTrigInversionPairs(
CallInst *CI,
2911 Value *Ret =
nullptr;
2913 if (UnsafeFPShrink &&
2914 (Name ==
"tan" || Name ==
"atanh" || Name ==
"sinh" || Name ==
"cosh" ||
2916 hasFloatVersion(M, Name))
2925 if (!CI->
isFast() || !OpC->isFast())
2935 if (
F && TLI->getLibFunc(
F->getName(), Func) &&
2937 LibFunc inverseFunc = llvm::StringSwitch<LibFunc>(
Callee->getName())
2938 .Case(
"tan", LibFunc_atan)
2939 .Case(
"atanh", LibFunc_tanh)
2940 .Case(
"sinh", LibFunc_asinh)
2941 .Case(
"cosh", LibFunc_acosh)
2942 .Case(
"tanf", LibFunc_atanf)
2943 .Case(
"atanhf", LibFunc_tanhf)
2944 .Case(
"sinhf", LibFunc_asinhf)
2945 .Case(
"coshf", LibFunc_acoshf)
2946 .Case(
"tanl", LibFunc_atanl)
2947 .Case(
"atanhl", LibFunc_tanhl)
2948 .Case(
"sinhl", LibFunc_asinhl)
2949 .Case(
"coshl", LibFunc_acoshl)
2950 .Case(
"asinh", LibFunc_sinh)
2951 .Case(
"asinhf", LibFunc_sinhf)
2952 .Case(
"asinhl", LibFunc_sinhl)
2953 .Default(NotLibFunc);
2954 if (Func == inverseFunc)
2955 Ret = OpC->getArgOperand(0);
2977 Name =
"__sincospif_stret";
2986 Name =
"__sincospi_stret";
2995 M, *TLI, TheLibFunc, OrigCallee->
getAttributes(), ResTy, ArgTy);
3000 B.SetInsertPoint(ArgInst->getParent(), ++ArgInst->getIterator());
3004 BasicBlock &EntryBB =
B.GetInsertBlock()->getParent()->getEntryBlock();
3005 B.SetInsertPoint(&EntryBB, EntryBB.
begin());
3008 SinCos =
B.CreateCall(Callee, Arg,
"sincospi");
3011 Sin =
B.CreateExtractValue(SinCos, 0,
"sinpi");
3012 Cos =
B.CreateExtractValue(SinCos, 1,
"cospi");
3014 Sin =
B.CreateExtractElement(SinCos, ConstantInt::get(
B.getInt32Ty(), 0),
3016 Cos =
B.CreateExtractElement(SinCos, ConstantInt::get(
B.getInt32Ty(), 1),
3030 Call->copyFastMathFlags(CI);
3044 Call->copyFastMathFlags(CI);
3051Value *LibCallSimplifier::optimizeSymmetric(
CallInst *CI, LibFunc Func,
3097 for (User *U : Arg->
users())
3098 classifyArgUse(U,
F, IsFloat, SinCalls, CosCalls, SinCosCalls);
3104 Value *Sin, *Cos, *SinCos;
3109 auto replaceTrigInsts = [
this](SmallVectorImpl<CallInst *> &Calls,
3111 for (CallInst *
C : Calls)
3112 replaceAllUsesWith(
C, Res);
3115 replaceTrigInsts(SinCalls, Sin);
3116 replaceTrigInsts(CosCalls, Cos);
3117 replaceTrigInsts(SinCosCalls, SinCos);
3119 return IsSin ? Sin : Cos;
3122void LibCallSimplifier::classifyArgUse(
3138 if (!Callee || !TLI->getLibFunc(*Callee, Func) ||
3144 if (Func == LibFunc_sinpif)
3146 else if (Func == LibFunc_cospif)
3148 else if (Func == LibFunc_sincospif_stret)
3151 if (Func == LibFunc_sinpi)
3153 else if (Func == LibFunc_cospi)
3155 else if (Func == LibFunc_sincospi_stret)
3177 unsigned IntBW = TLI->getIntSize();
3178 APSInt QuotInt(IntBW,
false);
3185 B.CreateAlignedStore(
3188 return ConstantFP::get(CI->
getType(), Rem);
3215 return ConstantFP::get(CI->
getType(), MaxVal);
3227 Type *ArgType =
Op->getType();
3228 Value *
V =
B.CreateIntrinsic(Intrinsic::cttz, {ArgType}, {
Op,
B.getTrue()},
3230 V =
B.CreateAdd(V, ConstantInt::get(
V->getType(), 1));
3231 V =
B.CreateIntCast(V, RetType,
false);
3234 return B.CreateSelect(
Cond, V, ConstantInt::get(RetType, 0));
3241 Type *ArgType =
Op->getType();
3242 Value *
V =
B.CreateIntrinsic(Intrinsic::ctlz, {ArgType}, {
Op,
B.getFalse()},
3246 return B.CreateIntCast(V, CI->
getType(),
false);
3253 Value *IsNeg =
B.CreateIsNeg(
X);
3254 Value *NegX =
B.CreateNSWNeg(
X,
"neg");
3255 return B.CreateSelect(IsNeg, NegX,
X);
3261 Type *ArgType =
Op->getType();
3262 Op =
B.CreateSub(
Op, ConstantInt::get(ArgType,
'0'),
"isdigittmp");
3263 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 10),
"isdigit");
3270 Type *ArgType =
Op->getType();
3271 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 128),
"isascii");
3278 ConstantInt::get(CI->
getType(), 0x7F));
3308 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned,
B);
3340 if (!Callee || !Callee->isDeclaration())
3349 if (StreamArg >= (
int)CI->
arg_size())
3357 return GV->
getName() ==
"stderr";
3362 StringRef FormatStr;
3367 if (FormatStr.
empty())
3378 if (FormatStr.
size() == 1 || FormatStr ==
"%%") {
3382 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)FormatStr[0]);
3383 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3387 if (FormatStr ==
"%s" && CI->
arg_size() > 1) {
3388 StringRef OperandStr;
3389 if (!getConstantStringInfo(CI->getOperand(1), OperandStr))
3392 if (OperandStr.empty())
3395 if (OperandStr.size() == 1) {
3399 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)OperandStr[0]);
3400 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3403 if (OperandStr.back() ==
'\n') {
3404 OperandStr = OperandStr.drop_back();
3405 Value *GV = B.CreateGlobalString(OperandStr,
"str");
3406 return copyFlags(*CI, emitPutS(GV, B, TLI));
3412 if (FormatStr.
back() ==
'\n' &&
3416 FormatStr = FormatStr.drop_back();
3417 Value *GV = B.CreateGlobalString(FormatStr,
"str");
3418 return copyFlags(*CI, emitPutS(GV, B, TLI));
3423 if (FormatStr ==
"%c" && CI->
arg_size() > 1 &&
3427 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false);
3428 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3432 if (FormatStr ==
"%s\n" && CI->
arg_size() > 1 &&
3442 FunctionType *FT =
Callee->getFunctionType();
3443 if (
Value *V = optimizePrintFString(CI,
B)) {
3454 Callee->getAttributes());
3456 New->setCalledFunction(IPrintFFn);
3466 Callee->getAttributes());
3468 New->setCalledFunction(SmallPrintFFn);
3476Value *LibCallSimplifier::optimizeSPrintFString(
CallInst *CI,
3479 StringRef FormatStr;
3495 return ConstantInt::get(CI->
getType(), FormatStr.
size());
3500 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3504 if (FormatStr[1] ==
'c') {
3510 B.CreateStore(V, Ptr);
3511 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3512 B.CreateStore(
B.getInt8(0), Ptr);
3514 return ConstantInt::get(CI->
getType(), 1);
3517 if (FormatStr[1] ==
's') {
3530 TLI->getAsSizeT(SrcLen, *CI->
getModule()));
3532 return ConstantInt::get(CI->
getType(), SrcLen - 1);
3535 Value *PtrDiff =
B.CreatePtrDiff(
B.getInt8Ty(), V, Dest);
3536 return B.CreateIntCast(PtrDiff, CI->
getType(),
false);
3547 B.CreateAdd(Len, ConstantInt::get(
Len->getType(), 1),
"leninc");
3551 return B.CreateIntCast(Len, CI->
getType(),
false);
3559 FunctionType *FT =
Callee->getFunctionType();
3560 if (
Value *V = optimizeSPrintFString(CI,
B)) {
3571 FT,
Callee->getAttributes());
3573 New->setCalledFunction(SIPrintFFn);
3583 Callee->getAttributes());
3585 New->setCalledFunction(SmallSPrintFFn);
3601 assert(StrArg || (
N < 2 && Str.size() == 1));
3603 unsigned IntBits = TLI->getIntSize();
3604 uint64_t IntMax =
maxIntN(IntBits);
3605 if (Str.size() > IntMax)
3611 Value *StrLen = ConstantInt::get(CI->
getType(), Str.size());
3621 NCopy = Str.size() + 1;
3626 if (NCopy && StrArg)
3629 TLI->getAsSizeT(NCopy, *CI->
getModule())));
3638 Value *NulOff =
B.getIntN(IntBits, NCopy);
3639 Value *DstEnd =
B.CreateInBoundsGEP(Int8Ty, DstArg, NulOff,
"endptr");
3640 B.CreateStore(ConstantInt::get(Int8Ty, 0), DstEnd);
3644Value *LibCallSimplifier::optimizeSnPrintFString(
CallInst *CI,
3651 uint64_t
N =
Size->getZExtValue();
3652 uint64_t IntMax =
maxIntN(TLI->getIntSize());
3662 StringRef FormatStr;
3673 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr,
N,
B);
3678 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() != 4)
3682 if (FormatStr[1] ==
'c') {
3687 StringRef CharStr(
"*");
3688 return emitSnPrintfMemCpy(CI,
nullptr, CharStr,
N,
B);
3695 Value *Ptr = DstArg;
3696 B.CreateStore(V, Ptr);
3697 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3698 B.CreateStore(
B.getInt8(0), Ptr);
3699 return ConstantInt::get(CI->
getType(), 1);
3702 if (FormatStr[1] !=
's')
3711 return emitSnPrintfMemCpy(CI, StrArg, Str,
N,
B);
3715 if (
Value *V = optimizeSnPrintFString(CI,
B)) {
3724Value *LibCallSimplifier::optimizeFPrintFString(
CallInst *CI,
3726 optimizeErrorReporting(CI,
B, 0);
3729 StringRef FormatStr;
3753 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3757 if (FormatStr[1] ==
'c') {
3761 Type *IntTy =
B.getIntNTy(TLI->getIntSize());
3767 if (FormatStr[1] ==
's') {
3780 FunctionType *FT =
Callee->getFunctionType();
3781 if (
Value *V = optimizeFPrintFString(CI,
B)) {
3790 FT,
Callee->getAttributes());
3792 New->setCalledFunction(FIPrintFFn);
3801 auto SmallFPrintFFn =
3803 Callee->getAttributes());
3805 New->setCalledFunction(SmallFPrintFFn);
3814 optimizeErrorReporting(CI,
B, 3);
3819 if (SizeC && CountC) {
3824 return ConstantInt::get(CI->
getType(), 0);
3831 Value *Cast =
B.CreateIntCast(Char, IntTy,
true,
"chari");
3833 return NewCI ? ConstantInt::get(CI->
getType(), 1) : nullptr;
3841 optimizeErrorReporting(CI,
B, 1);
3859 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
3864 ConstantInt::get(SizeTTy, Len - 1),
3904bool LibCallSimplifier::hasFloatVersion(
const Module *M,
StringRef FuncName) {
3905 SmallString<20> FloatFuncName = FuncName;
3906 FloatFuncName +=
'f';
3910Value *LibCallSimplifier::optimizeStringMemoryLibCall(
CallInst *CI,
3922 "Optimizing string/memory libcall would change the calling convention");
3924 case LibFunc_strcat:
3925 return optimizeStrCat(CI, Builder);
3926 case LibFunc_strncat:
3927 return optimizeStrNCat(CI, Builder);
3928 case LibFunc_strchr:
3929 return optimizeStrChr(CI, Builder);
3930 case LibFunc_strrchr:
3931 return optimizeStrRChr(CI, Builder);
3932 case LibFunc_strcmp:
3933 return optimizeStrCmp(CI, Builder);
3934 case LibFunc_strncmp:
3935 return optimizeStrNCmp(CI, Builder);
3936 case LibFunc_strcpy:
3937 return optimizeStrCpy(CI, Builder);
3938 case LibFunc_stpcpy:
3939 return optimizeStpCpy(CI, Builder);
3940 case LibFunc_strlcpy:
3941 return optimizeStrLCpy(CI, Builder);
3942 case LibFunc_stpncpy:
3943 return optimizeStringNCpy(CI,
true, Builder);
3944 case LibFunc_strncpy:
3945 return optimizeStringNCpy(CI,
false, Builder);
3946 case LibFunc_strlen:
3947 return optimizeStrLen(CI, Builder);
3948 case LibFunc_strnlen:
3949 return optimizeStrNLen(CI, Builder);
3950 case LibFunc_strpbrk:
3951 return optimizeStrPBrk(CI, Builder);
3952 case LibFunc_strndup:
3953 return optimizeStrNDup(CI, Builder);
3954 case LibFunc_strtol:
3955 case LibFunc_strtod:
3956 case LibFunc_strtof:
3957 case LibFunc_strtoul:
3958 case LibFunc_strtoll:
3959 case LibFunc_strtold:
3960 case LibFunc_strtoull:
3961 return optimizeStrTo(CI, Builder);
3962 case LibFunc_strspn:
3963 return optimizeStrSpn(CI, Builder);
3964 case LibFunc_strcspn:
3965 return optimizeStrCSpn(CI, Builder);
3966 case LibFunc_strstr:
3967 return optimizeStrStr(CI, Builder);
3968 case LibFunc_memchr:
3969 return optimizeMemChr(CI, Builder);
3970 case LibFunc_memrchr:
3971 return optimizeMemRChr(CI, Builder);
3973 return optimizeBCmp(CI, Builder);
3974 case LibFunc_memcmp:
3975 return optimizeMemCmp(CI, Builder);
3976 case LibFunc_memcpy:
3977 return optimizeMemCpy(CI, Builder);
3978 case LibFunc_memccpy:
3979 return optimizeMemCCpy(CI, Builder);
3980 case LibFunc_mempcpy:
3981 return optimizeMemPCpy(CI, Builder);
3982 case LibFunc_memmove:
3983 return optimizeMemMove(CI, Builder);
3984 case LibFunc_memset:
3985 return optimizeMemSet(CI, Builder);
3986 case LibFunc_realloc:
3987 return optimizeRealloc(CI, Builder);
3988 case LibFunc_wcslen:
3989 return optimizeWcslen(CI, Builder);
3991 return optimizeBCopy(CI, Builder);
3993 case LibFunc_ZnwmRKSt9nothrow_t:
3994 case LibFunc_ZnwmSt11align_val_t:
3995 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
3997 case LibFunc_ZnamRKSt9nothrow_t:
3998 case LibFunc_ZnamSt11align_val_t:
3999 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
4000 case LibFunc_Znwm12__hot_cold_t:
4001 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
4002 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
4003 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4004 case LibFunc_Znam12__hot_cold_t:
4005 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
4006 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
4007 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4008 case LibFunc_size_returning_new:
4009 case LibFunc_size_returning_new_hot_cold:
4010 case LibFunc_size_returning_new_aligned:
4011 case LibFunc_size_returning_new_aligned_hot_cold:
4012 return optimizeNew(CI, Builder, Func);
4028 if (CharSeq.
empty())
4029 Fill =
APInt(32, 0);
4036Value *LibCallSimplifier::optimizeFloatingPointLibCall(
CallInst *CI,
4045 if (
Value *V = optimizeSymmetric(CI, Func, Builder))
4049 case LibFunc_sinpif:
4051 return optimizeSinCosPi(CI,
true, Builder);
4052 case LibFunc_cospif:
4054 return optimizeSinCosPi(CI,
false, Builder);
4058 return optimizePow(CI, Builder);
4062 return optimizeExp2(CI, Builder);
4070 return optimizeSqrt(CI, Builder);
4074 return optimizeFMod(CI, Builder);
4078 case LibFunc_log10f:
4080 case LibFunc_log10l:
4081 case LibFunc_log1pf:
4083 case LibFunc_log1pl:
4090 return optimizeLog(CI, Builder);
4098 case LibFunc_asinhf:
4099 case LibFunc_asinhl:
4104 case LibFunc_atanhf:
4105 case LibFunc_atanhl:
4106 return optimizeTrigInversionPairs(CI, Builder);
4113 case LibFunc_roundeven:
4115 case LibFunc_nearbyint:
4135 case LibFunc_copysign:
4142 return optimizeFdim(CI, Builder);
4149 return optimizeFMinFMax(CI, Builder);
4150 case LibFunc_fminimum_numf:
4151 case LibFunc_fminimum_num:
4152 case LibFunc_fminimum_numl:
4153 case LibFunc_fmaximum_numf:
4154 case LibFunc_fmaximum_num:
4155 case LibFunc_fmaximum_numl:
4156 return optimizeFMinimumnumFMaximumnum(CI, Builder);
4160 return optimizeCAbs(CI, Builder);
4161 case LibFunc_remquo:
4162 case LibFunc_remquof:
4163 case LibFunc_remquol:
4164 return optimizeRemquo(CI, Builder);
4183 return maybeOptimizeNoBuiltinOperatorNew(CI, Builder);
4194 Builder.setDefaultOperandBundles(OpBundles);
4202 UnsafeFPShrink =
true;
4206 if (!IsCallingConvC)
4210 switch (
II->getIntrinsicID()) {
4211 case Intrinsic::pow:
4212 return optimizePow(CI, Builder);
4213 case Intrinsic::exp2:
4214 return optimizeExp2(CI, Builder);
4215 case Intrinsic::log:
4216 case Intrinsic::log2:
4217 case Intrinsic::log10:
4218 return optimizeLog(CI, Builder);
4219 case Intrinsic::sqrt:
4220 return optimizeSqrt(CI, Builder);
4221 case Intrinsic::memset:
4222 return optimizeMemSet(CI, Builder);
4223 case Intrinsic::memcpy:
4224 return optimizeMemCpy(CI, Builder);
4225 case Intrinsic::memmove:
4226 return optimizeMemMove(CI, Builder);
4227 case Intrinsic::sin:
4228 case Intrinsic::cos:
4238 if (
Value *SimplifiedFortifiedCI =
4239 FortifiedSimplifier.optimizeCall(CI, Builder))
4240 return SimplifiedFortifiedCI;
4247 if (
Value *V = optimizeStringMemoryLibCall(CI, Builder))
4249 if (
Value *V = optimizeFloatingPointLibCall(CI, Func, Builder))
4255 return optimizeFFS(CI, Builder);
4259 return optimizeFls(CI, Builder);
4263 return optimizeAbs(CI, Builder);
4264 case LibFunc_isdigit:
4265 return optimizeIsDigit(CI, Builder);
4266 case LibFunc_isascii:
4267 return optimizeIsAscii(CI, Builder);
4268 case LibFunc_toascii:
4269 return optimizeToAscii(CI, Builder);
4273 return optimizeAtoi(CI, Builder);
4274 case LibFunc_strtol:
4275 case LibFunc_strtoll:
4276 return optimizeStrToInt(CI, Builder,
true);
4277 case LibFunc_strtoul:
4278 case LibFunc_strtoull:
4279 return optimizeStrToInt(CI, Builder,
false);
4280 case LibFunc_printf:
4281 return optimizePrintF(CI, Builder);
4282 case LibFunc_sprintf:
4283 return optimizeSPrintF(CI, Builder);
4284 case LibFunc_snprintf:
4285 return optimizeSnPrintF(CI, Builder);
4286 case LibFunc_fprintf:
4287 return optimizeFPrintF(CI, Builder);
4288 case LibFunc_fwrite:
4289 return optimizeFWrite(CI, Builder);
4291 return optimizeFPuts(CI, Builder);
4293 return optimizePuts(CI, Builder);
4294 case LibFunc_perror:
4295 return optimizeErrorReporting(CI, Builder);
4296 case LibFunc_vfprintf:
4297 case LibFunc_fiprintf:
4298 return optimizeErrorReporting(CI, Builder, 0);
4301 return optimizeExit(CI);
4315 : FortifiedSimplifier(TLI), DL(DL), TLI(TLI), DT(DT), DC(DC), AC(AC),
4316 ORE(ORE), BFI(BFI), PSI(PSI), Replacer(Replacer), Eraser(Eraser) {}
4323void LibCallSimplifier::eraseFromParent(
Instruction *
I) {
4362bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(
4363 CallInst *CI,
unsigned ObjSizeOp, std::optional<unsigned> SizeOp,
4364 std::optional<unsigned> StrOp, std::optional<unsigned> FlagOp) {
4369 if (!Flag || !
Flag->isZero())
4376 if (ConstantInt *ObjSizeCI =
4378 if (ObjSizeCI->isMinusOne())
4381 if (OnlyLowerUnknownSize)
4391 return ObjSizeCI->getZExtValue() >=
Len;
4395 if (ConstantInt *SizeCI =
4397 return ObjSizeCI->getZExtValue() >= SizeCI->getZExtValue();
4403Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(
CallInst *CI,
4405 if (isFortifiedCallFoldable(CI, 3, 2)) {
4415Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(
CallInst *CI,
4417 if (isFortifiedCallFoldable(CI, 3, 2)) {
4427Value *FortifiedLibCallSimplifier::optimizeMemSetChk(
CallInst *CI,
4429 if (isFortifiedCallFoldable(CI, 3, 2)) {
4439Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(
CallInst *CI,
4442 if (isFortifiedCallFoldable(CI, 3, 2))
4450Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(
CallInst *CI,
4458 if (Func == LibFunc_stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src) {
4460 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
4468 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) {
4469 if (Func == LibFunc_strcpy_chk)
4475 if (OnlyLowerUnknownSize)
4485 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
4487 Value *LenV = ConstantInt::get(SizeTTy, Len);
4491 if (Ret && Func == LibFunc_stpcpy_chk)
4492 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
4493 ConstantInt::get(SizeTTy, Len - 1));
4497Value *FortifiedLibCallSimplifier::optimizeStrLenChk(
CallInst *CI,
4499 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0))
4505Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(
CallInst *CI,
4508 if (isFortifiedCallFoldable(CI, 3, 2)) {
4509 if (Func == LibFunc_strncpy_chk)
4522Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(
CallInst *CI,
4524 if (isFortifiedCallFoldable(CI, 4, 3))
4532Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(
CallInst *CI,
4534 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) {
4544Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(
CallInst *CI,
4546 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) {
4550 VariadicArgs,
B, TLI));
4556Value *FortifiedLibCallSimplifier::optimizeStrCatChk(
CallInst *CI,
4558 if (isFortifiedCallFoldable(CI, 2))
4565Value *FortifiedLibCallSimplifier::optimizeStrLCat(
CallInst *CI,
4567 if (isFortifiedCallFoldable(CI, 3))
4575Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(
CallInst *CI,
4577 if (isFortifiedCallFoldable(CI, 3))
4585Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(
CallInst *CI,
4587 if (isFortifiedCallFoldable(CI, 3))
4595Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(
CallInst *CI,
4597 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2))
4605Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(
CallInst *CI,
4607 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1))
4638 Builder.setDefaultOperandBundles(OpBundles);
4642 if (!TLI->getLibFunc(*Callee, Func))
4650 case LibFunc_memcpy_chk:
4651 return optimizeMemCpyChk(CI, Builder);
4652 case LibFunc_mempcpy_chk:
4653 return optimizeMemPCpyChk(CI, Builder);
4654 case LibFunc_memmove_chk:
4655 return optimizeMemMoveChk(CI, Builder);
4656 case LibFunc_memset_chk:
4657 return optimizeMemSetChk(CI, Builder);
4658 case LibFunc_stpcpy_chk:
4659 case LibFunc_strcpy_chk:
4660 return optimizeStrpCpyChk(CI, Builder, Func);
4661 case LibFunc_strlen_chk:
4662 return optimizeStrLenChk(CI, Builder);
4663 case LibFunc_stpncpy_chk:
4664 case LibFunc_strncpy_chk:
4665 return optimizeStrpNCpyChk(CI, Builder, Func);
4666 case LibFunc_memccpy_chk:
4667 return optimizeMemCCpyChk(CI, Builder);
4668 case LibFunc_snprintf_chk:
4669 return optimizeSNPrintfChk(CI, Builder);
4670 case LibFunc_sprintf_chk:
4671 return optimizeSPrintfChk(CI, Builder);
4672 case LibFunc_strcat_chk:
4673 return optimizeStrCatChk(CI, Builder);
4674 case LibFunc_strlcat_chk:
4675 return optimizeStrLCat(CI, Builder);
4676 case LibFunc_strncat_chk:
4677 return optimizeStrNCatChk(CI, Builder);
4678 case LibFunc_strlcpy_chk:
4679 return optimizeStrLCpyChk(CI, Builder);
4680 case LibFunc_vsnprintf_chk:
4681 return optimizeVSNPrintfChk(CI, Builder);
4682 case LibFunc_vsprintf_chk:
4683 return optimizeVSPrintfChk(CI, Builder);
4692 : TLI(TLI), OnlyLowerUnknownSize(OnlyLowerUnknownSize) {}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Module.h This file contains the declarations for the Module class.
static llvm::Error parse(DataExtractor &Data, uint64_t BaseAddr, LineEntryCallback const &Callback)
Machine Check Debug Module
uint64_t IntrinsicInst * II
static bool isBinary(MachineInstr &MI)
const SmallVectorImpl< MachineOperand > & Cond
static bool isOnlyUsedInEqualityComparison(Value *V, Value *With)
Return true if it is only used in equality comparisons with With.
static void annotateNonNullAndDereferenceable(CallInst *CI, ArrayRef< unsigned > ArgNos, Value *Size, const DataLayout &DL)
static cl::opt< unsigned, false, HotColdHintParser > ColdNewHintValue("cold-new-hint-value", cl::Hidden, cl::init(1), cl::desc("Value to pass to hot/cold operator new for cold allocation"))
static bool insertSinCosCall(IRBuilderBase &B, Function *OrigCallee, Value *Arg, bool UseFloat, Value *&Sin, Value *&Cos, Value *&SinCos, const TargetLibraryInfo *TLI)
static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, const DataLayout &DL)
static Value * mergeAttributesAndFlags(CallInst *NewCI, const CallInst &Old)
static cl::opt< bool > OptimizeHotColdNew("optimize-hot-cold-new", cl::Hidden, cl::init(false), cl::desc("Enable hot/cold operator new library calls"))
static Value * optimizeBinaryDoubleFP(CallInst *CI, IRBuilderBase &B, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float for binary functions.
static bool ignoreCallingConv(LibFunc Func)
static cl::opt< bool > OptimizeExistingHotColdNew("optimize-existing-hot-cold-new", cl::Hidden, cl::init(false), cl::desc("Enable optimization of existing hot/cold operator new library calls"))
static void annotateDereferenceableBytes(CallInst *CI, ArrayRef< unsigned > ArgNos, uint64_t DereferenceableBytes)
static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg)
static Value * optimizeDoubleFP(CallInst *CI, IRBuilderBase &B, bool isBinary, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float functions.
static Value * optimizeSymmetricCall(CallInst *CI, bool IsEven, IRBuilderBase &B)
static Value * getSqrtCall(Value *V, AttributeList Attrs, bool NoErrno, Module *M, IRBuilderBase &B, const TargetLibraryInfo *TLI)
static Value * valueHasFloatPrecision(Value *Val)
Return a variant of Val with float type.
static Value * optimizeMemCmpConstantSize(CallInst *CI, Value *LHS, Value *RHS, uint64_t Len, IRBuilderBase &B, const DataLayout &DL)
static Value * createPowWithIntegerExponent(Value *Base, Value *Expo, Module *M, IRBuilderBase &B)
static Value * convertStrToInt(CallInst *CI, StringRef &Str, Value *EndPtr, uint64_t Base, bool AsSigned, IRBuilderBase &B)
static Value * memChrToCharCompare(CallInst *CI, Value *NBytes, IRBuilderBase &B, const DataLayout &DL)
static Value * copyFlags(const CallInst &Old, Value *New)
static StringRef substr(StringRef Str, uint64_t Len)
static cl::opt< unsigned, false, HotColdHintParser > HotNewHintValue("hot-new-hint-value", cl::Hidden, cl::init(254), cl::desc("Value to pass to hot/cold operator new for hot allocation"))
static bool isTrigLibCall(CallInst *CI)
static Value * optimizeNaN(CallInst *CI)
Constant folding nan/nanf/nanl.
static bool isOnlyUsedInComparisonWithZero(Value *V)
static Value * replaceUnaryCall(CallInst *CI, IRBuilderBase &B, Intrinsic::ID IID)
static bool callHasFloatingPointArgument(const CallInst *CI)
static Value * optimizeUnaryDoubleFP(CallInst *CI, IRBuilderBase &B, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float for unary functions.
static bool callHasFP128Argument(const CallInst *CI)
static cl::opt< bool > OptimizeNoBuiltinHotColdNew("optimize-nobuiltin-hot-cold-new-new", cl::Hidden, cl::init(false), cl::desc("Enable transformation of nobuiltin operator new library calls"))
static cl::opt< unsigned, false, HotColdHintParser > AmbiguousNewHintValue("ambiguous-new-hint-value", cl::Hidden, cl::init(222), cl::desc("Value to pass to hot/cold operator new for ambiguous allocation"))
static void annotateNonNullNoUndefBasedOnAccess(CallInst *CI, ArrayRef< unsigned > ArgNos)
static Value * optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS, Value *Size, bool StrNCmp, IRBuilderBase &B, const DataLayout &DL)
static Value * getIntToFPVal(Value *I2F, IRBuilderBase &B, unsigned DstWidth)
static cl::opt< bool > EnableUnsafeFPShrink("enable-double-float-shrink", cl::Hidden, cl::init(false), cl::desc("Enable unsafe double to float " "shrinking for math lib calls"))
static cl::opt< unsigned, false, HotColdHintParser > NotColdNewHintValue("notcold-new-hint-value", cl::Hidden, cl::init(128), cl::desc("Value to pass to hot/cold operator new for " "notcold (warm) allocation"))
This file defines the SmallString class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
static const fltSemantics & IEEEsingle()
static constexpr roundingMode rmTowardZero
static constexpr roundingMode rmTowardNegative
static constexpr roundingMode rmNearestTiesToEven
opStatus
IEEE-754R 7: Default exception handling.
opStatus divide(const APFloat &RHS, roundingMode RM)
bool isFiniteNonZero() const
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
opStatus subtract(const APFloat &RHS, roundingMode RM)
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
opStatus add(const APFloat &RHS, roundingMode RM)
const fltSemantics & getSemantics() const
LLVM_ABI float convertToFloat() const
Converts this APFloat to host float value.
opStatus remainder(const APFloat &RHS)
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Class for arbitrary precision integers.
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
A cache of @llvm.assume calls within a function.
static LLVM_ABI Attribute getWithDereferenceableBytes(LLVMContext &Context, uint64_t Bytes)
static LLVM_ABI Attribute getWithCaptureInfo(LLVMContext &Context, CaptureInfo CI)
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
void removeParamAttrs(unsigned ArgNo, const AttributeMask &AttrsToRemove)
Removes the attributes from the given argument.
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
bool isNoBuiltin() const
Return true if the call should not be treated as a call to a builtin.
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Removes the attribute from the given argument.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool doesNotAccessMemory(unsigned OpNo) const
void removeRetAttrs(const AttributeMask &AttrsToRemove)
Removes the attributes from the return value.
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
bool isStrictFP() const
Determine if the call requires strict floating point semantics.
AttributeSet getParamAttributes(unsigned ArgNo) const
Return the param attributes for this call.
uint64_t getParamDereferenceableBytes(unsigned i) const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
AttributeSet getRetAttributes() const
Return the return attributes for this call.
void setAttributes(AttributeList A)
Set the attributes for this call.
bool doesNotThrow() const
Determine if the call cannot unwind.
Value * getArgOperand(unsigned i) const
uint64_t getParamDereferenceableOrNullBytes(unsigned i) const
Extract the number of dereferenceable_or_null bytes for a parameter (0=unknown).
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
TailCallKind getTailCallKind() const
bool isMustTailCall() const
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
@ ICMP_UGT
unsigned greater than
@ ICMP_ULT
unsigned less than
@ ICMP_ULE
unsigned less or equal
Predicate getPredicate() const
Return the predicate for this instruction.
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
ConstantFP - Floating Point Values [float, double].
static LLVM_ABI Constant * getInfinity(Type *Ty, bool Negative=false)
static LLVM_ABI Constant * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
This is the shared class of boolean and integer constants.
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
int64_t getSExtValue() const
Return the constant as a 64-bit integer value after it has been sign extended as appropriate for the ...
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
This is an important base class in LLVM.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
This class represents an extension of floating point types.
This class represents a truncation of floating point types.
void setNoSignedZeros(bool B=true)
static FastMathFlags getFast()
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
FortifiedLibCallSimplifier(const TargetLibraryInfo *TLI, bool OnlyLowerUnknownSize=false)
Value * optimizeCall(CallInst *CI, IRBuilderBase &B)
Take the given call instruction and return a more optimal value to replace the instruction with or 0 ...
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
AttributeList getAttributes() const
Return the attribute list for this Function.
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Common base class shared among various IRBuilders.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI bool isFast() const LLVM_READONLY
Determine whether all fast-math-flags are set.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI bool hasApproxFunc() const LLVM_READONLY
Determine whether the approximate-math-functions flag is set.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
LLVM_ABI bool hasAllowReassoc() const LLVM_READONLY
Determine whether the allow-reassociation flag is set.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
A wrapper class for inspecting calls to intrinsic functions.
LibCallSimplifier(const DataLayout &DL, const TargetLibraryInfo *TLI, DominatorTree *DT, DomConditionCache *DC, AssumptionCache *AC, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, function_ref< void(Instruction *, Value *)> Replacer=&replaceAllUsesWithDefault, function_ref< void(Instruction *)> Eraser=&eraseFromParentDefault)
Value * optimizeCall(CallInst *CI, IRBuilderBase &B)
optimizeCall - Take the given call instruction and return a more optimal value to replace the instruc...
An instruction for reading from memory.
Value * getPointerOperand()
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Analysis providing profile information.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
static constexpr size_t npos
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
char back() const
back - Get the last character in the string.
constexpr size_t size() const
size - Get the string size.
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
int compare(StringRef RHS) const
compare - Compare two strings; the result is negative, zero, or positive if this string is lexicograp...
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI bool isCallingConvCCompatible(CallBase *CI)
Returns true if call site / callee has cdecl-compatible calling conventions.
Provides information about what library functions are available for the current target.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
Triple - Helper class for working with autoconf configuration names.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
bool isPointerTy() const
True if this is an instance of PointerType.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
LLVM_ABI const fltSemantics & getFltSemantics() const
A Use represents the edge between a Value definition and its users.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
iterator_range< user_iterator > users()
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::FMul > m_FMul(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
This namespace contains all of the command line option processing machinery.
initializer< Ty > init(const Ty &Val)
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
FunctionAddr VTableAddr Value
LLVM_ABI Value * emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the unary function named 'Name' (e.g.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
LLVM_ABI Value * emitStrChr(Value *Ptr, char C, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strchr function to the builder, for the specified pointer and character.
constexpr uint64_t maxUIntN(uint64_t N)
Gets the maximum value for a N-bit unsigned integer.
LLVM_ABI Value * emitPutChar(Value *Char, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the putchar function. This assumes that Char is an 'int'.
LLVM_ABI Value * emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the __memcpy_chk function to the builder.
LLVM_ABI Value * emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncpy function to the builder, for the specified pointer arguments and length.
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
LLVM_ABI Value * emitHotColdNewAlignedNoThrow(Value *Num, Value *Align, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
APFloat abs(APFloat X)
Returns the absolute value of the argument.
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
LLVM_ABI Value * emitSPrintf(Value *Dest, Value *Fmt, ArrayRef< Value * > VariadicArgs, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the sprintf function.
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI Value * emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memrchr function, analogously to emitMemChr.
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
LLVM_ABI Value * emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcat function.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
LLVM_ABI bool hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn)
Check whether the overloaded floating point function corresponding to Ty is available.
LLVM_ABI Value * emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncat function.
LLVM_ABI bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, LibFunc TheLibFunc)
Check whether the library function is available on target and also that it in the current Module is a...
LLVM_ABI Value * emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsnprintf function.
auto dyn_cast_or_null(const Y &Val)
Align getKnownAlignment(Value *V, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to infer an alignment for the specified pointer.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Value * emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strncmp function to the builder.
LLVM_ABI Value * emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memcmp function.
LLVM_ABI Value * emitBinaryFloatFnCall(Value *Op1, Value *Op2, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the binary function named 'Name' (e.g.
bool isAlpha(char C)
Checks if character C is a valid letter as classified by "C" locale.
LLVM_ABI Value * emitFPutS(Value *Str, Value *File, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the fputs function.
LLVM_ABI Value * emitStrDup(Value *Ptr, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strdup function to the builder, for the specified pointer.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI Value * emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the bcmp function.
bool isDigit(char C)
Checks if character C is one of the 10 decimal digits.
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingMultiplyAdd(T X, T Y, T A, bool *ResultOverflowed=nullptr)
Multiply two unsigned integers, X and Y, and add the unsigned integer, A to the product.
LLVM_ABI uint64_t GetStringLength(const Value *V, unsigned CharSize=8)
If we can compute the length of the string pointed to by the specified pointer, return 'len+1'.
LLVM_ABI FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, LibFunc TheLibFunc, FunctionType *T, AttributeList AttributeList)
Calls getOrInsertFunction() and then makes sure to add mandatory argument attributes.
LLVM_ABI Value * emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strlen function to the builder, for the specified pointer.
LLVM_ABI Value * emitFPutC(Value *Char, Value *File, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the fputc function.
LLVM_ABI Value * emitStpNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the stpncpy function to the builder, for the specified pointer arguments and length.
LLVM_ABI Value * emitStrCat(Value *Dest, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strcat function.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI Value * emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsprintf function.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
LLVM_ABI Value * emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the fwrite function.
LLVM_ABI Value * emitSNPrintf(Value *Dest, Value *Size, Value *Fmt, ArrayRef< Value * > Args, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the snprintf function.
@ Mod
The access may modify the value stored in memory.
LLVM_ABI Value * emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the stpcpy function to the builder, for the specified pointer arguments.
@ And
Bitwise or logical AND of integers.
char toUpper(char x)
Returns the corresponding uppercase character if x is lowercase.
DWARFExpression::Operation Op
@ NearestTiesToEven
roundTiesToEven.
constexpr int64_t maxIntN(int64_t N)
Gets the maximum value for a N-bit signed integer.
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Value * emitHotColdNewNoThrow(Value *Num, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the malloc function.
LLVM_ABI Value * emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memchr function.
LLVM_ABI Value * emitHotColdNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
bool isSpace(char C)
Checks whether character C is whitespace in the "C" locale.
LLVM_ABI Value * emitPutS(Value *Str, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the puts function. This assumes that Str is some pointer.
LLVM_ABI Value * emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the memccpy function.
LLVM_ABI Value * emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitHotColdNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
Emit a call to the hot/cold operator new function.
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
LLVM_ABI Value * emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcpy function.
LLVM_ABI Value * emitHotColdSizeReturningNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strcpy function to the builder, for the specified pointer arguments.
LLVM_ABI Value * emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the mempcpy function.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
const ConstantDataArray * Array
ConstantDataArray pointer.
bool isNonNegative() const
Returns true if this value is known to be non-negative.
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
static constexpr FPClassTest OrderedLessThanZeroMask
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's know this can never be interpreted as a zero.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...