46using namespace PatternMatch;
51 cl::desc(
"Enable unsafe double to float "
52 "shrinking for math lib calls"));
59 cl::desc(
"Enable hot/cold operator new library calls"));
63 "Enable optimization of existing hot/cold operator new library calls"));
70struct HotColdHintParser :
public cl::parser<unsigned> {
75 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
78 return O.error(
"'" + Arg +
"' value must be in the range [0, 255]!");
92 cl::desc(
"Value to pass to hot/cold operator new for cold allocation"));
95 cl::desc(
"Value to pass to hot/cold operator new for "
96 "notcold (warm) allocation"));
99 cl::desc(
"Value to pass to hot/cold operator new for hot allocation"));
106 return Func == LibFunc_abs || Func == LibFunc_labs ||
107 Func == LibFunc_llabs || Func == LibFunc_strlen;
112 for (
User *U : V->users()) {
113 if (
ICmpInst *IC = dyn_cast<ICmpInst>(U))
114 if (IC->isEquality() && IC->getOperand(1) == With)
124 return OI->getType()->isFloatingPointTy();
130 return OI->getType()->isFP128Ty();
143 if (Base < 2 || Base > 36)
152 if (!isSpace((
unsigned char)Str[
Offset])) {
163 bool Negate = Str[0] ==
'-';
164 if (Str[0] ==
'-' || Str[0] ==
'+') {
165 Str = Str.drop_front();
175 unsigned NBits =
RetTy->getPrimitiveSizeInBits();
176 uint64_t Max = AsSigned && Negate ? 1 : 0;
180 if (Str.size() > 1) {
182 if (toUpper((
unsigned char)Str[1]) ==
'X') {
183 if (Str.size() == 2 || (
Base &&
Base != 16))
188 Str = Str.drop_front(2);
194 }
else if (
Base == 0)
204 for (
unsigned i = 0; i != Str.size(); ++i) {
205 unsigned char DigVal = Str[i];
207 DigVal = DigVal -
'0';
209 DigVal = toUpper(DigVal);
211 DigVal = DigVal -
'A' + 10;
224 if (VFlow || Result > Max)
232 Value *StrEnd =
B.CreateInBoundsGEP(
B.getInt8Ty(), StrBeg, Off,
"endptr");
233 B.CreateStore(StrEnd, EndPtr);
240 return ConstantInt::get(
RetTy, Result);
244 for (
User *U : V->users()) {
245 if (
ICmpInst *IC = dyn_cast<ICmpInst>(U))
246 if (
Constant *
C = dyn_cast<Constant>(IC->getOperand(1)))
247 if (
C->isNullValue())
275 for (
unsigned ArgNo : ArgNos) {
276 uint64_t DerefBytes = DereferenceableBytes;
281 DereferenceableBytes);
300 for (
unsigned ArgNo : ArgNos) {
326 DerefMin = std::min(
X,
Y);
340 if (
auto *NewCI = dyn_cast_or_null<CallInst>(New))
347 NewCI->
getContext(), {NewCI->getAttributes(), Old.getAttributes()}));
360 return Len >= Str.size() ? Str : Str.substr(0, Len);
385 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len,
B));
399 Value *CpyDst =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, DstLen,
"endptr");
404 TLI->
getAsSizeT(Len + 1, *
B.GetInsertBlock()->getModule()));
448 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen,
B));
461 Type *CharTy =
B.getInt8Ty();
462 Value *Char0 =
B.CreateLoad(CharTy, Src);
463 CharVal =
B.CreateTrunc(CharVal, CharTy);
464 Value *Cmp =
B.CreateICmpEQ(Char0, CharVal,
"char0cmp");
468 Value *
And =
B.CreateICmpNE(NBytes, Zero);
469 Cmp =
B.CreateLogicalAnd(
And, Cmp);
473 return B.CreateSelect(Cmp, Src, NullPtr);
486 ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal);
497 if (!FT->getParamType(1)->isIntegerTy(IntBits))
504 ConstantInt::get(SizeTTy, Len),
B,
513 return B.CreateIntToPtr(
B.getTrue(), CI->
getType());
522 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, StrLen,
"strchr");
535 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(
I),
"strchr");
541 ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal);
547 if (CharC && CharC->
isZero())
558 Value *
Size = ConstantInt::get(SizeTTy, NBytes);
565 return ConstantInt::get(CI->
getType(), 0);
572 if (HasStr1 && HasStr2)
573 return ConstantInt::get(CI->
getType(),
574 std::clamp(Str1.
compare(Str2), -1, 1));
576 if (HasStr1 && Str1.
empty())
577 return B.CreateNeg(
B.CreateZExt(
578 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
580 if (HasStr2 && Str2.
empty())
581 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
600 if (!HasStr1 && HasStr2) {
605 }
else if (HasStr1 && !HasStr2) {
627 return ConstantInt::get(CI->
getType(), 0);
639 return ConstantInt::get(CI->
getType(), 0);
649 if (HasStr1 && HasStr2) {
653 return ConstantInt::get(CI->
getType(),
654 std::clamp(SubStr1.
compare(SubStr2), -1, 1));
657 if (HasStr1 && Str1.
empty())
658 return B.CreateNeg(
B.CreateZExt(
659 B.CreateLoad(
B.getInt8Ty(), Str2P,
"strcmpload"), CI->
getType()));
661 if (HasStr2 && Str2.
empty())
662 return B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(), Str1P,
"strcmpload"),
673 if (!HasStr1 && HasStr2) {
674 Len2 = std::min(Len2,
Length);
679 }
else if (HasStr1 && !HasStr2) {
680 Len1 = std::min(Len1,
Length);
694 if (SrcLen &&
Size) {
696 if (SrcLen <= Size->getZExtValue() + 1)
733 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
744 Value *DstEnd =
B.CreateInBoundsGEP(
768 NBytes = SizeC->getZExtValue();
777 B.CreateStore(
B.getInt8(0), Dst);
793 bool NulTerm = SrcLen < NBytes;
802 SrcLen = std::min(SrcLen,
uint64_t(Str.size()));
803 NBytes = std::min(NBytes - 1, SrcLen);
808 B.CreateStore(
B.getInt8(0), Dst);
809 return ConstantInt::get(CI->
getType(), 0);
820 Value *EndOff = ConstantInt::get(CI->
getType(), NBytes);
821 Value *EndPtr =
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, EndOff);
822 B.CreateStore(
B.getInt8(0), EndPtr);
828 return ConstantInt::get(CI->
getType(), SrcLen);
833Value *LibCallSimplifier::optimizeStringNCpy(
CallInst *CI,
bool RetEnd,
850 N = SizeC->getZExtValue();
857 Type *CharTy =
B.getInt8Ty();
858 Value *CharVal =
B.CreateLoad(CharTy, Src,
"stxncpy.char0");
859 B.CreateStore(CharVal, Dst);
865 Value *ZeroChar = ConstantInt::get(CharTy, 0);
866 Value *
Cmp =
B.CreateICmpEQ(CharVal, ZeroChar,
"stpncpy.char0cmp");
868 Value *Off1 =
B.getInt32(1);
869 Value *EndPtr =
B.CreateInBoundsGEP(CharTy, Dst, Off1,
"stpncpy.end");
870 return B.CreateSelect(Cmp, Dst, EndPtr,
"stpncpy.sel");
886 CallInst *NewCI =
B.CreateMemSet(Dst,
B.getInt8(
'\0'),
Size, MemSetAlign);
894 if (
N > SrcLen + 1) {
903 std::string SrcStr = Str.str();
906 SrcStr.resize(
N,
'\0');
907 Src =
B.CreateGlobalString(SrcStr,
"str", 0,
922 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, Off,
"endptr");
929 Type *CharTy =
B.getIntNTy(CharSize);
939 return B.CreateZExt(
B.CreateLoad(CharTy, Src,
"char0"),
944 if (
ConstantInt *BoundCst = dyn_cast<ConstantInt>(Bound)) {
945 if (BoundCst->isZero())
947 return ConstantInt::get(CI->
getType(), 0);
949 if (BoundCst->isOne()) {
951 Value *CharVal =
B.CreateLoad(CharTy, Src,
"strnlen.char0");
952 Value *ZeroChar = ConstantInt::get(CharTy, 0);
953 Value *
Cmp =
B.CreateICmpNE(CharVal, ZeroChar,
"strnlen.char0cmp");
954 return B.CreateZExt(Cmp, CI->
getType());
964 return B.CreateBinaryIntrinsic(Intrinsic::umin, LenC, Bound);
983 APInt ConstOffset(BW, 0);
984 assert(CharSize % 8 == 0 &&
"Expected a multiple of 8 sized CharSize");
986 if (!
GEP->collectOffset(DL, BW, VarOffsets, ConstOffset) ||
987 VarOffsets.
size() != 1 || ConstOffset != 0 ||
988 VarOffsets.
begin()->second != CharSize / 8)
994 if (Slice.
Array ==
nullptr) {
1018 (isa<GlobalVariable>(
GEP->getOperand(0)) &&
1019 NullTermIdx == Slice.
Length - 1)) {
1021 return B.CreateSub(ConstantInt::get(CI->
getType(), NullTermIdx),
1028 if (
SelectInst *SI = dyn_cast<SelectInst>(Src)) {
1031 if (LenTrue && LenFalse) {
1034 <<
"folded strlen(select) to select of constants";
1036 return B.CreateSelect(
SI->getCondition(),
1037 ConstantInt::get(CI->
getType(), LenTrue - 1),
1038 ConstantInt::get(CI->
getType(), LenFalse - 1));
1046 if (
Value *V = optimizeStringLength(CI,
B, 8))
1054 if (
Value *V = optimizeStringLength(CI,
B, 8, Bound))
1069 return optimizeStringLength(CI,
B, WCharSize);
1079 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1083 if (HasS1 && HasS2) {
1084 size_t I =
S1.find_first_of(S2);
1089 B.getInt64(
I),
"strpbrk");
1093 if (HasS2 && S2.
size() == 1)
1101 if (isa<ConstantPointerNull>(EndPtr)) {
1118 if ((HasS1 &&
S1.empty()) || (HasS2 && S2.
empty()))
1122 if (HasS1 && HasS2) {
1123 size_t Pos =
S1.find_first_not_of(S2);
1126 return ConstantInt::get(CI->
getType(), Pos);
1138 if (HasS1 &&
S1.empty())
1142 if (HasS1 && HasS2) {
1143 size_t Pos =
S1.find_first_of(S2);
1146 return ConstantInt::get(CI->
getType(), Pos);
1150 if (HasS2 && S2.
empty())
1167 StrLen,
B, DL, TLI);
1175 replaceAllUsesWith(Old, Cmp);
1186 if (HasStr2 && ToFindStr.
empty())
1190 if (HasStr1 && HasStr2) {
1197 return B.CreateConstInBoundsGEP1_64(
B.getInt8Ty(), CI->
getArgOperand(0),
1202 if (HasStr2 && ToFindStr.
size() == 1) {
1223 if (LenC->
isOne()) {
1226 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memrchr.char0");
1228 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1229 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memrchr.char0cmp");
1230 return B.CreateSelect(Cmp, SrcStr, NullPtr,
"memrchr.sel");
1238 if (Str.size() == 0)
1247 if (Str.size() < EndOff)
1252 if (
ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal)) {
1262 return B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos));
1264 if (Str.find(Str[Pos]) == Pos) {
1271 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
1272 B.getInt64(Pos),
"memrchr.ptr_plus");
1273 return B.CreateSelect(Cmp, NullPtr, SrcPlus,
"memrchr.sel");
1278 Str = Str.substr(0, EndOff);
1286 Type *Int8Ty =
B.getInt8Ty();
1287 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1289 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1290 Value *CEqS0 =
B.CreateICmpEQ(ConstantInt::get(Int8Ty, Str[0]), CharVal);
1291 Value *
And =
B.CreateLogicalAnd(NNeZ, CEqS0);
1292 Value *SizeM1 =
B.CreateSub(
Size, ConstantInt::get(SizeTy, 1));
1294 B.CreateInBoundsGEP(Int8Ty, SrcStr, SizeM1,
"memrchr.ptr_plus");
1295 return B.CreateSelect(
And, SrcPlus, NullPtr,
"memrchr.sel");
1309 ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal);
1318 if (LenC->
isOne()) {
1321 Value *Val =
B.CreateLoad(
B.getInt8Ty(), SrcStr,
"memchr.char0");
1323 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1324 Value *
Cmp =
B.CreateICmpEQ(Val, CharVal,
"memchr.char0cmp");
1325 return B.CreateSelect(Cmp, SrcStr, NullPtr,
"memchr.sel");
1345 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr,
B.getInt64(Pos),
1347 return B.CreateSelect(Cmp, NullPtr, SrcPlus);
1350 if (Str.size() == 0)
1359 size_t Pos = Str.find_first_not_of(Str[0]);
1372 Type *Int8Ty =
B.getInt8Ty();
1375 CharVal =
B.CreateTrunc(CharVal, Int8Ty);
1377 Value *Sel1 = NullPtr;
1380 Value *PosVal = ConstantInt::get(SizeTy, Pos);
1381 Value *StrPos = ConstantInt::get(Int8Ty, Str[Pos]);
1382 Value *CEqSPos =
B.CreateICmpEQ(CharVal, StrPos);
1384 Value *
And =
B.CreateAnd(CEqSPos, NGtPos);
1385 Value *SrcPlus =
B.CreateInBoundsGEP(
B.getInt8Ty(), SrcStr, PosVal);
1386 Sel1 =
B.CreateSelect(
And, SrcPlus, NullPtr,
"memchr.sel1");
1389 Value *Str0 = ConstantInt::get(Int8Ty, Str[0]);
1390 Value *CEqS0 =
B.CreateICmpEQ(Str0, CharVal);
1391 Value *NNeZ =
B.CreateICmpNE(
Size, ConstantInt::get(SizeTy, 0));
1393 return B.CreateSelect(
And, SrcStr, Sel1,
"memchr.sel2");
1424 *std::max_element(
reinterpret_cast<const unsigned char *
>(Str.begin()),
1425 reinterpret_cast<const unsigned char *
>(Str.end()));
1438 std::string SortedStr = Str.str();
1441 unsigned NonContRanges = 1;
1442 for (
size_t i = 1; i < SortedStr.size(); ++i) {
1443 if (SortedStr[i] > SortedStr[i - 1] + 1) {
1450 if (NonContRanges > 2)
1454 CharVal =
B.CreateTrunc(CharVal,
B.getInt8Ty());
1457 for (
unsigned char C : SortedStr)
1458 CharCompares.
push_back(
B.CreateICmpEQ(CharVal,
B.getInt8(
C)));
1460 return B.CreateIntToPtr(
B.CreateOr(CharCompares), CI->
getType());
1465 unsigned char Width =
NextPowerOf2(std::max((
unsigned char)7, Max));
1475 C =
B.CreateAnd(
C,
B.getIntN(Width, 0xFF));
1482 Value *Shl =
B.CreateShl(
B.getIntN(Width, 1ULL),
C);
1483 Value *
Bits =
B.CreateIsNotNull(
B.CreateAnd(Shl, BitfieldC),
"memchr.bits");
1487 return B.CreateIntToPtr(
B.CreateLogicalAnd(Bounds, Bits,
"memchr"),
1512 if (Pos == MinSize ||
1513 (StrNCmp && (LStr[Pos] ==
'\0' && RStr[Pos] ==
'\0'))) {
1521 if (LStr[Pos] != RStr[Pos])
1526 typedef unsigned char UChar;
1527 int IRes = UChar(LStr[Pos]) < UChar(RStr[Pos]) ? -1 : 1;
1528 Value *MaxSize = ConstantInt::get(
Size->getType(), Pos);
1531 return B.CreateSelect(Cmp, Zero, Res);
1543 Value *LHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
LHS,
"lhsc"),
1545 Value *RHSV =
B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
RHS,
"rhsc"),
1547 return B.CreateSub(LHSV, RHSV,
"chardiff");
1555 Align PrefAlignment =
DL.getPrefTypeAlign(IntType);
1558 Value *LHSV =
nullptr;
1559 if (
auto *LHSC = dyn_cast<Constant>(
LHS))
1562 Value *RHSV =
nullptr;
1563 if (
auto *RHSC = dyn_cast<Constant>(
RHS))
1571 LHSV =
B.CreateLoad(IntType,
LHS,
"lhsv");
1573 RHSV =
B.CreateLoad(IntType,
RHS,
"rhsv");
1574 return B.CreateZExt(
B.CreateICmpNE(LHSV, RHSV), CI->
getType(),
"memcmp");
1582Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(
CallInst *CI,
1602 if (
Value *V = optimizeMemCmpBCmpCommon(CI,
B))
1620 return optimizeMemCmpBCmpCommon(CI,
B);
1626 if (isa<IntrinsicInst>(CI))
1646 if (
N->isNullValue())
1659 if (
N->getZExtValue() <= SrcStr.
size()) {
1668 ConstantInt::get(
N->getType(), std::min(
uint64_t(Pos + 1),
N->getZExtValue()));
1671 return Pos + 1 <=
N->getZExtValue()
1672 ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, NewN)
1686 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
N);
1692 if (isa<IntrinsicInst>(CI))
1705 if (isa<IntrinsicInst>(CI))
1750 case LibFunc_Znwm12__hot_cold_t:
1753 LibFunc_Znwm12__hot_cold_t, HotCold);
1758 LibFunc_Znwm12__hot_cold_t, HotCold);
1760 case LibFunc_Znam12__hot_cold_t:
1763 LibFunc_Znam12__hot_cold_t, HotCold);
1768 LibFunc_Znam12__hot_cold_t, HotCold);
1770 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1774 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1776 case LibFunc_ZnwmRKSt9nothrow_t:
1780 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1782 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1786 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1788 case LibFunc_ZnamRKSt9nothrow_t:
1792 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1794 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1798 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1800 case LibFunc_ZnwmSt11align_val_t:
1804 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1806 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1810 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1812 case LibFunc_ZnamSt11align_val_t:
1816 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1818 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1822 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1825 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1829 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1832 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1836 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1839 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1843 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1846 case LibFunc_size_returning_new:
1849 LibFunc_size_returning_new_hot_cold,
1852 case LibFunc_size_returning_new_hot_cold:
1855 LibFunc_size_returning_new_hot_cold,
1858 case LibFunc_size_returning_new_aligned:
1862 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1864 case LibFunc_size_returning_new_aligned_hot_cold:
1868 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1894 if (
FPExtInst *Cast = dyn_cast<FPExtInst>(Val)) {
1895 Value *
Op = Cast->getOperand(0);
1896 if (
Op->getType()->isFloatTy())
1899 if (
ConstantFP *Const = dyn_cast<ConstantFP>(Val)) {
1905 return ConstantFP::get(Const->getContext(),
F);
1913 bool isPrecise =
false) {
1945 CallerName.
size() == (CalleeName.
size() + 1) &&
1958 R =
isBinary ?
B.CreateIntrinsic(IID,
B.getFloatTy(), V)
1959 :
B.CreateIntrinsic(IID,
B.getFloatTy(), V[0]);
1966 return B.CreateFPExt(R,
B.getDoubleTy());
1972 bool isPrecise =
false) {
1979 bool isPrecise =
false) {
1993 assert(
Op->getType()->isArrayTy() &&
"Unexpected signature for cabs!");
1995 Real =
B.CreateExtractValue(
Op, 0,
"real");
1996 Imag =
B.CreateExtractValue(
Op, 1,
"imag");
2006 Value *AbsOp =
nullptr;
2007 if (
ConstantFP *ConstReal = dyn_cast<ConstantFP>(Real)) {
2008 if (ConstReal->isZero())
2011 }
else if (
ConstantFP *ConstImag = dyn_cast<ConstantFP>(Imag)) {
2012 if (ConstImag->isZero())
2018 *CI,
B.CreateUnaryIntrinsic(Intrinsic::fabs, AbsOp, CI,
"cabs"));
2025 Value *RealReal =
B.CreateFMulFMF(Real, Real, CI);
2026 Value *ImagImag =
B.CreateFMulFMF(Imag, Imag, CI);
2028 *CI,
B.CreateUnaryIntrinsic(Intrinsic::sqrt,
2029 B.CreateFAddFMF(RealReal, ImagImag, CI), CI,
2036 if (isa<SIToFPInst>(I2F) || isa<UIToFPInst>(I2F)) {
2037 Value *
Op = cast<Instruction>(I2F)->getOperand(0);
2040 unsigned BitWidth =
Op->getType()->getScalarSizeInBits();
2041 if (
BitWidth < DstWidth || (
BitWidth == DstWidth && isa<SIToFPInst>(I2F))) {
2042 Type *IntTy =
Op->getType()->getWithNewBitWidth(DstWidth);
2043 return isa<SIToFPInst>(I2F) ?
B.CreateSExt(
Op, IntTy)
2044 :
B.CreateZExt(
Op, IntTy);
2085 LibFunc LibFnFloat, LibFnDouble, LibFnLongDouble;
2093 ExpName = TLI->
getName(LibFunc_exp);
2094 ID = Intrinsic::exp;
2095 LibFnFloat = LibFunc_expf;
2096 LibFnDouble = LibFunc_exp;
2097 LibFnLongDouble = LibFunc_expl;
2102 ExpName = TLI->
getName(LibFunc_exp2);
2103 ID = Intrinsic::exp2;
2104 LibFnFloat = LibFunc_exp2f;
2105 LibFnDouble = LibFunc_exp2;
2106 LibFnLongDouble = LibFunc_exp2l;
2113 ?
B.CreateUnaryIntrinsic(
ID,
FMul,
nullptr, ExpName)
2122 substituteInParent(BaseFn, ExpFn);
2139 (isa<SIToFPInst>(Expo) || isa<UIToFPInst>(Expo)) &&
2141 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2146 Constant *One = ConstantFP::get(Ty, 1.0);
2149 return copyFlags(*Pow,
B.CreateIntrinsic(Intrinsic::ldexp,
2150 {Ty, ExpoI->getType()},
2151 {One, ExpoI}, Pow,
"exp2"));
2155 One, ExpoI, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2156 LibFunc_ldexpl,
B, NoAttrs));
2161 if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f, LibFunc_exp2l)) {
2164 BaseR = BaseR / *BaseF;
2166 const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
2168 if ((IsInteger || IsReciprocal) &&
2171 NI > 1 && NI.isPowerOf2()) {
2172 double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
2173 Value *
FMul =
B.CreateFMul(Expo, ConstantFP::get(Ty,
N),
"mul");
2175 return copyFlags(*Pow,
B.CreateUnaryIntrinsic(Intrinsic::exp2,
FMul,
2180 LibFunc_exp2l,
B, NoAttrs));
2186 hasFloatFn(M, TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) {
2190 B.CreateIntrinsic(Intrinsic::exp10, {Ty}, {Expo}, Pow,
"exp10");
2195 LibFunc_exp10f, LibFunc_exp10l,
2205 "pow(1.0, y) should have been simplified earlier!");
2207 Value *Log =
nullptr;
2214 Value *
FMul =
B.CreateFMul(Log, Expo,
"mul");
2216 return copyFlags(*Pow,
B.CreateUnaryIntrinsic(Intrinsic::exp2,
FMul,
2218 else if (
hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f,
2222 LibFunc_exp2l,
B, NoAttrs));
2234 return B.CreateUnaryIntrinsic(Intrinsic::sqrt, V,
nullptr,
"sqrt");
2237 if (
hasFloatFn(M, TLI, V->getType(), LibFunc_sqrt, LibFunc_sqrtf,
2243 LibFunc_sqrtl,
B, Attrs);
2280 Sqrt =
B.CreateUnaryIntrinsic(Intrinsic::fabs, Sqrt,
nullptr,
"abs");
2289 Value *FCmp =
B.CreateFCmpOEQ(
Base, NegInf,
"isinf");
2290 Sqrt =
B.CreateSelect(FCmp, PosInf, Sqrt);
2295 Sqrt =
B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt,
"reciprocal");
2304 return B.CreateIntrinsic(Intrinsic::powi, Types, Args);
2326 if (
Value *Exp = replacePowWithExp(Pow,
B))
2333 return B.CreateFDiv(ConstantFP::get(Ty, 1.0),
Base,
"reciprocal");
2337 return ConstantFP::get(Ty, 1.0);
2345 return B.CreateFMul(
Base,
Base,
"square");
2347 if (
Value *Sqrt = replacePowWithSqrt(Pow,
B))
2358 Value *Sqrt =
nullptr;
2359 if (!ExpoA.isInteger()) {
2373 if (!ExpoI.isInteger())
2396 return B.CreateFMul(PowI, Sqrt);
2403 if (AllowApprox && (isa<SIToFPInst>(Expo) || isa<UIToFPInst>(Expo))) {
2410 if (UnsafeFPShrink &&
Name == TLI->
getName(LibFunc_pow) &&
2411 hasFloatVersion(M,
Name)) {
2424 if (UnsafeFPShrink &&
Name == TLI->
getName(LibFunc_exp2) &&
2425 hasFloatVersion(M,
Name))
2434 const bool UseIntrinsic =
Callee->isIntrinsic();
2443 if ((isa<SIToFPInst>(
Op) || isa<UIToFPInst>(
Op)) &&
2445 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2447 Constant *One = ConstantFP::get(Ty, 1.0);
2450 return copyFlags(*CI,
B.CreateIntrinsic(Intrinsic::ldexp,
2451 {Ty, Exp->getType()},
2458 One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2473 if ((
Name ==
"fmin" ||
Name ==
"fmax") && hasFloatVersion(M,
Name))
2488 : Intrinsic::maxnum;
2500 if (UnsafeFPShrink && hasFloatVersion(
Mod, LogNm))
2504 LibFunc LogLb, ExpLb, Exp2Lb, Exp10Lb, PowLb;
2510 LogID = Intrinsic::log;
2511 ExpLb = LibFunc_expf;
2512 Exp2Lb = LibFunc_exp2f;
2513 Exp10Lb = LibFunc_exp10f;
2514 PowLb = LibFunc_powf;
2517 LogID = Intrinsic::log;
2518 ExpLb = LibFunc_exp;
2519 Exp2Lb = LibFunc_exp2;
2520 Exp10Lb = LibFunc_exp10;
2521 PowLb = LibFunc_pow;
2524 LogID = Intrinsic::log;
2525 ExpLb = LibFunc_expl;
2526 Exp2Lb = LibFunc_exp2l;
2527 Exp10Lb = LibFunc_exp10l;
2528 PowLb = LibFunc_powl;
2531 LogID = Intrinsic::log2;
2532 ExpLb = LibFunc_expf;
2533 Exp2Lb = LibFunc_exp2f;
2534 Exp10Lb = LibFunc_exp10f;
2535 PowLb = LibFunc_powf;
2538 LogID = Intrinsic::log2;
2539 ExpLb = LibFunc_exp;
2540 Exp2Lb = LibFunc_exp2;
2541 Exp10Lb = LibFunc_exp10;
2542 PowLb = LibFunc_pow;
2545 LogID = Intrinsic::log2;
2546 ExpLb = LibFunc_expl;
2547 Exp2Lb = LibFunc_exp2l;
2548 Exp10Lb = LibFunc_exp10l;
2549 PowLb = LibFunc_powl;
2551 case LibFunc_log10f:
2552 LogID = Intrinsic::log10;
2553 ExpLb = LibFunc_expf;
2554 Exp2Lb = LibFunc_exp2f;
2555 Exp10Lb = LibFunc_exp10f;
2556 PowLb = LibFunc_powf;
2559 LogID = Intrinsic::log10;
2560 ExpLb = LibFunc_exp;
2561 Exp2Lb = LibFunc_exp2;
2562 Exp10Lb = LibFunc_exp10;
2563 PowLb = LibFunc_pow;
2565 case LibFunc_log10l:
2566 LogID = Intrinsic::log10;
2567 ExpLb = LibFunc_expl;
2568 Exp2Lb = LibFunc_exp2l;
2569 Exp10Lb = LibFunc_exp10l;
2570 PowLb = LibFunc_powl;
2578 if (!IsKnownNoErrno) {
2589 if (IsKnownNoErrno) {
2590 auto *NewLog =
B.CreateUnaryIntrinsic(LogID, Log->
getArgOperand(0), Log);
2591 NewLog->copyMetadata(*Log);
2594 }
else if (LogID == Intrinsic::log || LogID == Intrinsic::log2 ||
2595 LogID == Intrinsic::log10) {
2597 ExpLb = LibFunc_expf;
2598 Exp2Lb = LibFunc_exp2f;
2599 Exp10Lb = LibFunc_exp10f;
2600 PowLb = LibFunc_powf;
2602 ExpLb = LibFunc_exp;
2603 Exp2Lb = LibFunc_exp2;
2604 Exp10Lb = LibFunc_exp10;
2605 PowLb = LibFunc_pow;
2625 if (ArgLb == PowLb || ArgID == Intrinsic::pow || ArgID == Intrinsic::powi) {
2628 ?
B.CreateUnaryIntrinsic(LogID, Arg->
getOperand(0),
nullptr,
"log")
2632 if (ArgID == Intrinsic::powi)
2633 Y =
B.CreateSIToFP(
Y, Ty,
"cast");
2634 Value *MulY =
B.CreateFMul(
Y, LogX,
"mul");
2637 substituteInParent(Arg, MulY);
2643 if (ArgLb == ExpLb || ArgLb == Exp2Lb || ArgLb == Exp10Lb ||
2644 ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) {
2646 if (ArgLb == ExpLb || ArgID == Intrinsic::exp)
2649 else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2)
2650 Eul = ConstantFP::get(Log->
getType(), 2.0);
2652 Eul = ConstantFP::get(Log->
getType(), 10.0);
2654 ?
B.CreateUnaryIntrinsic(LogID, Eul,
nullptr,
"log")
2659 substituteInParent(Arg, MulY);
2679 LibFunc SqrtLb, ExpLb, Exp2Lb, Exp10Lb;
2684 ExpLb = LibFunc_expf;
2685 Exp2Lb = LibFunc_exp2f;
2686 Exp10Lb = LibFunc_exp10f;
2689 ExpLb = LibFunc_exp;
2690 Exp2Lb = LibFunc_exp2;
2691 Exp10Lb = LibFunc_exp10;
2694 ExpLb = LibFunc_expl;
2695 Exp2Lb = LibFunc_exp2l;
2696 Exp10Lb = LibFunc_exp10l;
2703 ExpLb = LibFunc_expf;
2704 Exp2Lb = LibFunc_exp2f;
2705 Exp10Lb = LibFunc_exp10f;
2707 ExpLb = LibFunc_exp;
2708 Exp2Lb = LibFunc_exp2;
2709 Exp10Lb = LibFunc_exp10;
2715 if (ArgLb != ExpLb && ArgLb != Exp2Lb && ArgLb != Exp10Lb &&
2716 ArgID != Intrinsic::exp && ArgID != Intrinsic::exp2)
2720 B.SetInsertPoint(Arg);
2723 B.CreateFMulFMF(ExpOperand, ConstantFP::get(ExpOperand->getType(), 0.5),
2738 (
Callee->getName() ==
"sqrt" ||
2739 Callee->getIntrinsicID() == Intrinsic::sqrt))
2742 if (
Value *Opt = mergeSqrtToExp(CI,
B))
2749 if (!
I ||
I->getOpcode() != Instruction::FMul || !
I->isFast())
2755 Value *Op0 =
I->getOperand(0);
2756 Value *Op1 =
I->getOperand(1);
2757 Value *RepeatOp =
nullptr;
2758 Value *OtherOp =
nullptr;
2770 cast<Instruction>(Op0)->isFast()) {
2775 cast<Instruction>(Op1)->isFast()) {
2790 B.CreateUnaryIntrinsic(Intrinsic::fabs, RepeatOp,
I,
"fabs");
2796 B.CreateUnaryIntrinsic(Intrinsic::sqrt, OtherOp,
I,
"sqrt");
2797 return copyFlags(*CI,
B.CreateFMulFMF(FabsCall, SqrtCall,
I));
2823 if (
auto *FRemI = dyn_cast<Instruction>(FRem))
2824 FRemI->setHasNoNaNs(
true);
2830Value *LibCallSimplifier::optimizeTrigInversionPairs(
CallInst *CI,
2836 if (UnsafeFPShrink &&
2839 hasFloatVersion(M,
Name))
2843 auto *OpC = dyn_cast<CallInst>(Op1);
2848 if (!CI->
isFast() || !OpC->isFast())
2861 .
Case(
"tan", LibFunc_atan)
2862 .
Case(
"atanh", LibFunc_tanh)
2863 .
Case(
"sinh", LibFunc_asinh)
2864 .
Case(
"cosh", LibFunc_acosh)
2865 .
Case(
"tanf", LibFunc_atanf)
2866 .
Case(
"atanhf", LibFunc_tanhf)
2867 .
Case(
"sinhf", LibFunc_asinhf)
2868 .
Case(
"coshf", LibFunc_acoshf)
2869 .
Case(
"tanl", LibFunc_atanl)
2870 .
Case(
"atanhl", LibFunc_tanhl)
2871 .
Case(
"sinhl", LibFunc_asinhl)
2872 .
Case(
"coshl", LibFunc_acoshl)
2873 .
Case(
"asinh", LibFunc_sinh)
2874 .
Case(
"asinhf", LibFunc_sinhf)
2875 .
Case(
"asinhl", LibFunc_sinhl)
2877 if (Func == inverseFunc)
2878 Ret = OpC->getArgOperand(0);
2900 Name =
"__sincospif_stret";
2909 Name =
"__sincospi_stret";
2918 M, *TLI, TheLibFunc, OrigCallee->
getAttributes(), ResTy, ArgTy);
2920 if (
Instruction *ArgInst = dyn_cast<Instruction>(Arg)) {
2923 B.SetInsertPoint(ArgInst->getParent(), ++ArgInst->getIterator());
2927 BasicBlock &EntryBB =
B.GetInsertBlock()->getParent()->getEntryBlock();
2928 B.SetInsertPoint(&EntryBB, EntryBB.
begin());
2931 SinCos =
B.CreateCall(Callee, Arg,
"sincospi");
2934 Sin =
B.CreateExtractValue(SinCos, 0,
"sinpi");
2935 Cos =
B.CreateExtractValue(SinCos, 1,
"cospi");
2937 Sin =
B.CreateExtractElement(SinCos, ConstantInt::get(
B.getInt32Ty(), 0),
2939 Cos =
B.CreateExtractElement(SinCos, ConstantInt::get(
B.getInt32Ty(), 1),
2953 Call->copyFastMathFlags(CI);
2967 Call->copyFastMathFlags(CI);
3007 if (isa<ConstantData>(Arg))
3021 classifyArgUse(U,
F, IsFloat, SinCalls, CosCalls, SinCosCalls);
3027 Value *Sin, *Cos, *SinCos;
3035 replaceAllUsesWith(
C, Res);
3038 replaceTrigInsts(SinCalls, Sin);
3039 replaceTrigInsts(CosCalls, Cos);
3040 replaceTrigInsts(SinCosCalls, SinCos);
3042 return IsSin ? Sin : Cos;
3045void LibCallSimplifier::classifyArgUse(
3050 auto *CI = dyn_cast<CallInst>(Val);
3061 if (!Callee || !TLI->
getLibFunc(*Callee, Func) ||
3067 if (Func == LibFunc_sinpif)
3069 else if (Func == LibFunc_cospif)
3071 else if (Func == LibFunc_sincospif_stret)
3074 if (Func == LibFunc_sinpi)
3076 else if (Func == LibFunc_cospi)
3078 else if (Func == LibFunc_sincospi_stret)
3101 APSInt QuotInt(IntBW,
false);
3108 B.CreateAlignedStore(
3109 ConstantInt::get(
B.getIntNTy(IntBW), QuotInt.getExtValue()),
3111 return ConstantFP::get(CI->
getType(), Rem);
3138 return ConstantFP::get(CI->
getType(), MaxVal);
3150 Type *ArgType =
Op->getType();
3151 Value *
V =
B.CreateIntrinsic(Intrinsic::cttz, {ArgType}, {
Op,
B.getTrue()},
3153 V =
B.CreateAdd(V, ConstantInt::get(
V->getType(), 1));
3154 V =
B.CreateIntCast(V, RetType,
false);
3157 return B.CreateSelect(
Cond, V, ConstantInt::get(RetType, 0));
3164 Type *ArgType =
Op->getType();
3165 Value *
V =
B.CreateIntrinsic(Intrinsic::ctlz, {ArgType}, {
Op,
B.getFalse()},
3169 return B.CreateIntCast(V, CI->
getType(),
false);
3176 Value *IsNeg =
B.CreateIsNeg(
X);
3177 Value *NegX =
B.CreateNSWNeg(
X,
"neg");
3178 return B.CreateSelect(IsNeg, NegX,
X);
3184 Type *ArgType =
Op->getType();
3185 Op =
B.CreateSub(
Op, ConstantInt::get(ArgType,
'0'),
"isdigittmp");
3186 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 10),
"isdigit");
3193 Type *ArgType =
Op->getType();
3194 Op =
B.CreateICmpULT(
Op, ConstantInt::get(ArgType, 128),
"isascii");
3201 ConstantInt::get(CI->
getType(), 0x7F));
3217 if (isa<ConstantPointerNull>(EndPtr)) {
3231 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned,
B);
3263 if (!Callee || !Callee->isDeclaration())
3272 if (StreamArg >= (
int)CI->
arg_size())
3280 return GV->
getName() ==
"stderr";
3290 if (FormatStr.
empty())
3301 if (FormatStr.
size() == 1 || FormatStr ==
"%%") {
3305 Value *IntChar = ConstantInt::get(IntTy, (
unsigned char)FormatStr[0]);
3310 if (FormatStr ==
"%s" && CI->
arg_size() > 1) {
3315 if (OperandStr.
empty())
3318 if (OperandStr.
size() == 1) {
3322 Value *IntChar = ConstantInt::get(IntTy, (
unsigned char)OperandStr[0]);
3326 if (OperandStr.
back() ==
'\n') {
3328 Value *GV =
B.CreateGlobalString(OperandStr,
"str");
3335 if (FormatStr.
back() ==
'\n' &&
3340 Value *GV =
B.CreateGlobalString(FormatStr,
"str");
3346 if (FormatStr ==
"%c" && CI->
arg_size() > 1 &&
3355 if (FormatStr ==
"%s\n" && CI->
arg_size() > 1 &&
3366 if (
Value *V = optimizePrintFString(CI,
B)) {
3377 Callee->getAttributes());
3379 New->setCalledFunction(IPrintFFn);
3389 Callee->getAttributes());
3391 New->setCalledFunction(SmallPrintFFn);
3399Value *LibCallSimplifier::optimizeSPrintFString(
CallInst *CI,
3418 return ConstantInt::get(CI->
getType(), FormatStr.
size());
3423 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3427 if (FormatStr[1] ==
'c') {
3433 B.CreateStore(V,
Ptr);
3434 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(),
Ptr,
B.getInt32(1),
"nul");
3435 B.CreateStore(
B.getInt8(0),
Ptr);
3437 return ConstantInt::get(CI->
getType(), 1);
3440 if (FormatStr[1] ==
's') {
3455 return ConstantInt::get(CI->
getType(), SrcLen - 1);
3458 Value *PtrDiff =
B.CreatePtrDiff(
B.getInt8Ty(), V, Dest);
3459 return B.CreateIntCast(PtrDiff, CI->
getType(),
false);
3470 B.CreateAdd(Len, ConstantInt::get(
Len->getType(), 1),
"leninc");
3474 return B.CreateIntCast(Len, CI->
getType(),
false);
3483 if (
Value *V = optimizeSPrintFString(CI,
B)) {
3494 FT,
Callee->getAttributes());
3496 New->setCalledFunction(SIPrintFFn);
3506 Callee->getAttributes());
3508 New->setCalledFunction(SmallSPrintFFn);
3524 assert(StrArg || (
N < 2 && Str.size() == 1));
3528 if (Str.size() > IntMax)
3534 Value *StrLen = ConstantInt::get(CI->
getType(), Str.size());
3544 NCopy = Str.size() + 1;
3549 if (NCopy && StrArg)
3560 Type *Int8Ty =
B.getInt8Ty();
3561 Value *NulOff =
B.getIntN(IntBits, NCopy);
3562 Value *DstEnd =
B.CreateInBoundsGEP(Int8Ty, DstArg, NulOff,
"endptr");
3563 B.CreateStore(ConstantInt::get(Int8Ty, 0), DstEnd);
3567Value *LibCallSimplifier::optimizeSnPrintFString(
CallInst *CI,
3596 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr,
N,
B);
3601 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() != 4)
3605 if (FormatStr[1] ==
'c') {
3611 return emitSnPrintfMemCpy(CI,
nullptr, CharStr,
N,
B);
3619 B.CreateStore(V,
Ptr);
3620 Ptr =
B.CreateInBoundsGEP(
B.getInt8Ty(),
Ptr,
B.getInt32(1),
"nul");
3621 B.CreateStore(
B.getInt8(0),
Ptr);
3622 return ConstantInt::get(CI->
getType(), 1);
3625 if (FormatStr[1] !=
's')
3634 return emitSnPrintfMemCpy(CI, StrArg, Str,
N,
B);
3638 if (
Value *V = optimizeSnPrintFString(CI,
B)) {
3647Value *LibCallSimplifier::optimizeFPrintFString(
CallInst *CI,
3649 optimizeErrorReporting(CI,
B, 0);
3676 if (FormatStr.
size() != 2 || FormatStr[0] !=
'%' || CI->
arg_size() < 3)
3680 if (FormatStr[1] ==
'c') {
3690 if (FormatStr[1] ==
's') {
3704 if (
Value *V = optimizeFPrintFString(CI,
B)) {
3713 FT,
Callee->getAttributes());
3715 New->setCalledFunction(FIPrintFFn);
3724 auto SmallFPrintFFn =
3726 Callee->getAttributes());
3728 New->setCalledFunction(SmallFPrintFFn);
3737 optimizeErrorReporting(CI,
B, 3);
3742 if (SizeC && CountC) {
3747 return ConstantInt::get(CI->
getType(), 0);
3754 Value *Cast =
B.CreateIntCast(Char, IntTy,
true,
"chari");
3756 return NewCI ? ConstantInt::get(CI->
getType(), 1) : nullptr;
3764 optimizeErrorReporting(CI,
B, 1);
3787 ConstantInt::get(SizeTTy, Len - 1),
3827bool LibCallSimplifier::hasFloatVersion(
const Module *M,
StringRef FuncName) {
3829 FloatFuncName +=
'f';
3833Value *LibCallSimplifier::optimizeStringMemoryLibCall(
CallInst *CI,
3845 "Optimizing string/memory libcall would change the calling convention");
3847 case LibFunc_strcat:
3848 return optimizeStrCat(CI, Builder);
3849 case LibFunc_strncat:
3850 return optimizeStrNCat(CI, Builder);
3851 case LibFunc_strchr:
3852 return optimizeStrChr(CI, Builder);
3853 case LibFunc_strrchr:
3854 return optimizeStrRChr(CI, Builder);
3855 case LibFunc_strcmp:
3856 return optimizeStrCmp(CI, Builder);
3857 case LibFunc_strncmp:
3858 return optimizeStrNCmp(CI, Builder);
3859 case LibFunc_strcpy:
3860 return optimizeStrCpy(CI, Builder);
3861 case LibFunc_stpcpy:
3862 return optimizeStpCpy(CI, Builder);
3863 case LibFunc_strlcpy:
3864 return optimizeStrLCpy(CI, Builder);
3865 case LibFunc_stpncpy:
3866 return optimizeStringNCpy(CI,
true, Builder);
3867 case LibFunc_strncpy:
3868 return optimizeStringNCpy(CI,
false, Builder);
3869 case LibFunc_strlen:
3870 return optimizeStrLen(CI, Builder);
3871 case LibFunc_strnlen:
3872 return optimizeStrNLen(CI, Builder);
3873 case LibFunc_strpbrk:
3874 return optimizeStrPBrk(CI, Builder);
3875 case LibFunc_strndup:
3876 return optimizeStrNDup(CI, Builder);
3877 case LibFunc_strtol:
3878 case LibFunc_strtod:
3879 case LibFunc_strtof:
3880 case LibFunc_strtoul:
3881 case LibFunc_strtoll:
3882 case LibFunc_strtold:
3883 case LibFunc_strtoull:
3884 return optimizeStrTo(CI, Builder);
3885 case LibFunc_strspn:
3886 return optimizeStrSpn(CI, Builder);
3887 case LibFunc_strcspn:
3888 return optimizeStrCSpn(CI, Builder);
3889 case LibFunc_strstr:
3890 return optimizeStrStr(CI, Builder);
3891 case LibFunc_memchr:
3892 return optimizeMemChr(CI, Builder);
3893 case LibFunc_memrchr:
3894 return optimizeMemRChr(CI, Builder);
3896 return optimizeBCmp(CI, Builder);
3897 case LibFunc_memcmp:
3898 return optimizeMemCmp(CI, Builder);
3899 case LibFunc_memcpy:
3900 return optimizeMemCpy(CI, Builder);
3901 case LibFunc_memccpy:
3902 return optimizeMemCCpy(CI, Builder);
3903 case LibFunc_mempcpy:
3904 return optimizeMemPCpy(CI, Builder);
3905 case LibFunc_memmove:
3906 return optimizeMemMove(CI, Builder);
3907 case LibFunc_memset:
3908 return optimizeMemSet(CI, Builder);
3909 case LibFunc_realloc:
3910 return optimizeRealloc(CI, Builder);
3911 case LibFunc_wcslen:
3912 return optimizeWcslen(CI, Builder);
3914 return optimizeBCopy(CI, Builder);
3916 case LibFunc_ZnwmRKSt9nothrow_t:
3917 case LibFunc_ZnwmSt11align_val_t:
3918 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
3920 case LibFunc_ZnamRKSt9nothrow_t:
3921 case LibFunc_ZnamSt11align_val_t:
3922 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
3923 case LibFunc_Znwm12__hot_cold_t:
3924 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
3925 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
3926 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
3927 case LibFunc_Znam12__hot_cold_t:
3928 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
3929 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
3930 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
3931 case LibFunc_size_returning_new:
3932 case LibFunc_size_returning_new_hot_cold:
3933 case LibFunc_size_returning_new_aligned:
3934 case LibFunc_size_returning_new_aligned_hot_cold:
3935 return optimizeNew(CI, Builder, Func);
3951 if (CharSeq.
empty())
3952 Fill =
APInt(32, 0);
3959Value *LibCallSimplifier::optimizeFloatingPointLibCall(
CallInst *CI,
3968 if (
Value *V = optimizeSymmetric(CI, Func, Builder))
3972 case LibFunc_sinpif:
3974 return optimizeSinCosPi(CI,
true, Builder);
3975 case LibFunc_cospif:
3977 return optimizeSinCosPi(CI,
false, Builder);
3981 return optimizePow(CI, Builder);
3985 return optimizeExp2(CI, Builder);
3993 return optimizeSqrt(CI, Builder);
3997 return optimizeFMod(CI, Builder);
4001 case LibFunc_log10f:
4003 case LibFunc_log10l:
4004 case LibFunc_log1pf:
4006 case LibFunc_log1pl:
4013 return optimizeLog(CI, Builder);
4021 case LibFunc_asinhf:
4022 case LibFunc_asinhl:
4027 case LibFunc_atanhf:
4028 case LibFunc_atanhl:
4029 return optimizeTrigInversionPairs(CI, Builder);
4036 case LibFunc_roundeven:
4038 case LibFunc_nearbyint:
4058 case LibFunc_copysign:
4065 return optimizeFdim(CI, Builder);
4072 return optimizeFMinFMax(CI, Builder);
4076 return optimizeCAbs(CI, Builder);
4077 case LibFunc_remquo:
4078 case LibFunc_remquof:
4079 case LibFunc_remquol:
4080 return optimizeRemquo(CI, Builder);
4115 else if (isa<FPMathOperator>(CI) && CI->
isFast())
4116 UnsafeFPShrink =
true;
4120 if (!IsCallingConvC)
4124 switch (
II->getIntrinsicID()) {
4125 case Intrinsic::pow:
4126 return optimizePow(CI, Builder);
4127 case Intrinsic::exp2:
4128 return optimizeExp2(CI, Builder);
4129 case Intrinsic::log:
4130 case Intrinsic::log2:
4131 case Intrinsic::log10:
4132 return optimizeLog(CI, Builder);
4133 case Intrinsic::sqrt:
4134 return optimizeSqrt(CI, Builder);
4135 case Intrinsic::memset:
4136 return optimizeMemSet(CI, Builder);
4137 case Intrinsic::memcpy:
4138 return optimizeMemCpy(CI, Builder);
4139 case Intrinsic::memmove:
4140 return optimizeMemMove(CI, Builder);
4141 case Intrinsic::sin:
4142 case Intrinsic::cos:
4152 if (
Value *SimplifiedFortifiedCI =
4154 return SimplifiedFortifiedCI;
4161 if (
Value *V = optimizeStringMemoryLibCall(CI, Builder))
4163 if (
Value *V = optimizeFloatingPointLibCall(CI, Func, Builder))
4169 return optimizeFFS(CI, Builder);
4173 return optimizeFls(CI, Builder);
4177 return optimizeAbs(CI, Builder);
4178 case LibFunc_isdigit:
4179 return optimizeIsDigit(CI, Builder);
4180 case LibFunc_isascii:
4181 return optimizeIsAscii(CI, Builder);
4182 case LibFunc_toascii:
4183 return optimizeToAscii(CI, Builder);
4187 return optimizeAtoi(CI, Builder);
4188 case LibFunc_strtol:
4189 case LibFunc_strtoll:
4190 return optimizeStrToInt(CI, Builder,
true);
4191 case LibFunc_strtoul:
4192 case LibFunc_strtoull:
4193 return optimizeStrToInt(CI, Builder,
false);
4194 case LibFunc_printf:
4195 return optimizePrintF(CI, Builder);
4196 case LibFunc_sprintf:
4197 return optimizeSPrintF(CI, Builder);
4198 case LibFunc_snprintf:
4199 return optimizeSnPrintF(CI, Builder);
4200 case LibFunc_fprintf:
4201 return optimizeFPrintF(CI, Builder);
4202 case LibFunc_fwrite:
4203 return optimizeFWrite(CI, Builder);
4205 return optimizeFPuts(CI, Builder);
4207 return optimizePuts(CI, Builder);
4208 case LibFunc_perror:
4209 return optimizeErrorReporting(CI, Builder);
4210 case LibFunc_vfprintf:
4211 case LibFunc_fiprintf:
4212 return optimizeErrorReporting(CI, Builder, 0);
4215 return optimizeExit(CI);
4229 : FortifiedSimplifier(TLI),
DL(
DL), TLI(TLI), DT(DT), DC(DC), AC(AC),
4230 ORE(ORE), BFI(BFI), PSI(PSI), Replacer(Replacer), Eraser(Eraser) {}
4237void LibCallSimplifier::eraseFromParent(
Instruction *
I) {
4276bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(
4277 CallInst *CI,
unsigned ObjSizeOp, std::optional<unsigned> SizeOp,
4278 std::optional<unsigned> StrOp, std::optional<unsigned> FlagOp) {
4283 if (!Flag || !
Flag->isZero())
4292 if (ObjSizeCI->isMinusOne())
4295 if (OnlyLowerUnknownSize)
4305 return ObjSizeCI->getZExtValue() >=
Len;
4311 return ObjSizeCI->getZExtValue() >= SizeCI->getZExtValue();
4317Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(
CallInst *CI,
4319 if (isFortifiedCallFoldable(CI, 3, 2)) {
4329Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(
CallInst *CI,
4331 if (isFortifiedCallFoldable(CI, 3, 2)) {
4341Value *FortifiedLibCallSimplifier::optimizeMemSetChk(
CallInst *CI,
4343 if (isFortifiedCallFoldable(CI, 3, 2)) {
4353Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(
CallInst *CI,
4356 if (isFortifiedCallFoldable(CI, 3, 2))
4364Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(
CallInst *CI,
4372 if (Func == LibFunc_stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src) {
4374 return StrLen ?
B.CreateInBoundsGEP(
B.getInt8Ty(), Dst, StrLen) :
nullptr;
4382 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) {
4383 if (Func == LibFunc_strcpy_chk)
4389 if (OnlyLowerUnknownSize)
4401 Value *LenV = ConstantInt::get(SizeTTy, Len);
4405 if (Ret && Func == LibFunc_stpcpy_chk)
4406 return B.CreateInBoundsGEP(
B.getInt8Ty(), Dst,
4407 ConstantInt::get(SizeTTy, Len - 1));
4408 return copyFlags(*CI, cast<CallInst>(Ret));
4411Value *FortifiedLibCallSimplifier::optimizeStrLenChk(
CallInst *CI,
4413 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0))
4419Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(
CallInst *CI,
4422 if (isFortifiedCallFoldable(CI, 3, 2)) {
4423 if (Func == LibFunc_strncpy_chk)
4436Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(
CallInst *CI,
4438 if (isFortifiedCallFoldable(CI, 4, 3))
4446Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(
CallInst *CI,
4448 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) {
4458Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(
CallInst *CI,
4460 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) {
4464 VariadicArgs,
B, TLI));
4470Value *FortifiedLibCallSimplifier::optimizeStrCatChk(
CallInst *CI,
4472 if (isFortifiedCallFoldable(CI, 2))
4479Value *FortifiedLibCallSimplifier::optimizeStrLCat(
CallInst *CI,
4481 if (isFortifiedCallFoldable(CI, 3))
4489Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(
CallInst *CI,
4491 if (isFortifiedCallFoldable(CI, 3))
4499Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(
CallInst *CI,
4501 if (isFortifiedCallFoldable(CI, 3))
4509Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(
CallInst *CI,
4511 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2))
4519Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(
CallInst *CI,
4521 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1))
4564 case LibFunc_memcpy_chk:
4565 return optimizeMemCpyChk(CI, Builder);
4566 case LibFunc_mempcpy_chk:
4567 return optimizeMemPCpyChk(CI, Builder);
4568 case LibFunc_memmove_chk:
4569 return optimizeMemMoveChk(CI, Builder);
4570 case LibFunc_memset_chk:
4571 return optimizeMemSetChk(CI, Builder);
4572 case LibFunc_stpcpy_chk:
4573 case LibFunc_strcpy_chk:
4574 return optimizeStrpCpyChk(CI, Builder, Func);
4575 case LibFunc_strlen_chk:
4576 return optimizeStrLenChk(CI, Builder);
4577 case LibFunc_stpncpy_chk:
4578 case LibFunc_strncpy_chk:
4579 return optimizeStrpNCpyChk(CI, Builder, Func);
4580 case LibFunc_memccpy_chk:
4581 return optimizeMemCCpyChk(CI, Builder);
4582 case LibFunc_snprintf_chk:
4583 return optimizeSNPrintfChk(CI, Builder);
4584 case LibFunc_sprintf_chk:
4585 return optimizeSPrintfChk(CI, Builder);
4586 case LibFunc_strcat_chk:
4587 return optimizeStrCatChk(CI, Builder);
4588 case LibFunc_strlcat_chk:
4589 return optimizeStrLCat(CI, Builder);
4590 case LibFunc_strncat_chk:
4591 return optimizeStrNCatChk(CI, Builder);
4592 case LibFunc_strlcpy_chk:
4593 return optimizeStrLCpyChk(CI, Builder);
4594 case LibFunc_vsnprintf_chk:
4595 return optimizeVSNPrintfChk(CI, Builder);
4596 case LibFunc_vsprintf_chk:
4597 return optimizeVSPrintfChk(CI, Builder);
4606 : 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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
Module.h This file contains the declarations for the Module class.
uint64_t IntrinsicInst * II
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
static bool isBinary(MachineInstr &MI)
const SmallVectorImpl< MachineOperand > & Cond
static bool isDigit(const char C)
static bool isOnlyUsedInEqualityComparison(Value *V, Value *With)
Return true if it is only used in equality comparisons with With.
static void annotateNonNullAndDereferenceable(CallInst *CI, ArrayRef< unsigned > ArgNos, Value *Size, const DataLayout &DL)
static cl::opt< unsigned, false, HotColdHintParser > ColdNewHintValue("cold-new-hint-value", cl::Hidden, cl::init(1), cl::desc("Value to pass to hot/cold operator new for cold allocation"))
static bool insertSinCosCall(IRBuilderBase &B, Function *OrigCallee, Value *Arg, bool UseFloat, Value *&Sin, Value *&Cos, Value *&SinCos, const TargetLibraryInfo *TLI)
static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, const DataLayout &DL)
static Value * mergeAttributesAndFlags(CallInst *NewCI, const CallInst &Old)
static cl::opt< bool > OptimizeHotColdNew("optimize-hot-cold-new", cl::Hidden, cl::init(false), cl::desc("Enable hot/cold operator new library calls"))
static Value * optimizeBinaryDoubleFP(CallInst *CI, IRBuilderBase &B, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float for binary functions.
static bool ignoreCallingConv(LibFunc Func)
static cl::opt< bool > OptimizeExistingHotColdNew("optimize-existing-hot-cold-new", cl::Hidden, cl::init(false), cl::desc("Enable optimization of existing hot/cold operator new library calls"))
static void annotateDereferenceableBytes(CallInst *CI, ArrayRef< unsigned > ArgNos, uint64_t DereferenceableBytes)
static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg)
static Value * optimizeDoubleFP(CallInst *CI, IRBuilderBase &B, bool isBinary, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float functions.
static Value * optimizeSymmetricCall(CallInst *CI, bool IsEven, IRBuilderBase &B)
static Value * getSqrtCall(Value *V, AttributeList Attrs, bool NoErrno, Module *M, IRBuilderBase &B, const TargetLibraryInfo *TLI)
static Value * valueHasFloatPrecision(Value *Val)
Return a variant of Val with float type.
static Value * optimizeMemCmpConstantSize(CallInst *CI, Value *LHS, Value *RHS, uint64_t Len, IRBuilderBase &B, const DataLayout &DL)
static Value * createPowWithIntegerExponent(Value *Base, Value *Expo, Module *M, IRBuilderBase &B)
static Value * convertStrToInt(CallInst *CI, StringRef &Str, Value *EndPtr, uint64_t Base, bool AsSigned, IRBuilderBase &B)
static Value * memChrToCharCompare(CallInst *CI, Value *NBytes, IRBuilderBase &B, const DataLayout &DL)
static Value * copyFlags(const CallInst &Old, Value *New)
static StringRef substr(StringRef Str, uint64_t Len)
static cl::opt< unsigned, false, HotColdHintParser > HotNewHintValue("hot-new-hint-value", cl::Hidden, cl::init(254), cl::desc("Value to pass to hot/cold operator new for hot allocation"))
static bool isTrigLibCall(CallInst *CI)
static Value * optimizeNaN(CallInst *CI)
Constant folding nan/nanf/nanl.
static bool isOnlyUsedInComparisonWithZero(Value *V)
static Value * replaceUnaryCall(CallInst *CI, IRBuilderBase &B, Intrinsic::ID IID)
static bool callHasFloatingPointArgument(const CallInst *CI)
static Value * optimizeUnaryDoubleFP(CallInst *CI, IRBuilderBase &B, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float for unary functions.
static bool callHasFP128Argument(const CallInst *CI)
static void annotateNonNullNoUndefBasedOnAccess(CallInst *CI, ArrayRef< unsigned > ArgNos)
static Value * optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS, Value *Size, bool StrNCmp, IRBuilderBase &B, const DataLayout &DL)
static Value * getIntToFPVal(Value *I2F, IRBuilderBase &B, unsigned DstWidth)
static cl::opt< bool > EnableUnsafeFPShrink("enable-double-float-shrink", cl::Hidden, cl::init(false), cl::desc("Enable unsafe double to float " "shrinking for math lib calls"))
static cl::opt< unsigned, false, HotColdHintParser > NotColdNewHintValue("notcold-new-hint-value", cl::Hidden, cl::init(128), cl::desc("Value to pass to hot/cold operator new for " "notcold (warm) allocation"))
This file defines the SmallString class.
opStatus divide(const APFloat &RHS, roundingMode RM)
bool isFiniteNonZero() const
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
opStatus subtract(const APFloat &RHS, roundingMode RM)
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
opStatus add(const APFloat &RHS, roundingMode RM)
const fltSemantics & getSemantics() const
LLVM_ABI float convertToFloat() const
Converts this APFloat to host float value.
opStatus remainder(const APFloat &RHS)
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Class for arbitrary precision integers.
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
An arbitrary precision integer that knows its signedness.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
A cache of @llvm.assume calls within a function.
static LLVM_ABI AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute > > Attrs)
Create an AttributeList with the specified parameters in it.
Attribute getFnAttr(Attribute::AttrKind Kind) const
Return the attribute object that exists for the function.
LLVM_ABI AttributeSet getParamAttrs(unsigned ArgNo) const
The attributes for the argument or parameter at the given index are returned.
AttributeList addParamAttributes(LLVMContext &C, unsigned ArgNo, const AttrBuilder &B) const
Add an argument attribute to the list.
LLVM_ABI MaybeAlign getAlignment() const
static LLVM_ABI Attribute getWithDereferenceableBytes(LLVMContext &Context, uint64_t Bytes)
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
static LLVM_ABI Attribute getWithCaptureInfo(LLVMContext &Context, CaptureInfo CI)
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
void removeParamAttrs(unsigned ArgNo, const AttributeMask &AttrsToRemove)
Removes the attributes from the given argument.
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
bool isNoBuiltin() const
Return true if the call should not be treated as a call to a builtin.
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Removes the attribute from the given argument.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool doesNotAccessMemory(unsigned OpNo) const
void removeRetAttrs(const AttributeMask &AttrsToRemove)
Removes the attributes from the return value.
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
bool isStrictFP() const
Determine if the call requires strict floating point semantics.
AttributeSet getParamAttributes(unsigned ArgNo) const
Return the param attributes for this call.
uint64_t getParamDereferenceableBytes(unsigned i) const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
AttributeSet getRetAttributes() const
Return the return attributes for this call.
void setAttributes(AttributeList A)
Set the attributes for this call.
bool doesNotThrow() const
Determine if the call cannot unwind.
Value * getArgOperand(unsigned i) const
uint64_t getParamDereferenceableOrNullBytes(unsigned i) const
Extract the number of dereferenceable_or_null bytes for a parameter (0=unknown).
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
TailCallKind getTailCallKind() const
bool isMustTailCall() const
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
@ ICMP_UGT
unsigned greater than
@ ICMP_ULT
unsigned less than
@ ICMP_ULE
unsigned less or equal
Predicate getPredicate() const
Return the predicate for this instruction.
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
ConstantFP - Floating Point Values [float, double].
static LLVM_ABI Constant * getInfinity(Type *Ty, bool Negative=false)
static LLVM_ABI Constant * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
This is the shared class of boolean and integer constants.
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
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.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
LLVM_ABI unsigned getIndexTypeSizeInBits(Type *Ty) const
The size in bits of the index used in GEP calculation for this type.
bool fitsInLegalInteger(unsigned Width) const
Returns true if the specified type fits in a native integer type supported by the CPU.
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.
Convenience struct for specifying and reasoning about fast-math flags.
void setNoSignedZeros(bool B=true)
static FastMathFlags getFast()
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
FortifiedLibCallSimplifier(const TargetLibraryInfo *TLI, bool OnlyLowerUnknownSize=false)
Value * optimizeCall(CallInst *CI, IRBuilderBase &B)
Take the given call instruction and return a more optimal value to replace the instruction with or 0 ...
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
AttributeList getAttributes() const
Return the attribute list for this Function.
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Common base class shared among various IRBuilders.
void setDefaultOperandBundles(ArrayRef< OperandBundleDef > OpBundles)
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI bool isFast() const LLVM_READONLY
Determine whether all fast-math-flags are set.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI bool hasApproxFunc() const LLVM_READONLY
Determine whether the approximate-math-functions flag is set.
LLVM_ABI bool hasAllowReassoc() const LLVM_READONLY
Determine whether the allow-reassociation flag is set.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
A wrapper class for inspecting calls to intrinsic functions.
LibCallSimplifier(const DataLayout &DL, const TargetLibraryInfo *TLI, DominatorTree *DT, DomConditionCache *DC, AssumptionCache *AC, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, function_ref< void(Instruction *, Value *)> Replacer=&replaceAllUsesWithDefault, function_ref< void(Instruction *)> Eraser=&eraseFromParentDefault)
Value * optimizeCall(CallInst *CI, IRBuilderBase &B)
optimizeCall - Take the given call instruction and return a more optimal value to replace the instruc...
An instruction for reading from memory.
Value * getPointerOperand()
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Analysis providing profile information.
This class represents the LLVM 'select' instruction.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
char back() const
back - Get the last character in the string.
constexpr size_t size() const
size - Get the string size.
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
static constexpr size_t npos
int compare(StringRef RHS) const
compare - Compare two strings; the result is negative, zero, or positive if this string is lexicograp...
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
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.
unsigned getWCharSize(const Module &M) const
Returns the size of the wchar_t type in bytes or 0 if the size is unknown.
ConstantInt * getAsSizeT(uint64_t V, const Module &M) const
Returns a constant materialized as a size_t type.
unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
StringRef getName(LibFunc F) const
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
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.
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.
bool isStructTy() const
True if this is an instance of StructType.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
LLVM_ABI const fltSemantics & getFltSemantics() const
bool isIntegerTy() const
True if this is an instance of IntegerType.
LLVM_ABI unsigned getIntegerBitWidth() const
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
A Use represents the edge between a Value definition and its users.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
iterator_range< user_iterator > users()
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
int getNumOccurrences() const
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
LLVM_ABI AttributeMask typeIncompatible(Type *Ty, AttributeSet AS, AttributeSafetyKind ASK=ASK_ALL)
Which attributes cannot be applied to a type.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
BinaryOp_match< LHS, RHS, Instruction::FMul > m_FMul(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
apfloat_match m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
initializer< Ty > init(const Ty &Val)
NodeAddr< FuncNode * > Func
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 Value * emitStrChr(Value *Ptr, char C, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strchr function to the builder, for the specified pointer and character.
constexpr uint64_t maxUIntN(uint64_t N)
Gets the maximum value for a N-bit unsigned integer.
LLVM_ABI Value * emitPutChar(Value *Char, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the putchar function. This assumes that Char is an 'int'.
LLVM_ABI Value * emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the __memcpy_chk function to the builder.
LLVM_ABI Value * emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncpy function to the builder, for the specified pointer arguments and length.
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
LLVM_ABI Value * emitHotColdNewAlignedNoThrow(Value *Num, Value *Align, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
APFloat abs(APFloat X)
Returns the absolute value of the argument.
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
LLVM_ABI Value * emitSPrintf(Value *Dest, Value *Fmt, ArrayRef< Value * > VariadicArgs, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the sprintf function.
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI Value * emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memrchr function, analogously to emitMemChr.
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
LLVM_ABI Value * emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcat function.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
LLVM_ABI bool hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn)
Check whether the overloaded floating point function corresponding to Ty is available.
LLVM_ABI Value * emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncat function.
LLVM_ABI bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, LibFunc TheLibFunc)
Check whether the library function is available on target and also that it in the current Module is a...
LLVM_ABI Value * emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsnprintf function.
Align getKnownAlignment(Value *V, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to infer an alignment for the specified pointer.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Value * emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strncmp function to the builder.
LLVM_ABI Value * emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memcmp function.
LLVM_ABI Value * emitBinaryFloatFnCall(Value *Op1, Value *Op2, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the binary function named 'Name' (e.g.
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.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI Value * emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the bcmp function.
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.
LLVM_ABI Value * emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsprintf function.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
LLVM_ABI Value * emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the fwrite function.
LLVM_ABI Value * emitSNPrintf(Value *Dest, Value *Size, Value *Fmt, ArrayRef< Value * > Args, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the snprintf function.
@ Mod
The access may modify the value stored in memory.
LLVM_ABI Value * emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the stpcpy function to the builder, for the specified pointer arguments.
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
LLVM_ABI Value * emitHotColdNewNoThrow(Value *Num, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the malloc function.
LLVM_ABI Value * emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memchr function.
LLVM_ABI Value * emitHotColdNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitPutS(Value *Str, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the puts function. This assumes that Str is some pointer.
LLVM_ABI Value * emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the memccpy function.
LLVM_ABI Value * emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitHotColdNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
Emit a call to the hot/cold operator new function.
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
LLVM_ABI Value * emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcpy function.
LLVM_ABI Value * emitHotColdSizeReturningNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strcpy function to the builder, for the specified pointer arguments.
LLVM_ABI Value * emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the mempcpy function.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
static LLVM_ABI const fltSemantics & IEEEsingle() LLVM_READNONE
static constexpr roundingMode rmTowardNegative
static constexpr roundingMode rmNearestTiesToEven
static constexpr roundingMode rmTowardZero
opStatus
IEEE-754R 7: Default exception handling.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Holds functions to get, set or test bitfields.
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
const ConstantDataArray * Array
ConstantDataArray pointer.
bool isNonNegative() const
Returns true if this value is known to be non-negative.
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
static constexpr FPClassTest OrderedLessThanZeroMask
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's know this can never be interpreted as a zero.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
A MapVector that performs no allocations if smaller than a certain size.