42#define DEBUG_TYPE "gisel-known-bits"
50 "Analysis for ComputingKnownBits",
false,
true)
53 : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
58 switch (
MI->getOpcode()) {
59 case TargetOpcode::COPY:
61 case TargetOpcode::G_ASSERT_ALIGN: {
63 return Align(
MI->getOperand(2).getImm());
65 case TargetOpcode::G_FRAME_INDEX: {
66 int FrameIdx =
MI->getOperand(1).getIndex();
67 return MF.getFrameInfo().getObjectAlign(FrameIdx);
69 case TargetOpcode::G_INTRINSIC:
70 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
71 case TargetOpcode::G_INTRINSIC_CONVERGENT:
72 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
74 return TL.computeKnownAlignForTargetInstr(*
this, R, MRI,
Depth + 1);
79 const LLT Ty = MRI.getType(R);
89 const APInt &DemandedElts,
97 LLT Ty = MRI.getType(R);
98 unsigned BitWidth = Ty.getScalarSizeInBits();
103 LLT Ty = MRI.getType(R);
104 const APInt ScalarDemandedElts(1, 1);
105 APInt DemandedElts = Ty.isFixedVector()
107 : ScalarDemandedElts;
116 const APInt ScalarDemandedElts(1, 1);
119 switch (
MI.getOpcode()) {
123 case TargetOpcode::G_BUILD_VECTOR: {
125 if (!DemandedElts[
I])
133 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
136 LLT VecTy = MRI.getType(InVec);
144 if (Idx->ult(NumSrcElts))
150 case TargetOpcode::G_SHUFFLE_VECTOR: {
153 if (SrcTy.isScalableVector())
155 APInt DemandedLHS, DemandedRHS;
157 DemandedElts, DemandedLHS, DemandedRHS))
159 if (!DemandedLHS.
isZero() &&
162 if (!DemandedRHS.
isZero() &&
168 case TargetOpcode::G_OR:
173 case TargetOpcode::G_SELECT:
178 case TargetOpcode::G_SHL: {
208[[maybe_unused]]
static void
211 <<
"] Computed for: " <<
MI <<
"[" <<
Depth <<
"] Known: 0x"
222 const APInt &DemandedElts,
228 if (
Known.isUnknown())
253 const APInt &DemandedElts,
256 unsigned Opcode =
MI.getOpcode();
257 LLT DstTy = MRI.getType(R);
271 "DemandedElt width should equal the fixed vector number of elements");
274 "DemandedElt width should be 1 for scalars or scalable vectors");
299 TL.computeKnownBitsForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
302 case TargetOpcode::G_BUILD_VECTOR: {
304 Known.Zero.setAllBits();
305 Known.One.setAllBits();
307 if (!DemandedElts[
I])
316 if (
Known.isUnknown())
321 case TargetOpcode::G_SPLAT_VECTOR: {
329 case TargetOpcode::COPY:
330 case TargetOpcode::G_PHI:
331 case TargetOpcode::PHI: {
337 assert(
MI.getOperand(0).getSubReg() == 0 &&
"Is this code in SSA?");
340 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
343 LLT SrcTy = MRI.getType(SrcReg);
351 if (SrcReg.
isVirtual() && Src.getSubReg() == 0 &&
353 APInt NowDemandedElts;
354 if (!SrcTy.isFixedVector()) {
355 NowDemandedElts =
APInt(1, 1);
358 NowDemandedElts = DemandedElts;
365 Depth + (Opcode != TargetOpcode::COPY));
370 if (
Known.isUnknown())
380 case TargetOpcode::G_STEP_VECTOR: {
381 APInt Step =
MI.getOperand(1).getCImm()->getValue();
389 const APInt MinNumElts =
395 .
umul_ov(MinNumElts, Overflow);
398 const APInt MaxValue = (MaxNumElts - 1).
umul_ov(Step, Overflow);
404 case TargetOpcode::G_VSCALE: {
406 const APInt &Multiplier =
MI.getOperand(1).getCImm()->getValue();
410 case TargetOpcode::G_CONSTANT: {
414 case TargetOpcode::G_FRAME_INDEX: {
415 int FrameIdx =
MI.getOperand(1).getIndex();
416 TL.computeKnownBitsForStackObjectPointer(
417 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
420 case TargetOpcode::G_SUB: {
429 case TargetOpcode::G_XOR: {
438 case TargetOpcode::G_PTR_ADD: {
442 LLT Ty = MRI.getType(
MI.getOperand(1).getReg());
443 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
447 case TargetOpcode::G_ADD: {
455 case TargetOpcode::G_AND: {
465 case TargetOpcode::G_OR: {
475 case TargetOpcode::G_MUL: {
483 case TargetOpcode::G_UMULH: {
491 case TargetOpcode::G_SMULH: {
499 case TargetOpcode::G_UAVGFLOOR: {
507 case TargetOpcode::G_UAVGCEIL: {
515 case TargetOpcode::G_SAVGFLOOR: {
523 case TargetOpcode::G_SAVGCEIL: {
531 case TargetOpcode::G_ABDU: {
539 case TargetOpcode::G_ABDS: {
548 if (SignBits1 == 1) {
554 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
557 case TargetOpcode::G_SADDSAT: {
565 case TargetOpcode::G_UADDSAT: {
573 case TargetOpcode::G_SSUBSAT: {
581 case TargetOpcode::G_USUBSAT: {
589 case TargetOpcode::G_UDIV: {
598 case TargetOpcode::G_SDIV: {
607 case TargetOpcode::G_UREM: {
619 case TargetOpcode::G_SREM: {
631 case TargetOpcode::G_SELECT: {
632 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
636 case TargetOpcode::G_SMIN: {
646 case TargetOpcode::G_SMAX: {
656 case TargetOpcode::G_UMIN: {
665 case TargetOpcode::G_UMAX: {
674 case TargetOpcode::G_FCMP:
675 case TargetOpcode::G_ICMP: {
678 if (TL.getBooleanContents(DstTy.
isVector(),
679 Opcode == TargetOpcode::G_FCMP) ==
682 Known.Zero.setBitsFrom(1);
685 case TargetOpcode::G_SEXT: {
693 case TargetOpcode::G_ASSERT_SEXT:
694 case TargetOpcode::G_SEXT_INREG: {
700 case TargetOpcode::G_ANYEXT: {
706 case TargetOpcode::G_LOAD: {
714 case TargetOpcode::G_SEXTLOAD:
715 case TargetOpcode::G_ZEXTLOAD: {
722 Known = Opcode == TargetOpcode::G_SEXTLOAD
727 case TargetOpcode::G_ASHR: {
736 case TargetOpcode::G_LSHR: {
745 case TargetOpcode::G_SHL: {
754 case TargetOpcode::G_ROTL:
755 case TargetOpcode::G_ROTR: {
764 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
767 if (Opcode == TargetOpcode::G_ROTL)
774 case TargetOpcode::G_FSHL:
775 case TargetOpcode::G_FSHR: {
781 const APInt Amt = *MaybeAmtOp;
786 Known = Opcode == TargetOpcode::G_FSHL
791 case TargetOpcode::G_INTTOPTR:
792 case TargetOpcode::G_PTRTOINT:
797 case TargetOpcode::G_ZEXT:
798 case TargetOpcode::G_TRUNC: {
804 case TargetOpcode::G_ASSERT_ZEXT: {
808 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
809 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
811 Known.Zero |= (~InMask);
815 case TargetOpcode::G_ASSERT_ALIGN: {
816 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
821 Known.Zero.setLowBits(LogOfAlign);
822 Known.One.clearLowBits(LogOfAlign);
825 case TargetOpcode::G_MERGE_VALUES: {
826 unsigned NumOps =
MI.getNumOperands();
827 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
829 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
832 DemandedElts,
Depth + 1);
833 Known.insertBits(SrcOpKnown,
I * OpSize);
837 case TargetOpcode::G_UNMERGE_VALUES: {
838 unsigned NumOps =
MI.getNumOperands();
840 LLT SrcTy = MRI.getType(SrcReg);
842 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
846 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
848 APInt SubDemandedElts = DemandedElts;
849 if (SrcTy.isVector()) {
852 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
858 if (SrcTy.isVector())
859 Known = std::move(SrcOpKnown);
864 case TargetOpcode::G_BSWAP: {
870 case TargetOpcode::G_BITREVERSE: {
876 case TargetOpcode::G_CTPOP: {
883 Known.Zero.setBitsFrom(LowBits);
888 case TargetOpcode::G_UBFX: {
889 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
899 case TargetOpcode::G_SBFX: {
900 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
917 case TargetOpcode::G_UADDO:
918 case TargetOpcode::G_UADDE:
919 case TargetOpcode::G_SADDO:
920 case TargetOpcode::G_SADDE: {
921 if (
MI.getOperand(1).getReg() == R) {
924 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
927 Known.Zero.setBitsFrom(1);
931 assert(
MI.getOperand(0).getReg() == R &&
932 "We only compute knownbits for the sum here.");
935 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
939 Carry = Carry.
trunc(1);
951 case TargetOpcode::G_USUBO:
952 case TargetOpcode::G_USUBE:
953 case TargetOpcode::G_SSUBO:
954 case TargetOpcode::G_SSUBE:
955 case TargetOpcode::G_UMULO:
956 case TargetOpcode::G_SMULO: {
957 if (
MI.getOperand(1).getReg() == R) {
960 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
963 Known.Zero.setBitsFrom(1);
967 case TargetOpcode::G_CTTZ:
968 case TargetOpcode::G_CTTZ_ZERO_POISON: {
975 Known.Zero.setBitsFrom(LowBits);
978 case TargetOpcode::G_CTLZ:
979 case TargetOpcode::G_CTLZ_ZERO_POISON: {
986 Known.Zero.setBitsFrom(LowBits);
989 case TargetOpcode::G_CTLS: {
993 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
1001 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1008 LLT VecVT = MRI.getType(InVec);
1020 Known.Zero.setAllBits();
1021 Known.One.setAllBits();
1026 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
1033 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1035 Register InVec = Insert.getVectorReg();
1036 Register InVal = Insert.getElementReg();
1037 Register EltNo = Insert.getIndexReg();
1038 LLT VecVT = MRI.getType(InVec);
1046 bool DemandedVal =
true;
1047 APInt DemandedVecElts = DemandedElts;
1048 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
1049 unsigned EltIdx = ConstEltNo->getZExtValue();
1050 DemandedVal = !!DemandedElts[EltIdx];
1053 Known.setAllConflict();
1058 if (!!DemandedVecElts) {
1064 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1066 LLT SrcTy = MRI.getType(SrcReg);
1067 APInt DemandedSrcElts;
1068 if (SrcTy.isScalableVector()) {
1069 DemandedSrcElts =
APInt(1, 1);
1071 uint64_t Idx =
MI.getOperand(2).getImm();
1072 unsigned NumSrcElts = SrcTy.getNumElements();
1073 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
1078 case TargetOpcode::G_SHUFFLE_VECTOR: {
1079 APInt DemandedLHS, DemandedRHS;
1082 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1084 DemandedElts, DemandedLHS, DemandedRHS))
1088 Known.Zero.setAllBits();
1089 Known.One.setAllBits();
1090 if (!!DemandedLHS) {
1096 if (
Known.isUnknown())
1098 if (!!DemandedRHS) {
1105 case TargetOpcode::G_CONCAT_VECTORS: {
1106 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
1109 Known.Zero.setAllBits();
1110 Known.One.setAllBits();
1111 unsigned NumSubVectorElts =
1112 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1116 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
1117 if (!!DemandedSub) {
1123 if (
Known.isUnknown())
1128 case TargetOpcode::G_ABS: {
1145 APInt DemandedElts =
1159void GISelValueTracking::computeKnownFPClassForFPTrunc(
1167 KnownFPClass KnownSrc;
1168 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1173void GISelValueTracking::computeKnownFPClass(
Register R,
1174 const APInt &DemandedElts,
1178 assert(
Known.isUnknown() &&
"should not be called with known information");
1180 if (!DemandedElts) {
1188 MachineInstr &
MI = *MRI.getVRegDef(R);
1189 unsigned Opcode =
MI.getOpcode();
1190 LLT DstTy = MRI.getType(R);
1198 switch (Cst->getKind()) {
1200 auto APF = Cst->getScalarValue();
1201 Known.KnownFPClasses = APF.classify();
1202 Known.setSignBit(APF.isNegative());
1207 bool SignBitAllZero =
true;
1208 bool SignBitAllOne =
true;
1210 for (
auto C : *Cst) {
1211 Known.KnownFPClasses |=
C.classify();
1213 SignBitAllZero =
false;
1215 SignBitAllOne =
false;
1218 if (SignBitAllOne != SignBitAllZero)
1219 Known.setSignBit(SignBitAllOne);
1234 KnownNotFromFlags |=
fcNan;
1236 KnownNotFromFlags |=
fcInf;
1240 InterestedClasses &= ~KnownNotFromFlags;
1243 [=, &
Known] {
Known.knownNot(KnownNotFromFlags); });
1253 TL.computeKnownFPClassForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
1256 case TargetOpcode::G_FNEG: {
1258 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1262 case TargetOpcode::G_SELECT: {
1285 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1286 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1292 MaskIfTrue = TestedMask;
1293 MaskIfFalse = ~TestedMask;
1296 if (TestedValue ==
LHS) {
1298 FilterLHS = MaskIfTrue;
1299 }
else if (TestedValue ==
RHS) {
1301 FilterRHS = MaskIfFalse;
1304 KnownFPClass Known2;
1305 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS,
Known,
1307 Known.KnownFPClasses &= FilterLHS;
1309 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1316 case TargetOpcode::G_FCOPYSIGN: {
1317 Register Magnitude =
MI.getOperand(1).getReg();
1320 KnownFPClass KnownSign;
1322 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses,
Known,
1324 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1326 Known.copysign(KnownSign);
1329 case TargetOpcode::G_FMA:
1330 case TargetOpcode::G_STRICT_FMA:
1331 case TargetOpcode::G_FMAD: {
1344 KnownFPClass KnownSrc, KnownAddend;
1345 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1347 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1349 if (KnownNotFromFlags) {
1350 KnownSrc.
knownNot(KnownNotFromFlags);
1351 KnownAddend.
knownNot(KnownNotFromFlags);
1355 KnownFPClass KnownSrc[3];
1356 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1358 if (KnownSrc[0].isUnknown())
1360 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1362 if (KnownSrc[1].isUnknown())
1364 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1366 if (KnownSrc[2].isUnknown())
1368 if (KnownNotFromFlags) {
1369 KnownSrc[0].
knownNot(KnownNotFromFlags);
1370 KnownSrc[1].
knownNot(KnownNotFromFlags);
1371 KnownSrc[2].
knownNot(KnownNotFromFlags);
1377 case TargetOpcode::G_FSQRT:
1378 case TargetOpcode::G_STRICT_FSQRT: {
1379 KnownFPClass KnownSrc;
1381 if (InterestedClasses &
fcNan)
1385 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1394 case TargetOpcode::G_FABS: {
1399 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
1405 case TargetOpcode::G_FATAN2: {
1415 KnownFPClass KnownY, KnownX;
1416 computeKnownFPClass(
Y, DemandedElts, InterestedY, KnownY,
Depth + 1);
1417 computeKnownFPClass(
X, DemandedElts, InterestedX, KnownX,
Depth + 1);
1423 case TargetOpcode::G_FSINH: {
1425 KnownFPClass KnownSrc;
1426 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1431 case TargetOpcode::G_FCOSH: {
1433 KnownFPClass KnownSrc;
1434 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1439 case TargetOpcode::G_FTANH: {
1441 KnownFPClass KnownSrc;
1442 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1447 case TargetOpcode::G_FASIN: {
1449 KnownFPClass KnownSrc;
1450 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1455 case TargetOpcode::G_FACOS: {
1457 KnownFPClass KnownSrc;
1458 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1463 case TargetOpcode::G_FATAN: {
1465 KnownFPClass KnownSrc;
1466 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1471 case TargetOpcode::G_FTAN: {
1473 KnownFPClass KnownSrc;
1474 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1479 case TargetOpcode::G_FSIN:
1480 case TargetOpcode::G_FCOS: {
1483 KnownFPClass KnownSrc;
1484 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1487 : KnownFPClass::sin(KnownSrc);
1490 case TargetOpcode::G_FSINCOS: {
1493 KnownFPClass KnownSrc;
1494 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1496 if (R ==
MI.getOperand(0).getReg())
1502 case TargetOpcode::G_FMAXNUM:
1503 case TargetOpcode::G_FMINNUM:
1504 case TargetOpcode::G_FMINNUM_IEEE:
1505 case TargetOpcode::G_FMAXIMUM:
1506 case TargetOpcode::G_FMINIMUM:
1507 case TargetOpcode::G_FMAXNUM_IEEE:
1508 case TargetOpcode::G_FMAXIMUMNUM:
1509 case TargetOpcode::G_FMINIMUMNUM: {
1512 KnownFPClass KnownLHS, KnownRHS;
1514 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1516 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1521 case TargetOpcode::G_FMINIMUM:
1524 case TargetOpcode::G_FMAXIMUM:
1527 case TargetOpcode::G_FMINIMUMNUM:
1530 case TargetOpcode::G_FMAXIMUMNUM:
1533 case TargetOpcode::G_FMINNUM:
1534 case TargetOpcode::G_FMINNUM_IEEE:
1537 case TargetOpcode::G_FMAXNUM:
1538 case TargetOpcode::G_FMAXNUM_IEEE:
1550 case TargetOpcode::G_FCANONICALIZE: {
1552 KnownFPClass KnownSrc;
1553 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1558 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1562 case TargetOpcode::G_VECREDUCE_FMAX:
1563 case TargetOpcode::G_VECREDUCE_FMIN:
1564 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1565 case TargetOpcode::G_VECREDUCE_FMINIMUM:
1566 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
1567 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM: {
1573 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1575 if (!
Known.isKnownNeverNaN())
1576 Known.setSignBit(std::nullopt);
1579 case TargetOpcode::G_FFLOOR:
1580 case TargetOpcode::G_FCEIL:
1581 case TargetOpcode::G_FRINT:
1582 case TargetOpcode::G_FNEARBYINT:
1583 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1584 case TargetOpcode::G_INTRINSIC_ROUND:
1585 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1586 case TargetOpcode::G_INTRINSIC_TRUNC: {
1588 KnownFPClass KnownSrc;
1594 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1597 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1602 case TargetOpcode::G_FEXP:
1603 case TargetOpcode::G_FEXP2:
1604 case TargetOpcode::G_FEXP10: {
1606 KnownFPClass KnownSrc;
1607 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1612 case TargetOpcode::G_FLOG:
1613 case TargetOpcode::G_FLOG2:
1614 case TargetOpcode::G_FLOG10: {
1629 KnownFPClass KnownSrc;
1630 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1634 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1638 case TargetOpcode::G_FPOW: {
1639 const bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1641 if (!WantNaN && !WantNegative)
1650 InterestedRHS |=
fcNan;
1659 KnownFPClass KnownLHS;
1660 computeKnownFPClass(
MI.getOperand(1).getReg(), DemandedElts, InterestedLHS,
1661 KnownLHS,
Depth + 1);
1668 KnownFPClass KnownRHS;
1669 computeKnownFPClass(
MI.getOperand(2).getReg(), DemandedElts, InterestedRHS,
1670 KnownRHS,
Depth + 1);
1674 case TargetOpcode::G_FPOWI: {
1679 LLT ExpTy = MRI.getType(Exp);
1681 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1684 if (InterestedClasses &
fcNan)
1685 InterestedSrcs |=
fcNan;
1686 if (!ExponentKnownBits.
isZero()) {
1687 if (InterestedClasses &
fcInf)
1693 KnownFPClass KnownSrc;
1694 if (InterestedSrcs !=
fcNone) {
1696 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1703 case TargetOpcode::G_FLDEXP:
1704 case TargetOpcode::G_STRICT_FLDEXP: {
1706 KnownFPClass KnownSrc;
1707 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1715 LLT ExpTy = MRI.getType(ExpReg);
1717 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1722 DenormalMode
Mode = MF->getDenormalMode(Flt);
1726 case TargetOpcode::G_FADD:
1727 case TargetOpcode::G_STRICT_FADD:
1728 case TargetOpcode::G_FSUB:
1729 case TargetOpcode::G_STRICT_FSUB: {
1732 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1733 Opcode == TargetOpcode::G_STRICT_FADD);
1737 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1740 if (!WantNaN && !WantNegative && !WantNegZero) {
1750 if (InterestedClasses &
fcNan)
1751 InterestedSrcs |=
fcInf;
1755 KnownFPClass KnownSelf;
1756 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1762 KnownFPClass KnownLHS, KnownRHS;
1763 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1767 WantNegZero || !IsAdd) {
1770 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1780 case TargetOpcode::G_FMUL:
1781 case TargetOpcode::G_STRICT_FMUL: {
1789 KnownFPClass KnownSrc;
1796 KnownFPClass KnownLHS;
1800 KnownFPClass KnownLHS, KnownRHS;
1816 case TargetOpcode::G_FDIV: {
1817 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1832 KnownFPClass KnownSrc;
1833 computeKnownFPClass(
LHS, DemandedElts,
1842 if (!WantNan && !WantNegative && !WantPositive)
1845 KnownFPClass KnownLHS, KnownRHS;
1848 bool KnowSomethingUseful =
1853 if (KnowSomethingUseful)
1859 case TargetOpcode::G_FREM: {
1860 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1877 KnownFPClass KnownSrc;
1878 computeKnownFPClass(
LHS, DemandedElts,
1887 if (!WantNan && !WantNegative && !WantPositive)
1890 KnownFPClass KnownLHS, KnownRHS;
1892 KnownRHS,
Depth + 1);
1898 if (KnowSomethingUseful || WantPositive)
1905 case TargetOpcode::G_FFREXP: {
1907 if (R !=
MI.getOperand(0).getReg())
1910 KnownFPClass KnownSrc;
1911 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1918 case TargetOpcode::G_FPEXT: {
1920 KnownFPClass KnownSrc;
1921 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1926 LLT SrcTy = MRI.getType(Src).getScalarType();
1932 case TargetOpcode::G_FPTRUNC: {
1933 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses,
Known,
1937 case TargetOpcode::G_SITOFP:
1938 case TargetOpcode::G_UITOFP: {
1949 if (Opcode == TargetOpcode::G_UITOFP)
1950 Known.signBitMustBeZero();
1957 LLT Ty = MRI.getType(Val);
1959 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1965 if (Opcode == TargetOpcode::G_SITOFP) {
1970 Known.signBitMustBeZero();
1972 Known.signBitMustBeOne();
1975 if (InterestedClasses &
fcInf) {
1982 if (Opcode == TargetOpcode::G_UITOFP)
1996 case TargetOpcode::G_BUILD_VECTOR:
1997 case TargetOpcode::G_CONCAT_VECTORS: {
2004 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
2006 bool NeedsElt = DemandedElts[Idx];
2012 computeKnownFPClass(Src,
Known, InterestedClasses,
Depth + 1);
2015 KnownFPClass Known2;
2016 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
2021 if (
Known.isUnknown())
2028 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2038 LLT VecTy = MRI.getType(Vec);
2043 if (CIdx && CIdx->ult(NumElts))
2045 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses,
Known,
2051 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2057 LLT VecTy = MRI.getType(Vec);
2065 APInt DemandedVecElts = DemandedElts;
2066 bool NeedsElt =
true;
2068 if (CIdx && CIdx->ult(NumElts)) {
2069 DemandedVecElts.
clearBit(CIdx->getZExtValue());
2070 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2075 computeKnownFPClass(Elt,
Known, InterestedClasses,
Depth + 1);
2077 if (
Known.isUnknown())
2084 if (!DemandedVecElts.
isZero()) {
2085 KnownFPClass Known2;
2086 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
2093 case TargetOpcode::G_SHUFFLE_VECTOR: {
2097 APInt DemandedLHS, DemandedRHS;
2099 assert(DemandedElts == APInt(1, 1));
2100 DemandedLHS = DemandedRHS = DemandedElts;
2102 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
2104 DemandedLHS, DemandedRHS)) {
2110 if (!!DemandedLHS) {
2112 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses,
Known,
2116 if (
Known.isUnknown())
2122 if (!!DemandedRHS) {
2123 KnownFPClass Known2;
2125 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
2131 case TargetOpcode::G_PHI: {
2140 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
2141 const MachineOperand &Src =
MI.getOperand(Idx);
2144 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses,
Known,
2148 KnownFPClass Known2;
2149 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
2153 if (
Known.isUnknown())
2158 case TargetOpcode::COPY: {
2161 if (!Src.isVirtual())
2164 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
Depth + 1);
2175 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
2176 return KnownClasses;
2182 computeKnownFPClass(R,
Known, InterestedClasses,
Depth);
2190 InterestedClasses &=
~fcNan;
2192 InterestedClasses &=
~fcInf;
2195 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
2198 Result.KnownFPClasses &=
~fcNan;
2200 Result.KnownFPClasses &=
~fcInf;
2206 LLT Ty = MRI.getType(R);
2207 APInt DemandedElts =
2209 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
2224 switch (
DefMI->getOpcode()) {
2227 case TargetOpcode::G_FADD:
2228 case TargetOpcode::G_STRICT_FADD:
2229 case TargetOpcode::G_FSUB:
2230 case TargetOpcode::G_STRICT_FSUB:
2231 case TargetOpcode::G_FMUL:
2232 case TargetOpcode::G_STRICT_FMUL:
2233 case TargetOpcode::G_FDIV:
2234 case TargetOpcode::G_FREM:
2235 case TargetOpcode::G_FMA:
2236 case TargetOpcode::G_STRICT_FMA:
2237 case TargetOpcode::G_FMAD:
2238 case TargetOpcode::G_FSQRT:
2239 case TargetOpcode::G_STRICT_FSQRT:
2243 case TargetOpcode::G_FSIN:
2244 case TargetOpcode::G_FCOS:
2245 case TargetOpcode::G_FSINCOS:
2246 case TargetOpcode::G_FTAN:
2247 case TargetOpcode::G_FASIN:
2248 case TargetOpcode::G_FACOS:
2249 case TargetOpcode::G_FATAN:
2250 case TargetOpcode::G_FATAN2:
2251 case TargetOpcode::G_FSINH:
2252 case TargetOpcode::G_FCOSH:
2253 case TargetOpcode::G_FTANH:
2254 case TargetOpcode::G_FEXP:
2255 case TargetOpcode::G_FEXP2:
2256 case TargetOpcode::G_FEXP10:
2257 case TargetOpcode::G_FLOG:
2258 case TargetOpcode::G_FLOG2:
2259 case TargetOpcode::G_FLOG10:
2260 case TargetOpcode::G_FPOW:
2261 case TargetOpcode::G_FPOWI:
2262 case TargetOpcode::G_FLDEXP:
2263 case TargetOpcode::G_STRICT_FLDEXP:
2264 case TargetOpcode::G_FFREXP:
2265 case TargetOpcode::G_INTRINSIC_TRUNC:
2266 case TargetOpcode::G_INTRINSIC_ROUND:
2267 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2268 case TargetOpcode::G_FFLOOR:
2269 case TargetOpcode::G_FCEIL:
2270 case TargetOpcode::G_FRINT:
2271 case TargetOpcode::G_FNEARBYINT:
2272 case TargetOpcode::G_FPEXT:
2273 case TargetOpcode::G_FPTRUNC:
2274 case TargetOpcode::G_FCANONICALIZE:
2275 case TargetOpcode::G_FMINNUM:
2276 case TargetOpcode::G_FMAXNUM:
2277 case TargetOpcode::G_FMINNUM_IEEE:
2278 case TargetOpcode::G_FMAXNUM_IEEE:
2279 case TargetOpcode::G_FMINIMUM:
2280 case TargetOpcode::G_FMAXIMUM:
2281 case TargetOpcode::G_FMINIMUMNUM:
2282 case TargetOpcode::G_FMAXIMUMNUM:
2296unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2297 const APInt &DemandedElts,
2301 if (Src1SignBits == 1)
2311 const MDNode *Ranges = Ld->getRanges();
2317 switch (Ld->getOpcode()) {
2318 case TargetOpcode::G_SEXTLOAD:
2321 case TargetOpcode::G_ZEXTLOAD:
2334 const APInt &DemandedElts,
2337 unsigned Opcode =
MI.getOpcode();
2339 if (Opcode == TargetOpcode::G_CONSTANT)
2340 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2348 LLT DstTy = MRI.getType(R);
2358 unsigned FirstAnswer = 1;
2360 case TargetOpcode::COPY: {
2362 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2363 MRI.getType(Src.getReg()).isValid()) {
2370 case TargetOpcode::G_SEXT: {
2372 LLT SrcTy = MRI.getType(Src);
2373 unsigned Tmp = TyBits - SrcTy.getScalarSizeInBits();
2376 case TargetOpcode::G_ASSERT_SEXT:
2377 case TargetOpcode::G_SEXT_INREG: {
2380 unsigned SrcBits =
MI.getOperand(2).getImm();
2381 unsigned InRegBits = TyBits - SrcBits + 1;
2385 case TargetOpcode::G_LOAD: {
2392 case TargetOpcode::G_SEXTLOAD: {
2407 case TargetOpcode::G_ZEXTLOAD: {
2422 case TargetOpcode::G_AND:
2423 case TargetOpcode::G_OR:
2424 case TargetOpcode::G_XOR: {
2426 unsigned Src1NumSignBits =
2428 if (Src1NumSignBits != 1) {
2430 unsigned Src2NumSignBits =
2432 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2436 case TargetOpcode::G_ASHR: {
2441 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2444 case TargetOpcode::G_SHL: {
2447 if (std::optional<ConstantRange> ShAmtRange =
2449 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2450 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2460 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2461 ExtOpc == TargetOpcode::G_ANYEXT) {
2462 LLT ExtTy = MRI.getType(Src1);
2464 LLT ExtendeeTy = MRI.getType(Extendee);
2468 if (SizeDiff <= MinShAmt) {
2472 return Tmp - MaxShAmt;
2478 return Tmp - MaxShAmt;
2482 case TargetOpcode::G_ROTL:
2483 case TargetOpcode::G_ROTR: {
2492 case TargetOpcode::G_SAVGFLOOR:
2493 case TargetOpcode::G_SAVGCEIL: {
2496 FirstAnswer = computeNumSignBitsMin(Src1, Src2, DemandedElts,
Depth + 1);
2499 case TargetOpcode::G_SREM: {
2507 case TargetOpcode::G_TRUNC: {
2509 LLT SrcTy = MRI.getType(Src);
2514 if (NumSrcSignBits > (NumSrcBits - TyBits))
2515 return NumSrcSignBits - (NumSrcBits - TyBits);
2518 case TargetOpcode::G_SELECT: {
2519 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2520 MI.getOperand(3).getReg(), DemandedElts,
2523 case TargetOpcode::G_SMIN:
2524 case TargetOpcode::G_SMAX:
2525 case TargetOpcode::G_UMIN:
2526 case TargetOpcode::G_UMAX:
2528 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2529 MI.getOperand(2).getReg(), DemandedElts,
2531 case TargetOpcode::G_SADDO:
2532 case TargetOpcode::G_SADDE:
2533 case TargetOpcode::G_UADDO:
2534 case TargetOpcode::G_UADDE:
2535 case TargetOpcode::G_SSUBO:
2536 case TargetOpcode::G_SSUBE:
2537 case TargetOpcode::G_USUBO:
2538 case TargetOpcode::G_USUBE:
2539 case TargetOpcode::G_SMULO:
2540 case TargetOpcode::G_UMULO: {
2544 if (
MI.getOperand(1).getReg() == R) {
2545 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2552 case TargetOpcode::G_SUB: {
2554 unsigned Src2NumSignBits =
2556 if (Src2NumSignBits == 1)
2566 if ((Known2.
Zero | 1).isAllOnes())
2573 FirstAnswer = Src2NumSignBits;
2580 unsigned Src1NumSignBits =
2582 if (Src1NumSignBits == 1)
2587 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2590 case TargetOpcode::G_ADD: {
2592 unsigned Src2NumSignBits =
2594 if (Src2NumSignBits <= 2)
2598 unsigned Src1NumSignBits =
2600 if (Src1NumSignBits == 1)
2609 if ((Known1.
Zero | 1).isAllOnes())
2615 FirstAnswer = Src1NumSignBits;
2624 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2627 case TargetOpcode::G_FCMP:
2628 case TargetOpcode::G_ICMP: {
2629 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2632 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2639 case TargetOpcode::G_UNMERGE_VALUES: {
2640 unsigned NumOps =
MI.getNumOperands();
2642 LLT SrcTy = MRI.getType(SrcReg);
2644 if ((SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType()) ||
2645 (SrcTy.isScalar() && DstTy.
isVector()))
2649 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
2651 APInt SubDemandedElts = DemandedElts;
2653 if (SrcTy.isVector()) {
2655 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
2658 unsigned SrcOpKnown =
2660 if (SrcTy.isVector()) {
2661 FirstAnswer = SrcOpKnown;
2662 }
else if (SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 2) * TyBits) {
2663 FirstAnswer = SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 1) * TyBits
2665 : SrcOpKnown % TyBits;
2669 case TargetOpcode::G_BUILD_VECTOR: {
2671 FirstAnswer = TyBits;
2672 APInt SingleDemandedElt(1, 1);
2674 if (!DemandedElts[
I])
2679 FirstAnswer = std::min(FirstAnswer, Tmp2);
2682 if (FirstAnswer == 1)
2687 case TargetOpcode::G_CONCAT_VECTORS: {
2688 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2690 FirstAnswer = TyBits;
2693 unsigned NumSubVectorElts =
2694 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2697 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2702 FirstAnswer = std::min(FirstAnswer, Tmp2);
2705 if (FirstAnswer == 1)
2710 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2714 LLT VecVT = MRI.getType(InVec);
2719 APInt DemandedSrcElts =
2720 ConstEltNo && ConstEltNo->ult(NumSrcElts)
2725 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
2728 LLT SrcTy = MRI.getType(SrcReg);
2729 APInt DemandedSrcElts;
2730 if (SrcTy.isScalableVector()) {
2731 DemandedSrcElts =
APInt(1, 1);
2733 uint64_t Idx =
MI.getOperand(2).getImm();
2734 unsigned NumSrcElts = SrcTy.getNumElements();
2735 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
2739 case TargetOpcode::G_SHUFFLE_VECTOR: {
2742 APInt DemandedLHS, DemandedRHS;
2744 unsigned NumElts = MRI.getType(Src1).getNumElements();
2746 DemandedElts, DemandedLHS, DemandedRHS))
2752 if (FirstAnswer == 1)
2754 if (!!DemandedRHS) {
2757 FirstAnswer = std::min(FirstAnswer, Tmp2);
2761 case TargetOpcode::G_SPLAT_VECTOR: {
2765 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2766 if (NumSrcSignBits > (NumSrcBits - TyBits))
2767 return NumSrcSignBits - (NumSrcBits - TyBits);
2770 case TargetOpcode::G_INTRINSIC:
2771 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2772 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2773 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2776 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2778 FirstAnswer = std::max(FirstAnswer, NumBits);
2786 return std::max(FirstAnswer,
Known.countMinSignBits());
2790 LLT Ty = MRI.getType(R);
2791 APInt DemandedElts =
2800 unsigned Opcode =
MI.getOpcode();
2802 LLT Ty = MRI.getType(R);
2803 unsigned BitWidth = Ty.getScalarSizeInBits();
2805 if (Opcode == TargetOpcode::G_CONSTANT) {
2806 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2808 return std::nullopt;
2812 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2813 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2814 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2815 if (!DemandedElts[
I])
2818 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2819 MinAmt = MaxAmt =
nullptr;
2823 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2825 return std::nullopt;
2826 if (!MinAmt || MinAmt->
ugt(ShAmt))
2828 if (!MaxAmt || MaxAmt->ult(ShAmt))
2831 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2832 "Failed to find matching min/max shift amounts");
2833 if (MinAmt && MaxAmt)
2843 return std::nullopt;
2848 if (std::optional<ConstantRange> AmtRange =
2850 return AmtRange->getUnsignedMin().getZExtValue();
2851 return std::nullopt;
2869 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2881 return Result(MF, MaxDepth);
2896 if (!MO.isReg() || MO.getReg().isPhysical())
2899 if (!MRI.getType(Reg).isValid())
2902 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2903 bool IsKnownNeverZero = VTA.isKnownNeverZero(Reg);
2904 OS <<
" " << MO <<
" KnownBits:" <<
Known <<
" SignBits:" << SignedBits
2905 <<
" IsKnownNeverZero:" << IsKnownNeverZero <<
'\n';
MachineInstrBuilder MachineInstrBuilder & DefMI
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...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Utilities for dealing with flags related to floating point properties and mode controls.
static void dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth)
static unsigned computeNumSignBitsFromRangeMetadata(const GAnyLoad *Ld, unsigned TyBits)
Compute the known number of sign bits with attached range metadata in the memory operand.
Provides analysis for querying information about KnownBits during GISel passes.
Declares convenience wrapper classes for interpreting MachineInstr instances as specific generic oper...
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
Implement a low-level type suitable for MachineInstr level instruction selection.
Contains matchers for matching SSA Machine Instructions.
Promote Memory to Register
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
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 uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
static bool isAbsoluteValueULEOne(const Value *V)
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Class for arbitrary precision integers.
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
void clearBit(unsigned BitPosition)
Set a given bit to 0.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
unsigned countl_zero() const
The APInt version of std::countl_zero.
unsigned logBase2() const
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
APInt shl(unsigned shiftAmt) const
Left-shift function.
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
This class represents a range of values.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
Represents any generic load, including sign/zero extending variants.
static LLVM_ABI std::optional< GFConstant > getConstant(Register Const, const MachineRegisterInfo &MRI)
To use KnownBitsInfo analysis in a pass, KnownBitsInfo &Info = getAnalysis<GISelValueTrackingInfoAnal...
GISelValueTracking & get(MachineFunction &MF)
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
GISelValueTracking Result
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
unsigned getMaxDepth() const
KnownBits getKnownBits(Register R)
Align computeKnownAlignment(Register R, unsigned Depth=0)
std::optional< ConstantRange > getValidShiftAmountRange(Register R, const APInt &DemandedElts, unsigned Depth)
If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the eleme...
bool maskedValueIsZero(Register Val, const APInt &Mask)
std::optional< uint64_t > getValidMinimumShiftAmount(Register R, const APInt &DemandedElts, unsigned Depth=0)
If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the eleme...
bool signBitIsZero(Register Op)
const DataLayout & getDataLayout() const
unsigned computeNumSignBits(Register R, const APInt &DemandedElts, unsigned Depth=0)
const MachineFunction & getMachineFunction() const
bool isKnownNeverNaN(Register Val, bool SNaN=false)
Returns true if Val can be assumed to never be a NaN.
APInt getKnownOnes(Register R)
APInt getKnownZeroes(Register R)
void computeKnownBitsImpl(Register R, KnownBits &Known, const APInt &DemandedElts, unsigned Depth=0)
bool isKnownNeverZero(Register R, unsigned Depth=0)
Return true if the value defined by R is provably never zero.
Represents an insert vector element.
Register getCondReg() const
Register getFalseReg() const
Register getTrueReg() const
Represents a G_SHUFFLE_VECTOR.
Register getSrc2Reg() const
Register getSrc1Reg() const
ArrayRef< int > getMask() const
constexpr bool isScalableVector() const
Returns true if the LLT is a scalable vector.
constexpr unsigned getScalarSizeInBits() const
LLT getScalarType() const
constexpr bool isValid() const
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
constexpr bool isVector() const
constexpr ElementCount getElementCount() const
constexpr bool isFixedVector() const
Returns true if the LLT is a fixed vector.
TypeSize getValue() const
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
LLT getMemoryType() const
Return the memory type of the memory reference.
const MDNode * getRanges() const
Return the range tag for the memory reference.
LocationSize getSizeInBits() const
Return the size in bits of the memory reference.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
@ ZeroOrOneBooleanContent
@ ZeroOrNegativeOneBooleanContent
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
operand_type_match m_Reg()
UnaryOp_match< SrcTy, TargetOpcode::G_FFLOOR > m_GFFloor(const SrcTy &Src)
operand_type_match m_Pred()
bind_ty< FPClassTest > m_FPClassTest(FPClassTest &T)
deferred_ty< Register > m_DeferredReg(Register &R)
Similar to m_SpecificReg/Type, but the specific value to match originated from an earlier sub-pattern...
BinaryOp_match< LHS, RHS, TargetOpcode::G_FSUB, false > m_GFSub(const LHS &L, const RHS &R)
bool mi_match(Reg R, const MachineRegisterInfo &MRI, Pattern &&P)
ClassifyOp_match< LHS, Test, TargetOpcode::G_IS_FPCLASS > m_GIsFPClass(const LHS &L, const Test &T)
Matches the register and immediate used in a fpclass test G_IS_FPCLASS val, 96.
CompareOp_match< Pred, LHS, RHS, TargetOpcode::G_FCMP > m_GFCmp(const Pred &P, const LHS &L, const RHS &R)
LLVM_ABI unsigned rot(unsigned SrcSignBits, unsigned BitWidth, std::optional< APInt > RotAmt, bool IsRotateRight)
Compute the number of sign bits after rotating a value.
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 std::optional< APInt > isConstantOrConstantSplatVector(Register Def, const MachineRegisterInfo &MRI)
Determines if Def defines a constant integer or a splat vector of constant integers.
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 std::optional< APInt > getIConstantVRegVal(Register VReg, const MachineRegisterInfo &MRI)
If VReg is defined by a G_CONSTANT, return the corresponding value.
@ Known
Known to have no common set bits.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
LLVM_ABI const llvm::fltSemantics & getFltSemanticForLLT(LLT Ty)
Get the appropriate floating point arithmetic semantic based on the bit size of the given scalar LLT.
scope_exit(Callable) -> scope_exit< Callable >
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
std::tuple< Value *, FPClassTest, FPClassTest > fcmpImpliesClass(CmpInst::Predicate Pred, const Function &F, Value *LHS, FPClassTest RHSClass, bool LookThroughSrc=true)
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
constexpr unsigned MaxAnalysisRecursionDepth
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
DWARFExpression::Operation Op
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
static uint32_t extractBits(uint64_t Val, uint32_t Hi, uint32_t Lo)
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
This struct is a compact representation of a valid (non-zero power of two) alignment.
A special type used by analysis passes to provide an address that identifies that particular analysis...
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
static LLVM_ABI KnownBits sadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.sadd.sat(LHS, RHS)
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
bool isZero() const
Returns true if value is all zero.
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits ssub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.ssub.sat(LHS, RHS)
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
void setAllZero()
Make all bits known to be zero and discard any previous information.
unsigned getBitWidth() const
Get the bit width of this value.
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
bool isEven() const
Return if the value is known even (the low bit is 0).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
bool isNegative() const
Returns true if this value is known to be negative.
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits uadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.uadd.sat(LHS, RHS)
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
bool isAllOnes() const
Returns true if value is all one bits.
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
static LLVM_ABI KnownFPClass sin(const KnownFPClass &Src)
Report known values for sin.
static LLVM_ABI KnownFPClass frem(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem.
static LLVM_ABI KnownFPClass fdiv_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv x, x.
static constexpr FPClassTest OrderedLessThanZeroMask
void knownNot(FPClassTest RuleOut)
static LLVM_ABI KnownFPClass fmul(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmul.
static LLVM_ABI KnownFPClass fadd_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd x, x.
static KnownFPClass square(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
static LLVM_ABI KnownFPClass fsub(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fsub.
static LLVM_ABI KnownFPClass canonicalize(const KnownFPClass &Src, DenormalMode DenormMode=DenormalMode::getDynamic())
Apply the canonicalize intrinsic to this value.
static LLVM_ABI KnownFPClass log(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for log/log2/log10.
static LLVM_ABI KnownFPClass atan2(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for atan2.
static LLVM_ABI KnownFPClass atan(const KnownFPClass &Src)
Report known values for atan.
static LLVM_ABI KnownFPClass fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv.
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsTrunc, bool IsMultiUnitFPType)
Propagate known class for rounding intrinsics (trunc, floor, ceil, rint, nearbyint,...
static LLVM_ABI KnownFPClass cos(const KnownFPClass &Src)
Report known values for cos.
static LLVM_ABI KnownFPClass cosh(const KnownFPClass &Src)
Report known values for cosh.
static LLVM_ABI KnownFPClass minMaxLike(const KnownFPClass &LHS, const KnownFPClass &RHS, MinMaxKind Kind, DenormalMode DenormMode=DenormalMode::getDynamic())
static LLVM_ABI KnownFPClass exp(const KnownFPClass &Src)
Report known values for exp, exp2 and exp10.
static LLVM_ABI KnownFPClass frexp_mant(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for mantissa component of frexp.
static LLVM_ABI KnownFPClass asin(const KnownFPClass &Src)
Report known values for asin.
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
static LLVM_ABI KnownFPClass fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy)
Propagate known class for fpext.
static LLVM_ABI KnownFPClass fma(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma.
static LLVM_ABI KnownFPClass tan(const KnownFPClass &Src)
Report known values for tan.
static LLVM_ABI KnownFPClass fptrunc(const KnownFPClass &KnownSrc)
Propagate known class for fptrunc.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
static LLVM_ABI KnownFPClass sqrt(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for sqrt.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd.
static LLVM_ABI KnownFPClass fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma squared, squared, addend.
static LLVM_ABI KnownFPClass acos(const KnownFPClass &Src)
Report known values for acos.
static LLVM_ABI KnownFPClass frem_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem x, x.
static LLVM_ABI KnownFPClass powi(const KnownFPClass &Src, const KnownBits &N)
Propagate known class for powi.
static LLVM_ABI KnownFPClass pow(const KnownFPClass &LHS, const KnownFPClass &RHS)
Propagate known class for pow.
static LLVM_ABI KnownFPClass ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin, const APInt &ConstantRangeMax, const fltSemantics &Flt, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ldexp, assuming the exponent is known to be within [ConstantRangeMin,...
static LLVM_ABI KnownFPClass sinh(const KnownFPClass &Src)
Report known values for sinh.
static LLVM_ABI KnownFPClass tanh(const KnownFPClass &Src)
Report known values for tanh.