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_CLMUL: {
507 case TargetOpcode::G_UAVGFLOOR: {
515 case TargetOpcode::G_UAVGCEIL: {
523 case TargetOpcode::G_SAVGFLOOR: {
531 case TargetOpcode::G_SAVGCEIL: {
539 case TargetOpcode::G_ABDU: {
547 case TargetOpcode::G_ABDS: {
556 if (SignBits1 == 1) {
562 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
565 case TargetOpcode::G_SADDSAT: {
573 case TargetOpcode::G_UADDSAT: {
581 case TargetOpcode::G_SSUBSAT: {
589 case TargetOpcode::G_USUBSAT: {
597 case TargetOpcode::G_UDIV: {
606 case TargetOpcode::G_SDIV: {
615 case TargetOpcode::G_UREM: {
627 case TargetOpcode::G_SREM: {
639 case TargetOpcode::G_SELECT: {
640 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
644 case TargetOpcode::G_SMIN: {
654 case TargetOpcode::G_SMAX: {
664 case TargetOpcode::G_UMIN: {
673 case TargetOpcode::G_UMAX: {
682 case TargetOpcode::G_FCMP:
683 case TargetOpcode::G_ICMP: {
686 if (TL.getBooleanContents(DstTy.
isVector(),
687 Opcode == TargetOpcode::G_FCMP) ==
690 Known.Zero.setBitsFrom(1);
693 case TargetOpcode::G_SEXT: {
701 case TargetOpcode::G_ASSERT_SEXT:
702 case TargetOpcode::G_SEXT_INREG: {
708 case TargetOpcode::G_ANYEXT: {
714 case TargetOpcode::G_LOAD: {
722 case TargetOpcode::G_SEXTLOAD:
723 case TargetOpcode::G_ZEXTLOAD: {
730 Known = Opcode == TargetOpcode::G_SEXTLOAD
735 case TargetOpcode::G_ASHR: {
744 case TargetOpcode::G_LSHR: {
753 case TargetOpcode::G_SHL: {
762 case TargetOpcode::G_ROTL:
763 case TargetOpcode::G_ROTR: {
772 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
775 if (Opcode == TargetOpcode::G_ROTL)
782 case TargetOpcode::G_FSHL:
783 case TargetOpcode::G_FSHR: {
789 const APInt Amt = *MaybeAmtOp;
794 Known = Opcode == TargetOpcode::G_FSHL
799 case TargetOpcode::G_INTTOPTR:
800 case TargetOpcode::G_PTRTOINT:
805 case TargetOpcode::G_ZEXT:
806 case TargetOpcode::G_TRUNC: {
812 case TargetOpcode::G_TRUNC_SSAT_S: {
818 case TargetOpcode::G_TRUNC_SSAT_U: {
824 case TargetOpcode::G_TRUNC_USAT_U: {
830 case TargetOpcode::G_ASSERT_ZEXT: {
834 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
835 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
837 Known.Zero |= (~InMask);
841 case TargetOpcode::G_ASSERT_ALIGN: {
842 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
847 Known.Zero.setLowBits(LogOfAlign);
848 Known.One.clearLowBits(LogOfAlign);
851 case TargetOpcode::G_MERGE_VALUES: {
852 unsigned NumOps =
MI.getNumOperands();
853 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
855 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
858 DemandedElts,
Depth + 1);
859 Known.insertBits(SrcOpKnown,
I * OpSize);
863 case TargetOpcode::G_UNMERGE_VALUES: {
864 unsigned NumOps =
MI.getNumOperands();
866 LLT SrcTy = MRI.getType(SrcReg);
868 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
872 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
874 APInt SubDemandedElts = DemandedElts;
875 if (SrcTy.isVector()) {
878 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
884 if (SrcTy.isVector())
885 Known = std::move(SrcOpKnown);
890 case TargetOpcode::G_BSWAP: {
896 case TargetOpcode::G_BITREVERSE: {
902 case TargetOpcode::G_CTPOP: {
909 Known.Zero.setBitsFrom(LowBits);
914 case TargetOpcode::G_UBFX: {
915 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
925 case TargetOpcode::G_SBFX: {
926 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
943 case TargetOpcode::G_UADDO:
944 case TargetOpcode::G_UADDE:
945 case TargetOpcode::G_SADDO:
946 case TargetOpcode::G_SADDE: {
947 if (
MI.getOperand(1).getReg() == R) {
950 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
953 Known.Zero.setBitsFrom(1);
957 assert(
MI.getOperand(0).getReg() == R &&
958 "We only compute knownbits for the sum here.");
961 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
965 Carry = Carry.
trunc(1);
977 case TargetOpcode::G_USUBO:
978 case TargetOpcode::G_USUBE:
979 case TargetOpcode::G_SSUBO:
980 case TargetOpcode::G_SSUBE:
981 case TargetOpcode::G_UMULO:
982 case TargetOpcode::G_SMULO: {
983 if (
MI.getOperand(1).getReg() == R) {
986 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
989 Known.Zero.setBitsFrom(1);
993 case TargetOpcode::G_CTTZ:
994 case TargetOpcode::G_CTTZ_ZERO_POISON: {
1001 Known.Zero.setBitsFrom(LowBits);
1004 case TargetOpcode::G_CTLZ:
1005 case TargetOpcode::G_CTLZ_ZERO_POISON: {
1012 Known.Zero.setBitsFrom(LowBits);
1015 case TargetOpcode::G_CTLS: {
1019 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
1027 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1034 LLT VecVT = MRI.getType(InVec);
1046 Known.Zero.setAllBits();
1047 Known.One.setAllBits();
1052 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
1059 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1061 Register InVec = Insert.getVectorReg();
1062 Register InVal = Insert.getElementReg();
1063 Register EltNo = Insert.getIndexReg();
1064 LLT VecVT = MRI.getType(InVec);
1072 bool DemandedVal =
true;
1073 APInt DemandedVecElts = DemandedElts;
1074 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
1075 unsigned EltIdx = ConstEltNo->getZExtValue();
1076 DemandedVal = !!DemandedElts[EltIdx];
1079 Known.setAllConflict();
1084 if (!!DemandedVecElts) {
1090 case TargetOpcode::G_INSERT_SUBVECTOR: {
1094 uint64_t Idx = Insert.getIndexImm();
1095 LLT SrcTy = MRI.getType(Src);
1096 LLT SubTy = MRI.getType(
Sub);
1097 APInt DemandedSubElts;
1098 APInt DemandedSrcElts;
1100 if (SrcTy.isScalableVector()) {
1104 DemandedSrcElts =
APInt(1, 1);
1107 DemandedSubElts = DemandedElts.
extractBits(NumSubElts, Idx);
1108 DemandedSrcElts = DemandedElts;
1109 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
1112 Known.setAllConflict();
1113 if (!!DemandedSubElts) {
1116 if (
Known.isUnknown())
1120 if (!!DemandedSrcElts) {
1127 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1129 LLT SrcTy = MRI.getType(SrcReg);
1130 APInt DemandedSrcElts;
1131 if (SrcTy.isScalableVector()) {
1132 DemandedSrcElts =
APInt(1, 1);
1134 uint64_t Idx =
MI.getOperand(2).getImm();
1135 unsigned NumSrcElts = SrcTy.getNumElements();
1136 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
1141 case TargetOpcode::G_SHUFFLE_VECTOR: {
1142 APInt DemandedLHS, DemandedRHS;
1145 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1147 DemandedElts, DemandedLHS, DemandedRHS))
1151 Known.Zero.setAllBits();
1152 Known.One.setAllBits();
1153 if (!!DemandedLHS) {
1159 if (
Known.isUnknown())
1161 if (!!DemandedRHS) {
1168 case TargetOpcode::G_CONCAT_VECTORS: {
1169 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
1172 Known.Zero.setAllBits();
1173 Known.One.setAllBits();
1174 unsigned NumSubVectorElts =
1175 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1179 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
1180 if (!!DemandedSub) {
1186 if (
Known.isUnknown())
1191 case TargetOpcode::G_ABS: {
1208 APInt DemandedElts =
1222void GISelValueTracking::computeKnownFPClassForFPTrunc(
1230 KnownFPClass KnownSrc;
1231 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1236void GISelValueTracking::computeKnownFPClass(
Register R,
1237 const APInt &DemandedElts,
1241 assert(
Known.isUnknown() &&
"should not be called with known information");
1243 if (!DemandedElts) {
1251 MachineInstr &
MI = *MRI.getVRegDef(R);
1252 unsigned Opcode =
MI.getOpcode();
1253 LLT DstTy = MRI.getType(R);
1261 switch (Cst->getKind()) {
1263 auto APF = Cst->getScalarValue();
1264 Known.setKnownFPClasses(APF.classify());
1265 Known.setSignBit(APF.isNegative());
1270 bool SignBitAllZero =
true;
1271 bool SignBitAllOne =
true;
1273 for (
auto C : *Cst) {
1274 Known.setKnownFPClasses(
Known.getKnownFPClasses() |
C.classify());
1276 SignBitAllZero =
false;
1278 SignBitAllOne =
false;
1281 if (SignBitAllOne != SignBitAllZero)
1282 Known.setSignBit(SignBitAllOne);
1297 KnownNotFromFlags |=
fcNan;
1299 KnownNotFromFlags |=
fcInf;
1303 InterestedClasses &= ~KnownNotFromFlags;
1306 [=, &
Known] {
Known.knownNot(KnownNotFromFlags); });
1316 TL.computeKnownFPClassForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
1319 case TargetOpcode::G_FNEG: {
1321 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1325 case TargetOpcode::G_SELECT: {
1348 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1349 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1355 MaskIfTrue = TestedMask;
1356 MaskIfFalse = ~TestedMask;
1359 if (TestedValue ==
LHS) {
1361 FilterLHS = MaskIfTrue;
1362 }
else if (TestedValue ==
RHS) {
1364 FilterRHS = MaskIfFalse;
1367 KnownFPClass Known2;
1368 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS,
Known,
1370 Known.setKnownFPClasses(
Known.getKnownFPClasses() & FilterLHS);
1372 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1379 case TargetOpcode::G_FCOPYSIGN: {
1380 Register Magnitude =
MI.getOperand(1).getReg();
1383 KnownFPClass KnownSign;
1385 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses,
Known,
1387 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1389 Known.copysign(KnownSign);
1392 case TargetOpcode::G_FMA:
1393 case TargetOpcode::G_STRICT_FMA:
1394 case TargetOpcode::G_FMAD: {
1407 KnownFPClass KnownSrc, KnownAddend;
1408 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1410 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1412 if (KnownNotFromFlags) {
1413 KnownSrc.
knownNot(KnownNotFromFlags);
1414 KnownAddend.
knownNot(KnownNotFromFlags);
1418 KnownFPClass KnownSrc[3];
1419 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1421 if (KnownSrc[0].isUnknown())
1423 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1425 if (KnownSrc[1].isUnknown())
1427 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1429 if (KnownSrc[2].isUnknown())
1431 if (KnownNotFromFlags) {
1432 KnownSrc[0].
knownNot(KnownNotFromFlags);
1433 KnownSrc[1].
knownNot(KnownNotFromFlags);
1434 KnownSrc[2].
knownNot(KnownNotFromFlags);
1440 case TargetOpcode::G_FSQRT:
1441 case TargetOpcode::G_STRICT_FSQRT: {
1442 KnownFPClass KnownSrc;
1444 if (InterestedClasses &
fcNan)
1448 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1457 case TargetOpcode::G_FABS: {
1462 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
1468 case TargetOpcode::G_FATAN2: {
1486 KnownFPClass KnownY, KnownX;
1487 computeKnownFPClass(
Y, DemandedElts, InterestedY, KnownY,
Depth + 1);
1488 computeKnownFPClass(
X, DemandedElts, InterestedX, KnownX,
Depth + 1);
1494 case TargetOpcode::G_FSINH: {
1496 KnownFPClass KnownSrc;
1497 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1502 case TargetOpcode::G_FCOSH: {
1504 KnownFPClass KnownSrc;
1505 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1510 case TargetOpcode::G_FTANH: {
1512 KnownFPClass KnownSrc;
1513 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1518 case TargetOpcode::G_FASIN: {
1520 KnownFPClass KnownSrc;
1521 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1526 case TargetOpcode::G_FACOS: {
1528 KnownFPClass KnownSrc;
1529 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1534 case TargetOpcode::G_FATAN: {
1536 KnownFPClass KnownSrc;
1537 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1542 case TargetOpcode::G_FTAN: {
1544 KnownFPClass KnownSrc;
1545 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1550 case TargetOpcode::G_FSIN:
1551 case TargetOpcode::G_FCOS: {
1554 KnownFPClass KnownSrc;
1555 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1558 : KnownFPClass::sin(KnownSrc);
1561 case TargetOpcode::G_FSINCOS: {
1564 KnownFPClass KnownSrc;
1565 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1567 if (R ==
MI.getOperand(0).getReg())
1573 case TargetOpcode::G_FMAXNUM:
1574 case TargetOpcode::G_FMINNUM:
1575 case TargetOpcode::G_FMINNUM_IEEE:
1576 case TargetOpcode::G_FMAXIMUM:
1577 case TargetOpcode::G_FMINIMUM:
1578 case TargetOpcode::G_FMAXNUM_IEEE:
1579 case TargetOpcode::G_FMAXIMUMNUM:
1580 case TargetOpcode::G_FMINIMUMNUM: {
1583 KnownFPClass KnownLHS, KnownRHS;
1585 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1587 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1592 case TargetOpcode::G_FMINIMUM:
1595 case TargetOpcode::G_FMAXIMUM:
1598 case TargetOpcode::G_FMINIMUMNUM:
1601 case TargetOpcode::G_FMAXIMUMNUM:
1604 case TargetOpcode::G_FMINNUM:
1605 case TargetOpcode::G_FMINNUM_IEEE:
1608 case TargetOpcode::G_FMAXNUM:
1609 case TargetOpcode::G_FMAXNUM_IEEE:
1621 case TargetOpcode::G_FCANONICALIZE: {
1623 KnownFPClass KnownSrc;
1624 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1629 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1633 case TargetOpcode::G_VECREDUCE_FMAX:
1634 case TargetOpcode::G_VECREDUCE_FMIN:
1635 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1636 case TargetOpcode::G_VECREDUCE_FMINIMUM:
1637 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
1638 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM: {
1644 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1646 if (!
Known.isKnownNeverNaN())
1647 Known.setSignBit(std::nullopt);
1650 case TargetOpcode::G_FFLOOR:
1651 case TargetOpcode::G_FCEIL:
1652 case TargetOpcode::G_FRINT:
1653 case TargetOpcode::G_FNEARBYINT:
1654 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1655 case TargetOpcode::G_INTRINSIC_ROUND:
1656 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1657 case TargetOpcode::G_INTRINSIC_TRUNC: {
1659 KnownFPClass KnownSrc;
1665 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1668 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1673 case TargetOpcode::G_FEXP:
1674 case TargetOpcode::G_FEXP2:
1675 case TargetOpcode::G_FEXP10: {
1677 KnownFPClass KnownSrc;
1678 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1683 case TargetOpcode::G_FLOG:
1684 case TargetOpcode::G_FLOG2:
1685 case TargetOpcode::G_FLOG10: {
1709 KnownFPClass KnownSrc;
1710 if (InterestedSrcs !=
fcNone)
1711 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1716 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1720 case TargetOpcode::G_FPOW: {
1721 const bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1723 if (!WantNaN && !WantNegative)
1732 InterestedRHS |=
fcNan;
1741 KnownFPClass KnownLHS;
1742 computeKnownFPClass(
MI.getOperand(1).getReg(), DemandedElts, InterestedLHS,
1743 KnownLHS,
Depth + 1);
1750 KnownFPClass KnownRHS;
1751 computeKnownFPClass(
MI.getOperand(2).getReg(), DemandedElts, InterestedRHS,
1752 KnownRHS,
Depth + 1);
1756 case TargetOpcode::G_FPOWI: {
1761 LLT ExpTy = MRI.getType(Exp);
1763 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1766 if (InterestedClasses &
fcNan)
1767 InterestedSrcs |=
fcNan;
1768 if (!ExponentKnownBits.
isZero()) {
1769 if (InterestedClasses &
fcInf)
1775 KnownFPClass KnownSrc;
1776 if (InterestedSrcs !=
fcNone) {
1778 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1785 case TargetOpcode::G_FLDEXP:
1786 case TargetOpcode::G_STRICT_FLDEXP: {
1788 KnownFPClass KnownSrc;
1789 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1797 LLT ExpTy = MRI.getType(ExpReg);
1799 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1804 DenormalMode
Mode = MF->getDenormalMode(Flt);
1808 case TargetOpcode::G_FADD:
1809 case TargetOpcode::G_STRICT_FADD:
1810 case TargetOpcode::G_FSUB:
1811 case TargetOpcode::G_STRICT_FSUB: {
1814 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1815 Opcode == TargetOpcode::G_STRICT_FADD);
1819 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1822 if (!WantNaN && !WantNegative && !WantNegZero) {
1832 if (InterestedClasses &
fcNan)
1833 InterestedSrcs |=
fcInf;
1837 KnownFPClass KnownSelf;
1838 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1844 KnownFPClass KnownLHS, KnownRHS;
1845 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1849 WantNegZero || !IsAdd) {
1852 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1862 case TargetOpcode::G_FMUL:
1863 case TargetOpcode::G_STRICT_FMUL: {
1871 KnownFPClass KnownSrc;
1878 KnownFPClass KnownLHS;
1882 KnownFPClass KnownLHS, KnownRHS;
1898 case TargetOpcode::G_FDIV: {
1899 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1914 KnownFPClass KnownSrc;
1915 computeKnownFPClass(
LHS, DemandedElts,
1924 if (!WantNan && !WantNegative && !WantPositive)
1927 KnownFPClass KnownLHS, KnownRHS;
1930 bool KnowSomethingUseful =
1935 if (KnowSomethingUseful)
1941 case TargetOpcode::G_FREM: {
1942 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1959 KnownFPClass KnownSrc;
1960 computeKnownFPClass(
LHS, DemandedElts,
1969 if (!WantNan && !WantNegative && !WantPositive)
1972 KnownFPClass KnownLHS, KnownRHS;
1974 KnownRHS,
Depth + 1);
1980 if (KnowSomethingUseful || WantPositive)
1987 case TargetOpcode::G_FFREXP: {
1989 if (R !=
MI.getOperand(0).getReg())
1992 KnownFPClass KnownSrc;
1993 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
2000 case TargetOpcode::G_FPEXT: {
2002 KnownFPClass KnownSrc;
2003 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
2008 LLT SrcTy = MRI.getType(Src).getScalarType();
2014 case TargetOpcode::G_FPTRUNC: {
2015 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses,
Known,
2019 case TargetOpcode::G_SITOFP:
2020 case TargetOpcode::G_UITOFP: {
2031 if (Opcode == TargetOpcode::G_UITOFP)
2032 Known.signBitMustBeZero();
2039 LLT Ty = MRI.getType(Val);
2041 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
2047 if (Opcode == TargetOpcode::G_SITOFP) {
2052 Known.signBitMustBeZero();
2054 Known.signBitMustBeOne();
2057 if (InterestedClasses &
fcInf) {
2064 if (Opcode == TargetOpcode::G_UITOFP)
2078 case TargetOpcode::G_BUILD_VECTOR:
2079 case TargetOpcode::G_CONCAT_VECTORS: {
2086 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
2088 bool NeedsElt = DemandedElts[Idx];
2094 computeKnownFPClass(Src,
Known, InterestedClasses,
Depth + 1);
2097 KnownFPClass Known2;
2098 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
2103 if (
Known.isUnknown())
2110 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2120 LLT VecTy = MRI.getType(Vec);
2125 if (CIdx && CIdx->ult(NumElts))
2127 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses,
Known,
2133 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2139 LLT VecTy = MRI.getType(Vec);
2147 APInt DemandedVecElts = DemandedElts;
2148 bool NeedsElt =
true;
2150 if (CIdx && CIdx->ult(NumElts)) {
2151 DemandedVecElts.
clearBit(CIdx->getZExtValue());
2152 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2157 computeKnownFPClass(Elt,
Known, InterestedClasses,
Depth + 1);
2159 if (
Known.isUnknown())
2166 if (!DemandedVecElts.
isZero()) {
2167 KnownFPClass Known2;
2168 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
2175 case TargetOpcode::G_SHUFFLE_VECTOR: {
2179 APInt DemandedLHS, DemandedRHS;
2181 assert(DemandedElts == APInt(1, 1));
2182 DemandedLHS = DemandedRHS = DemandedElts;
2184 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
2186 DemandedLHS, DemandedRHS)) {
2192 if (!!DemandedLHS) {
2194 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses,
Known,
2198 if (
Known.isUnknown())
2204 if (!!DemandedRHS) {
2205 KnownFPClass Known2;
2207 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
2213 case TargetOpcode::G_PHI: {
2222 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
2223 const MachineOperand &Src =
MI.getOperand(Idx);
2226 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses,
Known,
2230 KnownFPClass Known2;
2231 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
2235 if (
Known.isUnknown())
2240 case TargetOpcode::COPY: {
2243 if (!Src.isVirtual())
2246 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
Depth + 1);
2257 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
2258 return KnownClasses;
2264 computeKnownFPClass(R,
Known, InterestedClasses,
Depth);
2272 InterestedClasses &=
~fcNan;
2274 InterestedClasses &=
~fcInf;
2277 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
2280 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~
fcNan);
2282 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~
fcInf);
2288 LLT Ty = MRI.getType(R);
2289 APInt DemandedElts =
2291 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
2306 switch (
DefMI->getOpcode()) {
2309 case TargetOpcode::G_FADD:
2310 case TargetOpcode::G_STRICT_FADD:
2311 case TargetOpcode::G_FSUB:
2312 case TargetOpcode::G_STRICT_FSUB:
2313 case TargetOpcode::G_FMUL:
2314 case TargetOpcode::G_STRICT_FMUL:
2315 case TargetOpcode::G_FDIV:
2316 case TargetOpcode::G_FREM:
2317 case TargetOpcode::G_FMA:
2318 case TargetOpcode::G_STRICT_FMA:
2319 case TargetOpcode::G_FMAD:
2320 case TargetOpcode::G_FSQRT:
2321 case TargetOpcode::G_STRICT_FSQRT:
2325 case TargetOpcode::G_FSIN:
2326 case TargetOpcode::G_FCOS:
2327 case TargetOpcode::G_FSINCOS:
2328 case TargetOpcode::G_FTAN:
2329 case TargetOpcode::G_FASIN:
2330 case TargetOpcode::G_FACOS:
2331 case TargetOpcode::G_FATAN:
2332 case TargetOpcode::G_FATAN2:
2333 case TargetOpcode::G_FSINH:
2334 case TargetOpcode::G_FCOSH:
2335 case TargetOpcode::G_FTANH:
2336 case TargetOpcode::G_FEXP:
2337 case TargetOpcode::G_FEXP2:
2338 case TargetOpcode::G_FEXP10:
2339 case TargetOpcode::G_FLOG:
2340 case TargetOpcode::G_FLOG2:
2341 case TargetOpcode::G_FLOG10:
2342 case TargetOpcode::G_FPOW:
2343 case TargetOpcode::G_FPOWI:
2344 case TargetOpcode::G_FLDEXP:
2345 case TargetOpcode::G_STRICT_FLDEXP:
2346 case TargetOpcode::G_FFREXP:
2347 case TargetOpcode::G_INTRINSIC_TRUNC:
2348 case TargetOpcode::G_INTRINSIC_ROUND:
2349 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2350 case TargetOpcode::G_FFLOOR:
2351 case TargetOpcode::G_FCEIL:
2352 case TargetOpcode::G_FRINT:
2353 case TargetOpcode::G_FNEARBYINT:
2354 case TargetOpcode::G_FPEXT:
2355 case TargetOpcode::G_FPTRUNC:
2356 case TargetOpcode::G_FCANONICALIZE:
2357 case TargetOpcode::G_FMINNUM:
2358 case TargetOpcode::G_FMAXNUM:
2359 case TargetOpcode::G_FMINNUM_IEEE:
2360 case TargetOpcode::G_FMAXNUM_IEEE:
2361 case TargetOpcode::G_FMINIMUM:
2362 case TargetOpcode::G_FMAXIMUM:
2363 case TargetOpcode::G_FMINIMUMNUM:
2364 case TargetOpcode::G_FMAXIMUMNUM:
2380 return Known.isKnownNeverLogicalZero(
2385unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2386 const APInt &DemandedElts,
2390 if (Src1SignBits == 1)
2400 const MDNode *Ranges = Ld->getRanges();
2406 switch (Ld->getOpcode()) {
2407 case TargetOpcode::G_SEXTLOAD:
2410 case TargetOpcode::G_ZEXTLOAD:
2423 const APInt &DemandedElts,
2426 unsigned Opcode =
MI.getOpcode();
2428 if (Opcode == TargetOpcode::G_CONSTANT)
2429 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2437 LLT DstTy = MRI.getType(R);
2447 unsigned FirstAnswer = 1;
2449 case TargetOpcode::COPY: {
2451 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2452 MRI.getType(Src.getReg()).isValid()) {
2459 case TargetOpcode::G_SEXT: {
2461 LLT SrcTy = MRI.getType(Src);
2462 unsigned Tmp = TyBits - SrcTy.getScalarSizeInBits();
2465 case TargetOpcode::G_ASSERT_SEXT:
2466 case TargetOpcode::G_SEXT_INREG: {
2469 unsigned SrcBits =
MI.getOperand(2).getImm();
2470 unsigned InRegBits = TyBits - SrcBits + 1;
2474 case TargetOpcode::G_LOAD: {
2481 case TargetOpcode::G_SEXTLOAD: {
2496 case TargetOpcode::G_ZEXTLOAD: {
2511 case TargetOpcode::G_AND:
2512 case TargetOpcode::G_OR:
2513 case TargetOpcode::G_XOR: {
2515 unsigned Src1NumSignBits =
2517 if (Src1NumSignBits != 1) {
2519 unsigned Src2NumSignBits =
2521 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2525 case TargetOpcode::G_ASHR: {
2530 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2533 case TargetOpcode::G_SHL: {
2536 if (std::optional<ConstantRange> ShAmtRange =
2538 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2539 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2549 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2550 ExtOpc == TargetOpcode::G_ANYEXT) {
2551 LLT ExtTy = MRI.getType(Src1);
2553 LLT ExtendeeTy = MRI.getType(Extendee);
2557 if (SizeDiff <= MinShAmt) {
2561 return Tmp - MaxShAmt;
2567 return Tmp - MaxShAmt;
2571 case TargetOpcode::G_ROTL:
2572 case TargetOpcode::G_ROTR: {
2581 case TargetOpcode::G_SAVGFLOOR:
2582 case TargetOpcode::G_SAVGCEIL: {
2585 FirstAnswer = computeNumSignBitsMin(Src1, Src2, DemandedElts,
Depth + 1);
2588 case TargetOpcode::G_SREM: {
2596 case TargetOpcode::G_TRUNC: {
2598 LLT SrcTy = MRI.getType(Src);
2603 if (NumSrcSignBits > (NumSrcBits - TyBits))
2604 return NumSrcSignBits - (NumSrcBits - TyBits);
2607 case TargetOpcode::G_SELECT: {
2608 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2609 MI.getOperand(3).getReg(), DemandedElts,
2612 case TargetOpcode::G_SMIN:
2613 case TargetOpcode::G_SMAX:
2614 case TargetOpcode::G_UMIN:
2615 case TargetOpcode::G_UMAX:
2617 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2618 MI.getOperand(2).getReg(), DemandedElts,
2620 case TargetOpcode::G_SADDO:
2621 case TargetOpcode::G_SADDE:
2622 case TargetOpcode::G_UADDO:
2623 case TargetOpcode::G_UADDE:
2624 case TargetOpcode::G_SSUBO:
2625 case TargetOpcode::G_SSUBE:
2626 case TargetOpcode::G_USUBO:
2627 case TargetOpcode::G_USUBE:
2628 case TargetOpcode::G_SMULO:
2629 case TargetOpcode::G_UMULO: {
2633 if (
MI.getOperand(1).getReg() == R) {
2634 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2641 case TargetOpcode::G_SUB: {
2643 unsigned Src2NumSignBits =
2645 if (Src2NumSignBits == 1)
2655 if ((Known2.
Zero | 1).isAllOnes())
2662 FirstAnswer = Src2NumSignBits;
2669 unsigned Src1NumSignBits =
2671 if (Src1NumSignBits == 1)
2676 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2679 case TargetOpcode::G_ADD: {
2681 unsigned Src2NumSignBits =
2683 if (Src2NumSignBits <= 2)
2687 unsigned Src1NumSignBits =
2689 if (Src1NumSignBits == 1)
2698 if ((Known1.
Zero | 1).isAllOnes())
2704 FirstAnswer = Src1NumSignBits;
2713 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2716 case TargetOpcode::G_FCMP:
2717 case TargetOpcode::G_ICMP: {
2718 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2721 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2728 case TargetOpcode::G_UNMERGE_VALUES: {
2729 unsigned NumOps =
MI.getNumOperands();
2731 LLT SrcTy = MRI.getType(SrcReg);
2733 if ((SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType()) ||
2734 (SrcTy.isScalar() && DstTy.
isVector()))
2738 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
2740 APInt SubDemandedElts = DemandedElts;
2742 if (SrcTy.isVector()) {
2744 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
2747 unsigned SrcOpKnown =
2749 if (SrcTy.isVector()) {
2750 FirstAnswer = SrcOpKnown;
2751 }
else if (SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 2) * TyBits) {
2752 FirstAnswer = SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 1) * TyBits
2754 : SrcOpKnown % TyBits;
2758 case TargetOpcode::G_BUILD_VECTOR: {
2760 FirstAnswer = TyBits;
2761 APInt SingleDemandedElt(1, 1);
2763 if (!DemandedElts[
I])
2768 FirstAnswer = std::min(FirstAnswer, Tmp2);
2771 if (FirstAnswer == 1)
2776 case TargetOpcode::G_CONCAT_VECTORS: {
2777 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2779 FirstAnswer = TyBits;
2782 unsigned NumSubVectorElts =
2783 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2786 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2791 FirstAnswer = std::min(FirstAnswer, Tmp2);
2794 if (FirstAnswer == 1)
2799 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2803 LLT VecVT = MRI.getType(InVec);
2808 APInt DemandedSrcElts =
2809 ConstEltNo && ConstEltNo->ult(NumSrcElts)
2814 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
2817 LLT SrcTy = MRI.getType(SrcReg);
2818 APInt DemandedSrcElts;
2819 if (SrcTy.isScalableVector()) {
2820 DemandedSrcElts =
APInt(1, 1);
2822 uint64_t Idx =
MI.getOperand(2).getImm();
2823 unsigned NumSrcElts = SrcTy.getNumElements();
2824 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
2828 case TargetOpcode::G_SHUFFLE_VECTOR: {
2831 APInt DemandedLHS, DemandedRHS;
2833 unsigned NumElts = MRI.getType(Src1).getNumElements();
2835 DemandedElts, DemandedLHS, DemandedRHS))
2841 if (FirstAnswer == 1)
2843 if (!!DemandedRHS) {
2846 FirstAnswer = std::min(FirstAnswer, Tmp2);
2850 case TargetOpcode::G_SPLAT_VECTOR: {
2854 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2855 if (NumSrcSignBits > (NumSrcBits - TyBits))
2856 return NumSrcSignBits - (NumSrcBits - TyBits);
2859 case TargetOpcode::G_INTRINSIC:
2860 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2861 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2862 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2865 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2867 FirstAnswer = std::max(FirstAnswer, NumBits);
2875 return std::max(FirstAnswer,
Known.countMinSignBits());
2879 LLT Ty = MRI.getType(R);
2880 APInt DemandedElts =
2889 unsigned Opcode =
MI.getOpcode();
2891 LLT Ty = MRI.getType(R);
2892 unsigned BitWidth = Ty.getScalarSizeInBits();
2894 if (Opcode == TargetOpcode::G_CONSTANT) {
2895 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2897 return std::nullopt;
2901 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2902 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2903 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2904 if (!DemandedElts[
I])
2907 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2908 MinAmt = MaxAmt =
nullptr;
2912 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2914 return std::nullopt;
2915 if (!MinAmt || MinAmt->
ugt(ShAmt))
2917 if (!MaxAmt || MaxAmt->ult(ShAmt))
2920 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2921 "Failed to find matching min/max shift amounts");
2922 if (MinAmt && MaxAmt)
2932 return std::nullopt;
2937 if (std::optional<ConstantRange> AmtRange =
2939 return AmtRange->getUnsignedMin().getZExtValue();
2940 return std::nullopt;
2958 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2970 return Result(MF, MaxDepth);
2985 if (!MO.isReg() || MO.getReg().isPhysical())
2988 if (!MRI.getType(Reg).isValid())
2991 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2992 bool IsKnownNeverZero = VTA.isKnownNeverZero(Reg);
2993 OS <<
" " << MO <<
" KnownBits:" <<
Known <<
" SignBits:" << SignedBits
2994 <<
" 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.
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
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.
bool isKnownNeverLogicalZero(Register Val, unsigned Depth=0)
Returns true if Val can be assumed to never be a zero, accounting for denormal flushing of the contai...
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 a insert subvector.
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.
@ Sub
Subtraction of integers.
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 clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
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.
void setKnownFPClasses(FPClassTest Classes)
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.
FPClassTest getKnownFPClasses() const
Floating-point classes the value could be one of.
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.