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.CreateSelect(Cmp, NullPtr, SrcPlus,
"memrchr.sel");
1327 Str = Str.substr(0, EndOff);
1335 Type *Int8Ty =
B.getInt8Ty();
1336 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1338 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1339 Value *CEqS0 =
B.CreateICmpEQ(ConstantInt::get(Int8Ty, Str[0]), CharVal);
1340 Value *
And =
B.CreateLogicalAnd(NNeZ, CEqS0);
1341 Value *SizeM1 =
B.CreateSub(
Size, ConstantInt::get(SizeTy, 1));
1343 B.CreateInBoundsGEP(Int8Ty, SrcStr, SizeM1,
"memrchr.ptr_plus");
1344 return B.CreateSelect(
And, SrcPlus, NullPtr,
"memrchr.sel");
1367 if (LenC->
isOne()) {
1370 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memchr.char0");
1372 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1373 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memchr.char0cmp");
1377 return B.CreateSelectWithUnknownProfile(Cmp, SrcStr, NullPtr,
DEBUG_TYPE,
1398 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos),
1402 return B.CreateSelectWithUnknownProfile(Cmp, NullPtr, SrcPlus,
DEBUG_TYPE);
1405 if (Str.size() == 0)
1414 size_t Pos = Str.find_first_not_of(Str[0]);
1430 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1432 Value *Sel1 = NullPtr;
1435 Value *PosVal = ConstantInt::get(SizeTy, Pos);
1436 Value *StrPos = ConstantInt::get(Int8Ty, Str[Pos]);
1437 Value *CEqSPos =
B.CreateICmpEQ(CharVal, StrPos);
1439 Value *
And =
B.CreateAnd(CEqSPos, NGtPos);
1440 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, PosVal);
1443 Sel1 =
B.CreateSelectWithUnknownProfile(
And, SrcPlus, NullPtr,
DEBUG_TYPE,
1447 Value *Str0 = ConstantInt::get(Int8Ty, Str[0]);
1448 Value *CEqS0 =
B.CreateICmpEQ(Str0, CharVal);
1449 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1453 return B.CreateSelectWithUnknownProfile(
And, SrcStr, Sel1,
DEBUG_TYPE,
1485 *std::max_element(
reinterpret_cast<const unsigned char *
>(Str.begin()),
1486 reinterpret_cast<const unsigned char *
>(Str.end()));
1493 if (!DL.fitsInLegalInteger(Max + 1)) {
1499 std::string SortedStr = Str.str();
1502 unsigned NonContRanges = 1;
1503 for (
size_t i = 1; i < SortedStr.size(); ++i) {
1504 if (SortedStr[i] > SortedStr[i - 1] + 1) {
1511 if (NonContRanges > 2)
1515 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1518 for (
unsigned char C : SortedStr)
1519 CharCompares.
push_back(
B.CreateICmpEQ(CharVal,
B.getInt8(
C)));
1521 return B.CreateIntToPtr(
B.CreateOr(CharCompares), CI->
getType());
1526 unsigned char Width =
NextPowerOf2(std::max((
unsigned char)7, Max));
1532 Value *BitfieldC =
B.getInt(Bitfield);
1536 C =
B.CreateAnd(
C,
B.getIntN(Width, 0xFF));
1543 Value *Shl =
B.CreateShl(
B.getIntN(Width, 1ULL),
C);
1544 Value *
Bits =
B.CreateIsNotNull(
B.CreateAnd(Shl, BitfieldC),
"memchr.bits");
1548 Value *Memchr =
B.CreateLogicalAnd(Bounds, Bits,
"memchr");
1554 return B.CreateIntToPtr(Memchr, CI->
getType());
1578 if (Pos == MinSize ||
1579 (StrNCmp && (LStr[Pos] ==
'\0' && RStr[Pos] ==
'\0'))) {
1587 if (LStr[Pos] != RStr[Pos])
1592 typedef unsigned char UChar;
1593 int IRes = UChar(LStr[Pos]) < UChar(RStr[Pos]) ? -1 : 1;
1594 Value *MaxSize = ConstantInt::get(
Size->getType(), Pos);
1597 return B.CreateSelect(Cmp, Zero, Res);
1609 Value *LHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
LHS,
"lhsc"),
1611 Value *RHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
RHS,
"rhsc"),
1613 return B.CreateSub(LHSV, RHSV,
"chardiff");
1621 Align PrefAlignment =
DL.getPrefTypeAlign(IntType);
1624 Value *LHSV =
nullptr;
1628 Value *RHSV =
nullptr;
1637 LHSV =
B.CreateLoad(IntType,
LHS,
"lhsv");
1639 RHSV =
B.CreateLoad(IntType,
RHS,
"rhsv");
1640 return B.CreateZExt(
B.CreateICmpNE(LHSV, RHSV), CI->
getType(),
"memcmp");
1648Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(
CallInst *CI,
1668 if (
Value *V = optimizeMemCmpBCmpCommon(CI,
B))
1686 return optimizeMemCmpBCmpCommon(CI,
B);
1712 if (
N->isNullValue())
1725 if (
N->getZExtValue() <= SrcStr.
size()) {
1734 ConstantInt::get(
N->getType(), std::min(
uint64_t(Pos + 1),
N->getZExtValue()));
1737 return Pos + 1 <=
N->getZExtValue()
1738 ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, NewN)
1752 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
N);
1785 if (MDNode *MD = CI->
getMetadata(LLVMContext::MD_alloc_token))
1786 MallocCI->setMetadata(LLVMContext::MD_alloc_token, MD);
1795Value *LibCallSimplifier::maybeOptimizeNoBuiltinOperatorNew(
CallInst *CI,
1802 LibFunc
Func = TLI->getLibFunc(*Callee);
1803 if (Func == NotLibFunc)
1807 case LibFunc_ZnwmRKSt9nothrow_t:
1808 case LibFunc_ZnwmSt11align_val_t:
1809 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1811 case LibFunc_ZnamRKSt9nothrow_t:
1812 case LibFunc_ZnamSt11align_val_t:
1813 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1814 case LibFunc_size_returning_new:
1815 case LibFunc_size_returning_new_aligned:
1822 case LibFunc_Znwm12__hot_cold_t:
1823 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1824 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1825 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1826 case LibFunc_Znam12__hot_cold_t:
1827 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1828 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1829 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1830 case LibFunc_size_returning_new_hot_cold:
1831 case LibFunc_size_returning_new_aligned_hot_cold:
1840 return optimizeNew(CI,
B, Func);
1853 bool IsCold =
false;
1854 if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"cold") {
1857 }
else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1860 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
"hot")
1862 else if (CI->
getAttributes().getFnAttr(
"memprof").getValueAsString() ==
1868 bool ShouldOptimizeExistingHotColdNew =
1873 Value *HotColdVal =
B.getInt8(HotCold);
1874 auto getHotColdHintForExisting = [&](uint8_t HotCold) ->
Value * {
1880 ExistingHint =
B.CreateTruncOrBitCast(ExistingHint,
B.getInt8Ty());
1884 return B.CreateBinaryIntrinsic(Intrinsic::umin, ExistingHint, HotColdVal);
1894 Value *NewCall =
nullptr;
1896 case LibFunc_Znwm12__hot_cold_t:
1897 if (ShouldOptimizeExistingHotColdNew)
1899 LibFunc_Znwm12__hot_cold_t,
1900 getHotColdHintForExisting(HotCold));
1904 LibFunc_Znwm12__hot_cold_t, HotColdVal);
1906 case LibFunc_Znam12__hot_cold_t:
1907 if (ShouldOptimizeExistingHotColdNew)
1909 LibFunc_Znam12__hot_cold_t,
1910 getHotColdHintForExisting(HotCold));
1914 LibFunc_Znam12__hot_cold_t, HotColdVal);
1916 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1917 if (ShouldOptimizeExistingHotColdNew)
1920 TLI, LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t,
1921 getHotColdHintForExisting(HotCold));
1923 case LibFunc_ZnwmRKSt9nothrow_t:
1926 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotColdVal);
1928 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1929 if (ShouldOptimizeExistingHotColdNew)
1932 TLI, LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t,
1933 getHotColdHintForExisting(HotCold));
1935 case LibFunc_ZnamRKSt9nothrow_t:
1938 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotColdVal);
1940 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1941 if (ShouldOptimizeExistingHotColdNew)
1944 TLI, LibFunc_ZnwmSt11align_val_t12__hot_cold_t,
1945 getHotColdHintForExisting(HotCold));
1947 case LibFunc_ZnwmSt11align_val_t:
1950 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotColdVal);
1952 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1953 if (ShouldOptimizeExistingHotColdNew)
1956 TLI, LibFunc_ZnamSt11align_val_t12__hot_cold_t,
1957 getHotColdHintForExisting(HotCold));
1959 case LibFunc_ZnamSt11align_val_t:
1962 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotColdVal);
1964 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1965 if (ShouldOptimizeExistingHotColdNew)
1968 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1969 getHotColdHintForExisting(HotCold));
1971 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1974 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1977 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1978 if (ShouldOptimizeExistingHotColdNew)
1981 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1982 getHotColdHintForExisting(HotCold));
1984 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1987 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1990 case LibFunc_size_returning_new:
1992 LibFunc_size_returning_new_hot_cold,
1995 case LibFunc_size_returning_new_hot_cold:
1996 if (ShouldOptimizeExistingHotColdNew)
1998 LibFunc_size_returning_new_hot_cold,
1999 getHotColdHintForExisting(HotCold));
2001 case LibFunc_size_returning_new_aligned:
2004 LibFunc_size_returning_new_aligned_hot_cold, HotColdVal);
2006 case LibFunc_size_returning_new_aligned_hot_cold:
2007 if (ShouldOptimizeExistingHotColdNew)
2010 LibFunc_size_returning_new_aligned_hot_cold,
2011 getHotColdHintForExisting(HotCold));
2059 Value *
Op = Cast->getOperand(0);
2060 if (
Op->getType()->isFloatTy())
2069 return ConstantFP::get(Const->getContext(),
F);
2077 bool isPrecise =
false) {
2109 CallerName.
size() == (CalleeName.
size() + 1) &&
2122 R =
isBinary ?
B.CreateIntrinsic(IID,
B.getFloatTy(), V)
2123 :
B.CreateIntrinsic(IID,
B.getFloatTy(), V[0]);
2131 return B.CreateFPExt(R,
B.getDoubleTy());
2137 bool isPrecise =
false) {
2144 bool isPrecise =
false) {
2151 if (!RetTy || RetTy->getNumElements() != 2 ||
2152 !RetTy->getElementType(0)->getScalarType()->isDoubleTy())
2158 if (Ext->getOperand(0)->getType()->getScalarType()->isFloatTy())
2159 X = Ext->getOperand(0);
2169 if (!Cast || !Cast->getType()->getScalarType()->isFloatTy())
2177 Value *NewCall =
B.CreateIntrinsic(Intrinsic::sincos,
X->getType(),
X);
2179 LLVMContext::MD_fpmath, CI->
getMetadata(LLVMContext::MD_fpmath));
2181 for (
unsigned I = 0;
I != 2; ++
I) {
2182 Value *Ext =
B.CreateFPExt(
B.CreateExtractValue(NewCall,
I),
2183 RetTy->getElementType(
I));
2184 Res =
B.CreateInsertValue(Res, Ext,
I);
2199 assert(
Op->getType()->isArrayTy() &&
"Unexpected signature for cabs!");
2201 Real =
B.CreateExtractValue(
Op, 0,
"real");
2202 Imag =
B.CreateExtractValue(
Op, 1,
"imag");
2212 Value *AbsOp =
nullptr;
2214 if (ConstReal->isZero())
2218 if (ConstImag->isZero())
2223 return copyFlags(*CI,
B.CreateFAbs(AbsOp, CI,
"cabs"));
2230 Value *RealReal =
B.CreateFMulFMF(Real, Real, CI);
2231 Value *ImagImag =
B.CreateFMulFMF(Imag, Imag, CI);
2233 *CI,
B.CreateUnaryIntrinsic(Intrinsic::sqrt,
2234 B.CreateFAddFMF(RealReal, ImagImag, CI), CI,
2245 unsigned BitWidth =
Op->getType()->getScalarSizeInBits();
2247 Type *IntTy =
Op->getType()->getWithNewBitWidth(DstWidth);
2249 :
B.CreateZExt(
Op, IntTy);
2284 CalleeFn ? TLI->getLibFunc(CalleeFn->
getName()) : NotLibFunc;
2289 LibFunc LibFnFloat, LibFnDouble, LibFnLongDouble;
2297 ExpName = TLI->getName(LibFunc_exp);
2298 ID = Intrinsic::exp;
2299 LibFnFloat = LibFunc_expf;
2300 LibFnDouble = LibFunc_exp;
2301 LibFnLongDouble = LibFunc_expl;
2306 ExpName = TLI->getName(LibFunc_exp2);
2307 ID = Intrinsic::exp2;
2308 LibFnFloat = LibFunc_exp2f;
2309 LibFnDouble = LibFunc_exp2;
2310 LibFnLongDouble = LibFunc_exp2l;
2317 ?
B.CreateUnaryIntrinsic(ID,
FMul,
nullptr, ExpName)
2326 substituteInParent(BaseFn, ExpFn);
2337 AttributeList NoAttrs;
2339 const bool UseIntrinsic =
Pow->doesNotAccessMemory();
2345 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2350 Constant *One = ConstantFP::get(Ty, 1.0);
2354 {Ty, ExpoI->getType()},
2355 {One, ExpoI},
Pow,
"exp2"));
2359 One, ExpoI, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2360 LibFunc_ldexpl,
B, NoAttrs));
2365 if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f, LibFunc_exp2l)) {
2368 BaseR = BaseR / *BaseF;
2370 const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
2372 if ((IsInteger || IsReciprocal) &&
2375 NI > 1 && NI.isPowerOf2()) {
2376 double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
2377 Value *
FMul =
B.CreateFMul(Expo, ConstantFP::get(Ty,
N),
"mul");
2378 if (
Pow->doesNotAccessMemory())
2384 LibFunc_exp2l,
B, NoAttrs));
2390 hasFloatFn(M, TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) {
2392 if (
Pow->doesNotAccessMemory()) {
2393 return B.CreateIntrinsic(Intrinsic::exp10, {Ty}, {Expo},
Pow,
"exp10", {},
2398 LibFunc_exp10f, LibFunc_exp10l,
2408 "pow(1.0, y) should have been simplified earlier!");
2417 Value *
FMul =
B.CreateFMul(Log, Expo,
"mul");
2418 if (
Pow->doesNotAccessMemory())
2421 else if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f,
2425 LibFunc_exp2l,
B, NoAttrs));
2437 return B.CreateUnaryIntrinsic(Intrinsic::sqrt, V,
nullptr,
"sqrt");
2440 if (
hasFloatFn(M, TLI, V->getType(), LibFunc_sqrt, LibFunc_sqrtf,
2446 LibFunc_sqrtl,
B, Attrs);
2453 Value *Sqrt, *
Base =
Pow->getArgOperand(0), *Expo =
Pow->getArgOperand(1);
2464 if (ExpoF->
isNegative() && (!
Pow->hasApproxFunc() && !
Pow->hasAllowReassoc()))
2471 if (!
Pow->doesNotAccessMemory() && !
Pow->hasNoInfs() &&
2473 Base, SimplifyQuery(DL, TLI, DT, AC,
Pow,
true,
true, DC)))
2482 if (!
Pow->hasNoSignedZeros())
2483 Sqrt =
B.CreateFAbs(Sqrt,
nullptr,
"abs");
2489 if (!
Pow->hasNoInfs()) {
2492 Value *FCmp =
B.CreateFCmpOEQ(
Base, NegInf,
"isinf");
2493 Sqrt =
B.CreateSelect(FCmp, PosInf, Sqrt);
2507 Sqrt =
B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt,
"reciprocal");
2516 return B.CreateIntrinsic(Intrinsic::powi, Types, Args);
2521 Value *Expo =
Pow->getArgOperand(1);
2526 bool AllowApprox =
Pow->hasApproxFunc();
2530 IRBuilderBase::FastMathFlagGuard Guard(
B);
2531 B.setFastMathFlags(
Pow->getFastMathFlags());
2538 if (
Value *Exp = replacePowWithExp(
Pow,
B))
2545 return B.CreateFDiv(ConstantFP::get(Ty, 1.0),
Base,
"reciprocal");
2549 return ConstantFP::get(Ty, 1.0);
2557 return B.CreateFMul(
Base,
Base,
"square");
2559 if (
Value *Sqrt = replacePowWithSqrt(
Pow,
B))
2570 Value *Sqrt =
nullptr;
2571 if (!ExpoA.isInteger()) {
2585 if (!ExpoI.isInteger())
2597 APSInt IntExpo(TLI->getIntSize(),
false);
2604 Base, ConstantInt::get(
B.getIntNTy(TLI->getIntSize()), IntExpo),
2608 return B.CreateFMul(PowI, Sqrt);
2624 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
2625 hasFloatVersion(M, Name)) {
2637 Value *Ret =
nullptr;
2638 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_exp2) &&
2639 hasFloatVersion(M, Name))
2648 const bool UseIntrinsic =
Callee->isIntrinsic();
2659 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2661 Constant *One = ConstantFP::get(Ty, 1.0);
2664 return copyFlags(*CI,
B.CreateIntrinsic(Intrinsic::ldexp,
2665 {Ty, Exp->getType()},
2669 IRBuilderBase::FastMathFlagGuard Guard(
B);
2672 One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2673 LibFunc_ldexpl,
B, AttributeList()));
2697 StringRef LogNm = LogFn->
getName();
2702 if (UnsafeFPShrink && hasFloatVersion(
Mod, LogNm))
2706 LibFunc LogLb, ExpLb, Exp2Lb, Exp10Lb, PowLb;
2709 LogLb = TLI->getLibFunc(LogNm);
2710 if (LogLb != NotLibFunc) {
2713 LogID = Intrinsic::log;
2714 ExpLb = LibFunc_expf;
2715 Exp2Lb = LibFunc_exp2f;
2716 Exp10Lb = LibFunc_exp10f;
2717 PowLb = LibFunc_powf;
2720 LogID = Intrinsic::log;
2721 ExpLb = LibFunc_exp;
2722 Exp2Lb = LibFunc_exp2;
2723 Exp10Lb = LibFunc_exp10;
2724 PowLb = LibFunc_pow;
2727 LogID = Intrinsic::log;
2728 ExpLb = LibFunc_expl;
2729 Exp2Lb = LibFunc_exp2l;
2730 Exp10Lb = LibFunc_exp10l;
2731 PowLb = LibFunc_powl;
2734 LogID = Intrinsic::log2;
2735 ExpLb = LibFunc_expf;
2736 Exp2Lb = LibFunc_exp2f;
2737 Exp10Lb = LibFunc_exp10f;
2738 PowLb = LibFunc_powf;
2741 LogID = Intrinsic::log2;
2742 ExpLb = LibFunc_exp;
2743 Exp2Lb = LibFunc_exp2;
2744 Exp10Lb = LibFunc_exp10;
2745 PowLb = LibFunc_pow;
2748 LogID = Intrinsic::log2;
2749 ExpLb = LibFunc_expl;
2750 Exp2Lb = LibFunc_exp2l;
2751 Exp10Lb = LibFunc_exp10l;
2752 PowLb = LibFunc_powl;
2754 case LibFunc_log10f:
2755 LogID = Intrinsic::log10;
2756 ExpLb = LibFunc_expf;
2757 Exp2Lb = LibFunc_exp2f;
2758 Exp10Lb = LibFunc_exp10f;
2759 PowLb = LibFunc_powf;
2762 LogID = Intrinsic::log10;
2763 ExpLb = LibFunc_exp;
2764 Exp2Lb = LibFunc_exp2;
2765 Exp10Lb = LibFunc_exp10;
2766 PowLb = LibFunc_pow;
2768 case LibFunc_log10l:
2769 LogID = Intrinsic::log10;
2770 ExpLb = LibFunc_expl;
2771 Exp2Lb = LibFunc_exp2l;
2772 Exp10Lb = LibFunc_exp10l;
2773 PowLb = LibFunc_powl;
2780 bool IsKnownNoErrno =
Log->hasNoNaNs() &&
Log->hasNoInfs();
2781 if (!IsKnownNoErrno) {
2782 SimplifyQuery SQ(DL, TLI, DT, AC, Log,
true,
true, DC);
2789 Known.cannotBeOrderedLessThanZero() &&
2790 Known.isKnownNeverLogicalZero(
F->getDenormalMode(FltSem));
2792 if (IsKnownNoErrno) {
2793 Value *NewLog =
B.CreateUnaryIntrinsic(LogID,
Log->getArgOperand(0), Log);
2795 I->copyMetadata(*Log);
2800 }
else if (LogID == Intrinsic::log || LogID == Intrinsic::log2 ||
2801 LogID == Intrinsic::log10) {
2803 ExpLb = LibFunc_expf;
2804 Exp2Lb = LibFunc_exp2f;
2805 Exp10Lb = LibFunc_exp10f;
2806 PowLb = LibFunc_powf;
2808 ExpLb = LibFunc_exp;
2809 Exp2Lb = LibFunc_exp2;
2810 Exp10Lb = LibFunc_exp10;
2811 PowLb = LibFunc_pow;
2822 IRBuilderBase::FastMathFlagGuard Guard(
B);
2826 LibFunc ArgLb = TLI->getLibFunc(*Arg);
2829 AttributeList NoAttrs;
2830 if (ArgLb == PowLb || ArgID == Intrinsic::pow || ArgID == Intrinsic::powi) {
2832 Log->doesNotAccessMemory()
2833 ?
B.CreateUnaryIntrinsic(LogID, Arg->
getOperand(0),
nullptr,
"log")
2837 if (ArgID == Intrinsic::powi)
2838 Y =
B.CreateSIToFP(
Y, Ty,
"cast");
2839 Value *MulY =
B.CreateFMul(
Y, LogX,
"mul");
2842 substituteInParent(Arg, MulY);
2848 if (ArgLb == ExpLb || ArgLb == Exp2Lb || ArgLb == Exp10Lb ||
2849 ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) {
2851 if (ArgLb == ExpLb || ArgID == Intrinsic::exp)
2854 else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2)
2855 Eul = ConstantFP::get(
Log->getType(), 2.0);
2857 Eul = ConstantFP::get(
Log->getType(), 10.0);
2858 Value *LogE =
Log->doesNotAccessMemory()
2859 ?
B.CreateUnaryIntrinsic(LogID, Eul,
nullptr,
"log")
2864 substituteInParent(Arg, MulY);
2881 LibFunc ArgLb = TLI->getLibFunc(*Arg);
2883 LibFunc SqrtLb, ExpLb, Exp2Lb, Exp10Lb;
2885 SqrtLb = TLI->getLibFunc(SqrtFn->
getName());
2886 if (SqrtLb != NotLibFunc)
2889 ExpLb = LibFunc_expf;
2890 Exp2Lb = LibFunc_exp2f;
2891 Exp10Lb = LibFunc_exp10f;
2894 ExpLb = LibFunc_exp;
2895 Exp2Lb = LibFunc_exp2;
2896 Exp10Lb = LibFunc_exp10;
2899 ExpLb = LibFunc_expl;
2900 Exp2Lb = LibFunc_exp2l;
2901 Exp10Lb = LibFunc_exp10l;
2908 ExpLb = LibFunc_expf;
2909 Exp2Lb = LibFunc_exp2f;
2910 Exp10Lb = LibFunc_exp10f;
2912 ExpLb = LibFunc_exp;
2913 Exp2Lb = LibFunc_exp2;
2914 Exp10Lb = LibFunc_exp10;
2920 if (ArgLb != ExpLb && ArgLb != Exp2Lb && ArgLb != Exp10Lb &&
2921 ArgID != Intrinsic::exp && ArgID != Intrinsic::exp2)
2924 IRBuilderBase::InsertPointGuard Guard(
B);
2925 B.SetInsertPoint(Arg);
2928 B.CreateFMulFMF(ExpOperand, ConstantFP::get(ExpOperand->getType(), 0.5),
2938 Value *Ret =
nullptr;
2943 (
Callee->getName() ==
"sqrt" ||
2944 Callee->getIntrinsicID() == Intrinsic::sqrt))
2947 if (
Value *Opt = mergeSqrtToExp(CI,
B))
2954 if (!
I ||
I->getOpcode() != Instruction::FMul || !
I->isFast())
2960 Value *Op0 =
I->getOperand(0);
2961 Value *Op1 =
I->getOperand(1);
2962 Value *RepeatOp =
nullptr;
2963 Value *OtherOp =
nullptr;
2994 Value *FabsCall =
B.CreateFAbs(RepeatOp,
I,
"fabs");
3000 B.CreateUnaryIntrinsic(Intrinsic::sqrt, OtherOp,
I,
"sqrt");
3001 return copyFlags(*CI,
B.CreateFMulFMF(FabsCall, SqrtCall,
I));
3012 SimplifyQuery SQ(DL, TLI, DT, AC, CI,
true,
true, DC);
3015 KnownFPClass Known1 =
3018 const fltSemantics &FltSem =
3029Value *LibCallSimplifier::optimizeTrigInversionPairs(
CallInst *CI,
3033 Value *Ret =
nullptr;
3035 if (UnsafeFPShrink &&
3036 (Name ==
"tan" || Name ==
"atanh" || Name ==
"sinh" || Name ==
"cosh" ||
3038 hasFloatVersion(M, Name))
3047 if (!CI->
isFast() || !OpC->isFast())
3056 LibFunc
Func =
F ? TLI->getLibFunc(
F->getName()) : NotLibFunc;
3058 LibFunc inverseFunc = llvm::StringSwitch<LibFunc>(
Callee->getName())
3059 .Case(
"tan", LibFunc_atan)
3060 .Case(
"atanh", LibFunc_tanh)
3061 .Case(
"sinh", LibFunc_asinh)
3062 .Case(
"cosh", LibFunc_acosh)
3063 .Case(
"tanf", LibFunc_atanf)
3064 .Case(
"atanhf", LibFunc_tanhf)
3065 .Case(
"sinhf", LibFunc_asinhf)
3066 .Case(
"coshf", LibFunc_acoshf)
3067 .Case(
"tanl", LibFunc_atanl)
3068 .Case(
"atanhl", LibFunc_tanhl)
3069 .Case(
"sinhl", LibFunc_asinhl)
3070 .Case(
"coshl", LibFunc_acoshl)
3071 .Case(
"asinh", LibFunc_sinh)
3072 .Case(
"asinhf", LibFunc_sinhf)
3073 .Case(
"asinhl", LibFunc_sinhl)
3074 .Default(NotLibFunc);
3075 if (Func == inverseFunc)
3076 Ret = OpC->getArgOperand(0);
3098 Name =
"__sincospif_stret";
3107 Name =
"__sincospi_stret";
3115 M, *TLI, TheLibFunc, OrigCallee->
getAttributes(), ResTy, ArgTy);
3120 B.SetInsertPoint(++ArgInst->getIterator());
3124 BasicBlock &EntryBB =
B.GetInsertBlock()->getParent()->getEntryBlock();
3125 B.SetInsertPoint(EntryBB.
begin());
3128 SinCos =
B.CreateCall(Callee, Arg,
"sincospi");
3131 Sin =
B.CreateExtractValue(SinCos, 0,
"sinpi");
3132 Cos =
B.CreateExtractValue(SinCos, 1,
"cospi");
3134 Sin =
B.CreateExtractElement(SinCos,
uint64_t{0},
"sinpi");
3135 Cos =
B.CreateExtractElement(SinCos,
uint64_t{1},
"cospi");
3145 return Mode.inputsMayBePositiveZero() ||
Mode.outputsMayBePositiveZero();
3175Value *LibCallSimplifier::optimizeSymmetric(
CallInst *CI, LibFunc Func,
3204 case LibFunc_asinhf:
3205 case LibFunc_asinhl:
3249 for (User *U : Arg->
users())
3250 classifyArgUse(U,
F, IsFloat, SinCalls, CosCalls, SinCosCalls);
3256 Value *Sin, *Cos, *SinCos;
3261 auto replaceTrigInsts = [
this](SmallVectorImpl<CallInst *> &Calls,
3263 for (CallInst *
C : Calls)
3264 replaceAllUsesWith(
C, Res);
3267 replaceTrigInsts(SinCalls, Sin);
3268 replaceTrigInsts(CosCalls, Cos);
3269 replaceTrigInsts(SinCosCalls, SinCos);
3271 return IsSin ? Sin : Cos;
3274void LibCallSimplifier::classifyArgUse(
3289 LibFunc
Func =
Callee ? TLI->getLibFunc(*Callee) : NotLibFunc;
3294 if (Func == LibFunc_sinpif)
3296 else if (Func == LibFunc_cospif)
3298 else if (Func == LibFunc_sincospif_stret)
3301 if (Func == LibFunc_sinpi)
3303 else if (Func == LibFunc_cospi)
3305 else if (Func == LibFunc_sincospi_stret)
3327 unsigned IntBW = TLI->getIntSize();
3328 APSInt QuotInt(IntBW,
false);
3335 B.CreateAlignedStore(
3338 return ConstantFP::get(CI->
getType(), Rem);
3365 return ConstantFP::get(CI->
getType(), Difference);
3377 Type *ArgType =
Op->getType();
3378 Value *
V =
B.CreateIntrinsic(Intrinsic::cttz, {ArgType}, {
Op,
B.getTrue()},
3380 V =
B.CreateAdd(V, ConstantInt::get(
V->getType(), 1));
3381 V =
B.CreateIntCast(V, RetType,
false);
3384 Value *S =
B.CreateSelect(
Cond, V, ConstantInt::get(RetType, 0));
3398 Type *ArgType =
Op->getType();
3399 Value *
V =
B.CreateIntrinsic(Intrinsic::ctlz, {ArgType}, {
Op,
B.getFalse()},
3403 return B.CreateIntCast(V, CI->
getType(),
false);
3410 Value *IsNeg =
B.CreateIsNeg(
X);
3411 Value *NegX =
B.CreateNSWNeg(
X,
"neg");
3412 return B.CreateSelect(IsNeg, NegX,
X);
3418 Type *ArgType =
Op->getType();
3419 Op =
B.CreateSub(
Op, ConstantInt::get(ArgType,
'0'),
"isdigittmp");
3420 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 10),
"isdigit");
3427 Type *ArgType =
Op->getType();
3428 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 128),
"isascii");
3435 ConstantInt::get(CI->
getType(), 0x7F));
3465 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned,
B);
3497 if (!Callee || !Callee->isDeclaration())
3506 if (StreamArg >= (
int)CI->
arg_size())
3514 return GV->
getName() ==
"stderr";
3519 StringRef FormatStr;
3524 if (FormatStr.
empty())
3535 if (FormatStr.
size() == 1 || FormatStr ==
"%%") {
3539 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)FormatStr[0]);
3540 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3544 if (FormatStr ==
"%s" && CI->
arg_size() > 1) {
3545 StringRef OperandStr;
3546 if (!getConstantStringInfo(CI->getOperand(1), OperandStr))
3549 if (OperandStr.empty())
3552 if (OperandStr.size() == 1) {
3556 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)OperandStr[0]);
3557 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3560 if (OperandStr.back() ==
'\n') {
3561 if (!isLibFuncEmittable(CI->getModule(), TLI, LibFunc_puts))
3563 OperandStr = OperandStr.drop_back();
3564 Value *GV = B.CreateGlobalString(OperandStr,
"str");
3565 return copyFlags(*CI, emitPutS(GV, B, TLI));
3571 if (FormatStr.
back() ==
'\n' &&
3573 if (!isLibFuncEmittable(CI->getModule(), TLI, LibFunc_puts))
3577 FormatStr = FormatStr.drop_back();
3578 Value *GV = B.CreateGlobalString(FormatStr,
"str");
3579 return copyFlags(*CI, emitPutS(GV, B, TLI));
3584 if (FormatStr ==
"%c" && CI->
arg_size() > 1 &&
3588 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false);
3589 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3593 if (FormatStr ==
"%s\n" && CI->
arg_size() > 1 &&
3603 FunctionType *FT =
Callee->getFunctionType();
3604 if (
Value *V = optimizePrintFString(CI,
B)) {
3615 Callee->getAttributes());
3617 New->setCalledFunction(IPrintFFn);
3627 Callee->getAttributes());
3629 New->setCalledFunction(SmallPrintFFn);
3637Value *LibCallSimplifier::optimizeSPrintFString(
CallInst *CI,
3640 StringRef FormatStr;
3656 return ConstantInt::get(CI->
getType(), FormatStr.
size());
3661 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3665 if (FormatStr[1] ==
'c') {
3671 B.CreateStore(V, Ptr);
3672 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3673 B.CreateStore(
B.getInt8(0), Ptr);
3675 return ConstantInt::get(CI->
getType(), 1);
3678 if (FormatStr[1] ==
's') {
3691 TLI->getAsSizeT(SrcLen, *CI->
getModule()));
3693 return ConstantInt::get(CI->
getType(), SrcLen - 1);
3696 Value *PtrDiff =
B.CreatePtrDiff(V, Dest);
3697 return B.CreateIntCast(PtrDiff, CI->
getType(),
false);
3708 B.CreateAdd(Len, ConstantInt::get(
Len->getType(), 1),
"leninc");
3712 return B.CreateIntCast(Len, CI->
getType(),
false);
3720 FunctionType *FT =
Callee->getFunctionType();
3721 if (
Value *V = optimizeSPrintFString(CI,
B)) {
3732 FT,
Callee->getAttributes());
3734 New->setCalledFunction(SIPrintFFn);
3744 Callee->getAttributes());
3746 New->setCalledFunction(SmallSPrintFFn);
3762 assert(StrArg || (
N < 2 && Str.size() == 1));
3764 unsigned IntBits = TLI->getIntSize();
3766 if (Str.size() > IntMax)
3772 Value *StrLen = ConstantInt::get(CI->
getType(), Str.size());
3782 NCopy = Str.size() + 1;
3787 if (NCopy && StrArg)
3790 TLI->getAsSizeT(NCopy, *CI->
getModule())));
3799 Value *NulOff =
B.getIntN(IntBits, NCopy);
3800 Value *DstEnd =
B.CreateInBoundsGEP(Int8Ty, DstArg, NulOff,
"endptr");
3801 B.CreateStore(ConstantInt::get(Int8Ty, 0), DstEnd);
3805Value *LibCallSimplifier::optimizeSnPrintFString(
CallInst *CI,
3823 StringRef FormatStr;
3834 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr,
N,
B);
3839 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() != 4)
3843 if (FormatStr[1] ==
'c') {
3848 StringRef CharStr(
"*");
3849 return emitSnPrintfMemCpy(CI,
nullptr, CharStr,
N,
B);
3856 Value *Ptr = DstArg;
3857 B.CreateStore(V, Ptr);
3858 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Ptr,
B.getInt32(1),
"nul");
3859 B.CreateStore(
B.getInt8(0), Ptr);
3860 return ConstantInt::get(CI->
getType(), 1);
3863 if (FormatStr[1] !=
's')
3872 return emitSnPrintfMemCpy(CI, StrArg, Str,
N,
B);
3876 if (
Value *V = optimizeSnPrintFString(CI,
B)) {
3885Value *LibCallSimplifier::optimizeFPrintFString(
CallInst *CI,
3887 optimizeErrorReporting(CI,
B, 0);
3890 StringRef FormatStr;
3914 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3918 if (FormatStr[1] ==
'c') {
3922 Type *IntTy =
B.getIntNTy(TLI->getIntSize());
3928 if (FormatStr[1] ==
's') {
3941 FunctionType *FT =
Callee->getFunctionType();
3942 if (
Value *V = optimizeFPrintFString(CI,
B)) {
3951 FT,
Callee->getAttributes());
3953 New->setCalledFunction(FIPrintFFn);
3962 auto SmallFPrintFFn =
3964 Callee->getAttributes());
3966 New->setCalledFunction(SmallFPrintFFn);
3975 optimizeErrorReporting(CI,
B, 3);
3980 if (SizeC && CountC) {
3985 return ConstantInt::get(CI->
getType(), 0);
3992 Value *Cast =
B.CreateIntCast(Char, IntTy,
true,
"chari");
3994 return NewCI ? ConstantInt::get(CI->
getType(), 1) : nullptr;
4002 optimizeErrorReporting(CI,
B, 1);
4020 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
4025 ConstantInt::get(SizeTTy, Len - 1),
4065bool LibCallSimplifier::hasFloatVersion(
const Module *M,
StringRef FuncName) {
4066 SmallString<20> FloatFuncName = FuncName;
4067 FloatFuncName +=
'f';
4071Value *LibCallSimplifier::optimizeStringMemoryLibCall(
CallInst *CI,
4075 LibFunc
Func = TLI->getLibFunc(*Callee);
4083 "Optimizing string/memory libcall would change the calling convention");
4085 case LibFunc_strcat:
4086 return optimizeStrCat(CI, Builder);
4087 case LibFunc_strncat:
4088 return optimizeStrNCat(CI, Builder);
4089 case LibFunc_strchr:
4090 return optimizeStrChr(CI, Builder);
4091 case LibFunc_strrchr:
4092 return optimizeStrRChr(CI, Builder);
4093 case LibFunc_strcmp:
4094 return optimizeStrCmp(CI, Builder);
4095 case LibFunc_strncmp:
4096 return optimizeStrNCmp(CI, Builder);
4097 case LibFunc_strcpy:
4098 return optimizeStrCpy(CI, Builder);
4099 case LibFunc_stpcpy:
4100 return optimizeStpCpy(CI, Builder);
4101 case LibFunc_strlcpy:
4102 return optimizeStrLCpy(CI, Builder);
4103 case LibFunc_stpncpy:
4104 return optimizeStringNCpy(CI,
true, Builder);
4105 case LibFunc_strncpy:
4106 return optimizeStringNCpy(CI,
false, Builder);
4107 case LibFunc_strlen:
4108 return optimizeStrLen(CI, Builder);
4109 case LibFunc_strnlen:
4110 return optimizeStrNLen(CI, Builder);
4111 case LibFunc_strpbrk:
4112 return optimizeStrPBrk(CI, Builder);
4113 case LibFunc_strndup:
4114 return optimizeStrNDup(CI, Builder);
4115 case LibFunc_strtol:
4116 case LibFunc_strtod:
4117 case LibFunc_strtof:
4118 case LibFunc_strtoul:
4119 case LibFunc_strtoll:
4120 case LibFunc_strtold:
4121 case LibFunc_strtoull:
4122 return optimizeStrTo(CI, Builder);
4123 case LibFunc_strspn:
4124 return optimizeStrSpn(CI, Builder);
4125 case LibFunc_strcspn:
4126 return optimizeStrCSpn(CI, Builder);
4127 case LibFunc_strstr:
4128 return optimizeStrStr(CI, Builder);
4129 case LibFunc_memchr:
4130 return optimizeMemChr(CI, Builder);
4131 case LibFunc_memrchr:
4132 return optimizeMemRChr(CI, Builder);
4134 return optimizeBCmp(CI, Builder);
4135 case LibFunc_memcmp:
4136 return optimizeMemCmp(CI, Builder);
4137 case LibFunc_memcpy:
4138 return optimizeMemCpy(CI, Builder);
4139 case LibFunc_memccpy:
4140 return optimizeMemCCpy(CI, Builder);
4141 case LibFunc_mempcpy:
4142 return optimizeMemPCpy(CI, Builder);
4143 case LibFunc_memmove:
4144 return optimizeMemMove(CI, Builder);
4145 case LibFunc_memset:
4146 return optimizeMemSet(CI, Builder);
4147 case LibFunc_realloc:
4148 return optimizeRealloc(CI, Builder);
4149 case LibFunc_wcslen:
4150 return optimizeWcslen(CI, Builder);
4152 return optimizeBCopy(CI, Builder);
4154 case LibFunc_ZnwmRKSt9nothrow_t:
4155 case LibFunc_ZnwmSt11align_val_t:
4156 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
4158 case LibFunc_ZnamRKSt9nothrow_t:
4159 case LibFunc_ZnamSt11align_val_t:
4160 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
4161 case LibFunc_Znwm12__hot_cold_t:
4162 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
4163 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
4164 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4165 case LibFunc_Znam12__hot_cold_t:
4166 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
4167 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
4168 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4169 case LibFunc_size_returning_new:
4170 case LibFunc_size_returning_new_hot_cold:
4171 case LibFunc_size_returning_new_aligned:
4172 case LibFunc_size_returning_new_aligned_hot_cold:
4173 return optimizeNew(CI, Builder, Func);
4189 if (CharSeq.
empty())
4190 Fill =
APInt(32, 0);
4197Value *LibCallSimplifier::optimizeFloatingPointLibCall(
CallInst *CI,
4206 if (
Value *V = optimizeSymmetric(CI, Func, Builder))
4210 case LibFunc_sinpif:
4212 return optimizeSinCosPi(CI,
true, Builder);
4213 case LibFunc_cospif:
4215 return optimizeSinCosPi(CI,
false, Builder);
4229 return optimizePow(CI, Builder);
4233 return optimizeExp2(CI, Builder);
4234 case LibFunc_scalbn:
4235 case LibFunc_scalbnf:
4236 case LibFunc_scalbnl:
4253 return optimizeSqrt(CI, Builder);
4257 return optimizeFMod(CI, Builder);
4261 case LibFunc_log10f:
4263 case LibFunc_log10l:
4264 case LibFunc_log1pf:
4266 case LibFunc_log1pl:
4273 return optimizeLog(CI, Builder);
4281 case LibFunc_asinhf:
4282 case LibFunc_asinhl:
4287 case LibFunc_atanhf:
4288 case LibFunc_atanhl:
4289 return optimizeTrigInversionPairs(CI, Builder);
4296 case LibFunc_roundeven:
4298 case LibFunc_nearbyint:
4306 if (UnsafeFPShrink &&
4312 CI, Builder, Func == LibFunc_sin ? Intrinsic::sin : Intrinsic::cos);
4326 case LibFunc_copysign:
4333 return optimizeFdim(CI, Builder);
4337 return optimizeFMinFMax(CI, Builder, Intrinsic::minnum);
4341 return optimizeFMinFMax(CI, Builder, Intrinsic::maxnum);
4342 case LibFunc_fminimum_numf:
4343 case LibFunc_fminimum_num:
4344 case LibFunc_fminimum_numl:
4346 case LibFunc_fmaximum_numf:
4347 case LibFunc_fmaximum_num:
4348 case LibFunc_fmaximum_numl:
4353 return optimizeCAbs(CI, Builder);
4354 case LibFunc_remquo:
4355 case LibFunc_remquof:
4356 case LibFunc_remquol:
4357 return optimizeRemquo(CI, Builder);
4376 return maybeOptimizeNoBuiltinOperatorNew(CI, Builder);
4380 LibFunc Func = TLI->getLibFunc(*Callee);
4387 Builder.setDefaultOperandBundles(OpBundles);
4395 UnsafeFPShrink =
true;
4399 if (!IsCallingConvC)
4403 switch (
II->getIntrinsicID()) {
4404 case Intrinsic::pow:
4405 return optimizePow(CI, Builder);
4406 case Intrinsic::exp2:
4407 return optimizeExp2(CI, Builder);
4408 case Intrinsic::log:
4409 case Intrinsic::log2:
4410 case Intrinsic::log10:
4411 return optimizeLog(CI, Builder);
4412 case Intrinsic::sqrt:
4413 return optimizeSqrt(CI, Builder);
4414 case Intrinsic::memset:
4415 return optimizeMemSet(CI, Builder);
4416 case Intrinsic::memcpy:
4417 return optimizeMemCpy(CI, Builder);
4418 case Intrinsic::memmove:
4419 return optimizeMemMove(CI, Builder);
4420 case Intrinsic::sin:
4421 case Intrinsic::cos:
4425 case Intrinsic::sincos:
4435 if (
Value *SimplifiedFortifiedCI =
4436 FortifiedSimplifier.optimizeCall(CI, Builder))
4437 return SimplifiedFortifiedCI;
4444 if (
Value *V = optimizeStringMemoryLibCall(CI, Builder))
4446 if (
Value *V = optimizeFloatingPointLibCall(CI, Func, Builder))
4452 return optimizeFFS(CI, Builder);
4456 return optimizeFls(CI, Builder);
4460 return optimizeAbs(CI, Builder);
4461 case LibFunc_isdigit:
4462 return optimizeIsDigit(CI, Builder);
4463 case LibFunc_isascii:
4464 return optimizeIsAscii(CI, Builder);
4465 case LibFunc_toascii:
4466 return optimizeToAscii(CI, Builder);
4470 return optimizeAtoi(CI, Builder);
4471 case LibFunc_strtol:
4472 case LibFunc_strtoll:
4473 return optimizeStrToInt(CI, Builder,
true);
4474 case LibFunc_strtoul:
4475 case LibFunc_strtoull:
4476 return optimizeStrToInt(CI, Builder,
false);
4477 case LibFunc_printf:
4478 return optimizePrintF(CI, Builder);
4479 case LibFunc_sprintf:
4480 return optimizeSPrintF(CI, Builder);
4481 case LibFunc_snprintf:
4482 return optimizeSnPrintF(CI, Builder);
4483 case LibFunc_fprintf:
4484 return optimizeFPrintF(CI, Builder);
4485 case LibFunc_fwrite:
4486 return optimizeFWrite(CI, Builder);
4488 return optimizeFPuts(CI, Builder);
4490 return optimizePuts(CI, Builder);
4491 case LibFunc_perror:
4492 return optimizeErrorReporting(CI, Builder);
4493 case LibFunc_vfprintf:
4494 case LibFunc_fiprintf:
4495 return optimizeErrorReporting(CI, Builder, 0);
4498 return optimizeExit(CI);
4512 : FortifiedSimplifier(TLI), DL(DL), TLI(TLI), DT(DT), DC(DC), AC(AC),
4513 ORE(ORE), BFI(BFI), PSI(PSI), Replacer(Replacer), Eraser(Eraser) {}
4520void LibCallSimplifier::eraseFromParent(
Instruction *
I) {
4559bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(
4560 CallInst *CI,
unsigned ObjSizeOp, std::optional<unsigned> SizeOp,
4561 std::optional<unsigned> StrOp, std::optional<unsigned> FlagOp) {
4566 if (!Flag || !
Flag->isZero())
4573 if (ConstantInt *ObjSizeCI =
4575 if (ObjSizeCI->isMinusOne())
4578 if (OnlyLowerUnknownSize)
4588 return ObjSizeCI->getZExtValue() >=
Len;
4592 if (ConstantInt *SizeCI =
4594 return ObjSizeCI->getZExtValue() >= SizeCI->getZExtValue();
4600Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(
CallInst *CI,
4602 if (isFortifiedCallFoldable(CI, 3, 2)) {
4612Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(
CallInst *CI,
4614 if (isFortifiedCallFoldable(CI, 3, 2)) {
4624Value *FortifiedLibCallSimplifier::optimizeMemSetChk(
CallInst *CI,
4626 if (isFortifiedCallFoldable(CI, 3, 2)) {
4636Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(
CallInst *CI,
4639 if (isFortifiedCallFoldable(CI, 3, 2))
4647Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(
CallInst *CI,
4655 if (Func == LibFunc_stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src) {
4657 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
4665 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) {
4666 if (Func == LibFunc_strcpy_chk)
4672 if (OnlyLowerUnknownSize)
4682 unsigned SizeTBits = TLI->getSizeTSize(*CI->
getModule());
4684 Value *LenV = ConstantInt::get(SizeTTy, Len);
4688 if (Ret && Func == LibFunc_stpcpy_chk)
4689 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
4690 ConstantInt::get(SizeTTy, Len - 1));
4694Value *FortifiedLibCallSimplifier::optimizeStrLenChk(
CallInst *CI,
4696 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0))
4702Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(
CallInst *CI,
4705 if (isFortifiedCallFoldable(CI, 3, 2)) {
4706 if (Func == LibFunc_strncpy_chk)
4719Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(
CallInst *CI,
4721 if (isFortifiedCallFoldable(CI, 4, 3))
4729Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(
CallInst *CI,
4731 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) {
4741Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(
CallInst *CI,
4743 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) {
4747 VariadicArgs,
B, TLI));
4753Value *FortifiedLibCallSimplifier::optimizeStrCatChk(
CallInst *CI,
4755 if (isFortifiedCallFoldable(CI, 2))
4762Value *FortifiedLibCallSimplifier::optimizeStrLCat(
CallInst *CI,
4764 if (isFortifiedCallFoldable(CI, 3))
4772Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(
CallInst *CI,
4774 if (isFortifiedCallFoldable(CI, 3))
4782Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(
CallInst *CI,
4784 if (isFortifiedCallFoldable(CI, 3))
4792Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(
CallInst *CI,
4794 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2))
4802Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(
CallInst *CI,
4804 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1))
4834 Builder.setDefaultOperandBundles(OpBundles);
4838 LibFunc Func = TLI->getLibFunc(*Callee);
4839 if (Func == NotLibFunc)
4847 case LibFunc_memcpy_chk:
4848 return optimizeMemCpyChk(CI, Builder);
4849 case LibFunc_mempcpy_chk:
4850 return optimizeMemPCpyChk(CI, Builder);
4851 case LibFunc_memmove_chk:
4852 return optimizeMemMoveChk(CI, Builder);
4853 case LibFunc_memset_chk:
4854 return optimizeMemSetChk(CI, Builder);
4855 case LibFunc_stpcpy_chk:
4856 case LibFunc_strcpy_chk:
4857 return optimizeStrpCpyChk(CI, Builder, Func);
4858 case LibFunc_strlen_chk:
4859 return optimizeStrLenChk(CI, Builder);
4860 case LibFunc_stpncpy_chk:
4861 case LibFunc_strncpy_chk:
4862 return optimizeStrpNCpyChk(CI, Builder, Func);
4863 case LibFunc_memccpy_chk:
4864 return optimizeMemCCpyChk(CI, Builder);
4865 case LibFunc_snprintf_chk:
4866 return optimizeSNPrintfChk(CI, Builder);
4867 case LibFunc_sprintf_chk:
4868 return optimizeSPrintfChk(CI, Builder);
4869 case LibFunc_strcat_chk:
4870 return optimizeStrCatChk(CI, Builder);
4871 case LibFunc_strlcat_chk:
4872 return optimizeStrLCat(CI, Builder);
4873 case LibFunc_strncat_chk:
4874 return optimizeStrNCatChk(CI, Builder);
4875 case LibFunc_strlcpy_chk:
4876 return optimizeStrLCpyChk(CI, Builder);
4877 case LibFunc_vsnprintf_chk:
4878 return optimizeVSNPrintfChk(CI, Builder);
4879 case LibFunc_vsprintf_chk:
4880 return optimizeVSPrintfChk(CI, Builder);
4889 : 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.