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 assert(
MI.getNumExplicitDefs() == 1 &&
80 "expected single return generic instruction");
85 const LLT Ty = MRI.getType(R);
95 const APInt &DemandedElts,
103 LLT Ty = MRI.getType(R);
104 unsigned BitWidth = Ty.getScalarSizeInBits();
109 LLT Ty = MRI.getType(R);
110 const APInt ScalarDemandedElts(1, 1);
111 APInt DemandedElts = Ty.isFixedVector()
113 : ScalarDemandedElts;
122 const APInt ScalarDemandedElts(1, 1);
125 switch (
MI.getOpcode()) {
129 case TargetOpcode::G_BUILD_VECTOR: {
131 if (!DemandedElts[
I])
139 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
142 LLT VecTy = MRI.getType(InVec);
150 if (Idx->ult(NumSrcElts))
156 case TargetOpcode::G_SHUFFLE_VECTOR: {
159 if (SrcTy.isScalableVector())
161 APInt DemandedLHS, DemandedRHS;
163 DemandedElts, DemandedLHS, DemandedRHS))
165 if (!DemandedLHS.
isZero() &&
168 if (!DemandedRHS.
isZero() &&
174 case TargetOpcode::G_OR:
179 case TargetOpcode::G_SELECT:
184 case TargetOpcode::G_SHL: {
214[[maybe_unused]]
static void
217 <<
"] Computed for: " <<
MI <<
"[" <<
Depth <<
"] Known: 0x"
228 const APInt &DemandedElts,
234 if (
Known.isUnknown())
259 const APInt &DemandedElts,
262 unsigned Opcode =
MI.getOpcode();
263 LLT DstTy = MRI.getType(R);
277 "DemandedElt width should equal the fixed vector number of elements");
280 "DemandedElt width should be 1 for scalars or scalable vectors");
305 TL.computeKnownBitsForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
308 case TargetOpcode::G_BUILD_VECTOR: {
310 Known.Zero.setAllBits();
311 Known.One.setAllBits();
313 if (!DemandedElts[
I])
322 if (
Known.isUnknown())
327 case TargetOpcode::G_SPLAT_VECTOR: {
335 case TargetOpcode::COPY:
336 case TargetOpcode::G_PHI:
337 case TargetOpcode::PHI: {
343 assert(
MI.getOperand(0).getSubReg() == 0 &&
"Is this code in SSA?");
346 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
349 LLT SrcTy = MRI.getType(SrcReg);
357 if (SrcReg.
isVirtual() && Src.getSubReg() == 0 &&
359 APInt NowDemandedElts;
360 if (!SrcTy.isFixedVector()) {
361 NowDemandedElts =
APInt(1, 1);
364 NowDemandedElts = DemandedElts;
371 Depth + (Opcode != TargetOpcode::COPY));
376 if (
Known.isUnknown())
386 case TargetOpcode::G_STEP_VECTOR: {
387 APInt Step =
MI.getOperand(1).getCImm()->getValue();
395 const APInt MinNumElts =
401 .
umul_ov(MinNumElts, Overflow);
404 const APInt MaxValue = (MaxNumElts - 1).
umul_ov(Step, Overflow);
410 case TargetOpcode::G_VSCALE: {
412 const APInt &Multiplier =
MI.getOperand(1).getCImm()->getValue();
416 case TargetOpcode::G_CONSTANT: {
420 case TargetOpcode::G_FRAME_INDEX: {
421 int FrameIdx =
MI.getOperand(1).getIndex();
422 TL.computeKnownBitsForStackObjectPointer(
423 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
426 case TargetOpcode::G_SUB: {
435 case TargetOpcode::G_XOR: {
444 case TargetOpcode::G_PTR_ADD: {
448 LLT Ty = MRI.getType(
MI.getOperand(1).getReg());
449 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
453 case TargetOpcode::G_ADD: {
461 case TargetOpcode::G_AND: {
471 case TargetOpcode::G_OR: {
481 case TargetOpcode::G_MUL: {
489 case TargetOpcode::G_UMULH: {
497 case TargetOpcode::G_SMULH: {
505 case TargetOpcode::G_UAVGFLOOR: {
513 case TargetOpcode::G_UAVGCEIL: {
521 case TargetOpcode::G_SAVGFLOOR: {
529 case TargetOpcode::G_SAVGCEIL: {
537 case TargetOpcode::G_ABDU: {
545 case TargetOpcode::G_ABDS: {
554 if (SignBits1 == 1) {
560 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
563 case TargetOpcode::G_SADDSAT: {
571 case TargetOpcode::G_UADDSAT: {
579 case TargetOpcode::G_SSUBSAT: {
587 case TargetOpcode::G_USUBSAT: {
595 case TargetOpcode::G_UDIV: {
604 case TargetOpcode::G_SDIV: {
613 case TargetOpcode::G_UREM: {
625 case TargetOpcode::G_SREM: {
637 case TargetOpcode::G_SELECT: {
638 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
642 case TargetOpcode::G_SMIN: {
652 case TargetOpcode::G_SMAX: {
662 case TargetOpcode::G_UMIN: {
671 case TargetOpcode::G_UMAX: {
680 case TargetOpcode::G_FCMP:
681 case TargetOpcode::G_ICMP: {
684 if (TL.getBooleanContents(DstTy.
isVector(),
685 Opcode == TargetOpcode::G_FCMP) ==
688 Known.Zero.setBitsFrom(1);
691 case TargetOpcode::G_SEXT: {
699 case TargetOpcode::G_ASSERT_SEXT:
700 case TargetOpcode::G_SEXT_INREG: {
706 case TargetOpcode::G_ANYEXT: {
712 case TargetOpcode::G_LOAD: {
720 case TargetOpcode::G_SEXTLOAD:
721 case TargetOpcode::G_ZEXTLOAD: {
728 Known = Opcode == TargetOpcode::G_SEXTLOAD
733 case TargetOpcode::G_ASHR: {
742 case TargetOpcode::G_LSHR: {
751 case TargetOpcode::G_SHL: {
760 case TargetOpcode::G_ROTL:
761 case TargetOpcode::G_ROTR: {
770 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
773 if (Opcode == TargetOpcode::G_ROTL)
780 case TargetOpcode::G_FSHL:
781 case TargetOpcode::G_FSHR: {
787 const APInt Amt = *MaybeAmtOp;
792 Known = Opcode == TargetOpcode::G_FSHL
797 case TargetOpcode::G_INTTOPTR:
798 case TargetOpcode::G_PTRTOINT:
803 case TargetOpcode::G_ZEXT:
804 case TargetOpcode::G_TRUNC: {
810 case TargetOpcode::G_ASSERT_ZEXT: {
814 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
815 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
817 Known.Zero |= (~InMask);
821 case TargetOpcode::G_ASSERT_ALIGN: {
822 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
827 Known.Zero.setLowBits(LogOfAlign);
828 Known.One.clearLowBits(LogOfAlign);
831 case TargetOpcode::G_MERGE_VALUES: {
832 unsigned NumOps =
MI.getNumOperands();
833 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
835 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
838 DemandedElts,
Depth + 1);
839 Known.insertBits(SrcOpKnown,
I * OpSize);
843 case TargetOpcode::G_UNMERGE_VALUES: {
844 unsigned NumOps =
MI.getNumOperands();
846 LLT SrcTy = MRI.getType(SrcReg);
848 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
852 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
854 APInt SubDemandedElts = DemandedElts;
855 if (SrcTy.isVector()) {
858 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
864 if (SrcTy.isVector())
865 Known = std::move(SrcOpKnown);
870 case TargetOpcode::G_BSWAP: {
876 case TargetOpcode::G_BITREVERSE: {
882 case TargetOpcode::G_CTPOP: {
889 Known.Zero.setBitsFrom(LowBits);
894 case TargetOpcode::G_UBFX: {
895 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
905 case TargetOpcode::G_SBFX: {
906 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
923 case TargetOpcode::G_UADDO:
924 case TargetOpcode::G_UADDE:
925 case TargetOpcode::G_SADDO:
926 case TargetOpcode::G_SADDE: {
927 if (
MI.getOperand(1).getReg() == R) {
930 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
933 Known.Zero.setBitsFrom(1);
937 assert(
MI.getOperand(0).getReg() == R &&
938 "We only compute knownbits for the sum here.");
941 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
945 Carry = Carry.
trunc(1);
957 case TargetOpcode::G_USUBO:
958 case TargetOpcode::G_USUBE:
959 case TargetOpcode::G_SSUBO:
960 case TargetOpcode::G_SSUBE:
961 case TargetOpcode::G_UMULO:
962 case TargetOpcode::G_SMULO: {
963 if (
MI.getOperand(1).getReg() == R) {
966 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
969 Known.Zero.setBitsFrom(1);
973 case TargetOpcode::G_CTTZ:
974 case TargetOpcode::G_CTTZ_ZERO_POISON: {
981 Known.Zero.setBitsFrom(LowBits);
984 case TargetOpcode::G_CTLZ:
985 case TargetOpcode::G_CTLZ_ZERO_POISON: {
992 Known.Zero.setBitsFrom(LowBits);
995 case TargetOpcode::G_CTLS: {
999 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
1007 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1014 LLT VecVT = MRI.getType(InVec);
1026 Known.Zero.setAllBits();
1027 Known.One.setAllBits();
1032 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
1039 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1041 Register InVec = Insert.getVectorReg();
1042 Register InVal = Insert.getElementReg();
1043 Register EltNo = Insert.getIndexReg();
1044 LLT VecVT = MRI.getType(InVec);
1052 bool DemandedVal =
true;
1053 APInt DemandedVecElts = DemandedElts;
1054 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
1055 unsigned EltIdx = ConstEltNo->getZExtValue();
1056 DemandedVal = !!DemandedElts[EltIdx];
1059 Known.setAllConflict();
1064 if (!!DemandedVecElts) {
1070 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1072 LLT SrcTy = MRI.getType(SrcReg);
1073 APInt DemandedSrcElts;
1074 if (SrcTy.isScalableVector()) {
1075 DemandedSrcElts =
APInt(1, 1);
1077 uint64_t Idx =
MI.getOperand(2).getImm();
1078 unsigned NumSrcElts = SrcTy.getNumElements();
1079 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
1084 case TargetOpcode::G_SHUFFLE_VECTOR: {
1085 APInt DemandedLHS, DemandedRHS;
1088 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1090 DemandedElts, DemandedLHS, DemandedRHS))
1094 Known.Zero.setAllBits();
1095 Known.One.setAllBits();
1096 if (!!DemandedLHS) {
1102 if (
Known.isUnknown())
1104 if (!!DemandedRHS) {
1111 case TargetOpcode::G_CONCAT_VECTORS: {
1112 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
1115 Known.Zero.setAllBits();
1116 Known.One.setAllBits();
1117 unsigned NumSubVectorElts =
1118 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1122 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
1123 if (!!DemandedSub) {
1129 if (
Known.isUnknown())
1134 case TargetOpcode::G_ABS: {
1151 APInt DemandedElts =
1165void GISelValueTracking::computeKnownFPClassForFPTrunc(
1173 KnownFPClass KnownSrc;
1174 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1179void GISelValueTracking::computeKnownFPClass(
Register R,
1180 const APInt &DemandedElts,
1184 assert(
Known.isUnknown() &&
"should not be called with known information");
1186 if (!DemandedElts) {
1194 MachineInstr &
MI = *MRI.getVRegDef(R);
1195 unsigned Opcode =
MI.getOpcode();
1196 LLT DstTy = MRI.getType(R);
1204 switch (Cst->getKind()) {
1206 auto APF = Cst->getScalarValue();
1207 Known.KnownFPClasses = APF.classify();
1208 Known.SignBit = APF.isNegative();
1213 bool SignBitAllZero =
true;
1214 bool SignBitAllOne =
true;
1216 for (
auto C : *Cst) {
1217 Known.KnownFPClasses |=
C.classify();
1219 SignBitAllZero =
false;
1221 SignBitAllOne =
false;
1224 if (SignBitAllOne != SignBitAllZero)
1225 Known.SignBit = SignBitAllOne;
1240 KnownNotFromFlags |=
fcNan;
1242 KnownNotFromFlags |=
fcInf;
1246 InterestedClasses &= ~KnownNotFromFlags;
1249 [=, &
Known] {
Known.knownNot(KnownNotFromFlags); });
1259 TL.computeKnownFPClassForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
1262 case TargetOpcode::G_FNEG: {
1264 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1268 case TargetOpcode::G_SELECT: {
1291 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1292 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1298 MaskIfTrue = TestedMask;
1299 MaskIfFalse = ~TestedMask;
1302 if (TestedValue ==
LHS) {
1304 FilterLHS = MaskIfTrue;
1305 }
else if (TestedValue ==
RHS) {
1307 FilterRHS = MaskIfFalse;
1310 KnownFPClass Known2;
1311 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS,
Known,
1313 Known.KnownFPClasses &= FilterLHS;
1315 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1322 case TargetOpcode::G_FCOPYSIGN: {
1323 Register Magnitude =
MI.getOperand(1).getReg();
1326 KnownFPClass KnownSign;
1328 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses,
Known,
1330 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1332 Known.copysign(KnownSign);
1335 case TargetOpcode::G_FMA:
1336 case TargetOpcode::G_STRICT_FMA:
1337 case TargetOpcode::G_FMAD: {
1350 KnownFPClass KnownSrc, KnownAddend;
1351 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1353 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1355 if (KnownNotFromFlags) {
1356 KnownSrc.
knownNot(KnownNotFromFlags);
1357 KnownAddend.
knownNot(KnownNotFromFlags);
1361 KnownFPClass KnownSrc[3];
1362 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1364 if (KnownSrc[0].isUnknown())
1366 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1368 if (KnownSrc[1].isUnknown())
1370 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1372 if (KnownSrc[2].isUnknown())
1374 if (KnownNotFromFlags) {
1375 KnownSrc[0].
knownNot(KnownNotFromFlags);
1376 KnownSrc[1].
knownNot(KnownNotFromFlags);
1377 KnownSrc[2].
knownNot(KnownNotFromFlags);
1383 case TargetOpcode::G_FSQRT:
1384 case TargetOpcode::G_STRICT_FSQRT: {
1385 KnownFPClass KnownSrc;
1387 if (InterestedClasses &
fcNan)
1391 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1400 case TargetOpcode::G_FABS: {
1405 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
1411 case TargetOpcode::G_FATAN2: {
1421 KnownFPClass KnownY, KnownX;
1422 computeKnownFPClass(
Y, DemandedElts, InterestedY, KnownY,
Depth + 1);
1423 computeKnownFPClass(
X, DemandedElts, InterestedX, KnownX,
Depth + 1);
1429 case TargetOpcode::G_FSINH: {
1431 KnownFPClass KnownSrc;
1432 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1437 case TargetOpcode::G_FCOSH: {
1439 KnownFPClass KnownSrc;
1440 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1445 case TargetOpcode::G_FTANH: {
1447 KnownFPClass KnownSrc;
1448 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1453 case TargetOpcode::G_FASIN: {
1455 KnownFPClass KnownSrc;
1456 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1461 case TargetOpcode::G_FACOS: {
1463 KnownFPClass KnownSrc;
1464 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1469 case TargetOpcode::G_FATAN: {
1471 KnownFPClass KnownSrc;
1472 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1477 case TargetOpcode::G_FTAN: {
1479 KnownFPClass KnownSrc;
1480 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1485 case TargetOpcode::G_FSIN:
1486 case TargetOpcode::G_FCOS: {
1489 KnownFPClass KnownSrc;
1490 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1493 : KnownFPClass::sin(KnownSrc);
1496 case TargetOpcode::G_FSINCOS: {
1499 KnownFPClass KnownSrc;
1500 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1502 if (R ==
MI.getOperand(0).getReg())
1508 case TargetOpcode::G_FMAXNUM:
1509 case TargetOpcode::G_FMINNUM:
1510 case TargetOpcode::G_FMINNUM_IEEE:
1511 case TargetOpcode::G_FMAXIMUM:
1512 case TargetOpcode::G_FMINIMUM:
1513 case TargetOpcode::G_FMAXNUM_IEEE:
1514 case TargetOpcode::G_FMAXIMUMNUM:
1515 case TargetOpcode::G_FMINIMUMNUM: {
1518 KnownFPClass KnownLHS, KnownRHS;
1520 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1522 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1527 case TargetOpcode::G_FMINIMUM:
1530 case TargetOpcode::G_FMAXIMUM:
1533 case TargetOpcode::G_FMINIMUMNUM:
1536 case TargetOpcode::G_FMAXIMUMNUM:
1539 case TargetOpcode::G_FMINNUM:
1540 case TargetOpcode::G_FMINNUM_IEEE:
1543 case TargetOpcode::G_FMAXNUM:
1544 case TargetOpcode::G_FMAXNUM_IEEE:
1556 case TargetOpcode::G_FCANONICALIZE: {
1558 KnownFPClass KnownSrc;
1559 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1564 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1568 case TargetOpcode::G_VECREDUCE_FMAX:
1569 case TargetOpcode::G_VECREDUCE_FMIN:
1570 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1571 case TargetOpcode::G_VECREDUCE_FMINIMUM:
1572 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
1573 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM: {
1579 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1581 if (!
Known.isKnownNeverNaN())
1582 Known.SignBit.reset();
1585 case TargetOpcode::G_FFLOOR:
1586 case TargetOpcode::G_FCEIL:
1587 case TargetOpcode::G_FRINT:
1588 case TargetOpcode::G_FNEARBYINT:
1589 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1590 case TargetOpcode::G_INTRINSIC_ROUND:
1591 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1592 case TargetOpcode::G_INTRINSIC_TRUNC: {
1594 KnownFPClass KnownSrc;
1600 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1603 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1608 case TargetOpcode::G_FEXP:
1609 case TargetOpcode::G_FEXP2:
1610 case TargetOpcode::G_FEXP10: {
1612 KnownFPClass KnownSrc;
1613 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1618 case TargetOpcode::G_FLOG:
1619 case TargetOpcode::G_FLOG2:
1620 case TargetOpcode::G_FLOG10: {
1635 KnownFPClass KnownSrc;
1636 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1640 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1644 case TargetOpcode::G_FPOW: {
1645 const bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1647 if (!WantNaN && !WantNegative)
1656 InterestedRHS |=
fcNan;
1665 KnownFPClass KnownLHS;
1666 computeKnownFPClass(
MI.getOperand(1).getReg(), DemandedElts, InterestedLHS,
1667 KnownLHS,
Depth + 1);
1674 KnownFPClass KnownRHS;
1675 computeKnownFPClass(
MI.getOperand(2).getReg(), DemandedElts, InterestedRHS,
1676 KnownRHS,
Depth + 1);
1680 case TargetOpcode::G_FPOWI: {
1685 LLT ExpTy = MRI.getType(Exp);
1687 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1690 if (InterestedClasses &
fcNan)
1691 InterestedSrcs |=
fcNan;
1692 if (!ExponentKnownBits.
isZero()) {
1693 if (InterestedClasses &
fcInf)
1699 KnownFPClass KnownSrc;
1700 if (InterestedSrcs !=
fcNone) {
1702 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1709 case TargetOpcode::G_FLDEXP:
1710 case TargetOpcode::G_STRICT_FLDEXP: {
1712 KnownFPClass KnownSrc;
1713 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1721 LLT ExpTy = MRI.getType(ExpReg);
1723 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1728 DenormalMode
Mode = MF->getDenormalMode(Flt);
1732 case TargetOpcode::G_FADD:
1733 case TargetOpcode::G_STRICT_FADD:
1734 case TargetOpcode::G_FSUB:
1735 case TargetOpcode::G_STRICT_FSUB: {
1738 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1739 Opcode == TargetOpcode::G_STRICT_FADD);
1743 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1746 if (!WantNaN && !WantNegative && !WantNegZero) {
1756 if (InterestedClasses &
fcNan)
1757 InterestedSrcs |=
fcInf;
1761 KnownFPClass KnownSelf;
1762 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1768 KnownFPClass KnownLHS, KnownRHS;
1769 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1773 WantNegZero || !IsAdd) {
1776 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1786 case TargetOpcode::G_FMUL:
1787 case TargetOpcode::G_STRICT_FMUL: {
1795 KnownFPClass KnownSrc;
1802 KnownFPClass KnownLHS;
1806 KnownFPClass KnownLHS, KnownRHS;
1822 case TargetOpcode::G_FDIV: {
1823 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1838 KnownFPClass KnownSrc;
1839 computeKnownFPClass(
LHS, DemandedElts,
1848 if (!WantNan && !WantNegative && !WantPositive)
1851 KnownFPClass KnownLHS, KnownRHS;
1854 bool KnowSomethingUseful =
1859 if (KnowSomethingUseful)
1865 case TargetOpcode::G_FREM: {
1866 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1883 KnownFPClass KnownSrc;
1884 computeKnownFPClass(
LHS, DemandedElts,
1893 if (!WantNan && !WantNegative && !WantPositive)
1896 KnownFPClass KnownLHS, KnownRHS;
1898 KnownRHS,
Depth + 1);
1904 if (KnowSomethingUseful || WantPositive)
1911 case TargetOpcode::G_FFREXP: {
1913 if (R !=
MI.getOperand(0).getReg())
1916 KnownFPClass KnownSrc;
1917 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1924 case TargetOpcode::G_FPEXT: {
1926 KnownFPClass KnownSrc;
1927 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1932 LLT SrcTy = MRI.getType(Src).getScalarType();
1938 case TargetOpcode::G_FPTRUNC: {
1939 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses,
Known,
1943 case TargetOpcode::G_SITOFP:
1944 case TargetOpcode::G_UITOFP: {
1955 if (Opcode == TargetOpcode::G_UITOFP)
1956 Known.signBitMustBeZero();
1963 LLT Ty = MRI.getType(Val);
1965 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1971 if (Opcode == TargetOpcode::G_SITOFP) {
1976 Known.signBitMustBeZero();
1978 Known.signBitMustBeOne();
1981 if (InterestedClasses &
fcInf) {
1988 if (Opcode == TargetOpcode::G_UITOFP)
2002 case TargetOpcode::G_BUILD_VECTOR:
2003 case TargetOpcode::G_CONCAT_VECTORS: {
2010 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
2012 bool NeedsElt = DemandedElts[Idx];
2018 computeKnownFPClass(Src,
Known, InterestedClasses,
Depth + 1);
2021 KnownFPClass Known2;
2022 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
2027 if (
Known.isUnknown())
2034 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2044 LLT VecTy = MRI.getType(Vec);
2049 if (CIdx && CIdx->ult(NumElts))
2051 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses,
Known,
2057 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2063 LLT VecTy = MRI.getType(Vec);
2071 APInt DemandedVecElts = DemandedElts;
2072 bool NeedsElt =
true;
2074 if (CIdx && CIdx->ult(NumElts)) {
2075 DemandedVecElts.
clearBit(CIdx->getZExtValue());
2076 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2081 computeKnownFPClass(Elt,
Known, InterestedClasses,
Depth + 1);
2083 if (
Known.isUnknown())
2090 if (!DemandedVecElts.
isZero()) {
2091 KnownFPClass Known2;
2092 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
2099 case TargetOpcode::G_SHUFFLE_VECTOR: {
2103 APInt DemandedLHS, DemandedRHS;
2105 assert(DemandedElts == APInt(1, 1));
2106 DemandedLHS = DemandedRHS = DemandedElts;
2108 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
2110 DemandedLHS, DemandedRHS)) {
2116 if (!!DemandedLHS) {
2118 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses,
Known,
2122 if (
Known.isUnknown())
2128 if (!!DemandedRHS) {
2129 KnownFPClass Known2;
2131 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
2137 case TargetOpcode::G_PHI: {
2146 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
2147 const MachineOperand &Src =
MI.getOperand(Idx);
2150 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses,
Known,
2154 KnownFPClass Known2;
2155 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
2159 if (
Known.isUnknown())
2164 case TargetOpcode::COPY: {
2167 if (!Src.isVirtual())
2170 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
Depth + 1);
2181 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
2182 return KnownClasses;
2188 computeKnownFPClass(R,
Known, InterestedClasses,
Depth);
2196 InterestedClasses &=
~fcNan;
2198 InterestedClasses &=
~fcInf;
2201 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
2204 Result.KnownFPClasses &=
~fcNan;
2206 Result.KnownFPClasses &=
~fcInf;
2212 LLT Ty = MRI.getType(R);
2213 APInt DemandedElts =
2215 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
2230 switch (
DefMI->getOpcode()) {
2233 case TargetOpcode::G_FADD:
2234 case TargetOpcode::G_STRICT_FADD:
2235 case TargetOpcode::G_FSUB:
2236 case TargetOpcode::G_STRICT_FSUB:
2237 case TargetOpcode::G_FMUL:
2238 case TargetOpcode::G_STRICT_FMUL:
2239 case TargetOpcode::G_FDIV:
2240 case TargetOpcode::G_FREM:
2241 case TargetOpcode::G_FMA:
2242 case TargetOpcode::G_STRICT_FMA:
2243 case TargetOpcode::G_FMAD:
2244 case TargetOpcode::G_FSQRT:
2245 case TargetOpcode::G_STRICT_FSQRT:
2249 case TargetOpcode::G_FSIN:
2250 case TargetOpcode::G_FCOS:
2251 case TargetOpcode::G_FSINCOS:
2252 case TargetOpcode::G_FTAN:
2253 case TargetOpcode::G_FASIN:
2254 case TargetOpcode::G_FACOS:
2255 case TargetOpcode::G_FATAN:
2256 case TargetOpcode::G_FATAN2:
2257 case TargetOpcode::G_FSINH:
2258 case TargetOpcode::G_FCOSH:
2259 case TargetOpcode::G_FTANH:
2260 case TargetOpcode::G_FEXP:
2261 case TargetOpcode::G_FEXP2:
2262 case TargetOpcode::G_FEXP10:
2263 case TargetOpcode::G_FLOG:
2264 case TargetOpcode::G_FLOG2:
2265 case TargetOpcode::G_FLOG10:
2266 case TargetOpcode::G_FPOW:
2267 case TargetOpcode::G_FPOWI:
2268 case TargetOpcode::G_FLDEXP:
2269 case TargetOpcode::G_STRICT_FLDEXP:
2270 case TargetOpcode::G_FFREXP:
2271 case TargetOpcode::G_INTRINSIC_TRUNC:
2272 case TargetOpcode::G_INTRINSIC_ROUND:
2273 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2274 case TargetOpcode::G_FFLOOR:
2275 case TargetOpcode::G_FCEIL:
2276 case TargetOpcode::G_FRINT:
2277 case TargetOpcode::G_FNEARBYINT:
2278 case TargetOpcode::G_FPEXT:
2279 case TargetOpcode::G_FPTRUNC:
2280 case TargetOpcode::G_FCANONICALIZE:
2281 case TargetOpcode::G_FMINNUM:
2282 case TargetOpcode::G_FMAXNUM:
2283 case TargetOpcode::G_FMINNUM_IEEE:
2284 case TargetOpcode::G_FMAXNUM_IEEE:
2285 case TargetOpcode::G_FMINIMUM:
2286 case TargetOpcode::G_FMAXIMUM:
2287 case TargetOpcode::G_FMINIMUMNUM:
2288 case TargetOpcode::G_FMAXIMUMNUM:
2302unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2303 const APInt &DemandedElts,
2307 if (Src1SignBits == 1)
2324 case TargetOpcode::G_SEXTLOAD:
2327 case TargetOpcode::G_ZEXTLOAD:
2340 const APInt &DemandedElts,
2343 unsigned Opcode =
MI.getOpcode();
2345 if (Opcode == TargetOpcode::G_CONSTANT)
2346 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2354 LLT DstTy = MRI.getType(R);
2364 unsigned FirstAnswer = 1;
2366 case TargetOpcode::COPY: {
2368 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2369 MRI.getType(Src.getReg()).isValid()) {
2376 case TargetOpcode::G_SEXT: {
2378 LLT SrcTy = MRI.getType(Src);
2382 case TargetOpcode::G_ASSERT_SEXT:
2383 case TargetOpcode::G_SEXT_INREG: {
2386 unsigned SrcBits =
MI.getOperand(2).getImm();
2387 unsigned InRegBits = TyBits - SrcBits + 1;
2391 case TargetOpcode::G_LOAD: {
2398 case TargetOpcode::G_SEXTLOAD: {
2413 case TargetOpcode::G_ZEXTLOAD: {
2428 case TargetOpcode::G_AND:
2429 case TargetOpcode::G_OR:
2430 case TargetOpcode::G_XOR: {
2432 unsigned Src1NumSignBits =
2434 if (Src1NumSignBits != 1) {
2436 unsigned Src2NumSignBits =
2438 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2442 case TargetOpcode::G_ASHR: {
2447 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2450 case TargetOpcode::G_SHL: {
2453 if (std::optional<ConstantRange> ShAmtRange =
2455 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2456 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2466 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2467 ExtOpc == TargetOpcode::G_ANYEXT) {
2468 LLT ExtTy = MRI.getType(Src1);
2470 LLT ExtendeeTy = MRI.getType(Extendee);
2474 if (SizeDiff <= MinShAmt) {
2478 return Tmp - MaxShAmt;
2484 return Tmp - MaxShAmt;
2488 case TargetOpcode::G_ROTL:
2489 case TargetOpcode::G_ROTR: {
2498 case TargetOpcode::G_SAVGFLOOR:
2499 case TargetOpcode::G_SAVGCEIL: {
2502 FirstAnswer = computeNumSignBitsMin(Src1, Src2, DemandedElts,
Depth + 1);
2505 case TargetOpcode::G_SREM: {
2513 case TargetOpcode::G_TRUNC: {
2515 LLT SrcTy = MRI.getType(Src);
2519 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2521 if (NumSrcSignBits > (NumSrcBits - DstTyBits))
2522 return NumSrcSignBits - (NumSrcBits - DstTyBits);
2525 case TargetOpcode::G_SELECT: {
2526 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2527 MI.getOperand(3).getReg(), DemandedElts,
2530 case TargetOpcode::G_SMIN:
2531 case TargetOpcode::G_SMAX:
2532 case TargetOpcode::G_UMIN:
2533 case TargetOpcode::G_UMAX:
2535 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2536 MI.getOperand(2).getReg(), DemandedElts,
2538 case TargetOpcode::G_SADDO:
2539 case TargetOpcode::G_SADDE:
2540 case TargetOpcode::G_UADDO:
2541 case TargetOpcode::G_UADDE:
2542 case TargetOpcode::G_SSUBO:
2543 case TargetOpcode::G_SSUBE:
2544 case TargetOpcode::G_USUBO:
2545 case TargetOpcode::G_USUBE:
2546 case TargetOpcode::G_SMULO:
2547 case TargetOpcode::G_UMULO: {
2551 if (
MI.getOperand(1).getReg() == R) {
2552 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2559 case TargetOpcode::G_SUB: {
2561 unsigned Src2NumSignBits =
2563 if (Src2NumSignBits == 1)
2573 if ((Known2.
Zero | 1).isAllOnes())
2580 FirstAnswer = Src2NumSignBits;
2587 unsigned Src1NumSignBits =
2589 if (Src1NumSignBits == 1)
2594 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2597 case TargetOpcode::G_ADD: {
2599 unsigned Src2NumSignBits =
2601 if (Src2NumSignBits <= 2)
2605 unsigned Src1NumSignBits =
2607 if (Src1NumSignBits == 1)
2616 if ((Known1.
Zero | 1).isAllOnes())
2622 FirstAnswer = Src1NumSignBits;
2631 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2634 case TargetOpcode::G_FCMP:
2635 case TargetOpcode::G_ICMP: {
2636 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2639 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2646 case TargetOpcode::G_UNMERGE_VALUES: {
2647 unsigned NumOps =
MI.getNumOperands();
2649 LLT SrcTy = MRI.getType(SrcReg);
2651 if ((SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType()) ||
2652 (SrcTy.isScalar() && DstTy.
isVector()))
2656 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
2658 APInt SubDemandedElts = DemandedElts;
2660 if (SrcTy.isVector()) {
2662 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
2665 unsigned SrcOpKnown =
2667 if (SrcTy.isVector()) {
2668 FirstAnswer = SrcOpKnown;
2669 }
else if (SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 2) * TyBits) {
2670 FirstAnswer = SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 1) * TyBits
2672 : SrcOpKnown % TyBits;
2676 case TargetOpcode::G_BUILD_VECTOR: {
2678 FirstAnswer = TyBits;
2679 APInt SingleDemandedElt(1, 1);
2681 if (!DemandedElts[
I])
2686 FirstAnswer = std::min(FirstAnswer, Tmp2);
2689 if (FirstAnswer == 1)
2694 case TargetOpcode::G_CONCAT_VECTORS: {
2695 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2697 FirstAnswer = TyBits;
2700 unsigned NumSubVectorElts =
2701 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2704 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2709 FirstAnswer = std::min(FirstAnswer, Tmp2);
2712 if (FirstAnswer == 1)
2717 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
2720 LLT SrcTy = MRI.getType(SrcReg);
2721 APInt DemandedSrcElts;
2722 if (SrcTy.isScalableVector()) {
2723 DemandedSrcElts =
APInt(1, 1);
2725 uint64_t Idx =
MI.getOperand(2).getImm();
2726 unsigned NumSrcElts = SrcTy.getNumElements();
2727 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
2731 case TargetOpcode::G_SHUFFLE_VECTOR: {
2734 APInt DemandedLHS, DemandedRHS;
2736 unsigned NumElts = MRI.getType(Src1).getNumElements();
2738 DemandedElts, DemandedLHS, DemandedRHS))
2744 if (FirstAnswer == 1)
2746 if (!!DemandedRHS) {
2749 FirstAnswer = std::min(FirstAnswer, Tmp2);
2753 case TargetOpcode::G_SPLAT_VECTOR: {
2757 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2758 if (NumSrcSignBits > (NumSrcBits - TyBits))
2759 return NumSrcSignBits - (NumSrcBits - TyBits);
2762 case TargetOpcode::G_INTRINSIC:
2763 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2764 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2765 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2768 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2770 FirstAnswer = std::max(FirstAnswer, NumBits);
2778 return std::max(FirstAnswer,
Known.countMinSignBits());
2782 LLT Ty = MRI.getType(R);
2783 APInt DemandedElts =
2792 unsigned Opcode =
MI.getOpcode();
2794 LLT Ty = MRI.getType(R);
2795 unsigned BitWidth = Ty.getScalarSizeInBits();
2797 if (Opcode == TargetOpcode::G_CONSTANT) {
2798 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2800 return std::nullopt;
2804 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2805 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2806 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2807 if (!DemandedElts[
I])
2810 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2811 MinAmt = MaxAmt =
nullptr;
2815 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2817 return std::nullopt;
2818 if (!MinAmt || MinAmt->
ugt(ShAmt))
2820 if (!MaxAmt || MaxAmt->ult(ShAmt))
2823 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2824 "Failed to find matching min/max shift amounts");
2825 if (MinAmt && MaxAmt)
2835 return std::nullopt;
2840 if (std::optional<ConstantRange> AmtRange =
2842 return AmtRange->getUnsignedMin().getZExtValue();
2843 return std::nullopt;
2861 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2873 return Result(MF, MaxDepth);
2888 if (!MO.isReg() || MO.getReg().isPhysical())
2891 if (!MRI.getType(Reg).isValid())
2894 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2895 bool IsKnownNeverZero = VTA.isKnownNeverZero(Reg);
2896 OS <<
" " << MO <<
" KnownBits:" <<
Known <<
" SignBits:" << SignedBits
2897 <<
" 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.
const MDNode * getRanges() const
Returns the Ranges that describes the dereference.
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.