49#define DEBUG_TYPE "simplify-lib-calls"
54 cl::desc(
"Enable unsafe double to float "
55 "shrinking for math lib calls"));
62 cl::desc(
"Enable hot/cold operator new library calls"));
71 "Enable optimization of existing hot/cold operator new library calls"),
75 "Do not optimize existing hot/cold operator new library calls"),
77 "Only optimize existing hot/cold operator new library calls "
78 "if determined to be cold"),
81 "Always optimize existing hot/cold operator new library calls"),
84 "Always optimize existing hot/cold operator new library calls")),
88 cl::desc(
"Enable transformation of nobuiltin operator new library calls"));
91 cl::desc(
"Take the minimum of compiler hint and existing hint when "
92 "optimizing existing hot/cold operator new library calls"));
103struct HotColdHintParser :
public cl::parser<unsigned> {
104 HotColdHintParser(cl::Option &O) : cl::parser<unsigned>(
O) {}
106 bool parse(cl::Option &O, StringRef ArgName, StringRef Arg,
unsigned &
Value) {
108 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
111 return O.error(
"'" + Arg +
"' value must be in the range [0, 255]!");
125 cl::desc(
"Value to pass to hot/cold operator new for cold allocation"));
128 cl::desc(
"Value to pass to hot/cold operator new for "
129 "notcold (warm) allocation"));
132 cl::desc(
"Value to pass to hot/cold operator new for hot allocation"));
136 "Value to pass to hot/cold operator new for ambiguous allocation"));
143 return Func == LibFunc_abs || Func == LibFunc_labs ||
144 Func == LibFunc_llabs || Func == LibFunc_strlen;
151 if (IC->isEquality() && IC->getOperand(1) == With)
161 return OI->getType()->isFloatingPointTy();
167 return OI->getType()->isFP128Ty();
200 bool Negate = Str[0] ==
'-';
201 if (Str[0] ==
'-' || Str[0] ==
'+') {
202 Str = Str.drop_front();
213 uint64_t Max = AsSigned && Negate ? 1 : 0;
217 if (Str.size() > 1) {
219 if (
toUpper((
unsigned char)Str[1]) ==
'X') {
220 if (Str.size() == 2 || (
Base &&
Base != 16))
225 Str = Str.drop_front(2);
231 }
else if (
Base == 0)
241 for (
unsigned i = 0; i != Str.size(); ++i) {
242 unsigned char DigVal = Str[i];
244 DigVal = DigVal -
'0';
248 DigVal = DigVal -
'A' + 10;
261 if (VFlow || Result > Max)
269 Value *StrEnd =
B.CreateInBoundsGEP(
B.getInt8Ty(), StrBeg, Off,
"endptr");
270 B.CreateStore(StrEnd, EndPtr);
281 return ConstantInt::get(RetTy, Result, AsSigned);
288 if (
C->isNullValue())
316 for (
unsigned ArgNo : ArgNos) {
317 uint64_t DerefBytes = DereferenceableBytes;
322 DereferenceableBytes);
341 for (
unsigned ArgNo : ArgNos) {
367 DerefMin = std::min(
X,
Y);
388 NewCI->
getContext(), {NewCI->getAttributes(), Old.getAttributes()}));
401 return Len >= Str.size() ? Str : Str.substr(0, Len);
426 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len,
B));
440 Value *CpyDst =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, DstLen,
"endptr");
445 TLI->getAsSizeT(Len + 1, *
B.GetInsertBlock()->getModule()));
489 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen,
B));
502 Type *CharTy =
B.getInt8Ty();
503 Value *Char0 =
B.CreateLoad(CharTy, Src);
504 CharVal =
B.CreateTrunc(CharVal, CharTy);
505 Value *Cmp =
B.CreateICmpEQ(Char0, CharVal,
"char0cmp");
509 Value *
And =
B.CreateICmpNE(NBytes, Zero);
510 Cmp =
B.CreateLogicalAnd(
And, Cmp);
518 return B.CreateSelect(Cmp, Src, NullPtr);
540 FunctionType *FT =
Callee->getFunctionType();
541 unsigned IntBits = TLI->getIntSize();
542 if (!FT->getParamType(1)->isIntegerTy(IntBits))
545 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
549 ConstantInt::get(SizeTTy, Len),
B,
558 return B.CreateIntToPtr(
B.getTrue(), CI->
getType());
567 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, StrLen,
"strchr");
580 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(
I),
"strchr");
592 if (CharC && CharC->
isZero())
597 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
603 Value *
Size = ConstantInt::get(SizeTTy, NBytes);
610 return ConstantInt::get(CI->
getType(), 0);
612 StringRef Str1, Str2;
617 if (HasStr1 && HasStr2)
619 std::clamp(Str1.
compare(Str2), -1, 1));
621 if (HasStr1 && Str1.
empty())
622 return B.CreateNeg(
B.CreateZExt(
623 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
625 if (HasStr2 && Str2.
empty())
626 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
640 TLI->getAsSizeT(std::min(Len1, Len2), *CI->
getModule()),
645 SimplifyQuery SQ(DL, TLI, DT, AC, CI);
646 if (!HasStr1 && HasStr2) {
651 }
else if (HasStr1 && !HasStr2) {
673 return ConstantInt::get(CI->
getType(), 0);
685 return ConstantInt::get(CI->
getType(), 0);
690 StringRef Str1, Str2;
695 if (HasStr1 && HasStr2) {
700 std::clamp(SubStr1.
compare(SubStr2), -1, 1));
703 if (HasStr1 && Str1.
empty())
704 return B.CreateNeg(
B.CreateZExt(
705 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
707 if (HasStr2 && Str2.
empty())
708 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
719 if (!HasStr1 && HasStr2) {
720 Len2 = std::min(Len2,
Length);
725 }
else if (HasStr1 && !HasStr2) {
726 Len1 = std::min(Len1,
Length);
740 if (SrcLen &&
Size) {
742 if (SrcLen <= Size->getZExtValue() + 1)
764 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
779 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
790 Value *DstEnd =
B.CreateInBoundsGEP(
791 B.getInt8Ty(), Dst, TLI->getAsSizeT(Len - 1, *CI->
getModule()));
795 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1), LenV);
814 NBytes = SizeC->getZExtValue();
823 B.CreateStore(
B.getInt8(0), Dst);
839 bool NulTerm = SrcLen < NBytes;
848 SrcLen = std::min(SrcLen,
uint64_t(Str.size()));
849 NBytes = std::min(NBytes - 1, SrcLen);
854 B.CreateStore(
B.getInt8(0), Dst);
855 return ConstantInt::get(CI->
getType(), 0);
861 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
862 TLI->getAsSizeT(NBytes, *CI->
getModule()));
866 Value *EndOff = ConstantInt::get(CI->
getType(), NBytes);
867 Value *EndPtr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, EndOff);
868 B.CreateStore(
B.getInt8(0), EndPtr);
874 return ConstantInt::get(CI->
getType(), SrcLen);
879Value *LibCallSimplifier::optimizeStringNCpy(
CallInst *CI,
bool RetEnd,
896 N = SizeC->getZExtValue();
903 Type *CharTy =
B.getInt8Ty();
904 Value *CharVal =
B.CreateLoad(CharTy, Src,
"stxncpy.char0");
905 B.CreateStore(CharVal, Dst);
911 Value *ZeroChar = ConstantInt::get(CharTy, 0);
912 Value *
Cmp =
B.CreateICmpEQ(CharVal, ZeroChar,
"stpncpy.char0cmp");
914 Value *Off1 =
B.getInt32(1);
915 Value *EndPtr =
B.CreateInBoundsGEP(CharTy, Dst, Off1,
"stpncpy.end");
916 return B.CreateSelect(Cmp, Dst, EndPtr,
"stpncpy.sel");
931 CI->
getAttributes().getParamAttrs(0).getAlignment().valueOrOne();
932 CallInst *NewCI =
B.CreateMemSet(Dst,
B.getInt8(
'\0'),
Size, MemSetAlign);
940 if (
N > SrcLen + 1) {
949 std::string SrcStr = Str.str();
952 SrcStr.resize(
N,
'\0');
953 Src =
B.CreateGlobalString(SrcStr,
"str", 0,
959 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
968 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, Off,
"endptr");
985 return B.CreateZExt(
B.CreateLoad(CharTy, Src,
"char0"),
991 if (BoundCst->isZero())
993 return ConstantInt::get(CI->
getType(), 0);
995 if (BoundCst->isOne()) {
997 Value *CharVal =
B.CreateLoad(CharTy, Src,
"strnlen.char0");
998 Value *ZeroChar = ConstantInt::get(CharTy, 0);
999 Value *
Cmp =
B.CreateICmpNE(CharVal, ZeroChar,
"strnlen.char0cmp");
1000 return B.CreateZExt(Cmp, CI->
getType());
1006 Value *LenC = ConstantInt::get(CI->
getType(), Len - 1);
1010 return B.CreateBinaryIntrinsic(Intrinsic::umin, LenC, Bound);
1027 unsigned BW = DL.getIndexTypeSizeInBits(
GEP->getType());
1028 SmallMapVector<Value *, APInt, 4> VarOffsets;
1029 APInt ConstOffset(BW, 0);
1030 assert(CharSize % 8 == 0 &&
"Expected a multiple of 8 sized CharSize");
1032 if (!
GEP->collectOffset(DL, BW, VarOffsets, ConstOffset) ||
1033 VarOffsets.
size() != 1 || ConstOffset != 0 ||
1034 VarOffsets.
begin()->second != CharSize / 8)
1037 ConstantDataArraySlice Slice;
1040 if (Slice.
Array ==
nullptr) {
1063 if ((
Known.isNonNegative() &&
Known.getMaxValue().ule(NullTermIdx)) ||
1065 NullTermIdx == Slice.
Length - 1)) {
1067 return B.CreateSub(ConstantInt::get(CI->
getType(), NullTermIdx),
1077 if (LenTrue && LenFalse) {
1079 return OptimizationRemark(
"instcombine",
"simplify-libcalls", CI)
1080 <<
"folded strlen(select) to select of constants";
1082 return B.CreateSelect(
SI->getCondition(),
1083 ConstantInt::get(CI->
getType(), LenTrue - 1),
1084 ConstantInt::get(CI->
getType(), LenFalse - 1),
"",
1093 if (
Value *V = optimizeStringLength(CI,
B, 8))
1101 if (
Value *V = optimizeStringLength(CI,
B, 8, Bound))
1111 unsigned WCharSize = TLI->getWCharSize(M) * 8;
1116 return optimizeStringLength(CI,
B, WCharSize);
1126 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1130 if (HasS1 && HasS2) {
1131 size_t I =
S1.find_first_of(S2);
1136 B.getInt64(
I),
"strpbrk");
1140 if (HasS2 && S2.
size() == 1)
1165 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1169 if (HasS1 && HasS2) {
1170 size_t Pos =
S1.find_first_not_of(S2);
1173 return ConstantInt::get(CI->
getType(), Pos);
1185 if (HasS1 &&
S1.empty())
1189 if (HasS1 && HasS2) {
1190 size_t Pos =
S1.find_first_of(S2);
1193 return ConstantInt::get(CI->
getType(), Pos);
1197 if (HasS2 && S2.
empty())
1214 StrLen,
B, DL, TLI);
1222 replaceAllUsesWith(Old, Cmp);
1228 StringRef SearchStr, ToFindStr;
1233 if (HasStr2 && ToFindStr.
empty())
1237 if (HasStr1 && HasStr2) {
1244 return B.CreateConstInBoundsGEP1_64(
B.getInt8Ty(), CI->
getArgOperand(0),
1249 if (HasStr2 && ToFindStr.
size() == 1) {
1270 if (LenC->
isOne()) {
1273 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memrchr.char0");
1275 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1276 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memrchr.char0cmp");
1277 return B.CreateSelect(Cmp, SrcStr, NullPtr,
"memrchr.sel");
1285 if (Str.size() == 0)
1294 if (Str.size() < EndOff)
1309 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos));
1311 if (Str.find(Str[Pos]) == Pos) {
1318 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
1319 B.getInt64(Pos),
"memrchr.ptr_plus");
1320 return B.CreateSelect(Cmp, NullPtr, SrcPlus,
"memrchr.sel");
1325 Str = Str.substr(0, EndOff);
1333 Type *Int8Ty =
B.getInt8Ty();
1334 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1336 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1337 Value *CEqS0 =
B.CreateICmpEQ(ConstantInt::get(Int8Ty, Str[0]), CharVal);
1338 Value *
And =
B.CreateLogicalAnd(NNeZ, CEqS0);
1339 Value *SizeM1 =
B.CreateSub(
Size, ConstantInt::get(SizeTy, 1));
1341 B.CreateInBoundsGEP(Int8Ty, SrcStr, SizeM1,
"memrchr.ptr_plus");
1342 return B.CreateSelect(
And, SrcPlus, NullPtr,
"memrchr.sel");
1365 if (LenC->
isOne()) {
1368 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memchr.char0");
1370 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1371 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memchr.char0cmp");
1375 return B.CreateSelectWithUnknownProfile(Cmp, SrcStr, NullPtr,
DEBUG_TYPE,
1396 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos),
1400 return B.CreateSelectWithUnknownProfile(Cmp, NullPtr, SrcPlus,
DEBUG_TYPE);
1403 if (Str.size() == 0)
1412 size_t Pos = Str.find_first_not_of(Str[0]);
1428 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1430 Value *Sel1 = NullPtr;
1433 Value *PosVal = ConstantInt::get(SizeTy, Pos);
1434 Value *StrPos = ConstantInt::get(Int8Ty, Str[Pos]);
1435 Value *CEqSPos =
B.CreateICmpEQ(CharVal, StrPos);
1437 Value *
And =
B.CreateAnd(CEqSPos, NGtPos);
1438 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, PosVal);
1441 Sel1 =
B.CreateSelectWithUnknownProfile(
And, SrcPlus, NullPtr,
DEBUG_TYPE,
1445 Value *Str0 = ConstantInt::get(Int8Ty, Str[0]);
1446 Value *CEqS0 =
B.CreateICmpEQ(Str0, CharVal);
1447 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1451 return B.CreateSelectWithUnknownProfile(
And, SrcStr, Sel1,
DEBUG_TYPE,
1483 *std::max_element(
reinterpret_cast<const unsigned char *
>(Str.begin()),
1484 reinterpret_cast<const unsigned char *
>(Str.end()));
1491 if (!DL.fitsInLegalInteger(Max + 1)) {
1497 std::string SortedStr = Str.str();
1500 unsigned NonContRanges = 1;
1501 for (
size_t i = 1; i < SortedStr.size(); ++i) {
1502 if (SortedStr[i] > SortedStr[i - 1] + 1) {
1509 if (NonContRanges > 2)
1513 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1516 for (
unsigned char C : SortedStr)
1517 CharCompares.
push_back(
B.CreateICmpEQ(CharVal,
B.getInt8(
C)));
1519 return B.CreateIntToPtr(
B.CreateOr(CharCompares), CI->
getType());
1524 unsigned char Width =
NextPowerOf2(std::max((
unsigned char)7, Max));
1530 Value *BitfieldC =
B.getInt(Bitfield);
1534 C =
B.CreateAnd(
C,
B.getIntN(Width, 0xFF));
1541 Value *Shl =
B.CreateShl(
B.getIntN(Width, 1ULL),
C);
1542 Value *
Bits =
B.CreateIsNotNull(
B.CreateAnd(Shl, BitfieldC),
"memchr.bits");
1546 Value *Memchr =
B.CreateLogicalAnd(Bounds, Bits,
"memchr");
1552 return B.CreateIntToPtr(Memchr, CI->
getType());
1576 if (Pos == MinSize ||
1577 (StrNCmp && (LStr[Pos] ==
'\0' && RStr[Pos] ==
'\0'))) {
1585 if (LStr[Pos] != RStr[Pos])
1590 typedef unsigned char UChar;
1591 int IRes = UChar(LStr[Pos]) < UChar(RStr[Pos]) ? -1 : 1;
1592 Value *MaxSize = ConstantInt::get(
Size->getType(), Pos);
1595 return B.CreateSelect(Cmp, Zero, Res);
1607 Value *LHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
LHS,
"lhsc"),
1609 Value *RHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
RHS,
"rhsc"),
1611 return B.CreateSub(LHSV, RHSV,
"chardiff");
1619 Align PrefAlignment =
DL.getPrefTypeAlign(IntType);
1622 Value *LHSV =
nullptr;
1626 Value *RHSV =
nullptr;
1635 LHSV =
B.CreateLoad(IntType,
LHS,
"lhsv");
1637 RHSV =
B.CreateLoad(IntType,
RHS,
"rhsv");
1638 return B.CreateZExt(
B.CreateICmpNE(LHSV, RHSV), CI->
getType(),
"memcmp");
1646Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(
CallInst *CI,
1666 if (
Value *V = optimizeMemCmpBCmpCommon(CI,
B))
1684 return optimizeMemCmpBCmpCommon(CI,
B);
1710 if (
N->isNullValue())
1723 if (
N->getZExtValue() <= SrcStr.
size()) {
1732 ConstantInt::get(
N->getType(), std::min(
uint64_t(Pos + 1),
N->getZExtValue()));
1735 return Pos + 1 <=
N->getZExtValue()
1736 ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, NewN)
1750 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
N);
1783 if (MDNode *MD = CI->
getMetadata(LLVMContext::MD_alloc_token))
1784 MallocCI->setMetadata(LLVMContext::MD_alloc_token, MD);
1793Value *LibCallSimplifier::maybeOptimizeNoBuiltinOperatorNew(
CallInst *CI,
1800 LibFunc
Func = TLI->getLibFunc(*Callee);
1801 if (Func == NotLibFunc)
1805 case LibFunc_ZnwmRKSt9nothrow_t:
1806 case LibFunc_ZnwmSt11align_val_t:
1807 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1809 case LibFunc_ZnamRKSt9nothrow_t:
1810 case LibFunc_ZnamSt11align_val_t:
1811 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1812 case LibFunc_size_returning_new:
1813 case LibFunc_size_returning_new_aligned:
1820 case LibFunc_Znwm12__hot_cold_t:
1821 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1822 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1823 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1824 case LibFunc_Znam12__hot_cold_t:
1825 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1826 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1827 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1828 case LibFunc_size_returning_new_hot_cold:
1829 case LibFunc_size_returning_new_aligned_hot_cold:
1838 return optimizeNew(CI,
B, Func);
1851 bool IsCold =
false;
1852 if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"cold") {
1855 }
else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1858 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"hot")
1860 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1866 bool ShouldOptimizeExistingHotColdNew =
1871 Value *HotColdVal =
B.getInt8(HotCold);
1872 auto getHotColdHintForExisting = [&](uint8_t HotCold) ->
Value * {
1878 ExistingHint =
B.CreateTruncOrBitCast(ExistingHint,
B.getInt8Ty());
1882 return B.CreateBinaryIntrinsic(Intrinsic::umin, ExistingHint, HotColdVal);
1892 Value *NewCall =
nullptr;
1894 case LibFunc_Znwm12__hot_cold_t:
1895 if (ShouldOptimizeExistingHotColdNew)
1897 LibFunc_Znwm12__hot_cold_t,
1898 getHotColdHintForExisting(HotCold));
1902 LibFunc_Znwm12__hot_cold_t, HotColdVal);
1904 case LibFunc_Znam12__hot_cold_t:
1905 if (ShouldOptimizeExistingHotColdNew)
1907 LibFunc_Znam12__hot_cold_t,
1908 getHotColdHintForExisting(HotCold));
1912 LibFunc_Znam12__hot_cold_t, HotColdVal);
1914 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1915 if (ShouldOptimizeExistingHotColdNew)
1918 TLI, LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t,
1919 getHotColdHintForExisting(HotCold));
1921 case LibFunc_ZnwmRKSt9nothrow_t:
1924 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotColdVal);
1926 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1927 if (ShouldOptimizeExistingHotColdNew)
1930 TLI, LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t,
1931 getHotColdHintForExisting(HotCold));
1933 case LibFunc_ZnamRKSt9nothrow_t:
1936 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotColdVal);
1938 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1939 if (ShouldOptimizeExistingHotColdNew)
1942 TLI, LibFunc_ZnwmSt11align_val_t12__hot_cold_t,
1943 getHotColdHintForExisting(HotCold));
1945 case LibFunc_ZnwmSt11align_val_t:
1948 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotColdVal);
1950 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1951 if (ShouldOptimizeExistingHotColdNew)
1954 TLI, LibFunc_ZnamSt11align_val_t12__hot_cold_t,
1955 getHotColdHintForExisting(HotCold));
1957 case LibFunc_ZnamSt11align_val_t:
1960 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotColdVal);
1962 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1963 if (ShouldOptimizeExistingHotColdNew)
1966 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1967 getHotColdHintForExisting(HotCold));
1969 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1972 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1975 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1976 if (ShouldOptimizeExistingHotColdNew)
1979 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1980 getHotColdHintForExisting(HotCold));
1982 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1985 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1988 case LibFunc_size_returning_new:
1990 LibFunc_size_returning_new_hot_cold,
1993 case LibFunc_size_returning_new_hot_cold:
1994 if (ShouldOptimizeExistingHotColdNew)
1996 LibFunc_size_returning_new_hot_cold,
1997 getHotColdHintForExisting(HotCold));
1999 case LibFunc_size_returning_new_aligned:
2002 LibFunc_size_returning_new_aligned_hot_cold, HotColdVal);
2004 case LibFunc_size_returning_new_aligned_hot_cold:
2005 if (ShouldOptimizeExistingHotColdNew)
2008 LibFunc_size_returning_new_aligned_hot_cold,
2009 getHotColdHintForExisting(HotCold));
2048 Value *
Op = Cast->getOperand(0);
2049 if (
Op->getType()->isFloatTy())
2058 return ConstantFP::get(Const->getContext(),
F);
2066 bool isPrecise =
false) {
2098 CallerName.
size() == (CalleeName.
size() + 1) &&
2111 R =
isBinary ?
B.CreateIntrinsic(IID,
B.getFloatTy(), V)
2112 :
B.CreateIntrinsic(IID,
B.getFloatTy(), V[0]);
2120 return B.CreateFPExt(R,
B.getDoubleTy());
2126 bool isPrecise =
false) {
2133 bool isPrecise =
false) {
2140 if (!RetTy || RetTy->getNumElements() != 2 ||
2141 !RetTy->getElementType(0)->getScalarType()->isDoubleTy())
2147 if (Ext->getOperand(0)->getType()->getScalarType()->isFloatTy())
2148 X = Ext->getOperand(0);
2158 if (!Cast || !Cast->getType()->getScalarType()->isFloatTy())
2166 Value *NewCall =
B.CreateIntrinsic(Intrinsic::sincos,
X->getType(),
X);
2168 LLVMContext::MD_fpmath, CI->
getMetadata(LLVMContext::MD_fpmath));
2170 for (
unsigned I = 0;
I != 2; ++
I) {
2171 Value *Ext =
B.CreateFPExt(
B.CreateExtractValue(NewCall,
I),
2172 RetTy->getElementType(
I));
2173 Res =
B.CreateInsertValue(Res, Ext,
I);
2188 assert(
Op->getType()->isArrayTy() &&
"Unexpected signature for cabs!");
2190 Real =
B.CreateExtractValue(
Op, 0,
"real");
2191 Imag =
B.CreateExtractValue(
Op, 1,
"imag");
2201 Value *AbsOp =
nullptr;
2203 if (ConstReal->isZero())
2207 if (ConstImag->isZero())
2212 return copyFlags(*CI,
B.CreateFAbs(AbsOp, CI,
"cabs"));
2219 Value *RealReal =
B.CreateFMulFMF(Real, Real, CI);
2220 Value *ImagImag =
B.CreateFMulFMF(Imag, Imag, CI);
2222 *CI,
B.CreateUnaryIntrinsic(Intrinsic::sqrt,
2223 B.CreateFAddFMF(RealReal, ImagImag, CI), CI,
2234 unsigned BitWidth =
Op->getType()->getScalarSizeInBits();
2236 Type *IntTy =
Op->getType()->getWithNewBitWidth(DstWidth);
2238 :
B.CreateZExt(
Op, IntTy);
2273 CalleeFn ? TLI->getLibFunc(CalleeFn->
getName()) : NotLibFunc;
2278 LibFunc LibFnFloat, LibFnDouble, LibFnLongDouble;
2286 ExpName = TLI->getName(LibFunc_exp);
2287 ID = Intrinsic::exp;
2288 LibFnFloat = LibFunc_expf;
2289 LibFnDouble = LibFunc_exp;
2290 LibFnLongDouble = LibFunc_expl;
2295 ExpName = TLI->getName(LibFunc_exp2);
2296 ID = Intrinsic::exp2;
2297 LibFnFloat = LibFunc_exp2f;
2298 LibFnDouble = LibFunc_exp2;
2299 LibFnLongDouble = LibFunc_exp2l;
2306 ?
B.CreateUnaryIntrinsic(ID,
FMul,
nullptr, ExpName)
2315 substituteInParent(BaseFn, ExpFn);
2326 AttributeList NoAttrs;
2328 const bool UseIntrinsic =
Pow->doesNotAccessMemory();
2334 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2339 Constant *One = ConstantFP::get(Ty, 1.0);
2343 {Ty, ExpoI->getType()},
2344 {One, ExpoI},
Pow,
"exp2"));
2348 One, ExpoI, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2349 LibFunc_ldexpl,
B, NoAttrs));
2354 if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f, LibFunc_exp2l)) {
2357 BaseR = BaseR / *BaseF;
2359 const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
2361 if ((IsInteger || IsReciprocal) &&
2364 NI > 1 && NI.isPowerOf2()) {
2365 double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
2366 Value *
FMul =
B.CreateFMul(Expo, ConstantFP::get(Ty,
N),
"mul");
2367 if (
Pow->doesNotAccessMemory())
2373 LibFunc_exp2l,
B, NoAttrs));
2379 hasFloatFn(M, TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) {
2381 if (
Pow->doesNotAccessMemory()) {
2382 return B.CreateIntrinsic(Intrinsic::exp10, {Ty}, {Expo},
Pow,
"exp10", {},
2387 LibFunc_exp10f, LibFunc_exp10l,
2397 "pow(1.0, y) should have been simplified earlier!");
2406 Value *
FMul =
B.CreateFMul(Log, Expo,
"mul");
2407 if (
Pow->doesNotAccessMemory())
2410 else if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f,
2414 LibFunc_exp2l,
B, NoAttrs));
2426 return B.CreateUnaryIntrinsic(Intrinsic::sqrt, V,
nullptr,
"sqrt");
2429 if (
hasFloatFn(M, TLI, V->getType(), LibFunc_sqrt, LibFunc_sqrtf,
2435 LibFunc_sqrtl,
B, Attrs);
2442 Value *Sqrt, *
Base =
Pow->getArgOperand(0), *Expo =
Pow->getArgOperand(1);
2453 if (ExpoF->
isNegative() && (!
Pow->hasApproxFunc() && !
Pow->hasAllowReassoc()))
2460 if (!
Pow->doesNotAccessMemory() && !
Pow->hasNoInfs() &&
2462 Base, SimplifyQuery(DL, TLI, DT, AC,
Pow,
true,
true, DC)))
2471 if (!
Pow->hasNoSignedZeros())
2472 Sqrt =
B.CreateFAbs(Sqrt,
nullptr,
"abs");
2478 if (!
Pow->hasNoInfs()) {
2481 Value *FCmp =
B.CreateFCmpOEQ(
Base, NegInf,
"isinf");
2482 Sqrt =
B.CreateSelect(FCmp, PosInf, Sqrt);
2487 Sqrt =
B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt,
"reciprocal");
2496 return B.CreateIntrinsic(Intrinsic::powi, Types, Args);
2501 Value *Expo =
Pow->getArgOperand(1);
2506 bool AllowApprox =
Pow->hasApproxFunc();
2510 IRBuilderBase::FastMathFlagGuard Guard(
B);
2511 B.setFastMathFlags(
Pow->getFastMathFlags());
2518 if (
Value *Exp = replacePowWithExp(
Pow,
B))
2525 return B.CreateFDiv(ConstantFP::get(Ty, 1.0),
Base,
"reciprocal");
2529 return ConstantFP::get(Ty, 1.0);
2537 return B.CreateFMul(
Base,
Base,
"square");
2539 if (
Value *Sqrt = replacePowWithSqrt(
Pow,
B))
2550 Value *Sqrt =
nullptr;
2551 if (!ExpoA.isInteger()) {
2565 if (!ExpoI.isInteger())
2577 APSInt IntExpo(TLI->getIntSize(),
false);
2584 Base, ConstantInt::get(
B.getIntNTy(TLI->getIntSize()), IntExpo),
2588 return B.CreateFMul(PowI, Sqrt);
2604 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
2605 hasFloatVersion(M, Name)) {
2617 Value *Ret =
nullptr;
2618 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_exp2) &&
2619 hasFloatVersion(M, Name))
2628 const bool UseIntrinsic =
Callee->isIntrinsic();
2639 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2641 Constant *One = ConstantFP::get(Ty, 1.0);
2644 return copyFlags(*CI,
B.CreateIntrinsic(Intrinsic::ldexp,
2645 {Ty, Exp->getType()},
2649 IRBuilderBase::FastMathFlagGuard Guard(
B);
2652 One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2653 LibFunc_ldexpl,
B, AttributeList()));
2677 StringRef LogNm = LogFn->
getName();
2682 if (UnsafeFPShrink && hasFloatVersion(
Mod, LogNm))
2686 LibFunc LogLb, ExpLb, Exp2Lb, Exp10Lb, PowLb;
2689 LogLb = TLI->getLibFunc(LogNm);
2690 if (LogLb != NotLibFunc) {
2693 LogID = Intrinsic::log;
2694 ExpLb = LibFunc_expf;
2695 Exp2Lb = LibFunc_exp2f;
2696 Exp10Lb = LibFunc_exp10f;
2697 PowLb = LibFunc_powf;
2700 LogID = Intrinsic::log;
2701 ExpLb = LibFunc_exp;
2702 Exp2Lb = LibFunc_exp2;
2703 Exp10Lb = LibFunc_exp10;
2704 PowLb = LibFunc_pow;
2707 LogID = Intrinsic::log;
2708 ExpLb = LibFunc_expl;
2709 Exp2Lb = LibFunc_exp2l;
2710 Exp10Lb = LibFunc_exp10l;
2711 PowLb = LibFunc_powl;
2714 LogID = Intrinsic::log2;
2715 ExpLb = LibFunc_expf;
2716 Exp2Lb = LibFunc_exp2f;
2717 Exp10Lb = LibFunc_exp10f;
2718 PowLb = LibFunc_powf;
2721 LogID = Intrinsic::log2;
2722 ExpLb = LibFunc_exp;
2723 Exp2Lb = LibFunc_exp2;
2724 Exp10Lb = LibFunc_exp10;
2725 PowLb = LibFunc_pow;
2728 LogID = Intrinsic::log2;
2729 ExpLb = LibFunc_expl;
2730 Exp2Lb = LibFunc_exp2l;
2731 Exp10Lb = LibFunc_exp10l;
2732 PowLb = LibFunc_powl;
2734 case LibFunc_log10f:
2735 LogID = Intrinsic::log10;
2736 ExpLb = LibFunc_expf;
2737 Exp2Lb = LibFunc_exp2f;
2738 Exp10Lb = LibFunc_exp10f;
2739 PowLb = LibFunc_powf;
2742 LogID = Intrinsic::log10;
2743 ExpLb = LibFunc_exp;
2744 Exp2Lb = LibFunc_exp2;
2745 Exp10Lb = LibFunc_exp10;
2746 PowLb = LibFunc_pow;
2748 case LibFunc_log10l:
2749 LogID = Intrinsic::log10;
2750 ExpLb = LibFunc_expl;
2751 Exp2Lb = LibFunc_exp2l;
2752 Exp10Lb = LibFunc_exp10l;
2753 PowLb = LibFunc_powl;
2760 bool IsKnownNoErrno =
Log->hasNoNaNs() &&
Log->hasNoInfs();
2761 if (!IsKnownNoErrno) {
2762 SimplifyQuery SQ(DL, TLI, DT, AC, Log,
true,
true, DC);
2769 Known.cannotBeOrderedLessThanZero() &&
2770 Known.isKnownNeverLogicalZero(
F->getDenormalMode(FltSem));
2772 if (IsKnownNoErrno) {
2773 Value *NewLog =
B.CreateUnaryIntrinsic(LogID,
Log->getArgOperand(0), Log);
2775 I->copyMetadata(*Log);
2780 }
else if (LogID == Intrinsic::log || LogID == Intrinsic::log2 ||
2781 LogID == Intrinsic::log10) {
2783 ExpLb = LibFunc_expf;
2784 Exp2Lb = LibFunc_exp2f;
2785 Exp10Lb = LibFunc_exp10f;
2786 PowLb = LibFunc_powf;
2788 ExpLb = LibFunc_exp;
2789 Exp2Lb = LibFunc_exp2;
2790 Exp10Lb = LibFunc_exp10;
2791 PowLb = LibFunc_pow;
2802 IRBuilderBase::FastMathFlagGuard Guard(
B);
2806 LibFunc ArgLb = TLI->getLibFunc(*Arg);
2809 AttributeList NoAttrs;
2810 if (ArgLb == PowLb || ArgID == Intrinsic::pow || ArgID == Intrinsic::powi) {
2812 Log->doesNotAccessMemory()
2813 ?
B.CreateUnaryIntrinsic(LogID, Arg->
getOperand(0),
nullptr,
"log")
2817 if (ArgID == Intrinsic::powi)
2818 Y =
B.CreateSIToFP(
Y, Ty,
"cast");
2819 Value *MulY =
B.CreateFMul(
Y, LogX,
"mul");
2822 substituteInParent(Arg, MulY);
2828 if (ArgLb == ExpLb || ArgLb == Exp2Lb || ArgLb == Exp10Lb ||
2829 ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) {
2831 if (ArgLb == ExpLb || ArgID == Intrinsic::exp)
2834 else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2)
2835 Eul = ConstantFP::get(
Log->getType(), 2.0);
2837 Eul = ConstantFP::get(
Log->getType(), 10.0);
2838 Value *LogE =
Log->doesNotAccessMemory()
2839 ?
B.CreateUnaryIntrinsic(LogID, Eul,
nullptr,
"log")
2844 substituteInParent(Arg, MulY);
2861 LibFunc ArgLb = TLI->getLibFunc(*Arg);
2863 LibFunc SqrtLb, ExpLb, Exp2Lb, Exp10Lb;
2865 SqrtLb = TLI->getLibFunc(SqrtFn->
getName());
2866 if (SqrtLb != NotLibFunc)
2869 ExpLb = LibFunc_expf;
2870 Exp2Lb = LibFunc_exp2f;
2871 Exp10Lb = LibFunc_exp10f;
2874 ExpLb = LibFunc_exp;
2875 Exp2Lb = LibFunc_exp2;
2876 Exp10Lb = LibFunc_exp10;
2879 ExpLb = LibFunc_expl;
2880 Exp2Lb = LibFunc_exp2l;
2881 Exp10Lb = LibFunc_exp10l;
2888 ExpLb = LibFunc_expf;
2889 Exp2Lb = LibFunc_exp2f;
2890 Exp10Lb = LibFunc_exp10f;
2892 ExpLb = LibFunc_exp;
2893 Exp2Lb = LibFunc_exp2;
2894 Exp10Lb = LibFunc_exp10;
2900 if (ArgLb != ExpLb && ArgLb != Exp2Lb && ArgLb != Exp10Lb &&
2901 ArgID != Intrinsic::exp && ArgID != Intrinsic::exp2)
2904 IRBuilderBase::InsertPointGuard Guard(
B);
2905 B.SetInsertPoint(Arg);
2908 B.CreateFMulFMF(ExpOperand, ConstantFP::get(ExpOperand->getType(), 0.5),
2918 Value *Ret =
nullptr;
2923 (
Callee->getName() ==
"sqrt" ||
2924 Callee->getIntrinsicID() == Intrinsic::sqrt))
2927 if (
Value *Opt = mergeSqrtToExp(CI,
B))
2934 if (!
I ||
I->getOpcode() != Instruction::FMul || !
I->isFast())
2940 Value *Op0 =
I->getOperand(0);
2941 Value *Op1 =
I->getOperand(1);
2942 Value *RepeatOp =
nullptr;
2943 Value *OtherOp =
nullptr;
2974 Value *FabsCall =
B.CreateFAbs(RepeatOp,
I,
"fabs");
2980 B.CreateUnaryIntrinsic(Intrinsic::sqrt, OtherOp,
I,
"sqrt");
2981 return copyFlags(*CI,
B.CreateFMulFMF(FabsCall, SqrtCall,
I));
2992 SimplifyQuery SQ(DL, TLI, DT, AC, CI,
true,
true, DC);
2995 KnownFPClass Known1 =
2998 const fltSemantics &FltSem =
3009Value *LibCallSimplifier::optimizeTrigInversionPairs(
CallInst *CI,
3013 Value *Ret =
nullptr;
3015 if (UnsafeFPShrink &&
3016 (Name ==
"tan" || Name ==
"atanh" || Name ==
"sinh" || Name ==
"cosh" ||
3018 hasFloatVersion(M, Name))
3027 if (!CI->
isFast() || !OpC->isFast())
3036 LibFunc
Func =
F ? TLI->getLibFunc(
F->getName()) : NotLibFunc;
3038 LibFunc inverseFunc = llvm::StringSwitch<LibFunc>(
Callee->getName())
3039 .Case(
"tan", LibFunc_atan)
3040 .Case(
"atanh", LibFunc_tanh)
3041 .Case(
"sinh", LibFunc_asinh)
3042 .Case(
"cosh", LibFunc_acosh)
3043 .Case(
"tanf", LibFunc_atanf)
3044 .Case(
"atanhf", LibFunc_tanhf)
3045 .Case(
"sinhf", LibFunc_asinhf)
3046 .Case(
"coshf", LibFunc_acoshf)
3047 .Case(
"tanl", LibFunc_atanl)
3048 .Case(
"atanhl", LibFunc_tanhl)
3049 .Case(
"sinhl", LibFunc_asinhl)
3050 .Case(
"coshl", LibFunc_acoshl)
3051 .Case(
"asinh", LibFunc_sinh)
3052 .Case(
"asinhf", LibFunc_sinhf)
3053 .Case(
"asinhl", LibFunc_sinhl)
3054 .Default(NotLibFunc);
3055 if (Func == inverseFunc)
3056 Ret = OpC->getArgOperand(0);
3078 Name =
"__sincospif_stret";
3087 Name =
"__sincospi_stret";
3095 M, *TLI, TheLibFunc, OrigCallee->
getAttributes(), ResTy, ArgTy);
3100 B.SetInsertPoint(ArgInst->getParent(), ++ArgInst->getIterator());
3104 BasicBlock &EntryBB =
B.GetInsertBlock()->getParent()->getEntryBlock();
3105 B.SetInsertPoint(&EntryBB, EntryBB.
begin());
3108 SinCos =
B.CreateCall(Callee, Arg,
"sincospi");
3111 Sin =
B.CreateExtractValue(SinCos, 0,
"sinpi");
3112 Cos =
B.CreateExtractValue(SinCos, 1,
"cospi");
3114 Sin =
B.CreateExtractElement(SinCos,
uint64_t{0},
"sinpi");
3115 Cos =
B.CreateExtractElement(SinCos,
uint64_t{1},
"cospi");
3147Value *LibCallSimplifier::optimizeSymmetric(
CallInst *CI, LibFunc Func,
3205 for (User *U : Arg->
users())
3206 classifyArgUse(U,
F, IsFloat, SinCalls, CosCalls, SinCosCalls);
3212 Value *Sin, *Cos, *SinCos;
3217 auto replaceTrigInsts = [
this](SmallVectorImpl<CallInst *> &Calls,
3219 for (CallInst *
C : Calls)
3220 replaceAllUsesWith(
C, Res);
3223 replaceTrigInsts(SinCalls, Sin);
3224 replaceTrigInsts(CosCalls, Cos);
3225 replaceTrigInsts(SinCosCalls, SinCos);
3227 return IsSin ? Sin : Cos;
3230void LibCallSimplifier::classifyArgUse(
3245 LibFunc
Func =
Callee ? TLI->getLibFunc(*Callee) : NotLibFunc;
3250 if (Func == LibFunc_sinpif)
3252 else if (Func == LibFunc_cospif)
3254 else if (Func == LibFunc_sincospif_stret)
3257 if (Func == LibFunc_sinpi)
3259 else if (Func == LibFunc_cospi)
3261 else if (Func == LibFunc_sincospi_stret)
3283 unsigned IntBW = TLI->getIntSize();
3284 APSInt QuotInt(IntBW,
false);
3291 B.CreateAlignedStore(
3294 return ConstantFP::get(CI->
getType(), Rem);
3321 return ConstantFP::get(CI->
getType(), Difference);
3333 Type *ArgType =
Op->getType();
3334 Value *
V =
B.CreateIntrinsic(Intrinsic::cttz, {ArgType}, {
Op,
B.getTrue()},
3336 V =
B.CreateAdd(V, ConstantInt::get(
V->getType(), 1));
3337 V =
B.CreateIntCast(V, RetType,
false);
3340 return B.CreateSelect(
Cond, V, ConstantInt::get(RetType, 0));
3347 Type *ArgType =
Op->getType();
3348 Value *
V =
B.CreateIntrinsic(Intrinsic::ctlz, {ArgType}, {
Op,
B.getFalse()},
3352 return B.CreateIntCast(V, CI->
getType(),
false);
3359 Value *IsNeg =
B.CreateIsNeg(
X);
3360 Value *NegX =
B.CreateNSWNeg(
X,
"neg");
3361 return B.CreateSelect(IsNeg, NegX,
X);
3367 Type *ArgType =
Op->getType();
3368 Op =
B.CreateSub(
Op, ConstantInt::get(ArgType,
'0'),
"isdigittmp");
3369 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 10),
"isdigit");
3376 Type *ArgType =
Op->getType();
3377 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 128),
"isascii");
3384 ConstantInt::get(CI->
getType(), 0x7F));
3414 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned,
B);
3446 if (!Callee || !Callee->isDeclaration())
3455 if (StreamArg >= (
int)CI->
arg_size())
3463 return GV->
getName() ==
"stderr";
3468 StringRef FormatStr;
3473 if (FormatStr.
empty())
3484 if (FormatStr.
size() == 1 || FormatStr ==
"%%") {
3488 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)FormatStr[0]);
3489 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3493 if (FormatStr ==
"%s" && CI->
arg_size() > 1) {
3494 StringRef OperandStr;
3495 if (!getConstantStringInfo(CI->getOperand(1), OperandStr))
3498 if (OperandStr.empty())
3501 if (OperandStr.size() == 1) {
3505 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)OperandStr[0]);
3506 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3509 if (OperandStr.back() ==
'\n') {
3510 if (!isLibFuncEmittable(CI->getModule(), TLI, LibFunc_puts))
3512 OperandStr = OperandStr.drop_back();
3513 Value *GV = B.CreateGlobalString(OperandStr,
"str");
3514 return copyFlags(*CI, emitPutS(GV, B, TLI));
3520 if (FormatStr.
back() ==
'\n' &&
3522 if (!isLibFuncEmittable(CI->getModule(), TLI, LibFunc_puts))
3526 FormatStr = FormatStr.drop_back();
3527 Value *GV = B.CreateGlobalString(FormatStr,
"str");
3528 return copyFlags(*CI, emitPutS(GV, B, TLI));
3533 if (FormatStr ==
"%c" && CI->
arg_size() > 1 &&
3537 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false);
3538 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3542 if (FormatStr ==
"%s\n" && CI->
arg_size() > 1 &&
3552 FunctionType *FT =
Callee->getFunctionType();
3553 if (
Value *V = optimizePrintFString(CI,
B)) {
3564 Callee->getAttributes());
3566 New->setCalledFunction(IPrintFFn);
3576 Callee->getAttributes());
3578 New->setCalledFunction(SmallPrintFFn);
3586Value *LibCallSimplifier::optimizeSPrintFString(
CallInst *CI,
3589 StringRef FormatStr;
3605 return ConstantInt::get(CI->
getType(), FormatStr.
size());
3610 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3614 if (FormatStr[1] ==
'c') {
3620 B.CreateStore(V, Ptr);
3621 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3622 B.CreateStore(
B.getInt8(0), Ptr);
3624 return ConstantInt::get(CI->
getType(), 1);
3627 if (FormatStr[1] ==
's') {
3640 TLI->getAsSizeT(SrcLen, *CI->
getModule()));
3642 return ConstantInt::get(CI->
getType(), SrcLen - 1);
3645 Value *PtrDiff =
B.CreatePtrDiff(V, Dest);
3646 return B.CreateIntCast(PtrDiff, CI->
getType(),
false);
3657 B.CreateAdd(Len, ConstantInt::get(
Len->getType(), 1),
"leninc");
3661 return B.CreateIntCast(Len, CI->
getType(),
false);
3669 FunctionType *FT =
Callee->getFunctionType();
3670 if (
Value *V = optimizeSPrintFString(CI,
B)) {
3681 FT,
Callee->getAttributes());
3683 New->setCalledFunction(SIPrintFFn);
3693 Callee->getAttributes());
3695 New->setCalledFunction(SmallSPrintFFn);
3711 assert(StrArg || (
N < 2 && Str.size() == 1));
3713 unsigned IntBits = TLI->getIntSize();
3715 if (Str.size() > IntMax)
3721 Value *StrLen = ConstantInt::get(CI->
getType(), Str.size());
3731 NCopy = Str.size() + 1;
3736 if (NCopy && StrArg)
3739 TLI->getAsSizeT(NCopy, *CI->
getModule())));
3748 Value *NulOff =
B.getIntN(IntBits, NCopy);
3749 Value *DstEnd =
B.CreateInBoundsGEP(Int8Ty, DstArg, NulOff,
"endptr");
3750 B.CreateStore(ConstantInt::get(Int8Ty, 0), DstEnd);
3754Value *LibCallSimplifier::optimizeSnPrintFString(
CallInst *CI,
3772 StringRef FormatStr;
3783 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr,
N,
B);
3788 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() != 4)
3792 if (FormatStr[1] ==
'c') {
3797 StringRef CharStr(
"*");
3798 return emitSnPrintfMemCpy(CI,
nullptr, CharStr,
N,
B);
3805 Value *Ptr = DstArg;
3806 B.CreateStore(V, Ptr);
3807 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3808 B.CreateStore(
B.getInt8(0), Ptr);
3809 return ConstantInt::get(CI->
getType(), 1);
3812 if (FormatStr[1] !=
's')
3821 return emitSnPrintfMemCpy(CI, StrArg, Str,
N,
B);
3825 if (
Value *V = optimizeSnPrintFString(CI,
B)) {
3834Value *LibCallSimplifier::optimizeFPrintFString(
CallInst *CI,
3836 optimizeErrorReporting(CI,
B, 0);
3839 StringRef FormatStr;
3863 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3867 if (FormatStr[1] ==
'c') {
3871 Type *IntTy =
B.getIntNTy(TLI->getIntSize());
3877 if (FormatStr[1] ==
's') {
3890 FunctionType *FT =
Callee->getFunctionType();
3891 if (
Value *V = optimizeFPrintFString(CI,
B)) {
3900 FT,
Callee->getAttributes());
3902 New->setCalledFunction(FIPrintFFn);
3911 auto SmallFPrintFFn =
3913 Callee->getAttributes());
3915 New->setCalledFunction(SmallFPrintFFn);
3924 optimizeErrorReporting(CI,
B, 3);
3929 if (SizeC && CountC) {
3934 return ConstantInt::get(CI->
getType(), 0);
3941 Value *Cast =
B.CreateIntCast(Char, IntTy,
true,
"chari");
3943 return NewCI ? ConstantInt::get(CI->
getType(), 1) : nullptr;
3951 optimizeErrorReporting(CI,
B, 1);
3969 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
3974 ConstantInt::get(SizeTTy, Len - 1),
4014bool LibCallSimplifier::hasFloatVersion(
const Module *M,
StringRef FuncName) {
4015 SmallString<20> FloatFuncName = FuncName;
4016 FloatFuncName +=
'f';
4020Value *LibCallSimplifier::optimizeStringMemoryLibCall(
CallInst *CI,
4024 LibFunc
Func = TLI->getLibFunc(*Callee);
4032 "Optimizing string/memory libcall would change the calling convention");
4034 case LibFunc_strcat:
4035 return optimizeStrCat(CI, Builder);
4036 case LibFunc_strncat:
4037 return optimizeStrNCat(CI, Builder);
4038 case LibFunc_strchr:
4039 return optimizeStrChr(CI, Builder);
4040 case LibFunc_strrchr:
4041 return optimizeStrRChr(CI, Builder);
4042 case LibFunc_strcmp:
4043 return optimizeStrCmp(CI, Builder);
4044 case LibFunc_strncmp:
4045 return optimizeStrNCmp(CI, Builder);
4046 case LibFunc_strcpy:
4047 return optimizeStrCpy(CI, Builder);
4048 case LibFunc_stpcpy:
4049 return optimizeStpCpy(CI, Builder);
4050 case LibFunc_strlcpy:
4051 return optimizeStrLCpy(CI, Builder);
4052 case LibFunc_stpncpy:
4053 return optimizeStringNCpy(CI,
true, Builder);
4054 case LibFunc_strncpy:
4055 return optimizeStringNCpy(CI,
false, Builder);
4056 case LibFunc_strlen:
4057 return optimizeStrLen(CI, Builder);
4058 case LibFunc_strnlen:
4059 return optimizeStrNLen(CI, Builder);
4060 case LibFunc_strpbrk:
4061 return optimizeStrPBrk(CI, Builder);
4062 case LibFunc_strndup:
4063 return optimizeStrNDup(CI, Builder);
4064 case LibFunc_strtol:
4065 case LibFunc_strtod:
4066 case LibFunc_strtof:
4067 case LibFunc_strtoul:
4068 case LibFunc_strtoll:
4069 case LibFunc_strtold:
4070 case LibFunc_strtoull:
4071 return optimizeStrTo(CI, Builder);
4072 case LibFunc_strspn:
4073 return optimizeStrSpn(CI, Builder);
4074 case LibFunc_strcspn:
4075 return optimizeStrCSpn(CI, Builder);
4076 case LibFunc_strstr:
4077 return optimizeStrStr(CI, Builder);
4078 case LibFunc_memchr:
4079 return optimizeMemChr(CI, Builder);
4080 case LibFunc_memrchr:
4081 return optimizeMemRChr(CI, Builder);
4083 return optimizeBCmp(CI, Builder);
4084 case LibFunc_memcmp:
4085 return optimizeMemCmp(CI, Builder);
4086 case LibFunc_memcpy:
4087 return optimizeMemCpy(CI, Builder);
4088 case LibFunc_memccpy:
4089 return optimizeMemCCpy(CI, Builder);
4090 case LibFunc_mempcpy:
4091 return optimizeMemPCpy(CI, Builder);
4092 case LibFunc_memmove:
4093 return optimizeMemMove(CI, Builder);
4094 case LibFunc_memset:
4095 return optimizeMemSet(CI, Builder);
4096 case LibFunc_realloc:
4097 return optimizeRealloc(CI, Builder);
4098 case LibFunc_wcslen:
4099 return optimizeWcslen(CI, Builder);
4101 return optimizeBCopy(CI, Builder);
4103 case LibFunc_ZnwmRKSt9nothrow_t:
4104 case LibFunc_ZnwmSt11align_val_t:
4105 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
4107 case LibFunc_ZnamRKSt9nothrow_t:
4108 case LibFunc_ZnamSt11align_val_t:
4109 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
4110 case LibFunc_Znwm12__hot_cold_t:
4111 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
4112 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
4113 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4114 case LibFunc_Znam12__hot_cold_t:
4115 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
4116 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
4117 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4118 case LibFunc_size_returning_new:
4119 case LibFunc_size_returning_new_hot_cold:
4120 case LibFunc_size_returning_new_aligned:
4121 case LibFunc_size_returning_new_aligned_hot_cold:
4122 return optimizeNew(CI, Builder, Func);
4138 if (CharSeq.
empty())
4139 Fill =
APInt(32, 0);
4146Value *LibCallSimplifier::optimizeFloatingPointLibCall(
CallInst *CI,
4155 if (
Value *V = optimizeSymmetric(CI, Func, Builder))
4159 case LibFunc_sinpif:
4161 return optimizeSinCosPi(CI,
true, Builder);
4162 case LibFunc_cospif:
4164 return optimizeSinCosPi(CI,
false, Builder);
4178 return optimizePow(CI, Builder);
4182 return optimizeExp2(CI, Builder);
4183 case LibFunc_scalbn:
4184 case LibFunc_scalbnf:
4185 case LibFunc_scalbnl:
4202 return optimizeSqrt(CI, Builder);
4206 return optimizeFMod(CI, Builder);
4210 case LibFunc_log10f:
4212 case LibFunc_log10l:
4213 case LibFunc_log1pf:
4215 case LibFunc_log1pl:
4222 return optimizeLog(CI, Builder);
4230 case LibFunc_asinhf:
4231 case LibFunc_asinhl:
4236 case LibFunc_atanhf:
4237 case LibFunc_atanhl:
4238 return optimizeTrigInversionPairs(CI, Builder);
4245 case LibFunc_roundeven:
4247 case LibFunc_nearbyint:
4255 if (UnsafeFPShrink &&
4261 CI, Builder, Func == LibFunc_sin ? Intrinsic::sin : Intrinsic::cos);
4275 case LibFunc_copysign:
4282 return optimizeFdim(CI, Builder);
4286 return optimizeFMinFMax(CI, Builder, Intrinsic::minnum);
4290 return optimizeFMinFMax(CI, Builder, Intrinsic::maxnum);
4291 case LibFunc_fminimum_numf:
4292 case LibFunc_fminimum_num:
4293 case LibFunc_fminimum_numl:
4295 case LibFunc_fmaximum_numf:
4296 case LibFunc_fmaximum_num:
4297 case LibFunc_fmaximum_numl:
4302 return optimizeCAbs(CI, Builder);
4303 case LibFunc_remquo:
4304 case LibFunc_remquof:
4305 case LibFunc_remquol:
4306 return optimizeRemquo(CI, Builder);
4325 return maybeOptimizeNoBuiltinOperatorNew(CI, Builder);
4329 LibFunc Func = TLI->getLibFunc(*Callee);
4336 Builder.setDefaultOperandBundles(OpBundles);
4344 UnsafeFPShrink =
true;
4348 if (!IsCallingConvC)
4352 switch (
II->getIntrinsicID()) {
4353 case Intrinsic::pow:
4354 return optimizePow(CI, Builder);
4355 case Intrinsic::exp2:
4356 return optimizeExp2(CI, Builder);
4357 case Intrinsic::log:
4358 case Intrinsic::log2:
4359 case Intrinsic::log10:
4360 return optimizeLog(CI, Builder);
4361 case Intrinsic::sqrt:
4362 return optimizeSqrt(CI, Builder);
4363 case Intrinsic::memset:
4364 return optimizeMemSet(CI, Builder);
4365 case Intrinsic::memcpy:
4366 return optimizeMemCpy(CI, Builder);
4367 case Intrinsic::memmove:
4368 return optimizeMemMove(CI, Builder);
4369 case Intrinsic::sin:
4370 case Intrinsic::cos:
4374 case Intrinsic::sincos:
4384 if (
Value *SimplifiedFortifiedCI =
4385 FortifiedSimplifier.optimizeCall(CI, Builder))
4386 return SimplifiedFortifiedCI;
4393 if (
Value *V = optimizeStringMemoryLibCall(CI, Builder))
4395 if (
Value *V = optimizeFloatingPointLibCall(CI, Func, Builder))
4401 return optimizeFFS(CI, Builder);
4405 return optimizeFls(CI, Builder);
4409 return optimizeAbs(CI, Builder);
4410 case LibFunc_isdigit:
4411 return optimizeIsDigit(CI, Builder);
4412 case LibFunc_isascii:
4413 return optimizeIsAscii(CI, Builder);
4414 case LibFunc_toascii:
4415 return optimizeToAscii(CI, Builder);
4419 return optimizeAtoi(CI, Builder);
4420 case LibFunc_strtol:
4421 case LibFunc_strtoll:
4422 return optimizeStrToInt(CI, Builder,
true);
4423 case LibFunc_strtoul:
4424 case LibFunc_strtoull:
4425 return optimizeStrToInt(CI, Builder,
false);
4426 case LibFunc_printf:
4427 return optimizePrintF(CI, Builder);
4428 case LibFunc_sprintf:
4429 return optimizeSPrintF(CI, Builder);
4430 case LibFunc_snprintf:
4431 return optimizeSnPrintF(CI, Builder);
4432 case LibFunc_fprintf:
4433 return optimizeFPrintF(CI, Builder);
4434 case LibFunc_fwrite:
4435 return optimizeFWrite(CI, Builder);
4437 return optimizeFPuts(CI, Builder);
4439 return optimizePuts(CI, Builder);
4440 case LibFunc_perror:
4441 return optimizeErrorReporting(CI, Builder);
4442 case LibFunc_vfprintf:
4443 case LibFunc_fiprintf:
4444 return optimizeErrorReporting(CI, Builder, 0);
4447 return optimizeExit(CI);
4461 : FortifiedSimplifier(TLI), DL(DL), TLI(TLI), DT(DT), DC(DC), AC(AC),
4462 ORE(ORE), BFI(BFI), PSI(PSI), Replacer(Replacer), Eraser(Eraser) {}
4469void LibCallSimplifier::eraseFromParent(
Instruction *
I) {
4508bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(
4509 CallInst *CI,
unsigned ObjSizeOp, std::optional<unsigned> SizeOp,
4510 std::optional<unsigned> StrOp, std::optional<unsigned> FlagOp) {
4515 if (!Flag || !
Flag->isZero())
4522 if (ConstantInt *ObjSizeCI =
4524 if (ObjSizeCI->isMinusOne())
4527 if (OnlyLowerUnknownSize)
4537 return ObjSizeCI->getZExtValue() >=
Len;
4541 if (ConstantInt *SizeCI =
4543 return ObjSizeCI->getZExtValue() >= SizeCI->getZExtValue();
4549Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(
CallInst *CI,
4551 if (isFortifiedCallFoldable(CI, 3, 2)) {
4561Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(
CallInst *CI,
4563 if (isFortifiedCallFoldable(CI, 3, 2)) {
4573Value *FortifiedLibCallSimplifier::optimizeMemSetChk(
CallInst *CI,
4575 if (isFortifiedCallFoldable(CI, 3, 2)) {
4585Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(
CallInst *CI,
4588 if (isFortifiedCallFoldable(CI, 3, 2))
4596Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(
CallInst *CI,
4604 if (Func == LibFunc_stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src) {
4606 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
4614 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) {
4615 if (Func == LibFunc_strcpy_chk)
4621 if (OnlyLowerUnknownSize)
4631 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
4633 Value *LenV = ConstantInt::get(SizeTTy, Len);
4637 if (Ret && Func == LibFunc_stpcpy_chk)
4638 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
4639 ConstantInt::get(SizeTTy, Len - 1));
4643Value *FortifiedLibCallSimplifier::optimizeStrLenChk(
CallInst *CI,
4645 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0))
4651Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(
CallInst *CI,
4654 if (isFortifiedCallFoldable(CI, 3, 2)) {
4655 if (Func == LibFunc_strncpy_chk)
4668Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(
CallInst *CI,
4670 if (isFortifiedCallFoldable(CI, 4, 3))
4678Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(
CallInst *CI,
4680 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) {
4690Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(
CallInst *CI,
4692 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) {
4696 VariadicArgs,
B, TLI));
4702Value *FortifiedLibCallSimplifier::optimizeStrCatChk(
CallInst *CI,
4704 if (isFortifiedCallFoldable(CI, 2))
4711Value *FortifiedLibCallSimplifier::optimizeStrLCat(
CallInst *CI,
4713 if (isFortifiedCallFoldable(CI, 3))
4721Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(
CallInst *CI,
4723 if (isFortifiedCallFoldable(CI, 3))
4731Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(
CallInst *CI,
4733 if (isFortifiedCallFoldable(CI, 3))
4741Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(
CallInst *CI,
4743 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2))
4751Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(
CallInst *CI,
4753 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1))
4783 Builder.setDefaultOperandBundles(OpBundles);
4787 LibFunc Func = TLI->getLibFunc(*Callee);
4788 if (Func == NotLibFunc)
4796 case LibFunc_memcpy_chk:
4797 return optimizeMemCpyChk(CI, Builder);
4798 case LibFunc_mempcpy_chk:
4799 return optimizeMemPCpyChk(CI, Builder);
4800 case LibFunc_memmove_chk:
4801 return optimizeMemMoveChk(CI, Builder);
4802 case LibFunc_memset_chk:
4803 return optimizeMemSetChk(CI, Builder);
4804 case LibFunc_stpcpy_chk:
4805 case LibFunc_strcpy_chk:
4806 return optimizeStrpCpyChk(CI, Builder, Func);
4807 case LibFunc_strlen_chk:
4808 return optimizeStrLenChk(CI, Builder);
4809 case LibFunc_stpncpy_chk:
4810 case LibFunc_strncpy_chk:
4811 return optimizeStrpNCpyChk(CI, Builder, Func);
4812 case LibFunc_memccpy_chk:
4813 return optimizeMemCCpyChk(CI, Builder);
4814 case LibFunc_snprintf_chk:
4815 return optimizeSNPrintfChk(CI, Builder);
4816 case LibFunc_sprintf_chk:
4817 return optimizeSPrintfChk(CI, Builder);
4818 case LibFunc_strcat_chk:
4819 return optimizeStrCatChk(CI, Builder);
4820 case LibFunc_strlcat_chk:
4821 return optimizeStrLCat(CI, Builder);
4822 case LibFunc_strncat_chk:
4823 return optimizeStrNCatChk(CI, Builder);
4824 case LibFunc_strlcpy_chk:
4825 return optimizeStrLCpyChk(CI, Builder);
4826 case LibFunc_vsnprintf_chk:
4827 return optimizeVSNPrintfChk(CI, Builder);
4828 case LibFunc_vsprintf_chk:
4829 return optimizeVSPrintfChk(CI, Builder);
4838 : 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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Module.h This file contains the declarations for the Module class.
static llvm::Error parse(GsymDataExtractor &Data, uint64_t BaseAddr, LineEntryCallback const &Callback)
uint64_t IntrinsicInst * II
static bool isBinary(MachineInstr &MI)
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
static bool isOnlyUsedInEqualityComparison(Value *V, Value *With)
Return true if it is only used in equality comparisons with With.
static Value * optimizeSinCosDoubleFP(CallInst *CI, IRBuilderBase &B)
Shrink double -> float for llvm.sincos.
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 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 cl::opt< OptimizeExistingHotColdNewKind > OptimizeExistingHotColdNew("optimize-existing-hot-cold-new", cl::Hidden, cl::desc("Enable optimization of existing hot/cold operator new library calls"), cl::values(clEnumValN(OptimizeExistingHotColdNewKind::None, "none", "Do not optimize existing hot/cold operator new library calls"), clEnumValN(OptimizeExistingHotColdNewKind::Cold, "cold", "Only optimize existing hot/cold operator new library calls " "if determined to be cold"), clEnumValN(OptimizeExistingHotColdNewKind::Always, "always", "Always optimize existing hot/cold operator new library calls"), clEnumValN(OptimizeExistingHotColdNewKind::Always, "", "Always optimize existing hot/cold operator new library calls")), cl::init(OptimizeExistingHotColdNewKind::None), cl::ValueOptional)
static cl::opt< bool > MinExistingHotColdNewHint("min-existing-hot-cold-new-hint", cl::Hidden, cl::init(false), cl::desc("Take the minimum of compiler hint and existing hint when " "optimizing existing hot/cold operator new library calls"))
static bool ignoreCallingConv(LibFunc Func)
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 * replaceBinaryCall(CallInst *CI, IRBuilderBase &B, Intrinsic::ID IID)
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 bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, const SimplifyQuery &SQ)
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"))
OptimizeExistingHotColdNewKind
This file defines the SmallString class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
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
Class for arbitrary precision integers.
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 ConstantFP * getZero(Type *Ty, bool Negative=false)
static LLVM_ABI ConstantFP * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
static LLVM_ABI ConstantFP * getInfinity(Type *Ty, bool Negative=false)
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.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
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)
LLVM_ABI FortifiedLibCallSimplifier(const TargetLibraryInfo *TLI, bool OnlyLowerUnknownSize=false)
LLVM_ABI 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.
Value * CreateLdexp(Value *Src, Value *Exp, FMFSource FMFSource={}, const Twine &Name="")
Create call to the ldexp intrinsic.
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 void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
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.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
iterator_range< user_iterator > users()
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 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.
LLVM_ABI 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)
LLVM_ABI 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.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
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.
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
Check if the string is empty.
char back() const
Get the last character in the string.
constexpr size_t size() const
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 two strings; the result is negative, zero, or positive if this string is lexicographically le...
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.
LibFunc getLibFunc(StringRef funcName) 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.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< user_iterator > users()
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.
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)
match_deferred< 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()...
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...
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.
auto m_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_Value()
Match an arbitrary value and ignore it.
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
auto m_FAbs(const Opnd0 &Op0)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
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.
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 cl::opt< bool > ProfcheckDisableMetadataFixes
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)
@ Known
Known to have no common set bits.
LLVM_ABI void setExplicitlyUnknownBranchWeightsIfProfiled(Instruction &I, StringRef PassName, const Function *F=nullptr)
Like setExplicitlyUnknownBranchWeights(...), but only sets unknown branch weights in the new instruct...
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 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_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 Value * emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, Value *HotCold)
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 * emitHotColdNewNoThrow(Value *Num, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, Value *HotCold)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
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 Value * emitHotColdNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, Value *HotCold)
LLVM_ABI Value * emitHotColdNewAlignedNoThrow(Value *Num, Value *Align, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, Value *HotCold)
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 * emitHotColdSizeReturningNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, Value *HotCold)
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 * 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.
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 * emitHotColdNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, Value *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 bool isDereferenceablePointer(const Value *V, Type *Ty, const SimplifyQuery &Q, bool IgnoreFree=false)
Equivalent to isDereferenceableAndAlignedPointer with an alignment of 1.
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 * 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.
@ Always
Always emit .debug_str_offsets talbes as DWARF64 for testing.
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 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 known this can never be interpreted as a zero.