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);
251 return ConstantInt::get(RetTy, Result, AsSigned);
258 if (
C->isNullValue())
286 for (
unsigned ArgNo : ArgNos) {
287 uint64_t DerefBytes = DereferenceableBytes;
292 DereferenceableBytes);
311 for (
unsigned ArgNo : ArgNos) {
337 DerefMin = std::min(
X,
Y);
358 NewCI->
getContext(), {NewCI->getAttributes(), Old.getAttributes()}));
371 return Len >= Str.size() ? Str : Str.substr(0, Len);
396 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len,
B));
399Value *LibCallSimplifier::emitStrLenMemCpy(
Value *Src,
Value *Dst, uint64_t Len,
410 Value *CpyDst =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, DstLen,
"endptr");
415 TLI->getAsSizeT(Len + 1, *
B.GetInsertBlock()->getModule()));
459 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen,
B));
472 Type *CharTy =
B.getInt8Ty();
473 Value *Char0 =
B.CreateLoad(CharTy, Src);
474 CharVal =
B.CreateTrunc(CharVal, CharTy);
475 Value *Cmp =
B.CreateICmpEQ(Char0, CharVal,
"char0cmp");
479 Value *
And =
B.CreateICmpNE(NBytes, Zero);
480 Cmp =
B.CreateLogicalAnd(
And, Cmp);
484 return B.CreateSelect(Cmp, Src, NullPtr);
506 FunctionType *FT =
Callee->getFunctionType();
507 unsigned IntBits = TLI->getIntSize();
508 if (!FT->getParamType(1)->isIntegerTy(IntBits))
511 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
515 ConstantInt::get(SizeTTy, Len),
B,
524 return B.CreateIntToPtr(
B.getTrue(), CI->
getType());
533 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, StrLen,
"strchr");
546 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(
I),
"strchr");
558 if (CharC && CharC->
isZero())
563 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
568 uint64_t NBytes = Str.size() + 1;
569 Value *
Size = ConstantInt::get(SizeTTy, NBytes);
576 return ConstantInt::get(CI->
getType(), 0);
578 StringRef Str1, Str2;
583 if (HasStr1 && HasStr2)
585 std::clamp(Str1.
compare(Str2), -1, 1));
587 if (HasStr1 && Str1.
empty())
588 return B.CreateNeg(
B.CreateZExt(
589 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
591 if (HasStr2 && Str2.
empty())
592 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
606 TLI->getAsSizeT(std::min(Len1, Len2), *CI->
getModule()),
611 if (!HasStr1 && HasStr2) {
616 }
else if (HasStr1 && !HasStr2) {
638 return ConstantInt::get(CI->
getType(), 0);
650 return ConstantInt::get(CI->
getType(), 0);
655 StringRef Str1, Str2;
660 if (HasStr1 && HasStr2) {
665 std::clamp(SubStr1.
compare(SubStr2), -1, 1));
668 if (HasStr1 && Str1.
empty())
669 return B.CreateNeg(
B.CreateZExt(
670 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
672 if (HasStr2 && Str2.
empty())
673 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
684 if (!HasStr1 && HasStr2) {
685 Len2 = std::min(Len2,
Length);
690 }
else if (HasStr1 && !HasStr2) {
691 Len1 = std::min(Len1,
Length);
705 if (SrcLen &&
Size) {
707 if (SrcLen <= Size->getZExtValue() + 1)
729 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
744 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
755 Value *DstEnd =
B.CreateInBoundsGEP(
756 B.getInt8Ty(), Dst, TLI->getAsSizeT(Len - 1, *CI->
getModule()));
760 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1), LenV);
779 NBytes = SizeC->getZExtValue();
788 B.CreateStore(
B.getInt8(0), Dst);
801 uint64_t SrcLen = Str.find(
'\0');
804 bool NulTerm = SrcLen < NBytes;
813 SrcLen = std::min(SrcLen, uint64_t(Str.size()));
814 NBytes = std::min(NBytes - 1, SrcLen);
819 B.CreateStore(
B.getInt8(0), Dst);
820 return ConstantInt::get(CI->
getType(), 0);
826 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
827 TLI->getAsSizeT(NBytes, *CI->
getModule()));
831 Value *EndOff = ConstantInt::get(CI->
getType(), NBytes);
832 Value *EndPtr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, EndOff);
833 B.CreateStore(
B.getInt8(0), EndPtr);
839 return ConstantInt::get(CI->
getType(), SrcLen);
844Value *LibCallSimplifier::optimizeStringNCpy(
CallInst *CI,
bool RetEnd,
861 N = SizeC->getZExtValue();
868 Type *CharTy =
B.getInt8Ty();
869 Value *CharVal =
B.CreateLoad(CharTy, Src,
"stxncpy.char0");
870 B.CreateStore(CharVal, Dst);
876 Value *ZeroChar = ConstantInt::get(CharTy, 0);
877 Value *
Cmp =
B.CreateICmpEQ(CharVal, ZeroChar,
"stpncpy.char0cmp");
879 Value *Off1 =
B.getInt32(1);
880 Value *EndPtr =
B.CreateInBoundsGEP(CharTy, Dst, Off1,
"stpncpy.end");
881 return B.CreateSelect(Cmp, Dst, EndPtr,
"stpncpy.sel");
896 CI->
getAttributes().getParamAttrs(0).getAlignment().valueOrOne();
897 CallInst *NewCI =
B.CreateMemSet(Dst,
B.getInt8(
'\0'),
Size, MemSetAlign);
905 if (
N > SrcLen + 1) {
914 std::string SrcStr = Str.str();
917 SrcStr.resize(
N,
'\0');
918 Src =
B.CreateGlobalString(SrcStr,
"str", 0,
924 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
933 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, Off,
"endptr");
950 return B.CreateZExt(
B.CreateLoad(CharTy, Src,
"char0"),
956 if (BoundCst->isZero())
958 return ConstantInt::get(CI->
getType(), 0);
960 if (BoundCst->isOne()) {
962 Value *CharVal =
B.CreateLoad(CharTy, Src,
"strnlen.char0");
963 Value *ZeroChar = ConstantInt::get(CharTy, 0);
964 Value *
Cmp =
B.CreateICmpNE(CharVal, ZeroChar,
"strnlen.char0cmp");
965 return B.CreateZExt(Cmp, CI->
getType());
975 return B.CreateBinaryIntrinsic(Intrinsic::umin, LenC, Bound);
992 unsigned BW = DL.getIndexTypeSizeInBits(
GEP->getType());
993 SmallMapVector<Value *, APInt, 4> VarOffsets;
994 APInt ConstOffset(BW, 0);
995 assert(CharSize % 8 == 0 &&
"Expected a multiple of 8 sized CharSize");
997 if (!
GEP->collectOffset(DL, BW, VarOffsets, ConstOffset) ||
998 VarOffsets.
size() != 1 || ConstOffset != 0 ||
999 VarOffsets.
begin()->second != CharSize / 8)
1002 ConstantDataArraySlice Slice;
1004 uint64_t NullTermIdx;
1005 if (Slice.
Array ==
nullptr) {
1008 NullTermIdx = ~((uint64_t)0);
1009 for (uint64_t
I = 0,
E = Slice.
Length;
I <
E; ++
I) {
1017 if (NullTermIdx == ~((uint64_t)0))
1030 NullTermIdx == Slice.
Length - 1)) {
1032 return B.CreateSub(ConstantInt::get(CI->
getType(), NullTermIdx),
1042 if (LenTrue && LenFalse) {
1044 return OptimizationRemark(
"instcombine",
"simplify-libcalls", CI)
1045 <<
"folded strlen(select) to select of constants";
1047 return B.CreateSelect(
SI->getCondition(),
1048 ConstantInt::get(CI->
getType(), LenTrue - 1),
1049 ConstantInt::get(CI->
getType(), LenFalse - 1));
1057 if (
Value *V = optimizeStringLength(CI,
B, 8))
1065 if (
Value *V = optimizeStringLength(CI,
B, 8, Bound))
1075 unsigned WCharSize = TLI->getWCharSize(M) * 8;
1080 return optimizeStringLength(CI,
B, WCharSize);
1090 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1094 if (HasS1 && HasS2) {
1095 size_t I =
S1.find_first_of(S2);
1100 B.getInt64(
I),
"strpbrk");
1104 if (HasS2 && S2.
size() == 1)
1129 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1133 if (HasS1 && HasS2) {
1134 size_t Pos =
S1.find_first_not_of(S2);
1137 return ConstantInt::get(CI->
getType(), Pos);
1149 if (HasS1 &&
S1.empty())
1153 if (HasS1 && HasS2) {
1154 size_t Pos =
S1.find_first_of(S2);
1157 return ConstantInt::get(CI->
getType(), Pos);
1161 if (HasS2 && S2.
empty())
1178 StrLen,
B, DL, TLI);
1186 replaceAllUsesWith(Old, Cmp);
1192 StringRef SearchStr, ToFindStr;
1197 if (HasStr2 && ToFindStr.
empty())
1201 if (HasStr1 && HasStr2) {
1208 return B.CreateConstInBoundsGEP1_64(
B.getInt8Ty(), CI->
getArgOperand(0),
1213 if (HasStr2 && ToFindStr.
size() == 1) {
1234 if (LenC->
isOne()) {
1237 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memrchr.char0");
1239 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1240 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memrchr.char0cmp");
1241 return B.CreateSelect(Cmp, SrcStr, NullPtr,
"memrchr.sel");
1249 if (Str.size() == 0)
1258 if (Str.size() < EndOff)
1273 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos));
1275 if (Str.find(Str[Pos]) == Pos) {
1282 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
1283 B.getInt64(Pos),
"memrchr.ptr_plus");
1284 return B.CreateSelect(Cmp, NullPtr, SrcPlus,
"memrchr.sel");
1289 Str = Str.substr(0, EndOff);
1297 Type *Int8Ty =
B.getInt8Ty();
1298 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1300 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1301 Value *CEqS0 =
B.CreateICmpEQ(ConstantInt::get(Int8Ty, Str[0]), CharVal);
1302 Value *
And =
B.CreateLogicalAnd(NNeZ, CEqS0);
1303 Value *SizeM1 =
B.CreateSub(
Size, ConstantInt::get(SizeTy, 1));
1305 B.CreateInBoundsGEP(Int8Ty, SrcStr, SizeM1,
"memrchr.ptr_plus");
1306 return B.CreateSelect(
And, SrcPlus, NullPtr,
"memrchr.sel");
1329 if (LenC->
isOne()) {
1332 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memchr.char0");
1334 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1335 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memchr.char0cmp");
1336 return B.CreateSelect(Cmp, SrcStr, NullPtr,
"memchr.sel");
1356 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos),
1358 return B.CreateSelect(Cmp, NullPtr, SrcPlus);
1361 if (Str.size() == 0)
1370 size_t Pos = Str.find_first_not_of(Str[0]);
1386 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1388 Value *Sel1 = NullPtr;
1391 Value *PosVal = ConstantInt::get(SizeTy, Pos);
1392 Value *StrPos = ConstantInt::get(Int8Ty, Str[Pos]);
1393 Value *CEqSPos =
B.CreateICmpEQ(CharVal, StrPos);
1395 Value *
And =
B.CreateAnd(CEqSPos, NGtPos);
1396 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, PosVal);
1397 Sel1 =
B.CreateSelect(
And, SrcPlus, NullPtr,
"memchr.sel1");
1400 Value *Str0 = ConstantInt::get(Int8Ty, Str[0]);
1401 Value *CEqS0 =
B.CreateICmpEQ(Str0, CharVal);
1402 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1404 return B.CreateSelect(
And, SrcStr, Sel1,
"memchr.sel2");
1435 *std::max_element(
reinterpret_cast<const unsigned char *
>(Str.begin()),
1436 reinterpret_cast<const unsigned char *
>(Str.end()));
1443 if (!DL.fitsInLegalInteger(Max + 1)) {
1449 std::string SortedStr = Str.str();
1452 unsigned NonContRanges = 1;
1453 for (
size_t i = 1; i < SortedStr.size(); ++i) {
1454 if (SortedStr[i] > SortedStr[i - 1] + 1) {
1461 if (NonContRanges > 2)
1465 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1468 for (
unsigned char C : SortedStr)
1469 CharCompares.
push_back(
B.CreateICmpEQ(CharVal,
B.getInt8(
C)));
1471 return B.CreateIntToPtr(
B.CreateOr(CharCompares), CI->
getType());
1476 unsigned char Width =
NextPowerOf2(std::max((
unsigned char)7, Max));
1482 Value *BitfieldC =
B.getInt(Bitfield);
1486 C =
B.CreateAnd(
C,
B.getIntN(Width, 0xFF));
1493 Value *Shl =
B.CreateShl(
B.getIntN(Width, 1ULL),
C);
1494 Value *
Bits =
B.CreateIsNotNull(
B.CreateAnd(Shl, BitfieldC),
"memchr.bits");
1498 return B.CreateIntToPtr(
B.CreateLogicalAnd(Bounds, Bits,
"memchr"),
1523 if (Pos == MinSize ||
1524 (StrNCmp && (LStr[Pos] ==
'\0' && RStr[Pos] ==
'\0'))) {
1532 if (LStr[Pos] != RStr[Pos])
1537 typedef unsigned char UChar;
1538 int IRes = UChar(LStr[Pos]) < UChar(RStr[Pos]) ? -1 : 1;
1539 Value *MaxSize = ConstantInt::get(
Size->getType(), Pos);
1542 return B.CreateSelect(Cmp, Zero, Res);
1554 Value *LHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
LHS,
"lhsc"),
1556 Value *RHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
RHS,
"rhsc"),
1558 return B.CreateSub(LHSV, RHSV,
"chardiff");
1566 Align PrefAlignment =
DL.getPrefTypeAlign(IntType);
1569 Value *LHSV =
nullptr;
1573 Value *RHSV =
nullptr;
1582 LHSV =
B.CreateLoad(IntType,
LHS,
"lhsv");
1584 RHSV =
B.CreateLoad(IntType,
RHS,
"rhsv");
1585 return B.CreateZExt(
B.CreateICmpNE(LHSV, RHSV), CI->
getType(),
"memcmp");
1593Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(
CallInst *CI,
1613 if (
Value *V = optimizeMemCmpBCmpCommon(CI,
B))
1631 return optimizeMemCmpBCmpCommon(CI,
B);
1657 if (
N->isNullValue())
1670 if (
N->getZExtValue() <= SrcStr.
size()) {
1679 ConstantInt::get(
N->getType(), std::min(uint64_t(Pos + 1),
N->getZExtValue()));
1682 return Pos + 1 <=
N->getZExtValue()
1683 ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, NewN)
1697 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
N);
1735Value *LibCallSimplifier::maybeOptimizeNoBuiltinOperatorNew(
CallInst *CI,
1743 if (!TLI->getLibFunc(*Callee, Func))
1747 case LibFunc_ZnwmRKSt9nothrow_t:
1748 case LibFunc_ZnwmSt11align_val_t:
1749 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1751 case LibFunc_ZnamRKSt9nothrow_t:
1752 case LibFunc_ZnamSt11align_val_t:
1753 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1754 case LibFunc_size_returning_new:
1755 case LibFunc_size_returning_new_aligned:
1762 case LibFunc_Znwm12__hot_cold_t:
1763 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1764 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1765 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1766 case LibFunc_Znam12__hot_cold_t:
1767 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1768 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1769 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1770 case LibFunc_size_returning_new_hot_cold:
1771 case LibFunc_size_returning_new_aligned_hot_cold:
1780 return optimizeNew(CI,
B, Func);
1793 if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"cold")
1795 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1798 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"hot")
1800 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1813 Value *NewCall =
nullptr;
1815 case LibFunc_Znwm12__hot_cold_t:
1818 LibFunc_Znwm12__hot_cold_t, HotCold);
1822 LibFunc_Znwm12__hot_cold_t, HotCold);
1824 case LibFunc_Znam12__hot_cold_t:
1827 LibFunc_Znam12__hot_cold_t, HotCold);
1831 LibFunc_Znam12__hot_cold_t, HotCold);
1833 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1837 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1839 case LibFunc_ZnwmRKSt9nothrow_t:
1842 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1844 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1848 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1850 case LibFunc_ZnamRKSt9nothrow_t:
1853 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1855 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1859 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1861 case LibFunc_ZnwmSt11align_val_t:
1864 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1866 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1870 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1872 case LibFunc_ZnamSt11align_val_t:
1875 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1877 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1881 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1884 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1887 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t, HotCold);
1889 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1893 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1896 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1899 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t, HotCold);
1901 case LibFunc_size_returning_new:
1903 LibFunc_size_returning_new_hot_cold,
1906 case LibFunc_size_returning_new_hot_cold:
1909 LibFunc_size_returning_new_hot_cold,
1912 case LibFunc_size_returning_new_aligned:
1915 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1917 case LibFunc_size_returning_new_aligned_hot_cold:
1921 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1952 Value *
Op = Cast->getOperand(0);
1953 if (
Op->getType()->isFloatTy())
1962 return ConstantFP::get(Const->getContext(),
F);
1970 bool isPrecise =
false) {
2002 CallerName.
size() == (CalleeName.
size() + 1) &&
2015 R =
isBinary ?
B.CreateIntrinsic(IID,
B.getFloatTy(), V)
2016 :
B.CreateIntrinsic(IID,
B.getFloatTy(), V[0]);
2023 return B.CreateFPExt(R,
B.getDoubleTy());
2029 bool isPrecise =
false) {
2036 bool isPrecise =
false) {
2050 assert(
Op->getType()->isArrayTy() &&
"Unexpected signature for cabs!");
2052 Real =
B.CreateExtractValue(
Op, 0,
"real");
2053 Imag =
B.CreateExtractValue(
Op, 1,
"imag");
2063 Value *AbsOp =
nullptr;
2065 if (ConstReal->isZero())
2069 if (ConstImag->isZero())
2075 *CI,
B.CreateUnaryIntrinsic(Intrinsic::fabs, AbsOp, CI,
"cabs"));
2082 Value *RealReal =
B.CreateFMulFMF(Real, Real, CI);
2083 Value *ImagImag =
B.CreateFMulFMF(Imag, Imag, CI);
2085 *CI,
B.CreateUnaryIntrinsic(Intrinsic::sqrt,
2086 B.CreateFAddFMF(RealReal, ImagImag, CI), CI,
2097 unsigned BitWidth =
Op->getType()->getScalarSizeInBits();
2099 Type *IntTy =
Op->getType()->getWithNewBitWidth(DstWidth);
2101 :
B.CreateZExt(
Op, IntTy);
2137 if (CalleeFn && TLI->getLibFunc(CalleeFn->
getName(), LibFn) &&
2142 LibFunc LibFnFloat, LibFnDouble, LibFnLongDouble;
2150 ExpName = TLI->getName(LibFunc_exp);
2151 ID = Intrinsic::exp;
2152 LibFnFloat = LibFunc_expf;
2153 LibFnDouble = LibFunc_exp;
2154 LibFnLongDouble = LibFunc_expl;
2159 ExpName = TLI->getName(LibFunc_exp2);
2160 ID = Intrinsic::exp2;
2161 LibFnFloat = LibFunc_exp2f;
2162 LibFnDouble = LibFunc_exp2;
2163 LibFnLongDouble = LibFunc_exp2l;
2170 ?
B.CreateUnaryIntrinsic(
ID,
FMul,
nullptr, ExpName)
2179 substituteInParent(BaseFn, ExpFn);
2190 AttributeList NoAttrs;
2198 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2203 Constant *One = ConstantFP::get(Ty, 1.0);
2206 return copyFlags(*Pow,
B.CreateIntrinsic(Intrinsic::ldexp,
2207 {Ty, ExpoI->getType()},
2208 {One, ExpoI}, Pow,
"exp2"));
2212 One, ExpoI, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2213 LibFunc_ldexpl,
B, NoAttrs));
2218 if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f, LibFunc_exp2l)) {
2221 BaseR = BaseR / *BaseF;
2223 const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
2225 if ((IsInteger || IsReciprocal) &&
2228 NI > 1 && NI.isPowerOf2()) {
2229 double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
2230 Value *
FMul =
B.CreateFMul(Expo, ConstantFP::get(Ty,
N),
"mul");
2232 return copyFlags(*Pow,
B.CreateUnaryIntrinsic(Intrinsic::exp2,
FMul,
2237 LibFunc_exp2l,
B, NoAttrs));
2243 hasFloatFn(M, TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) {
2246 CallInst *NewExp10 =
2247 B.CreateIntrinsic(Intrinsic::exp10, {Ty}, {Expo}, Pow,
"exp10");
2252 LibFunc_exp10f, LibFunc_exp10l,
2262 "pow(1.0, y) should have been simplified earlier!");
2271 Value *
FMul =
B.CreateFMul(Log, Expo,
"mul");
2273 return copyFlags(*Pow,
B.CreateUnaryIntrinsic(Intrinsic::exp2,
FMul,
2275 else if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f,
2279 LibFunc_exp2l,
B, NoAttrs));
2291 return B.CreateUnaryIntrinsic(Intrinsic::sqrt, V,
nullptr,
"sqrt");
2294 if (
hasFloatFn(M, TLI, V->getType(), LibFunc_sqrt, LibFunc_sqrtf,
2300 LibFunc_sqrtl,
B, Attrs);
2327 Base, SimplifyQuery(DL, TLI, DT, AC, Pow,
true,
true, DC)))
2337 Sqrt =
B.CreateUnaryIntrinsic(Intrinsic::fabs, Sqrt,
nullptr,
"abs");
2346 Value *FCmp =
B.CreateFCmpOEQ(
Base, NegInf,
"isinf");
2347 Sqrt =
B.CreateSelect(FCmp, PosInf, Sqrt);
2352 Sqrt =
B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt,
"reciprocal");
2361 return B.CreateIntrinsic(Intrinsic::powi, Types, Args);
2375 IRBuilderBase::FastMathFlagGuard Guard(
B);
2383 if (
Value *Exp = replacePowWithExp(Pow,
B))
2390 return B.CreateFDiv(ConstantFP::get(Ty, 1.0),
Base,
"reciprocal");
2394 return ConstantFP::get(Ty, 1.0);
2402 return B.CreateFMul(
Base,
Base,
"square");
2404 if (
Value *Sqrt = replacePowWithSqrt(Pow,
B))
2415 Value *Sqrt =
nullptr;
2416 if (!ExpoA.isInteger()) {
2430 if (!ExpoI.isInteger())
2442 APSInt IntExpo(TLI->getIntSize(),
false);
2449 Base, ConstantInt::get(
B.getIntNTy(TLI->getIntSize()), IntExpo),
2453 return B.CreateFMul(PowI, Sqrt);
2467 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
2468 hasFloatVersion(M, Name)) {
2480 Value *Ret =
nullptr;
2481 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_exp2) &&
2482 hasFloatVersion(M, Name))
2491 const bool UseIntrinsic =
Callee->isIntrinsic();
2502 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2504 Constant *One = ConstantFP::get(Ty, 1.0);
2507 return copyFlags(*CI,
B.CreateIntrinsic(Intrinsic::ldexp,
2508 {Ty, Exp->getType()},
2512 IRBuilderBase::FastMathFlagGuard Guard(
B);
2515 One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2516 LibFunc_ldexpl,
B, AttributeList()));
2530 if ((Name ==
"fmin" || Name ==
"fmax") && hasFloatVersion(M, Name))
2545 : Intrinsic::maxnum;
2550Value *LibCallSimplifier::optimizeFMinimumnumFMaximumnum(
CallInst *CI,
2558 if ((Name ==
"fminimum_num" || Name ==
"fmaximum_num") &&
2559 hasFloatVersion(M, Name))
2568 ? Intrinsic::minimumnum
2569 : Intrinsic::maximumnum;
2576 StringRef LogNm = LogFn->
getName();
2581 if (UnsafeFPShrink && hasFloatVersion(
Mod, LogNm))
2585 LibFunc LogLb, ExpLb, Exp2Lb, Exp10Lb, PowLb;
2588 if (TLI->getLibFunc(LogNm, LogLb)) {
2591 LogID = Intrinsic::log;
2592 ExpLb = LibFunc_expf;
2593 Exp2Lb = LibFunc_exp2f;
2594 Exp10Lb = LibFunc_exp10f;
2595 PowLb = LibFunc_powf;
2598 LogID = Intrinsic::log;
2599 ExpLb = LibFunc_exp;
2600 Exp2Lb = LibFunc_exp2;
2601 Exp10Lb = LibFunc_exp10;
2602 PowLb = LibFunc_pow;
2605 LogID = Intrinsic::log;
2606 ExpLb = LibFunc_expl;
2607 Exp2Lb = LibFunc_exp2l;
2608 Exp10Lb = LibFunc_exp10l;
2609 PowLb = LibFunc_powl;
2612 LogID = Intrinsic::log2;
2613 ExpLb = LibFunc_expf;
2614 Exp2Lb = LibFunc_exp2f;
2615 Exp10Lb = LibFunc_exp10f;
2616 PowLb = LibFunc_powf;
2619 LogID = Intrinsic::log2;
2620 ExpLb = LibFunc_exp;
2621 Exp2Lb = LibFunc_exp2;
2622 Exp10Lb = LibFunc_exp10;
2623 PowLb = LibFunc_pow;
2626 LogID = Intrinsic::log2;
2627 ExpLb = LibFunc_expl;
2628 Exp2Lb = LibFunc_exp2l;
2629 Exp10Lb = LibFunc_exp10l;
2630 PowLb = LibFunc_powl;
2632 case LibFunc_log10f:
2633 LogID = Intrinsic::log10;
2634 ExpLb = LibFunc_expf;
2635 Exp2Lb = LibFunc_exp2f;
2636 Exp10Lb = LibFunc_exp10f;
2637 PowLb = LibFunc_powf;
2640 LogID = Intrinsic::log10;
2641 ExpLb = LibFunc_exp;
2642 Exp2Lb = LibFunc_exp2;
2643 Exp10Lb = LibFunc_exp10;
2644 PowLb = LibFunc_pow;
2646 case LibFunc_log10l:
2647 LogID = Intrinsic::log10;
2648 ExpLb = LibFunc_expl;
2649 Exp2Lb = LibFunc_exp2l;
2650 Exp10Lb = LibFunc_exp10l;
2651 PowLb = LibFunc_powl;
2658 bool IsKnownNoErrno =
Log->hasNoNaNs() &&
Log->hasNoInfs();
2659 if (!IsKnownNoErrno) {
2660 SimplifyQuery SQ(DL, TLI, DT, AC, Log,
true,
true, DC);
2670 if (IsKnownNoErrno) {
2671 auto *NewLog =
B.CreateUnaryIntrinsic(LogID,
Log->getArgOperand(0), Log);
2672 NewLog->copyMetadata(*Log);
2675 }
else if (LogID == Intrinsic::log || LogID == Intrinsic::log2 ||
2676 LogID == Intrinsic::log10) {
2678 ExpLb = LibFunc_expf;
2679 Exp2Lb = LibFunc_exp2f;
2680 Exp10Lb = LibFunc_exp10f;
2681 PowLb = LibFunc_powf;
2683 ExpLb = LibFunc_exp;
2684 Exp2Lb = LibFunc_exp2;
2685 Exp10Lb = LibFunc_exp10;
2686 PowLb = LibFunc_pow;
2697 IRBuilderBase::FastMathFlagGuard Guard(
B);
2701 LibFunc ArgLb = NotLibFunc;
2702 TLI->getLibFunc(*Arg, ArgLb);
2705 AttributeList NoAttrs;
2706 if (ArgLb == PowLb || ArgID == Intrinsic::pow || ArgID == Intrinsic::powi) {
2708 Log->doesNotAccessMemory()
2709 ?
B.CreateUnaryIntrinsic(LogID, Arg->
getOperand(0),
nullptr,
"log")
2713 if (ArgID == Intrinsic::powi)
2714 Y =
B.CreateSIToFP(
Y, Ty,
"cast");
2715 Value *MulY =
B.CreateFMul(
Y, LogX,
"mul");
2718 substituteInParent(Arg, MulY);
2724 if (ArgLb == ExpLb || ArgLb == Exp2Lb || ArgLb == Exp10Lb ||
2725 ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) {
2727 if (ArgLb == ExpLb || ArgID == Intrinsic::exp)
2730 else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2)
2731 Eul = ConstantFP::get(
Log->getType(), 2.0);
2733 Eul = ConstantFP::get(
Log->getType(), 10.0);
2734 Value *LogE =
Log->doesNotAccessMemory()
2735 ?
B.CreateUnaryIntrinsic(LogID, Eul,
nullptr,
"log")
2740 substituteInParent(Arg, MulY);
2757 LibFunc ArgLb = NotLibFunc;
2758 TLI->getLibFunc(*Arg, ArgLb);
2760 LibFunc SqrtLb, ExpLb, Exp2Lb, Exp10Lb;
2762 if (TLI->getLibFunc(SqrtFn->
getName(), SqrtLb))
2765 ExpLb = LibFunc_expf;
2766 Exp2Lb = LibFunc_exp2f;
2767 Exp10Lb = LibFunc_exp10f;
2770 ExpLb = LibFunc_exp;
2771 Exp2Lb = LibFunc_exp2;
2772 Exp10Lb = LibFunc_exp10;
2775 ExpLb = LibFunc_expl;
2776 Exp2Lb = LibFunc_exp2l;
2777 Exp10Lb = LibFunc_exp10l;
2784 ExpLb = LibFunc_expf;
2785 Exp2Lb = LibFunc_exp2f;
2786 Exp10Lb = LibFunc_exp10f;
2788 ExpLb = LibFunc_exp;
2789 Exp2Lb = LibFunc_exp2;
2790 Exp10Lb = LibFunc_exp10;
2796 if (ArgLb != ExpLb && ArgLb != Exp2Lb && ArgLb != Exp10Lb &&
2797 ArgID != Intrinsic::exp && ArgID != Intrinsic::exp2)
2800 IRBuilderBase::InsertPointGuard Guard(
B);
2801 B.SetInsertPoint(Arg);
2804 B.CreateFMulFMF(ExpOperand, ConstantFP::get(ExpOperand->getType(), 0.5),
2814 Value *Ret =
nullptr;
2819 (
Callee->getName() ==
"sqrt" ||
2820 Callee->getIntrinsicID() == Intrinsic::sqrt))
2823 if (
Value *Opt = mergeSqrtToExp(CI,
B))
2830 if (!
I ||
I->getOpcode() != Instruction::FMul || !
I->isFast())
2836 Value *Op0 =
I->getOperand(0);
2837 Value *Op1 =
I->getOperand(1);
2838 Value *RepeatOp =
nullptr;
2839 Value *OtherOp =
nullptr;
2871 B.CreateUnaryIntrinsic(Intrinsic::fabs, RepeatOp,
I,
"fabs");
2877 B.CreateUnaryIntrinsic(Intrinsic::sqrt, OtherOp,
I,
"sqrt");
2878 return copyFlags(*CI,
B.CreateFMulFMF(FabsCall, SqrtCall,
I));
2890 SimplifyQuery SQ(DL, TLI, DT, AC, CI,
true,
true, DC);
2893 KnownFPClass Known1 =
2896 const fltSemantics &FltSem =
2905 FRemI->setHasNoNaNs(
true);
2911Value *LibCallSimplifier::optimizeTrigInversionPairs(
CallInst *CI,
2915 Value *Ret =
nullptr;
2917 if (UnsafeFPShrink &&
2918 (Name ==
"tan" || Name ==
"atanh" || Name ==
"sinh" || Name ==
"cosh" ||
2920 hasFloatVersion(M, Name))
2929 if (!CI->
isFast() || !OpC->isFast())
2939 if (
F && TLI->getLibFunc(
F->getName(), Func) &&
2941 LibFunc inverseFunc = llvm::StringSwitch<LibFunc>(
Callee->getName())
2942 .Case(
"tan", LibFunc_atan)
2943 .Case(
"atanh", LibFunc_tanh)
2944 .Case(
"sinh", LibFunc_asinh)
2945 .Case(
"cosh", LibFunc_acosh)
2946 .Case(
"tanf", LibFunc_atanf)
2947 .Case(
"atanhf", LibFunc_tanhf)
2948 .Case(
"sinhf", LibFunc_asinhf)
2949 .Case(
"coshf", LibFunc_acoshf)
2950 .Case(
"tanl", LibFunc_atanl)
2951 .Case(
"atanhl", LibFunc_tanhl)
2952 .Case(
"sinhl", LibFunc_asinhl)
2953 .Case(
"coshl", LibFunc_acoshl)
2954 .Case(
"asinh", LibFunc_sinh)
2955 .Case(
"asinhf", LibFunc_sinhf)
2956 .Case(
"asinhl", LibFunc_sinhl)
2957 .Default(NotLibFunc);
2958 if (Func == inverseFunc)
2959 Ret = OpC->getArgOperand(0);
2981 Name =
"__sincospif_stret";
2990 Name =
"__sincospi_stret";
2999 M, *TLI, TheLibFunc, OrigCallee->
getAttributes(), ResTy, ArgTy);
3004 B.SetInsertPoint(ArgInst->getParent(), ++ArgInst->getIterator());
3008 BasicBlock &EntryBB =
B.GetInsertBlock()->getParent()->getEntryBlock();
3009 B.SetInsertPoint(&EntryBB, EntryBB.
begin());
3012 SinCos =
B.CreateCall(Callee, Arg,
"sincospi");
3015 Sin =
B.CreateExtractValue(SinCos, 0,
"sinpi");
3016 Cos =
B.CreateExtractValue(SinCos, 1,
"cospi");
3018 Sin =
B.CreateExtractElement(SinCos, ConstantInt::get(
B.getInt32Ty(), 0),
3020 Cos =
B.CreateExtractElement(SinCos, ConstantInt::get(
B.getInt32Ty(), 1),
3034 Call->copyFastMathFlags(CI);
3048 Call->copyFastMathFlags(CI);
3055Value *LibCallSimplifier::optimizeSymmetric(
CallInst *CI, LibFunc Func,
3101 for (User *U : Arg->
users())
3102 classifyArgUse(U,
F, IsFloat, SinCalls, CosCalls, SinCosCalls);
3108 Value *Sin, *Cos, *SinCos;
3113 auto replaceTrigInsts = [
this](SmallVectorImpl<CallInst *> &Calls,
3115 for (CallInst *
C : Calls)
3116 replaceAllUsesWith(
C, Res);
3119 replaceTrigInsts(SinCalls, Sin);
3120 replaceTrigInsts(CosCalls, Cos);
3121 replaceTrigInsts(SinCosCalls, SinCos);
3123 return IsSin ? Sin : Cos;
3126void LibCallSimplifier::classifyArgUse(
3142 if (!Callee || !TLI->getLibFunc(*Callee, Func) ||
3148 if (Func == LibFunc_sinpif)
3150 else if (Func == LibFunc_cospif)
3152 else if (Func == LibFunc_sincospif_stret)
3155 if (Func == LibFunc_sinpi)
3157 else if (Func == LibFunc_cospi)
3159 else if (Func == LibFunc_sincospi_stret)
3181 unsigned IntBW = TLI->getIntSize();
3182 APSInt QuotInt(IntBW,
false);
3189 B.CreateAlignedStore(
3192 return ConstantFP::get(CI->
getType(), Rem);
3219 return ConstantFP::get(CI->
getType(), MaxVal);
3231 Type *ArgType =
Op->getType();
3232 Value *
V =
B.CreateIntrinsic(Intrinsic::cttz, {ArgType}, {
Op,
B.getTrue()},
3234 V =
B.CreateAdd(V, ConstantInt::get(
V->getType(), 1));
3235 V =
B.CreateIntCast(V, RetType,
false);
3238 return B.CreateSelect(
Cond, V, ConstantInt::get(RetType, 0));
3245 Type *ArgType =
Op->getType();
3246 Value *
V =
B.CreateIntrinsic(Intrinsic::ctlz, {ArgType}, {
Op,
B.getFalse()},
3250 return B.CreateIntCast(V, CI->
getType(),
false);
3257 Value *IsNeg =
B.CreateIsNeg(
X);
3258 Value *NegX =
B.CreateNSWNeg(
X,
"neg");
3259 return B.CreateSelect(IsNeg, NegX,
X);
3265 Type *ArgType =
Op->getType();
3266 Op =
B.CreateSub(
Op, ConstantInt::get(ArgType,
'0'),
"isdigittmp");
3267 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 10),
"isdigit");
3274 Type *ArgType =
Op->getType();
3275 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 128),
"isascii");
3282 ConstantInt::get(CI->
getType(), 0x7F));
3312 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned,
B);
3344 if (!Callee || !Callee->isDeclaration())
3353 if (StreamArg >= (
int)CI->
arg_size())
3361 return GV->
getName() ==
"stderr";
3366 StringRef FormatStr;
3371 if (FormatStr.
empty())
3382 if (FormatStr.
size() == 1 || FormatStr ==
"%%") {
3386 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)FormatStr[0]);
3387 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3391 if (FormatStr ==
"%s" && CI->
arg_size() > 1) {
3392 StringRef OperandStr;
3393 if (!getConstantStringInfo(CI->getOperand(1), OperandStr))
3396 if (OperandStr.empty())
3399 if (OperandStr.size() == 1) {
3403 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)OperandStr[0]);
3404 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3407 if (OperandStr.back() ==
'\n') {
3408 OperandStr = OperandStr.drop_back();
3409 Value *GV = B.CreateGlobalString(OperandStr,
"str");
3410 return copyFlags(*CI, emitPutS(GV, B, TLI));
3416 if (FormatStr.
back() ==
'\n' &&
3420 FormatStr = FormatStr.drop_back();
3421 Value *GV = B.CreateGlobalString(FormatStr,
"str");
3422 return copyFlags(*CI, emitPutS(GV, B, TLI));
3427 if (FormatStr ==
"%c" && CI->
arg_size() > 1 &&
3431 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false);
3432 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3436 if (FormatStr ==
"%s\n" && CI->
arg_size() > 1 &&
3446 FunctionType *FT =
Callee->getFunctionType();
3447 if (
Value *V = optimizePrintFString(CI,
B)) {
3458 Callee->getAttributes());
3460 New->setCalledFunction(IPrintFFn);
3470 Callee->getAttributes());
3472 New->setCalledFunction(SmallPrintFFn);
3480Value *LibCallSimplifier::optimizeSPrintFString(
CallInst *CI,
3483 StringRef FormatStr;
3499 return ConstantInt::get(CI->
getType(), FormatStr.
size());
3504 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3508 if (FormatStr[1] ==
'c') {
3514 B.CreateStore(V, Ptr);
3515 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3516 B.CreateStore(
B.getInt8(0), Ptr);
3518 return ConstantInt::get(CI->
getType(), 1);
3521 if (FormatStr[1] ==
's') {
3534 TLI->getAsSizeT(SrcLen, *CI->
getModule()));
3536 return ConstantInt::get(CI->
getType(), SrcLen - 1);
3539 Value *PtrDiff =
B.CreatePtrDiff(
B.getInt8Ty(), V, Dest);
3540 return B.CreateIntCast(PtrDiff, CI->
getType(),
false);
3551 B.CreateAdd(Len, ConstantInt::get(
Len->getType(), 1),
"leninc");
3555 return B.CreateIntCast(Len, CI->
getType(),
false);
3563 FunctionType *FT =
Callee->getFunctionType();
3564 if (
Value *V = optimizeSPrintFString(CI,
B)) {
3575 FT,
Callee->getAttributes());
3577 New->setCalledFunction(SIPrintFFn);
3587 Callee->getAttributes());
3589 New->setCalledFunction(SmallSPrintFFn);
3605 assert(StrArg || (
N < 2 && Str.size() == 1));
3607 unsigned IntBits = TLI->getIntSize();
3608 uint64_t IntMax =
maxIntN(IntBits);
3609 if (Str.size() > IntMax)
3615 Value *StrLen = ConstantInt::get(CI->
getType(), Str.size());
3625 NCopy = Str.size() + 1;
3630 if (NCopy && StrArg)
3633 TLI->getAsSizeT(NCopy, *CI->
getModule())));
3642 Value *NulOff =
B.getIntN(IntBits, NCopy);
3643 Value *DstEnd =
B.CreateInBoundsGEP(Int8Ty, DstArg, NulOff,
"endptr");
3644 B.CreateStore(ConstantInt::get(Int8Ty, 0), DstEnd);
3648Value *LibCallSimplifier::optimizeSnPrintFString(
CallInst *CI,
3655 uint64_t
N =
Size->getZExtValue();
3656 uint64_t IntMax =
maxIntN(TLI->getIntSize());
3666 StringRef FormatStr;
3677 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr,
N,
B);
3682 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() != 4)
3686 if (FormatStr[1] ==
'c') {
3691 StringRef CharStr(
"*");
3692 return emitSnPrintfMemCpy(CI,
nullptr, CharStr,
N,
B);
3699 Value *Ptr = DstArg;
3700 B.CreateStore(V, Ptr);
3701 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3702 B.CreateStore(
B.getInt8(0), Ptr);
3703 return ConstantInt::get(CI->
getType(), 1);
3706 if (FormatStr[1] !=
's')
3715 return emitSnPrintfMemCpy(CI, StrArg, Str,
N,
B);
3719 if (
Value *V = optimizeSnPrintFString(CI,
B)) {
3728Value *LibCallSimplifier::optimizeFPrintFString(
CallInst *CI,
3730 optimizeErrorReporting(CI,
B, 0);
3733 StringRef FormatStr;
3757 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3761 if (FormatStr[1] ==
'c') {
3765 Type *IntTy =
B.getIntNTy(TLI->getIntSize());
3771 if (FormatStr[1] ==
's') {
3784 FunctionType *FT =
Callee->getFunctionType();
3785 if (
Value *V = optimizeFPrintFString(CI,
B)) {
3794 FT,
Callee->getAttributes());
3796 New->setCalledFunction(FIPrintFFn);
3805 auto SmallFPrintFFn =
3807 Callee->getAttributes());
3809 New->setCalledFunction(SmallFPrintFFn);
3818 optimizeErrorReporting(CI,
B, 3);
3823 if (SizeC && CountC) {
3828 return ConstantInt::get(CI->
getType(), 0);
3835 Value *Cast =
B.CreateIntCast(Char, IntTy,
true,
"chari");
3837 return NewCI ? ConstantInt::get(CI->
getType(), 1) : nullptr;
3845 optimizeErrorReporting(CI,
B, 1);
3863 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
3868 ConstantInt::get(SizeTTy, Len - 1),
3908bool LibCallSimplifier::hasFloatVersion(
const Module *M,
StringRef FuncName) {
3909 SmallString<20> FloatFuncName = FuncName;
3910 FloatFuncName +=
'f';
3914Value *LibCallSimplifier::optimizeStringMemoryLibCall(
CallInst *CI,
3926 "Optimizing string/memory libcall would change the calling convention");
3928 case LibFunc_strcat:
3929 return optimizeStrCat(CI, Builder);
3930 case LibFunc_strncat:
3931 return optimizeStrNCat(CI, Builder);
3932 case LibFunc_strchr:
3933 return optimizeStrChr(CI, Builder);
3934 case LibFunc_strrchr:
3935 return optimizeStrRChr(CI, Builder);
3936 case LibFunc_strcmp:
3937 return optimizeStrCmp(CI, Builder);
3938 case LibFunc_strncmp:
3939 return optimizeStrNCmp(CI, Builder);
3940 case LibFunc_strcpy:
3941 return optimizeStrCpy(CI, Builder);
3942 case LibFunc_stpcpy:
3943 return optimizeStpCpy(CI, Builder);
3944 case LibFunc_strlcpy:
3945 return optimizeStrLCpy(CI, Builder);
3946 case LibFunc_stpncpy:
3947 return optimizeStringNCpy(CI,
true, Builder);
3948 case LibFunc_strncpy:
3949 return optimizeStringNCpy(CI,
false, Builder);
3950 case LibFunc_strlen:
3951 return optimizeStrLen(CI, Builder);
3952 case LibFunc_strnlen:
3953 return optimizeStrNLen(CI, Builder);
3954 case LibFunc_strpbrk:
3955 return optimizeStrPBrk(CI, Builder);
3956 case LibFunc_strndup:
3957 return optimizeStrNDup(CI, Builder);
3958 case LibFunc_strtol:
3959 case LibFunc_strtod:
3960 case LibFunc_strtof:
3961 case LibFunc_strtoul:
3962 case LibFunc_strtoll:
3963 case LibFunc_strtold:
3964 case LibFunc_strtoull:
3965 return optimizeStrTo(CI, Builder);
3966 case LibFunc_strspn:
3967 return optimizeStrSpn(CI, Builder);
3968 case LibFunc_strcspn:
3969 return optimizeStrCSpn(CI, Builder);
3970 case LibFunc_strstr:
3971 return optimizeStrStr(CI, Builder);
3972 case LibFunc_memchr:
3973 return optimizeMemChr(CI, Builder);
3974 case LibFunc_memrchr:
3975 return optimizeMemRChr(CI, Builder);
3977 return optimizeBCmp(CI, Builder);
3978 case LibFunc_memcmp:
3979 return optimizeMemCmp(CI, Builder);
3980 case LibFunc_memcpy:
3981 return optimizeMemCpy(CI, Builder);
3982 case LibFunc_memccpy:
3983 return optimizeMemCCpy(CI, Builder);
3984 case LibFunc_mempcpy:
3985 return optimizeMemPCpy(CI, Builder);
3986 case LibFunc_memmove:
3987 return optimizeMemMove(CI, Builder);
3988 case LibFunc_memset:
3989 return optimizeMemSet(CI, Builder);
3990 case LibFunc_realloc:
3991 return optimizeRealloc(CI, Builder);
3992 case LibFunc_wcslen:
3993 return optimizeWcslen(CI, Builder);
3995 return optimizeBCopy(CI, Builder);
3997 case LibFunc_ZnwmRKSt9nothrow_t:
3998 case LibFunc_ZnwmSt11align_val_t:
3999 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
4001 case LibFunc_ZnamRKSt9nothrow_t:
4002 case LibFunc_ZnamSt11align_val_t:
4003 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
4004 case LibFunc_Znwm12__hot_cold_t:
4005 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
4006 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
4007 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4008 case LibFunc_Znam12__hot_cold_t:
4009 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
4010 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
4011 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4012 case LibFunc_size_returning_new:
4013 case LibFunc_size_returning_new_hot_cold:
4014 case LibFunc_size_returning_new_aligned:
4015 case LibFunc_size_returning_new_aligned_hot_cold:
4016 return optimizeNew(CI, Builder, Func);
4032 if (CharSeq.
empty())
4033 Fill =
APInt(32, 0);
4040Value *LibCallSimplifier::optimizeFloatingPointLibCall(
CallInst *CI,
4049 if (
Value *V = optimizeSymmetric(CI, Func, Builder))
4053 case LibFunc_sinpif:
4055 return optimizeSinCosPi(CI,
true, Builder);
4056 case LibFunc_cospif:
4058 return optimizeSinCosPi(CI,
false, Builder);
4062 return optimizePow(CI, Builder);
4066 return optimizeExp2(CI, Builder);
4074 return optimizeSqrt(CI, Builder);
4078 return optimizeFMod(CI, Builder);
4082 case LibFunc_log10f:
4084 case LibFunc_log10l:
4085 case LibFunc_log1pf:
4087 case LibFunc_log1pl:
4094 return optimizeLog(CI, Builder);
4102 case LibFunc_asinhf:
4103 case LibFunc_asinhl:
4108 case LibFunc_atanhf:
4109 case LibFunc_atanhl:
4110 return optimizeTrigInversionPairs(CI, Builder);
4117 case LibFunc_roundeven:
4119 case LibFunc_nearbyint:
4139 case LibFunc_copysign:
4146 return optimizeFdim(CI, Builder);
4153 return optimizeFMinFMax(CI, Builder);
4154 case LibFunc_fminimum_numf:
4155 case LibFunc_fminimum_num:
4156 case LibFunc_fminimum_numl:
4157 case LibFunc_fmaximum_numf:
4158 case LibFunc_fmaximum_num:
4159 case LibFunc_fmaximum_numl:
4160 return optimizeFMinimumnumFMaximumnum(CI, Builder);
4164 return optimizeCAbs(CI, Builder);
4165 case LibFunc_remquo:
4166 case LibFunc_remquof:
4167 case LibFunc_remquol:
4168 return optimizeRemquo(CI, Builder);
4187 return maybeOptimizeNoBuiltinOperatorNew(CI, Builder);
4198 Builder.setDefaultOperandBundles(OpBundles);
4206 UnsafeFPShrink =
true;
4210 if (!IsCallingConvC)
4214 switch (
II->getIntrinsicID()) {
4215 case Intrinsic::pow:
4216 return optimizePow(CI, Builder);
4217 case Intrinsic::exp2:
4218 return optimizeExp2(CI, Builder);
4219 case Intrinsic::log:
4220 case Intrinsic::log2:
4221 case Intrinsic::log10:
4222 return optimizeLog(CI, Builder);
4223 case Intrinsic::sqrt:
4224 return optimizeSqrt(CI, Builder);
4225 case Intrinsic::memset:
4226 return optimizeMemSet(CI, Builder);
4227 case Intrinsic::memcpy:
4228 return optimizeMemCpy(CI, Builder);
4229 case Intrinsic::memmove:
4230 return optimizeMemMove(CI, Builder);
4231 case Intrinsic::sin:
4232 case Intrinsic::cos:
4242 if (
Value *SimplifiedFortifiedCI =
4243 FortifiedSimplifier.optimizeCall(CI, Builder))
4244 return SimplifiedFortifiedCI;
4251 if (
Value *V = optimizeStringMemoryLibCall(CI, Builder))
4253 if (
Value *V = optimizeFloatingPointLibCall(CI, Func, Builder))
4259 return optimizeFFS(CI, Builder);
4263 return optimizeFls(CI, Builder);
4267 return optimizeAbs(CI, Builder);
4268 case LibFunc_isdigit:
4269 return optimizeIsDigit(CI, Builder);
4270 case LibFunc_isascii:
4271 return optimizeIsAscii(CI, Builder);
4272 case LibFunc_toascii:
4273 return optimizeToAscii(CI, Builder);
4277 return optimizeAtoi(CI, Builder);
4278 case LibFunc_strtol:
4279 case LibFunc_strtoll:
4280 return optimizeStrToInt(CI, Builder,
true);
4281 case LibFunc_strtoul:
4282 case LibFunc_strtoull:
4283 return optimizeStrToInt(CI, Builder,
false);
4284 case LibFunc_printf:
4285 return optimizePrintF(CI, Builder);
4286 case LibFunc_sprintf:
4287 return optimizeSPrintF(CI, Builder);
4288 case LibFunc_snprintf:
4289 return optimizeSnPrintF(CI, Builder);
4290 case LibFunc_fprintf:
4291 return optimizeFPrintF(CI, Builder);
4292 case LibFunc_fwrite:
4293 return optimizeFWrite(CI, Builder);
4295 return optimizeFPuts(CI, Builder);
4297 return optimizePuts(CI, Builder);
4298 case LibFunc_perror:
4299 return optimizeErrorReporting(CI, Builder);
4300 case LibFunc_vfprintf:
4301 case LibFunc_fiprintf:
4302 return optimizeErrorReporting(CI, Builder, 0);
4305 return optimizeExit(CI);
4319 : FortifiedSimplifier(TLI), DL(DL), TLI(TLI), DT(DT), DC(DC), AC(AC),
4320 ORE(ORE), BFI(BFI), PSI(PSI), Replacer(Replacer), Eraser(Eraser) {}
4327void LibCallSimplifier::eraseFromParent(
Instruction *
I) {
4366bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(
4367 CallInst *CI,
unsigned ObjSizeOp, std::optional<unsigned> SizeOp,
4368 std::optional<unsigned> StrOp, std::optional<unsigned> FlagOp) {
4373 if (!Flag || !
Flag->isZero())
4380 if (ConstantInt *ObjSizeCI =
4382 if (ObjSizeCI->isMinusOne())
4385 if (OnlyLowerUnknownSize)
4395 return ObjSizeCI->getZExtValue() >=
Len;
4399 if (ConstantInt *SizeCI =
4401 return ObjSizeCI->getZExtValue() >= SizeCI->getZExtValue();
4407Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(
CallInst *CI,
4409 if (isFortifiedCallFoldable(CI, 3, 2)) {
4419Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(
CallInst *CI,
4421 if (isFortifiedCallFoldable(CI, 3, 2)) {
4431Value *FortifiedLibCallSimplifier::optimizeMemSetChk(
CallInst *CI,
4433 if (isFortifiedCallFoldable(CI, 3, 2)) {
4443Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(
CallInst *CI,
4446 if (isFortifiedCallFoldable(CI, 3, 2))
4454Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(
CallInst *CI,
4462 if (Func == LibFunc_stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src) {
4464 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
4472 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) {
4473 if (Func == LibFunc_strcpy_chk)
4479 if (OnlyLowerUnknownSize)
4489 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
4491 Value *LenV = ConstantInt::get(SizeTTy, Len);
4495 if (Ret && Func == LibFunc_stpcpy_chk)
4496 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
4497 ConstantInt::get(SizeTTy, Len - 1));
4501Value *FortifiedLibCallSimplifier::optimizeStrLenChk(
CallInst *CI,
4503 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0))
4509Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(
CallInst *CI,
4512 if (isFortifiedCallFoldable(CI, 3, 2)) {
4513 if (Func == LibFunc_strncpy_chk)
4526Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(
CallInst *CI,
4528 if (isFortifiedCallFoldable(CI, 4, 3))
4536Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(
CallInst *CI,
4538 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) {
4548Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(
CallInst *CI,
4550 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) {
4554 VariadicArgs,
B, TLI));
4560Value *FortifiedLibCallSimplifier::optimizeStrCatChk(
CallInst *CI,
4562 if (isFortifiedCallFoldable(CI, 2))
4569Value *FortifiedLibCallSimplifier::optimizeStrLCat(
CallInst *CI,
4571 if (isFortifiedCallFoldable(CI, 3))
4579Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(
CallInst *CI,
4581 if (isFortifiedCallFoldable(CI, 3))
4589Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(
CallInst *CI,
4591 if (isFortifiedCallFoldable(CI, 3))
4599Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(
CallInst *CI,
4601 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2))
4609Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(
CallInst *CI,
4611 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1))
4642 Builder.setDefaultOperandBundles(OpBundles);
4646 if (!TLI->getLibFunc(*Callee, Func))
4654 case LibFunc_memcpy_chk:
4655 return optimizeMemCpyChk(CI, Builder);
4656 case LibFunc_mempcpy_chk:
4657 return optimizeMemPCpyChk(CI, Builder);
4658 case LibFunc_memmove_chk:
4659 return optimizeMemMoveChk(CI, Builder);
4660 case LibFunc_memset_chk:
4661 return optimizeMemSetChk(CI, Builder);
4662 case LibFunc_stpcpy_chk:
4663 case LibFunc_strcpy_chk:
4664 return optimizeStrpCpyChk(CI, Builder, Func);
4665 case LibFunc_strlen_chk:
4666 return optimizeStrLenChk(CI, Builder);
4667 case LibFunc_stpncpy_chk:
4668 case LibFunc_strncpy_chk:
4669 return optimizeStrpNCpyChk(CI, Builder, Func);
4670 case LibFunc_memccpy_chk:
4671 return optimizeMemCCpyChk(CI, Builder);
4672 case LibFunc_snprintf_chk:
4673 return optimizeSNPrintfChk(CI, Builder);
4674 case LibFunc_sprintf_chk:
4675 return optimizeSPrintfChk(CI, Builder);
4676 case LibFunc_strcat_chk:
4677 return optimizeStrCatChk(CI, Builder);
4678 case LibFunc_strlcat_chk:
4679 return optimizeStrLCat(CI, Builder);
4680 case LibFunc_strncat_chk:
4681 return optimizeStrNCatChk(CI, Builder);
4682 case LibFunc_strlcpy_chk:
4683 return optimizeStrLCpyChk(CI, Builder);
4684 case LibFunc_vsnprintf_chk:
4685 return optimizeVSNPrintfChk(CI, Builder);
4686 case LibFunc_vsprintf_chk:
4687 return optimizeVSPrintfChk(CI, Builder);
4696 : 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 -...