50#define DEBUG_TYPE "simplify-lib-calls"
55 cl::desc(
"Enable unsafe double to float "
56 "shrinking for math lib calls"));
63 cl::desc(
"Enable hot/cold operator new library calls"));
72 "Enable optimization of existing hot/cold operator new library calls"),
76 "Do not optimize existing hot/cold operator new library calls"),
78 "Only optimize existing hot/cold operator new library calls "
79 "if determined to be cold"),
82 "Always optimize existing hot/cold operator new library calls"),
85 "Always optimize existing hot/cold operator new library calls")),
89 cl::desc(
"Enable transformation of nobuiltin operator new library calls"));
92 cl::desc(
"Take the minimum of compiler hint and existing hint when "
93 "optimizing existing hot/cold operator new library calls"));
104struct HotColdHintParser :
public cl::parser<unsigned> {
105 HotColdHintParser(cl::Option &O) : cl::parser<unsigned>(
O) {}
107 bool parse(cl::Option &O, StringRef ArgName, StringRef Arg,
unsigned &
Value) {
109 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
112 return O.error(
"'" + Arg +
"' value must be in the range [0, 255]!");
126 cl::desc(
"Value to pass to hot/cold operator new for cold allocation"));
129 cl::desc(
"Value to pass to hot/cold operator new for "
130 "notcold (warm) allocation"));
133 cl::desc(
"Value to pass to hot/cold operator new for hot allocation"));
137 "Value to pass to hot/cold operator new for ambiguous allocation"));
144 return Func == LibFunc_abs || Func == LibFunc_labs ||
145 Func == LibFunc_llabs || Func == LibFunc_strlen;
152 if (IC->isEquality() && IC->getOperand(1) == With)
162 return OI->getType()->isFloatingPointTy();
168 return OI->getType()->isFP128Ty();
201 bool Negate = Str[0] ==
'-';
202 if (Str[0] ==
'-' || Str[0] ==
'+') {
203 Str = Str.drop_front();
214 uint64_t Max = AsSigned && Negate ? 1 : 0;
218 if (Str.size() > 1) {
220 if (
toUpper((
unsigned char)Str[1]) ==
'X') {
221 if (Str.size() == 2 || (
Base &&
Base != 16))
226 Str = Str.drop_front(2);
232 }
else if (
Base == 0)
242 for (
unsigned i = 0; i != Str.size(); ++i) {
243 unsigned char DigVal = Str[i];
245 DigVal = DigVal -
'0';
249 DigVal = DigVal -
'A' + 10;
262 if (VFlow || Result > Max)
270 Value *StrEnd =
B.CreateInBoundsGEP(
B.getInt8Ty(), StrBeg,
Off,
"endptr");
271 B.CreateStore(StrEnd, EndPtr);
282 return ConstantInt::get(RetTy, Result, AsSigned);
289 if (
C->isNullValue())
317 for (
unsigned ArgNo : ArgNos) {
318 uint64_t DerefBytes = DereferenceableBytes;
323 DereferenceableBytes);
342 for (
unsigned ArgNo : ArgNos) {
368 DerefMin = std::min(
X,
Y);
389 NewCI->
getContext(), {NewCI->getAttributes(), Old.getAttributes()}));
402 return Len >= Str.size() ? Str : Str.substr(0, Len);
427 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len,
B));
441 Value *CpyDst =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, DstLen,
"endptr");
446 TLI->getAsSizeT(Len + 1, *
B.getModule()));
490 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen,
B));
503 Type *CharTy =
B.getInt8Ty();
504 Value *Char0 =
B.CreateLoad(CharTy, Src);
505 CharVal =
B.CreateTrunc(CharVal, CharTy);
506 Value *Cmp =
B.CreateICmpEQ(Char0, CharVal,
"char0cmp");
510 Value *
And =
B.CreateICmpNE(NBytes, Zero);
511 Cmp =
B.CreateLogicalAnd(
And, Cmp);
519 return B.CreateSelect(Cmp, Src, NullPtr);
541 FunctionType *FT =
Callee->getFunctionType();
542 unsigned IntBits = TLI->getIntSize();
543 if (!FT->getParamType(1)->isIntegerTy(IntBits))
546 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
550 ConstantInt::get(SizeTTy, Len),
B,
559 return B.CreateIntToPtr(
B.getTrue(), CI->
getType());
568 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, StrLen,
"strchr");
581 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(
I),
"strchr");
593 if (CharC && CharC->
isZero())
598 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
604 Value *
Size = ConstantInt::get(SizeTTy, NBytes);
611 return ConstantInt::get(CI->
getType(), 0);
613 StringRef Str1, Str2;
618 if (HasStr1 && HasStr2)
620 std::clamp(Str1.
compare(Str2), -1, 1));
622 if (HasStr1 && Str1.
empty())
623 return B.CreateNeg(
B.CreateZExt(
624 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
626 if (HasStr2 && Str2.
empty())
627 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
641 TLI->getAsSizeT(std::min(Len1, Len2), *CI->
getModule()),
646 SimplifyQuery SQ(DL, TLI, DT, AC, CI);
647 if (!HasStr1 && HasStr2) {
652 }
else if (HasStr1 && !HasStr2) {
674 return ConstantInt::get(CI->
getType(), 0);
686 return ConstantInt::get(CI->
getType(), 0);
691 StringRef Str1, Str2;
696 if (HasStr1 && HasStr2) {
701 std::clamp(SubStr1.
compare(SubStr2), -1, 1));
704 if (HasStr1 && Str1.
empty())
705 return B.CreateNeg(
B.CreateZExt(
706 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
708 if (HasStr2 && Str2.
empty())
709 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
720 if (!HasStr1 && HasStr2) {
721 Len2 = std::min(Len2,
Length);
726 }
else if (HasStr1 && !HasStr2) {
727 Len1 = std::min(Len1,
Length);
741 if (SrcLen &&
Size) {
743 if (SrcLen <= Size->getZExtValue() + 1)
765 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
780 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
791 Value *DstEnd =
B.CreateInBoundsGEP(
792 B.getInt8Ty(), Dst, TLI->getAsSizeT(Len - 1, *CI->
getModule()));
796 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1), LenV);
815 NBytes = SizeC->getZExtValue();
824 B.CreateStore(
B.getInt8(0), Dst);
840 bool NulTerm = SrcLen < NBytes;
849 SrcLen = std::min(SrcLen,
uint64_t(Str.size()));
850 NBytes = std::min(NBytes - 1, SrcLen);
855 B.CreateStore(
B.getInt8(0), Dst);
856 return ConstantInt::get(CI->
getType(), 0);
862 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
863 TLI->getAsSizeT(NBytes, *CI->
getModule()));
867 Value *EndOff = ConstantInt::get(CI->
getType(), NBytes);
868 Value *EndPtr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, EndOff);
869 B.CreateStore(
B.getInt8(0), EndPtr);
875 return ConstantInt::get(CI->
getType(), SrcLen);
880Value *LibCallSimplifier::optimizeStringNCpy(
CallInst *CI,
bool RetEnd,
897 N = SizeC->getZExtValue();
904 Type *CharTy =
B.getInt8Ty();
905 Value *CharVal =
B.CreateLoad(CharTy, Src,
"stxncpy.char0");
906 B.CreateStore(CharVal, Dst);
912 Value *ZeroChar = ConstantInt::get(CharTy, 0);
913 Value *
Cmp =
B.CreateICmpEQ(CharVal, ZeroChar,
"stpncpy.char0cmp");
915 Value *Off1 =
B.getInt32(1);
916 Value *EndPtr =
B.CreateInBoundsGEP(CharTy, Dst, Off1,
"stpncpy.end");
917 return B.CreateSelect(Cmp, Dst, EndPtr,
"stpncpy.sel");
932 CI->
getAttributes().getParamAttrs(0).getAlignment().valueOrOne();
933 CallInst *NewCI =
B.CreateMemSet(Dst,
B.getInt8(
'\0'),
Size, MemSetAlign);
941 if (
N > SrcLen + 1) {
950 std::string SrcStr = Str.str();
953 SrcStr.resize(
N,
'\0');
954 Src =
B.CreateGlobalString(SrcStr,
"str", 0,
960 CallInst *NewCI =
B.CreateMemCpy(Dst,
Align(1), Src,
Align(1),
969 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
Off,
"endptr");
986 return B.CreateZExt(
B.CreateLoad(CharTy, Src,
"char0"),
992 if (BoundCst->isZero())
994 return ConstantInt::get(CI->
getType(), 0);
996 if (BoundCst->isOne()) {
998 Value *CharVal =
B.CreateLoad(CharTy, Src,
"strnlen.char0");
999 Value *ZeroChar = ConstantInt::get(CharTy, 0);
1000 Value *
Cmp =
B.CreateICmpNE(CharVal, ZeroChar,
"strnlen.char0cmp");
1001 return B.CreateZExt(Cmp, CI->
getType());
1007 Value *LenC = ConstantInt::get(CI->
getType(), Len - 1);
1011 return B.CreateBinaryIntrinsic(Intrinsic::umin, LenC, Bound);
1028 unsigned BW = DL.getIndexTypeSizeInBits(
GEP->getType());
1029 SmallMapVector<Value *, APInt, 4> VarOffsets;
1030 APInt ConstOffset(BW, 0);
1031 assert(CharSize % 8 == 0 &&
"Expected a multiple of 8 sized CharSize");
1033 if (!
GEP->collectOffset(DL, BW, VarOffsets, ConstOffset) ||
1034 VarOffsets.
size() != 1 || ConstOffset != 0 ||
1035 VarOffsets.
begin()->second != CharSize / 8)
1038 ConstantDataArraySlice Slice;
1041 if (Slice.
Array ==
nullptr) {
1064 if ((
Known.isNonNegative() &&
Known.getMaxValue().ule(NullTermIdx)) ||
1066 NullTermIdx == Slice.
Length - 1)) {
1068 return B.CreateSub(ConstantInt::get(CI->
getType(), NullTermIdx),
1078 if (LenTrue && LenFalse) {
1080 return OptimizationRemark(
"instcombine",
"simplify-libcalls", CI)
1081 <<
"folded strlen(select) to select of constants";
1083 return B.CreateSelect(
SI->getCondition(),
1084 ConstantInt::get(CI->
getType(), LenTrue - 1),
1085 ConstantInt::get(CI->
getType(), LenFalse - 1),
"",
1094 if (
Value *V = optimizeStringLength(CI,
B, 8))
1102 if (
Value *V = optimizeStringLength(CI,
B, 8, Bound))
1112 unsigned WCharSize = TLI->getWCharSize(M) * 8;
1117 return optimizeStringLength(CI,
B, WCharSize);
1127 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1131 if (HasS1 && HasS2) {
1132 size_t I =
S1.find_first_of(S2);
1137 B.getInt64(
I),
"strpbrk");
1141 if (HasS2 && S2.
size() == 1)
1166 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1170 if (HasS1 && HasS2) {
1171 size_t Pos =
S1.find_first_not_of(S2);
1174 return ConstantInt::get(CI->
getType(), Pos);
1186 if (HasS1 &&
S1.empty())
1190 if (HasS1 && HasS2) {
1191 size_t Pos =
S1.find_first_of(S2);
1194 return ConstantInt::get(CI->
getType(), Pos);
1198 if (HasS2 && S2.
empty())
1215 StrLen,
B, DL, TLI);
1223 replaceAllUsesWith(Old, Cmp);
1229 StringRef SearchStr, ToFindStr;
1234 if (HasStr2 && ToFindStr.
empty())
1238 if (HasStr1 && HasStr2) {
1245 return B.CreateConstInBoundsGEP1_64(
B.getInt8Ty(), CI->
getArgOperand(0),
1250 if (HasStr2 && ToFindStr.
size() == 1) {
1271 if (LenC->
isOne()) {
1274 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memrchr.char0");
1276 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1277 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memrchr.char0cmp");
1278 return B.CreateSelectWithUnknownProfile(Cmp, SrcStr, NullPtr,
DEBUG_TYPE,
1287 if (Str.size() == 0)
1296 if (Str.size() < EndOff)
1311 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos));
1313 if (Str.find(Str[Pos]) == Pos) {
1320 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
1321 B.getInt64(Pos),
"memrchr.ptr_plus");
1322 return B.CreateSelectWithUnknownProfile(Cmp, NullPtr, SrcPlus,
DEBUG_TYPE,
1328 Str = Str.substr(0, EndOff);
1336 Type *Int8Ty =
B.getInt8Ty();
1337 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1339 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1341 B.CreateICmpEQ(ConstantInt::get(Int8Ty, (
unsigned char)Str[0]), CharVal);
1342 Value *
And =
B.CreateLogicalAnd(NNeZ, CEqS0);
1345 Value *SizeM1 =
B.CreateSub(
Size, ConstantInt::get(SizeTy, 1));
1347 B.CreateInBoundsGEP(Int8Ty, SrcStr, SizeM1,
"memrchr.ptr_plus");
1348 return B.CreateSelectWithUnknownProfile(
And, SrcPlus, NullPtr,
DEBUG_TYPE,
1372 if (LenC->
isOne()) {
1375 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memchr.char0");
1377 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1378 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memchr.char0cmp");
1382 return B.CreateSelectWithUnknownProfile(Cmp, SrcStr, NullPtr,
DEBUG_TYPE,
1403 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos),
1407 return B.CreateSelectWithUnknownProfile(Cmp, NullPtr, SrcPlus,
DEBUG_TYPE);
1410 if (Str.size() == 0)
1419 size_t Pos = Str.find_first_not_of(Str[0]);
1435 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1437 Value *Sel1 = NullPtr;
1440 Value *PosVal = ConstantInt::get(SizeTy, Pos);
1441 Value *StrPos = ConstantInt::get(Int8Ty, (
unsigned char)Str[Pos]);
1442 Value *CEqSPos =
B.CreateICmpEQ(CharVal, StrPos);
1444 Value *
And =
B.CreateAnd(CEqSPos, NGtPos);
1445 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, PosVal);
1448 Sel1 =
B.CreateSelectWithUnknownProfile(
And, SrcPlus, NullPtr,
DEBUG_TYPE,
1452 Value *Str0 = ConstantInt::get(Int8Ty, (
unsigned char)Str[0]);
1453 Value *CEqS0 =
B.CreateICmpEQ(Str0, CharVal);
1454 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1458 return B.CreateSelectWithUnknownProfile(
And, SrcStr, Sel1,
DEBUG_TYPE,
1490 *std::max_element(
reinterpret_cast<const unsigned char *
>(Str.begin()),
1491 reinterpret_cast<const unsigned char *
>(Str.end()));
1498 if (!DL.fitsInLegalInteger(Max + 1)) {
1504 std::string SortedStr = Str.str();
1507 unsigned NonContRanges = 1;
1508 for (
size_t i = 1; i < SortedStr.size(); ++i) {
1509 if (SortedStr[i] > SortedStr[i - 1] + 1) {
1516 if (NonContRanges > 2)
1520 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1523 for (
unsigned char C : SortedStr)
1524 CharCompares.
push_back(
B.CreateICmpEQ(CharVal,
B.getInt8(
C)));
1526 return B.CreateIntToPtr(
B.CreateOr(CharCompares), CI->
getType());
1531 unsigned char Width =
NextPowerOf2(std::max((
unsigned char)7, Max));
1537 Value *BitfieldC =
B.getInt(Bitfield);
1541 C =
B.CreateAnd(
C,
B.getIntN(Width, 0xFF));
1548 Value *Shl =
B.CreateShl(
B.getIntN(Width, 1ULL),
C);
1549 Value *
Bits =
B.CreateIsNotNull(
B.CreateAnd(Shl, BitfieldC),
"memchr.bits");
1553 Value *Memchr =
B.CreateLogicalAnd(Bounds, Bits,
"memchr");
1559 return B.CreateIntToPtr(Memchr, CI->
getType());
1583 if (Pos == MinSize ||
1584 (StrNCmp && (LStr[Pos] ==
'\0' && RStr[Pos] ==
'\0'))) {
1592 if (LStr[Pos] != RStr[Pos])
1597 typedef unsigned char UChar;
1598 int IRes = UChar(LStr[Pos]) < UChar(RStr[Pos]) ? -1 : 1;
1599 Value *MaxSize = ConstantInt::get(
Size->getType(), Pos);
1602 return B.CreateSelect(Cmp, Zero, Res);
1614 Value *LHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
LHS,
"lhsc"),
1616 Value *RHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
RHS,
"rhsc"),
1618 return B.CreateSub(LHSV, RHSV,
"chardiff");
1626 Align PrefAlignment =
DL.getPrefTypeAlign(IntType);
1629 Value *LHSV =
nullptr;
1633 Value *RHSV =
nullptr;
1642 LHSV =
B.CreateLoad(IntType,
LHS,
"lhsv");
1644 RHSV =
B.CreateLoad(IntType,
RHS,
"rhsv");
1645 return B.CreateZExt(
B.CreateICmpNE(LHSV, RHSV), CI->
getType(),
"memcmp");
1653Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(
CallInst *CI,
1673 if (
Value *V = optimizeMemCmpBCmpCommon(CI,
B))
1691 return optimizeMemCmpBCmpCommon(CI,
B);
1717 if (
N->isNullValue())
1730 if (
N->getZExtValue() <= SrcStr.
size()) {
1739 ConstantInt::get(
N->getType(), std::min(
uint64_t(Pos + 1),
N->getZExtValue()));
1742 return Pos + 1 <=
N->getZExtValue()
1743 ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, NewN)
1757 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
N);
1790 if (MDNode *MD = CI->
getMetadata(LLVMContext::MD_alloc_token))
1791 MallocCI->setMetadata(LLVMContext::MD_alloc_token, MD);
1800Value *LibCallSimplifier::maybeOptimizeNoBuiltinOperatorNew(
CallInst *CI,
1807 LibFunc
Func = TLI->getLibFunc(*Callee);
1808 if (Func == NotLibFunc)
1812 case LibFunc_ZnwmRKSt9nothrow_t:
1813 case LibFunc_ZnwmSt11align_val_t:
1814 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1816 case LibFunc_ZnamRKSt9nothrow_t:
1817 case LibFunc_ZnamSt11align_val_t:
1818 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1819 case LibFunc_size_returning_new:
1820 case LibFunc_size_returning_new_aligned:
1827 case LibFunc_Znwm12__hot_cold_t:
1828 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1829 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1830 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1831 case LibFunc_Znam12__hot_cold_t:
1832 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1833 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1834 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1835 case LibFunc_size_returning_new_hot_cold:
1836 case LibFunc_size_returning_new_aligned_hot_cold:
1845 return optimizeNew(CI,
B, Func);
1858 bool IsCold =
false;
1859 if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"cold") {
1862 }
else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1865 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"hot")
1867 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1873 bool ShouldOptimizeExistingHotColdNew =
1878 Value *HotColdVal =
B.getInt8(HotCold);
1879 auto getHotColdHintForExisting = [&](uint8_t HotCold) ->
Value * {
1885 ExistingHint =
B.CreateTruncOrBitCast(ExistingHint,
B.getInt8Ty());
1889 return B.CreateBinaryIntrinsic(Intrinsic::umin, ExistingHint, HotColdVal);
1899 Value *NewCall =
nullptr;
1901 case LibFunc_Znwm12__hot_cold_t:
1902 if (ShouldOptimizeExistingHotColdNew)
1904 LibFunc_Znwm12__hot_cold_t,
1905 getHotColdHintForExisting(HotCold));
1909 LibFunc_Znwm12__hot_cold_t, HotColdVal);
1911 case LibFunc_Znam12__hot_cold_t:
1912 if (ShouldOptimizeExistingHotColdNew)
1914 LibFunc_Znam12__hot_cold_t,
1915 getHotColdHintForExisting(HotCold));
1919 LibFunc_Znam12__hot_cold_t, HotColdVal);
1921 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1922 if (ShouldOptimizeExistingHotColdNew)
1925 TLI, LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t,
1926 getHotColdHintForExisting(HotCold));
1928 case LibFunc_ZnwmRKSt9nothrow_t:
1931 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotColdVal);
1933 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1934 if (ShouldOptimizeExistingHotColdNew)
1937 TLI, LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t,
1938 getHotColdHintForExisting(HotCold));
1940 case LibFunc_ZnamRKSt9nothrow_t:
1943 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotColdVal);
1945 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1946 if (ShouldOptimizeExistingHotColdNew)
1949 TLI, LibFunc_ZnwmSt11align_val_t12__hot_cold_t,
1950 getHotColdHintForExisting(HotCold));
1952 case LibFunc_ZnwmSt11align_val_t:
1955 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotColdVal);
1957 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1958 if (ShouldOptimizeExistingHotColdNew)
1961 TLI, LibFunc_ZnamSt11align_val_t12__hot_cold_t,
1962 getHotColdHintForExisting(HotCold));
1964 case LibFunc_ZnamSt11align_val_t:
1967 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotColdVal);
1969 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1970 if (ShouldOptimizeExistingHotColdNew)
1973 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1974 getHotColdHintForExisting(HotCold));
1976 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1979 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1982 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1983 if (ShouldOptimizeExistingHotColdNew)
1986 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1987 getHotColdHintForExisting(HotCold));
1989 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1992 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1995 case LibFunc_size_returning_new:
1997 LibFunc_size_returning_new_hot_cold,
2000 case LibFunc_size_returning_new_hot_cold:
2001 if (ShouldOptimizeExistingHotColdNew)
2003 LibFunc_size_returning_new_hot_cold,
2004 getHotColdHintForExisting(HotCold));
2006 case LibFunc_size_returning_new_aligned:
2009 LibFunc_size_returning_new_aligned_hot_cold, HotColdVal);
2011 case LibFunc_size_returning_new_aligned_hot_cold:
2012 if (ShouldOptimizeExistingHotColdNew)
2015 LibFunc_size_returning_new_aligned_hot_cold,
2016 getHotColdHintForExisting(HotCold));
2064 Value *
Op = Cast->getOperand(0);
2065 if (
Op->getType()->isFloatTy())
2074 return ConstantFP::get(Const->getContext(),
F);
2082 bool isPrecise =
false) {
2114 CallerName.
size() == (CalleeName.
size() + 1) &&
2127 R =
isBinary ?
B.CreateIntrinsic(IID,
B.getFloatTy(), V)
2128 :
B.CreateIntrinsic(IID,
B.getFloatTy(), V[0]);
2136 return B.CreateFPExt(R,
B.getDoubleTy());
2142 bool isPrecise =
false) {
2149 bool isPrecise =
false) {
2156 if (!RetTy || RetTy->getNumElements() != 2 ||
2157 !RetTy->getElementType(0)->getScalarType()->isDoubleTy())
2163 if (Ext->getOperand(0)->getType()->getScalarType()->isFloatTy())
2164 X = Ext->getOperand(0);
2174 if (!Cast || !Cast->getType()->getScalarType()->isFloatTy())
2182 Value *NewCall =
B.CreateIntrinsic(Intrinsic::sincos,
X->getType(),
X);
2184 LLVMContext::MD_fpmath, CI->
getMetadata(LLVMContext::MD_fpmath));
2186 for (
unsigned I = 0;
I != 2; ++
I) {
2187 Value *Ext =
B.CreateFPExt(
B.CreateExtractValue(NewCall,
I),
2188 RetTy->getElementType(
I));
2189 Res =
B.CreateInsertValue(Res, Ext,
I);
2204 assert(
Op->getType()->isArrayTy() &&
"Unexpected signature for cabs!");
2206 Real =
B.CreateExtractValue(
Op, 0,
"real");
2207 Imag =
B.CreateExtractValue(
Op, 1,
"imag");
2217 Value *AbsOp =
nullptr;
2219 if (ConstReal->isZero())
2223 if (ConstImag->isZero())
2228 return copyFlags(*CI,
B.CreateFAbs(AbsOp, CI,
"cabs"));
2235 Value *RealReal =
B.CreateFMulFMF(Real, Real, CI);
2236 Value *ImagImag =
B.CreateFMulFMF(Imag, Imag, CI);
2238 *CI,
B.CreateUnaryIntrinsic(Intrinsic::sqrt,
2239 B.CreateFAddFMF(RealReal, ImagImag, CI), CI,
2250 unsigned BitWidth =
Op->getType()->getScalarSizeInBits();
2252 Type *IntTy =
Op->getType()->getWithNewBitWidth(DstWidth);
2254 :
B.CreateZExt(
Op, IntTy);
2289 CalleeFn ? TLI->getLibFunc(CalleeFn->
getName()) : NotLibFunc;
2294 LibFunc LibFnFloat, LibFnDouble, LibFnLongDouble;
2302 ExpName = TLI->getName(LibFunc_exp);
2303 ID = Intrinsic::exp;
2304 LibFnFloat = LibFunc_expf;
2305 LibFnDouble = LibFunc_exp;
2306 LibFnLongDouble = LibFunc_expl;
2311 ExpName = TLI->getName(LibFunc_exp2);
2312 ID = Intrinsic::exp2;
2313 LibFnFloat = LibFunc_exp2f;
2314 LibFnDouble = LibFunc_exp2;
2315 LibFnLongDouble = LibFunc_exp2l;
2322 ?
B.CreateUnaryIntrinsic(ID,
FMul,
nullptr, ExpName)
2331 substituteInParent(BaseFn, ExpFn);
2342 AttributeList NoAttrs;
2344 const bool UseIntrinsic =
Pow->doesNotAccessMemory();
2350 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2355 Constant *One = ConstantFP::get(Ty, 1.0);
2359 {Ty, ExpoI->getType()},
2360 {One, ExpoI},
Pow,
"exp2"));
2364 One, ExpoI, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2365 LibFunc_ldexpl,
B, NoAttrs));
2370 if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f, LibFunc_exp2l)) {
2373 BaseR = BaseR / *BaseF;
2375 const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
2377 if ((IsInteger || IsReciprocal) &&
2380 NI > 1 && NI.isPowerOf2()) {
2381 double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
2382 Value *
FMul =
B.CreateFMul(Expo, ConstantFP::get(Ty,
N),
"mul");
2383 if (
Pow->doesNotAccessMemory())
2389 LibFunc_exp2l,
B, NoAttrs));
2395 hasFloatFn(M, TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) {
2397 if (
Pow->doesNotAccessMemory()) {
2398 return B.CreateIntrinsic(Intrinsic::exp10, {Ty}, {Expo},
Pow,
"exp10", {},
2403 LibFunc_exp10f, LibFunc_exp10l,
2413 "pow(1.0, y) should have been simplified earlier!");
2422 Value *
FMul =
B.CreateFMul(Log, Expo,
"mul");
2423 if (
Pow->doesNotAccessMemory())
2426 else if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f,
2430 LibFunc_exp2l,
B, NoAttrs));
2442 return B.CreateUnaryIntrinsic(Intrinsic::sqrt, V,
nullptr,
"sqrt");
2445 if (
hasFloatFn(M, TLI, V->getType(), LibFunc_sqrt, LibFunc_sqrtf,
2451 LibFunc_sqrtl,
B, Attrs);
2458 Value *Sqrt, *
Base =
Pow->getArgOperand(0), *Expo =
Pow->getArgOperand(1);
2469 if (ExpoF->
isNegative() && (!
Pow->hasApproxFunc() && !
Pow->hasAllowReassoc()))
2476 if (!
Pow->doesNotAccessMemory() && !
Pow->hasNoInfs() &&
2478 Base, SimplifyQuery(DL, TLI, DT, AC,
Pow,
true,
true, DC)))
2487 if (!
Pow->hasNoSignedZeros())
2488 Sqrt =
B.CreateFAbs(Sqrt,
nullptr,
"abs");
2494 if (!
Pow->hasNoInfs()) {
2497 Value *FCmp =
B.CreateFCmpOEQ(
Base, NegInf,
"isinf");
2498 Sqrt =
B.CreateSelect(FCmp, PosInf, Sqrt);
2512 Sqrt =
B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt,
"reciprocal");
2521 return B.CreateIntrinsic(Intrinsic::powi, Types, Args);
2526 Value *Expo =
Pow->getArgOperand(1);
2531 bool AllowApprox =
Pow->hasApproxFunc();
2535 IRBuilderBase::FastMathFlagGuard Guard(
B);
2536 B.setFastMathFlags(
Pow->getFastMathFlags());
2543 if (
Value *Exp = replacePowWithExp(
Pow,
B))
2550 return B.CreateFDiv(ConstantFP::get(Ty, 1.0),
Base,
"reciprocal");
2554 return ConstantFP::get(Ty, 1.0);
2562 return B.CreateFMul(
Base,
Base,
"square");
2564 if (
Value *Sqrt = replacePowWithSqrt(
Pow,
B))
2575 Value *Sqrt =
nullptr;
2576 if (!ExpoA.isInteger()) {
2590 if (!ExpoI.isInteger())
2602 APSInt IntExpo(TLI->getIntSize(),
false);
2609 Base, ConstantInt::get(
B.getIntNTy(TLI->getIntSize()), IntExpo),
2613 return B.CreateFMul(PowI, Sqrt);
2629 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
2630 hasFloatVersion(M, Name)) {
2642 Value *Ret =
nullptr;
2643 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_exp2) &&
2644 hasFloatVersion(M, Name))
2653 const bool UseIntrinsic =
Callee->isIntrinsic();
2664 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2666 Constant *One = ConstantFP::get(Ty, 1.0);
2669 return copyFlags(*CI,
B.CreateIntrinsic(Intrinsic::ldexp,
2670 {Ty, Exp->getType()},
2674 IRBuilderBase::FastMathFlagGuard Guard(
B);
2677 One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2678 LibFunc_ldexpl,
B, AttributeList()));
2702 StringRef LogNm = LogFn->
getName();
2707 if (UnsafeFPShrink && hasFloatVersion(
Mod, LogNm))
2711 LibFunc LogLb, ExpLb, Exp2Lb, Exp10Lb, PowLb;
2714 LogLb = TLI->getLibFunc(LogNm);
2715 if (LogLb != NotLibFunc) {
2718 LogID = Intrinsic::log;
2719 ExpLb = LibFunc_expf;
2720 Exp2Lb = LibFunc_exp2f;
2721 Exp10Lb = LibFunc_exp10f;
2722 PowLb = LibFunc_powf;
2725 LogID = Intrinsic::log;
2726 ExpLb = LibFunc_exp;
2727 Exp2Lb = LibFunc_exp2;
2728 Exp10Lb = LibFunc_exp10;
2729 PowLb = LibFunc_pow;
2732 LogID = Intrinsic::log;
2733 ExpLb = LibFunc_expl;
2734 Exp2Lb = LibFunc_exp2l;
2735 Exp10Lb = LibFunc_exp10l;
2736 PowLb = LibFunc_powl;
2739 LogID = Intrinsic::log2;
2740 ExpLb = LibFunc_expf;
2741 Exp2Lb = LibFunc_exp2f;
2742 Exp10Lb = LibFunc_exp10f;
2743 PowLb = LibFunc_powf;
2746 LogID = Intrinsic::log2;
2747 ExpLb = LibFunc_exp;
2748 Exp2Lb = LibFunc_exp2;
2749 Exp10Lb = LibFunc_exp10;
2750 PowLb = LibFunc_pow;
2753 LogID = Intrinsic::log2;
2754 ExpLb = LibFunc_expl;
2755 Exp2Lb = LibFunc_exp2l;
2756 Exp10Lb = LibFunc_exp10l;
2757 PowLb = LibFunc_powl;
2759 case LibFunc_log10f:
2760 LogID = Intrinsic::log10;
2761 ExpLb = LibFunc_expf;
2762 Exp2Lb = LibFunc_exp2f;
2763 Exp10Lb = LibFunc_exp10f;
2764 PowLb = LibFunc_powf;
2767 LogID = Intrinsic::log10;
2768 ExpLb = LibFunc_exp;
2769 Exp2Lb = LibFunc_exp2;
2770 Exp10Lb = LibFunc_exp10;
2771 PowLb = LibFunc_pow;
2773 case LibFunc_log10l:
2774 LogID = Intrinsic::log10;
2775 ExpLb = LibFunc_expl;
2776 Exp2Lb = LibFunc_exp2l;
2777 Exp10Lb = LibFunc_exp10l;
2778 PowLb = LibFunc_powl;
2785 bool IsKnownNoErrno =
Log->hasNoNaNs() &&
Log->hasNoInfs();
2786 if (!IsKnownNoErrno) {
2787 SimplifyQuery SQ(DL, TLI, DT, AC, Log,
true,
true, DC);
2794 Known.cannotBeOrderedLessThanZero() &&
2795 Known.isKnownNeverLogicalZero(
F->getDenormalMode(FltSem));
2797 if (IsKnownNoErrno) {
2798 Value *NewLog =
B.CreateUnaryIntrinsic(LogID,
Log->getArgOperand(0), Log);
2800 I->copyMetadata(*Log);
2805 }
else if (LogID == Intrinsic::log || LogID == Intrinsic::log2 ||
2806 LogID == Intrinsic::log10) {
2808 ExpLb = LibFunc_expf;
2809 Exp2Lb = LibFunc_exp2f;
2810 Exp10Lb = LibFunc_exp10f;
2811 PowLb = LibFunc_powf;
2813 ExpLb = LibFunc_exp;
2814 Exp2Lb = LibFunc_exp2;
2815 Exp10Lb = LibFunc_exp10;
2816 PowLb = LibFunc_pow;
2827 IRBuilderBase::FastMathFlagGuard Guard(
B);
2831 LibFunc ArgLb = TLI->getLibFunc(*Arg);
2834 AttributeList NoAttrs;
2835 if (ArgLb == PowLb || ArgID == Intrinsic::pow || ArgID == Intrinsic::powi) {
2837 Log->doesNotAccessMemory()
2838 ?
B.CreateUnaryIntrinsic(LogID, Arg->
getOperand(0),
nullptr,
"log")
2842 if (ArgID == Intrinsic::powi)
2843 Y =
B.CreateSIToFP(
Y, Ty,
"cast");
2844 Value *MulY =
B.CreateFMul(
Y, LogX,
"mul");
2847 substituteInParent(Arg, MulY);
2853 if (ArgLb == ExpLb || ArgLb == Exp2Lb || ArgLb == Exp10Lb ||
2854 ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) {
2856 if (ArgLb == ExpLb || ArgID == Intrinsic::exp)
2859 else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2)
2860 Eul = ConstantFP::get(
Log->getType(), 2.0);
2862 Eul = ConstantFP::get(
Log->getType(), 10.0);
2863 Value *LogE =
Log->doesNotAccessMemory()
2864 ?
B.CreateUnaryIntrinsic(LogID, Eul,
nullptr,
"log")
2869 substituteInParent(Arg, MulY);
2886 LibFunc ArgLb = TLI->getLibFunc(*Arg);
2888 LibFunc SqrtLb, ExpLb, Exp2Lb, Exp10Lb;
2890 SqrtLb = TLI->getLibFunc(SqrtFn->
getName());
2891 if (SqrtLb != NotLibFunc)
2894 ExpLb = LibFunc_expf;
2895 Exp2Lb = LibFunc_exp2f;
2896 Exp10Lb = LibFunc_exp10f;
2899 ExpLb = LibFunc_exp;
2900 Exp2Lb = LibFunc_exp2;
2901 Exp10Lb = LibFunc_exp10;
2904 ExpLb = LibFunc_expl;
2905 Exp2Lb = LibFunc_exp2l;
2906 Exp10Lb = LibFunc_exp10l;
2913 ExpLb = LibFunc_expf;
2914 Exp2Lb = LibFunc_exp2f;
2915 Exp10Lb = LibFunc_exp10f;
2917 ExpLb = LibFunc_exp;
2918 Exp2Lb = LibFunc_exp2;
2919 Exp10Lb = LibFunc_exp10;
2925 if (ArgLb != ExpLb && ArgLb != Exp2Lb && ArgLb != Exp10Lb &&
2926 ArgID != Intrinsic::exp && ArgID != Intrinsic::exp2)
2929 IRBuilderBase::InsertPointGuard Guard(
B);
2930 B.SetInsertPoint(Arg);
2933 B.CreateFMulFMF(ExpOperand, ConstantFP::get(ExpOperand->getType(), 0.5),
2943 Value *Ret =
nullptr;
2948 (
Callee->getName() ==
"sqrt" ||
2949 Callee->getIntrinsicID() == Intrinsic::sqrt))
2952 if (
Value *Opt = mergeSqrtToExp(CI,
B))
2959 if (!
I ||
I->getOpcode() != Instruction::FMul || !
I->isFast())
2965 Value *Op0 =
I->getOperand(0);
2966 Value *Op1 =
I->getOperand(1);
2967 Value *RepeatOp =
nullptr;
2968 Value *OtherOp =
nullptr;
2999 Value *FabsCall =
B.CreateFAbs(RepeatOp,
I,
"fabs");
3005 B.CreateUnaryIntrinsic(Intrinsic::sqrt, OtherOp,
I,
"sqrt");
3006 return copyFlags(*CI,
B.CreateFMulFMF(FabsCall, SqrtCall,
I));
3017 SimplifyQuery SQ(DL, TLI, DT, AC, CI,
true,
true, DC);
3020 KnownFPClass Known1 =
3023 const fltSemantics &FltSem =
3034Value *LibCallSimplifier::optimizeTrigInversionPairs(
CallInst *CI,
3038 Value *Ret =
nullptr;
3040 if (UnsafeFPShrink &&
3041 (Name ==
"tan" || Name ==
"atanh" || Name ==
"sinh" || Name ==
"cosh" ||
3043 hasFloatVersion(M, Name))
3052 if (!CI->
isFast() || !OpC->isFast())
3061 LibFunc
Func =
F ? TLI->getLibFunc(
F->getName()) : NotLibFunc;
3063 LibFunc inverseFunc = llvm::StringSwitch<LibFunc>(
Callee->getName())
3064 .Case(
"tan", LibFunc_atan)
3065 .Case(
"atanh", LibFunc_tanh)
3066 .Case(
"sinh", LibFunc_asinh)
3067 .Case(
"cosh", LibFunc_acosh)
3068 .Case(
"tanf", LibFunc_atanf)
3069 .Case(
"atanhf", LibFunc_tanhf)
3070 .Case(
"sinhf", LibFunc_asinhf)
3071 .Case(
"coshf", LibFunc_acoshf)
3072 .Case(
"tanl", LibFunc_atanl)
3073 .Case(
"atanhl", LibFunc_tanhl)
3074 .Case(
"sinhl", LibFunc_asinhl)
3075 .Case(
"coshl", LibFunc_acoshl)
3076 .Case(
"asinh", LibFunc_sinh)
3077 .Case(
"asinhf", LibFunc_sinhf)
3078 .Case(
"asinhl", LibFunc_sinhl)
3079 .Default(NotLibFunc);
3080 if (Func == inverseFunc)
3081 Ret = OpC->getArgOperand(0);
3103 Name =
"__sincospif_stret";
3112 Name =
"__sincospi_stret";
3120 M, *TLI, TheLibFunc, OrigCallee->
getAttributes(), ResTy, ArgTy);
3125 B.SetInsertPoint(++ArgInst->getIterator());
3129 BasicBlock &EntryBB =
B.GetInsertBlock()->getParent()->getEntryBlock();
3130 B.SetInsertPoint(EntryBB.
begin());
3133 SinCos =
B.CreateCall(Callee, Arg,
"sincospi");
3136 Sin =
B.CreateExtractValue(SinCos, 0,
"sinpi");
3137 Cos =
B.CreateExtractValue(SinCos, 1,
"cospi");
3139 Sin =
B.CreateExtractElement(SinCos,
uint64_t{0},
"sinpi");
3140 Cos =
B.CreateExtractElement(SinCos,
uint64_t{1},
"cospi");
3150 return Mode.inputsMayBePositiveZero() ||
Mode.outputsMayBePositiveZero();
3180Value *LibCallSimplifier::optimizeSymmetric(
CallInst *CI, LibFunc Func,
3209 case LibFunc_asinhf:
3210 case LibFunc_asinhl:
3254 for (User *U : Arg->
users())
3255 classifyArgUse(U,
F, IsFloat, SinCalls, CosCalls, SinCosCalls);
3261 Value *Sin, *Cos, *SinCos;
3266 auto replaceTrigInsts = [
this](SmallVectorImpl<CallInst *> &Calls,
3268 for (CallInst *
C : Calls)
3269 replaceAllUsesWith(
C, Res);
3272 replaceTrigInsts(SinCalls, Sin);
3273 replaceTrigInsts(CosCalls, Cos);
3274 replaceTrigInsts(SinCosCalls, SinCos);
3276 return IsSin ? Sin : Cos;
3279void LibCallSimplifier::classifyArgUse(
3294 LibFunc
Func =
Callee ? TLI->getLibFunc(*Callee) : NotLibFunc;
3299 if (Func == LibFunc_sinpif)
3301 else if (Func == LibFunc_cospif)
3303 else if (Func == LibFunc_sincospif_stret)
3306 if (Func == LibFunc_sinpi)
3308 else if (Func == LibFunc_cospi)
3310 else if (Func == LibFunc_sincospi_stret)
3332 unsigned IntBW = TLI->getIntSize();
3333 APSInt QuotInt(IntBW,
false);
3340 B.CreateAlignedStore(
3343 return ConstantFP::get(CI->
getType(), Rem);
3370 return ConstantFP::get(CI->
getType(), Difference);
3382 Type *ArgType =
Op->getType();
3383 Value *
V =
B.CreateIntrinsic(Intrinsic::cttz, {ArgType}, {
Op,
B.getTrue()},
3385 V =
B.CreateAdd(V, ConstantInt::get(
V->getType(), 1));
3386 V =
B.CreateIntCast(V, RetType,
false);
3389 Value *S =
B.CreateSelect(
Cond, V, ConstantInt::get(RetType, 0));
3403 Type *ArgType =
Op->getType();
3404 Value *
V =
B.CreateIntrinsic(Intrinsic::ctlz, {ArgType}, {
Op,
B.getFalse()},
3408 return B.CreateIntCast(V, CI->
getType(),
false);
3415 Value *IsNeg =
B.CreateIsNeg(
X);
3416 Value *NegX =
B.CreateNSWNeg(
X,
"neg");
3417 return B.CreateSelect(IsNeg, NegX,
X);
3423 Type *ArgType =
Op->getType();
3424 Op =
B.CreateSub(
Op, ConstantInt::get(ArgType,
'0'),
"isdigittmp");
3425 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 10),
"isdigit");
3432 Type *ArgType =
Op->getType();
3433 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 128),
"isascii");
3440 ConstantInt::get(CI->
getType(), 0x7F));
3470 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned,
B);
3502 if (!Callee || !Callee->isDeclaration())
3511 if (StreamArg >= (
int)CI->
arg_size())
3519 return GV->
getName() ==
"stderr";
3524 StringRef FormatStr;
3529 if (FormatStr.
empty())
3540 if (FormatStr.
size() == 1 || FormatStr ==
"%%") {
3544 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)FormatStr[0]);
3545 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3549 if (FormatStr ==
"%s" && CI->
arg_size() > 1) {
3550 StringRef OperandStr;
3551 if (!getConstantStringInfo(CI->getOperand(1), OperandStr))
3554 if (OperandStr.empty())
3557 if (OperandStr.size() == 1) {
3561 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)OperandStr[0]);
3562 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3565 if (OperandStr.back() ==
'\n') {
3566 if (!isLibFuncEmittable(CI->getModule(), TLI, LibFunc_puts))
3568 OperandStr = OperandStr.drop_back();
3569 Value *GV = B.CreateGlobalString(OperandStr,
"str");
3570 return copyFlags(*CI, emitPutS(GV, B, TLI));
3576 if (FormatStr.
back() ==
'\n' &&
3578 if (!isLibFuncEmittable(CI->getModule(), TLI, LibFunc_puts))
3582 FormatStr = FormatStr.drop_back();
3583 Value *GV = B.CreateGlobalString(FormatStr,
"str");
3584 return copyFlags(*CI, emitPutS(GV, B, TLI));
3589 if (FormatStr ==
"%c" && CI->
arg_size() > 1 &&
3593 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false);
3594 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3598 if (FormatStr ==
"%s\n" && CI->
arg_size() > 1 &&
3608 FunctionType *FT =
Callee->getFunctionType();
3609 if (
Value *V = optimizePrintFString(CI,
B)) {
3620 Callee->getAttributes());
3622 New->setCalledFunction(IPrintFFn);
3632 Callee->getAttributes());
3634 New->setCalledFunction(SmallPrintFFn);
3642Value *LibCallSimplifier::optimizeSPrintFString(
CallInst *CI,
3645 StringRef FormatStr;
3661 return ConstantInt::get(CI->
getType(), FormatStr.
size());
3666 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3670 if (FormatStr[1] ==
'c') {
3676 B.CreateStore(V, Ptr);
3677 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3678 B.CreateStore(
B.getInt8(0), Ptr);
3680 return ConstantInt::get(CI->
getType(), 1);
3683 if (FormatStr[1] ==
's') {
3696 TLI->getAsSizeT(SrcLen, *CI->
getModule()));
3698 return ConstantInt::get(CI->
getType(), SrcLen - 1);
3701 Value *PtrDiff =
B.CreatePtrDiff(V, Dest);
3702 return B.CreateIntCast(PtrDiff, CI->
getType(),
false);
3713 B.CreateAdd(Len, ConstantInt::get(
Len->getType(), 1),
"leninc");
3717 return B.CreateIntCast(Len, CI->
getType(),
false);
3725 FunctionType *FT =
Callee->getFunctionType();
3726 if (
Value *V = optimizeSPrintFString(CI,
B)) {
3737 FT,
Callee->getAttributes());
3739 New->setCalledFunction(SIPrintFFn);
3749 Callee->getAttributes());
3751 New->setCalledFunction(SmallSPrintFFn);
3767 assert(StrArg || (
N < 2 && Str.size() == 1));
3769 unsigned IntBits = TLI->getIntSize();
3771 if (Str.size() > IntMax)
3777 Value *StrLen = ConstantInt::get(CI->
getType(), Str.size());
3787 NCopy = Str.size() + 1;
3792 if (NCopy && StrArg)
3795 TLI->getAsSizeT(NCopy, *CI->
getModule())));
3804 Value *NulOff =
B.getIntN(IntBits, NCopy);
3805 Value *DstEnd =
B.CreateInBoundsGEP(Int8Ty, DstArg, NulOff,
"endptr");
3806 B.CreateStore(ConstantInt::get(Int8Ty, 0), DstEnd);
3810Value *LibCallSimplifier::optimizeSnPrintFString(
CallInst *CI,
3828 StringRef FormatStr;
3839 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr,
N,
B);
3844 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() != 4)
3848 if (FormatStr[1] ==
'c') {
3853 StringRef CharStr(
"*");
3854 return emitSnPrintfMemCpy(CI,
nullptr, CharStr,
N,
B);
3861 Value *Ptr = DstArg;
3862 B.CreateStore(V, Ptr);
3863 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3864 B.CreateStore(
B.getInt8(0), Ptr);
3865 return ConstantInt::get(CI->
getType(), 1);
3868 if (FormatStr[1] !=
's')
3877 return emitSnPrintfMemCpy(CI, StrArg, Str,
N,
B);
3881 if (
Value *V = optimizeSnPrintFString(CI,
B)) {
3890Value *LibCallSimplifier::optimizeFPrintFString(
CallInst *CI,
3892 optimizeErrorReporting(CI,
B, 0);
3895 StringRef FormatStr;
3919 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3923 if (FormatStr[1] ==
'c') {
3927 Type *IntTy =
B.getIntNTy(TLI->getIntSize());
3933 if (FormatStr[1] ==
's') {
3946 FunctionType *FT =
Callee->getFunctionType();
3947 if (
Value *V = optimizeFPrintFString(CI,
B)) {
3956 FT,
Callee->getAttributes());
3958 New->setCalledFunction(FIPrintFFn);
3967 auto SmallFPrintFFn =
3969 Callee->getAttributes());
3971 New->setCalledFunction(SmallFPrintFFn);
3980 optimizeErrorReporting(CI,
B, 3);
3985 if (SizeC && CountC) {
3990 return ConstantInt::get(CI->
getType(), 0);
3997 Value *Cast =
B.CreateIntCast(Char, IntTy,
true,
"chari");
3999 return NewCI ? ConstantInt::get(CI->
getType(), 1) : nullptr;
4007 optimizeErrorReporting(CI,
B, 1);
4025 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
4030 ConstantInt::get(SizeTTy, Len - 1),
4070bool LibCallSimplifier::hasFloatVersion(
const Module *M,
StringRef FuncName) {
4071 SmallString<20> FloatFuncName = FuncName;
4072 FloatFuncName +=
'f';
4076Value *LibCallSimplifier::optimizeStringMemoryLibCall(
CallInst *CI,
4080 LibFunc
Func = TLI->getLibFunc(*Callee);
4088 "Optimizing string/memory libcall would change the calling convention");
4090 case LibFunc_strcat:
4091 return optimizeStrCat(CI, Builder);
4092 case LibFunc_strncat:
4093 return optimizeStrNCat(CI, Builder);
4094 case LibFunc_strchr:
4095 return optimizeStrChr(CI, Builder);
4096 case LibFunc_strrchr:
4097 return optimizeStrRChr(CI, Builder);
4098 case LibFunc_strcmp:
4099 return optimizeStrCmp(CI, Builder);
4100 case LibFunc_strncmp:
4101 return optimizeStrNCmp(CI, Builder);
4102 case LibFunc_strcpy:
4103 return optimizeStrCpy(CI, Builder);
4104 case LibFunc_stpcpy:
4105 return optimizeStpCpy(CI, Builder);
4106 case LibFunc_strlcpy:
4107 return optimizeStrLCpy(CI, Builder);
4108 case LibFunc_stpncpy:
4109 return optimizeStringNCpy(CI,
true, Builder);
4110 case LibFunc_strncpy:
4111 return optimizeStringNCpy(CI,
false, Builder);
4112 case LibFunc_strlen:
4113 return optimizeStrLen(CI, Builder);
4114 case LibFunc_strnlen:
4115 return optimizeStrNLen(CI, Builder);
4116 case LibFunc_strpbrk:
4117 return optimizeStrPBrk(CI, Builder);
4118 case LibFunc_strndup:
4119 return optimizeStrNDup(CI, Builder);
4120 case LibFunc_strtol:
4121 case LibFunc_strtod:
4122 case LibFunc_strtof:
4123 case LibFunc_strtoul:
4124 case LibFunc_strtoll:
4125 case LibFunc_strtold:
4126 case LibFunc_strtoull:
4127 return optimizeStrTo(CI, Builder);
4128 case LibFunc_strspn:
4129 return optimizeStrSpn(CI, Builder);
4130 case LibFunc_strcspn:
4131 return optimizeStrCSpn(CI, Builder);
4132 case LibFunc_strstr:
4133 return optimizeStrStr(CI, Builder);
4134 case LibFunc_memchr:
4135 return optimizeMemChr(CI, Builder);
4136 case LibFunc_memrchr:
4137 return optimizeMemRChr(CI, Builder);
4139 return optimizeBCmp(CI, Builder);
4140 case LibFunc_memcmp:
4141 return optimizeMemCmp(CI, Builder);
4142 case LibFunc_memcpy:
4143 return optimizeMemCpy(CI, Builder);
4144 case LibFunc_memccpy:
4145 return optimizeMemCCpy(CI, Builder);
4146 case LibFunc_mempcpy:
4147 return optimizeMemPCpy(CI, Builder);
4148 case LibFunc_memmove:
4149 return optimizeMemMove(CI, Builder);
4150 case LibFunc_memset:
4151 return optimizeMemSet(CI, Builder);
4152 case LibFunc_realloc:
4153 return optimizeRealloc(CI, Builder);
4154 case LibFunc_wcslen:
4155 return optimizeWcslen(CI, Builder);
4157 return optimizeBCopy(CI, Builder);
4159 case LibFunc_ZnwmRKSt9nothrow_t:
4160 case LibFunc_ZnwmSt11align_val_t:
4161 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
4163 case LibFunc_ZnamRKSt9nothrow_t:
4164 case LibFunc_ZnamSt11align_val_t:
4165 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
4166 case LibFunc_Znwm12__hot_cold_t:
4167 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
4168 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
4169 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4170 case LibFunc_Znam12__hot_cold_t:
4171 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
4172 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
4173 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4174 case LibFunc_size_returning_new:
4175 case LibFunc_size_returning_new_hot_cold:
4176 case LibFunc_size_returning_new_aligned:
4177 case LibFunc_size_returning_new_aligned_hot_cold:
4178 return optimizeNew(CI, Builder, Func);
4194 if (CharSeq.
empty())
4195 Fill =
APInt(32, 0);
4202Value *LibCallSimplifier::optimizeFloatingPointLibCall(
CallInst *CI,
4211 if (
Value *V = optimizeSymmetric(CI, Func, Builder))
4215 case LibFunc_sinpif:
4217 return optimizeSinCosPi(CI,
true, Builder);
4218 case LibFunc_cospif:
4220 return optimizeSinCosPi(CI,
false, Builder);
4234 return optimizePow(CI, Builder);
4238 return optimizeExp2(CI, Builder);
4239 case LibFunc_scalbn:
4240 case LibFunc_scalbnf:
4241 case LibFunc_scalbnl:
4258 return optimizeSqrt(CI, Builder);
4262 return optimizeFMod(CI, Builder);
4266 case LibFunc_log10f:
4268 case LibFunc_log10l:
4269 case LibFunc_log1pf:
4271 case LibFunc_log1pl:
4278 return optimizeLog(CI, Builder);
4286 case LibFunc_asinhf:
4287 case LibFunc_asinhl:
4292 case LibFunc_atanhf:
4293 case LibFunc_atanhl:
4294 return optimizeTrigInversionPairs(CI, Builder);
4301 case LibFunc_roundeven:
4303 case LibFunc_nearbyint:
4311 if (UnsafeFPShrink &&
4317 CI, Builder, Func == LibFunc_sin ? Intrinsic::sin : Intrinsic::cos);
4331 case LibFunc_copysign:
4338 return optimizeFdim(CI, Builder);
4342 return optimizeFMinFMax(CI, Builder, Intrinsic::minnum);
4346 return optimizeFMinFMax(CI, Builder, Intrinsic::maxnum);
4347 case LibFunc_fminimum_numf:
4348 case LibFunc_fminimum_num:
4349 case LibFunc_fminimum_numl:
4351 case LibFunc_fmaximum_numf:
4352 case LibFunc_fmaximum_num:
4353 case LibFunc_fmaximum_numl:
4358 return optimizeCAbs(CI, Builder);
4359 case LibFunc_remquo:
4360 case LibFunc_remquof:
4361 case LibFunc_remquol:
4362 return optimizeRemquo(CI, Builder);
4381 return maybeOptimizeNoBuiltinOperatorNew(CI, Builder);
4385 LibFunc Func = TLI->getLibFunc(*Callee);
4392 Builder.setDefaultOperandBundles(OpBundles);
4400 UnsafeFPShrink =
true;
4404 if (!IsCallingConvC)
4408 switch (
II->getIntrinsicID()) {
4409 case Intrinsic::pow:
4410 return optimizePow(CI, Builder);
4411 case Intrinsic::exp2:
4412 return optimizeExp2(CI, Builder);
4413 case Intrinsic::log:
4414 case Intrinsic::log2:
4415 case Intrinsic::log10:
4416 return optimizeLog(CI, Builder);
4417 case Intrinsic::sqrt:
4418 return optimizeSqrt(CI, Builder);
4419 case Intrinsic::memset:
4420 return optimizeMemSet(CI, Builder);
4421 case Intrinsic::memcpy:
4422 return optimizeMemCpy(CI, Builder);
4423 case Intrinsic::memmove:
4424 return optimizeMemMove(CI, Builder);
4425 case Intrinsic::sin:
4426 case Intrinsic::cos:
4430 case Intrinsic::sincos:
4440 if (
Value *SimplifiedFortifiedCI =
4441 FortifiedSimplifier.optimizeCall(CI, Builder))
4442 return SimplifiedFortifiedCI;
4449 if (
Value *V = optimizeStringMemoryLibCall(CI, Builder))
4451 if (
Value *V = optimizeFloatingPointLibCall(CI, Func, Builder))
4457 return optimizeFFS(CI, Builder);
4461 return optimizeFls(CI, Builder);
4465 return optimizeAbs(CI, Builder);
4466 case LibFunc_isdigit:
4467 return optimizeIsDigit(CI, Builder);
4468 case LibFunc_isascii:
4469 return optimizeIsAscii(CI, Builder);
4470 case LibFunc_toascii:
4471 return optimizeToAscii(CI, Builder);
4475 return optimizeAtoi(CI, Builder);
4476 case LibFunc_strtol:
4477 case LibFunc_strtoll:
4478 return optimizeStrToInt(CI, Builder,
true);
4479 case LibFunc_strtoul:
4480 case LibFunc_strtoull:
4481 return optimizeStrToInt(CI, Builder,
false);
4482 case LibFunc_printf:
4483 return optimizePrintF(CI, Builder);
4484 case LibFunc_sprintf:
4485 return optimizeSPrintF(CI, Builder);
4486 case LibFunc_snprintf:
4487 return optimizeSnPrintF(CI, Builder);
4488 case LibFunc_fprintf:
4489 return optimizeFPrintF(CI, Builder);
4490 case LibFunc_fwrite:
4491 return optimizeFWrite(CI, Builder);
4493 return optimizeFPuts(CI, Builder);
4495 return optimizePuts(CI, Builder);
4496 case LibFunc_perror:
4497 return optimizeErrorReporting(CI, Builder);
4498 case LibFunc_vfprintf:
4499 case LibFunc_fiprintf:
4500 return optimizeErrorReporting(CI, Builder, 0);
4503 return optimizeExit(CI);
4517 : FortifiedSimplifier(TLI), DL(DL), TLI(TLI), DT(DT), DC(DC), AC(AC),
4518 ORE(ORE), BFI(BFI), PSI(PSI), Replacer(Replacer), Eraser(Eraser) {}
4525void LibCallSimplifier::eraseFromParent(
Instruction *
I) {
4564bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(
4565 CallInst *CI,
unsigned ObjSizeOp, std::optional<unsigned> SizeOp,
4566 std::optional<unsigned> StrOp, std::optional<unsigned> FlagOp) {
4571 if (!Flag || !
Flag->isZero())
4578 if (ConstantInt *ObjSizeCI =
4580 if (ObjSizeCI->isMinusOne())
4583 if (OnlyLowerUnknownSize)
4593 return ObjSizeCI->getZExtValue() >=
Len;
4597 if (ConstantInt *SizeCI =
4599 return ObjSizeCI->getZExtValue() >= SizeCI->getZExtValue();
4605Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(
CallInst *CI,
4607 if (isFortifiedCallFoldable(CI, 3, 2)) {
4617Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(
CallInst *CI,
4619 if (isFortifiedCallFoldable(CI, 3, 2)) {
4629Value *FortifiedLibCallSimplifier::optimizeMemSetChk(
CallInst *CI,
4631 if (isFortifiedCallFoldable(CI, 3, 2)) {
4641Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(
CallInst *CI,
4644 if (isFortifiedCallFoldable(CI, 3, 2))
4652Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(
CallInst *CI,
4660 if (Func == LibFunc_stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src) {
4662 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
4670 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) {
4671 if (Func == LibFunc_strcpy_chk)
4677 if (OnlyLowerUnknownSize)
4687 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
4689 Value *LenV = ConstantInt::get(SizeTTy, Len);
4693 if (Ret && Func == LibFunc_stpcpy_chk)
4694 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
4695 ConstantInt::get(SizeTTy, Len - 1));
4699Value *FortifiedLibCallSimplifier::optimizeStrLenChk(
CallInst *CI,
4701 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0))
4707Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(
CallInst *CI,
4710 if (isFortifiedCallFoldable(CI, 3, 2)) {
4711 if (Func == LibFunc_strncpy_chk)
4724Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(
CallInst *CI,
4726 if (isFortifiedCallFoldable(CI, 4, 3))
4734Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(
CallInst *CI,
4736 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) {
4746Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(
CallInst *CI,
4748 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) {
4752 VariadicArgs,
B, TLI));
4758Value *FortifiedLibCallSimplifier::optimizeStrCatChk(
CallInst *CI,
4760 if (isFortifiedCallFoldable(CI, 2))
4767Value *FortifiedLibCallSimplifier::optimizeStrLCat(
CallInst *CI,
4769 if (isFortifiedCallFoldable(CI, 3))
4777Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(
CallInst *CI,
4779 if (isFortifiedCallFoldable(CI, 3))
4787Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(
CallInst *CI,
4789 if (isFortifiedCallFoldable(CI, 3))
4797Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(
CallInst *CI,
4799 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2))
4807Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(
CallInst *CI,
4809 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1))
4839 Builder.setDefaultOperandBundles(OpBundles);
4843 LibFunc Func = TLI->getLibFunc(*Callee);
4844 if (Func == NotLibFunc)
4852 case LibFunc_memcpy_chk:
4853 return optimizeMemCpyChk(CI, Builder);
4854 case LibFunc_mempcpy_chk:
4855 return optimizeMemPCpyChk(CI, Builder);
4856 case LibFunc_memmove_chk:
4857 return optimizeMemMoveChk(CI, Builder);
4858 case LibFunc_memset_chk:
4859 return optimizeMemSetChk(CI, Builder);
4860 case LibFunc_stpcpy_chk:
4861 case LibFunc_strcpy_chk:
4862 return optimizeStrpCpyChk(CI, Builder, Func);
4863 case LibFunc_strlen_chk:
4864 return optimizeStrLenChk(CI, Builder);
4865 case LibFunc_stpncpy_chk:
4866 case LibFunc_strncpy_chk:
4867 return optimizeStrpNCpyChk(CI, Builder, Func);
4868 case LibFunc_memccpy_chk:
4869 return optimizeMemCCpyChk(CI, Builder);
4870 case LibFunc_snprintf_chk:
4871 return optimizeSNPrintfChk(CI, Builder);
4872 case LibFunc_sprintf_chk:
4873 return optimizeSPrintfChk(CI, Builder);
4874 case LibFunc_strcat_chk:
4875 return optimizeStrCatChk(CI, Builder);
4876 case LibFunc_strlcat_chk:
4877 return optimizeStrLCat(CI, Builder);
4878 case LibFunc_strncat_chk:
4879 return optimizeStrNCatChk(CI, Builder);
4880 case LibFunc_strlcpy_chk:
4881 return optimizeStrLCpyChk(CI, Builder);
4882 case LibFunc_vsnprintf_chk:
4883 return optimizeVSNPrintfChk(CI, Builder);
4884 case LibFunc_vsprintf_chk:
4885 return optimizeVSPrintfChk(CI, Builder);
4894 : 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 bool mayFlushDenormalsToPositiveZero(const CallInst *CI)
Flushing a denormal to +0.0 breaks f(-x) = -f(x) for odd f.
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 cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
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 void copyFPMath(const CallInst &Old, Value *New)
Preserve the accuracy requirement of Old on the replacement New.
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.".
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
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()
static constexpr uint32_t kLikelyBranchWeight
The weight for a branch taken with high probability.
static constexpr uint32_t kUnlikelyBranchWeight
The weight for a branch taken with low probability.
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.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
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...
@ 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 void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=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 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 void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected, bool ElideAllZero=false)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
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)
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 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.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CtxI)
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.
Align getKnownAlignment(Value *V, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to infer an alignment for the specified pointer.
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.
Represent subnormal handling kind for floating point instruction inputs and outputs.
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.