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_VECTOR_COMPRESS: {
1195 Register PassThru =
MI.getOperand(3).getReg();
1198 if (
Known.isUnknown())
1207 case TargetOpcode::G_ABS: {
1224 APInt DemandedElts =
1238void GISelValueTracking::computeKnownFPClassForFPTrunc(
1246 KnownFPClass KnownSrc;
1247 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1252void GISelValueTracking::computeKnownFPClass(
Register R,
1253 const APInt &DemandedElts,
1257 assert(
Known.isUnknown() &&
"should not be called with known information");
1259 if (!DemandedElts) {
1267 MachineInstr &
MI = *MRI.getVRegDef(R);
1268 unsigned Opcode =
MI.getOpcode();
1269 LLT DstTy = MRI.getType(R);
1277 switch (Cst->getKind()) {
1279 auto APF = Cst->getScalarValue();
1280 Known.setKnownFPClasses(APF.classify());
1281 Known.setSignBit(APF.isNegative());
1286 bool SignBitAllZero =
true;
1287 bool SignBitAllOne =
true;
1289 for (
auto C : *Cst) {
1290 Known.setKnownFPClasses(
Known.getKnownFPClasses() |
C.classify());
1292 SignBitAllZero =
false;
1294 SignBitAllOne =
false;
1297 if (SignBitAllOne != SignBitAllZero)
1298 Known.setSignBit(SignBitAllOne);
1313 KnownNotFromFlags |=
fcNan;
1315 KnownNotFromFlags |=
fcInf;
1319 InterestedClasses &= ~KnownNotFromFlags;
1322 [=, &
Known] {
Known.knownNot(KnownNotFromFlags); });
1332 TL.computeKnownFPClassForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
1335 case TargetOpcode::G_FNEG: {
1337 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1341 case TargetOpcode::G_SELECT: {
1364 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1365 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1371 MaskIfTrue = TestedMask;
1372 MaskIfFalse = ~TestedMask;
1375 if (TestedValue ==
LHS) {
1377 FilterLHS = MaskIfTrue;
1378 }
else if (TestedValue ==
RHS) {
1380 FilterRHS = MaskIfFalse;
1383 KnownFPClass Known2;
1384 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS,
Known,
1386 Known.setKnownFPClasses(
Known.getKnownFPClasses() & FilterLHS);
1388 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1395 case TargetOpcode::G_FCOPYSIGN: {
1396 Register Magnitude =
MI.getOperand(1).getReg();
1399 KnownFPClass KnownSign;
1401 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses,
Known,
1403 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1405 Known.copysign(KnownSign);
1408 case TargetOpcode::G_FMA:
1409 case TargetOpcode::G_STRICT_FMA:
1410 case TargetOpcode::G_FMAD: {
1423 KnownFPClass KnownSrc, KnownAddend;
1424 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1426 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1428 if (KnownNotFromFlags) {
1429 KnownSrc.
knownNot(KnownNotFromFlags);
1430 KnownAddend.
knownNot(KnownNotFromFlags);
1434 KnownFPClass KnownSrc[3];
1435 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1437 if (KnownSrc[0].isUnknown())
1439 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1441 if (KnownSrc[1].isUnknown())
1443 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1445 if (KnownSrc[2].isUnknown())
1447 if (KnownNotFromFlags) {
1448 KnownSrc[0].
knownNot(KnownNotFromFlags);
1449 KnownSrc[1].
knownNot(KnownNotFromFlags);
1450 KnownSrc[2].
knownNot(KnownNotFromFlags);
1456 case TargetOpcode::G_FSQRT:
1457 case TargetOpcode::G_STRICT_FSQRT: {
1458 KnownFPClass KnownSrc;
1460 if (InterestedClasses &
fcNan)
1464 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1473 case TargetOpcode::G_FABS: {
1478 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
1484 case TargetOpcode::G_FATAN2: {
1502 KnownFPClass KnownY, KnownX;
1503 computeKnownFPClass(
Y, DemandedElts, InterestedY, KnownY,
Depth + 1);
1504 computeKnownFPClass(
X, DemandedElts, InterestedX, KnownX,
Depth + 1);
1510 case TargetOpcode::G_FSINH: {
1512 KnownFPClass KnownSrc;
1513 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1518 case TargetOpcode::G_FCOSH: {
1520 KnownFPClass KnownSrc;
1521 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1526 case TargetOpcode::G_FTANH: {
1528 KnownFPClass KnownSrc;
1529 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1534 case TargetOpcode::G_FASIN: {
1536 KnownFPClass KnownSrc;
1537 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1542 case TargetOpcode::G_FACOS: {
1544 KnownFPClass KnownSrc;
1545 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1550 case TargetOpcode::G_FATAN: {
1552 KnownFPClass KnownSrc;
1553 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1558 case TargetOpcode::G_FTAN: {
1560 KnownFPClass KnownSrc;
1561 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1566 case TargetOpcode::G_FSIN:
1567 case TargetOpcode::G_FCOS: {
1570 KnownFPClass KnownSrc;
1571 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1574 : KnownFPClass::sin(KnownSrc);
1577 case TargetOpcode::G_FSINCOS: {
1580 KnownFPClass KnownSrc;
1581 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1583 if (R ==
MI.getOperand(0).getReg())
1589 case TargetOpcode::G_FMAXNUM:
1590 case TargetOpcode::G_FMINNUM:
1591 case TargetOpcode::G_FMINNUM_IEEE:
1592 case TargetOpcode::G_FMAXIMUM:
1593 case TargetOpcode::G_FMINIMUM:
1594 case TargetOpcode::G_FMAXNUM_IEEE:
1595 case TargetOpcode::G_FMAXIMUMNUM:
1596 case TargetOpcode::G_FMINIMUMNUM: {
1599 KnownFPClass KnownLHS, KnownRHS;
1601 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1603 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1608 case TargetOpcode::G_FMINIMUM:
1611 case TargetOpcode::G_FMAXIMUM:
1614 case TargetOpcode::G_FMINIMUMNUM:
1617 case TargetOpcode::G_FMAXIMUMNUM:
1620 case TargetOpcode::G_FMINNUM:
1621 case TargetOpcode::G_FMINNUM_IEEE:
1624 case TargetOpcode::G_FMAXNUM:
1625 case TargetOpcode::G_FMAXNUM_IEEE:
1637 case TargetOpcode::G_FCANONICALIZE: {
1639 KnownFPClass KnownSrc;
1640 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1645 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1649 case TargetOpcode::G_VECREDUCE_FMAX:
1650 case TargetOpcode::G_VECREDUCE_FMIN:
1651 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1652 case TargetOpcode::G_VECREDUCE_FMINIMUM:
1653 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
1654 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM: {
1660 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1662 if (!
Known.isKnownNeverNaN())
1663 Known.setSignBit(std::nullopt);
1666 case TargetOpcode::G_FFLOOR:
1667 case TargetOpcode::G_FCEIL:
1668 case TargetOpcode::G_FRINT:
1669 case TargetOpcode::G_FNEARBYINT:
1670 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1671 case TargetOpcode::G_INTRINSIC_ROUND:
1672 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1673 case TargetOpcode::G_INTRINSIC_TRUNC: {
1675 KnownFPClass KnownSrc;
1681 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1684 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1689 case TargetOpcode::G_FEXP:
1690 case TargetOpcode::G_FEXP2:
1691 case TargetOpcode::G_FEXP10: {
1693 KnownFPClass KnownSrc;
1694 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1699 case TargetOpcode::G_FLOG:
1700 case TargetOpcode::G_FLOG2:
1701 case TargetOpcode::G_FLOG10: {
1725 KnownFPClass KnownSrc;
1726 if (InterestedSrcs !=
fcNone)
1727 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1732 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1736 case TargetOpcode::G_FPOW: {
1737 const bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1739 if (!WantNaN && !WantNegative)
1748 InterestedRHS |=
fcNan;
1757 KnownFPClass KnownLHS;
1758 computeKnownFPClass(
MI.getOperand(1).getReg(), DemandedElts, InterestedLHS,
1759 KnownLHS,
Depth + 1);
1766 KnownFPClass KnownRHS;
1767 computeKnownFPClass(
MI.getOperand(2).getReg(), DemandedElts, InterestedRHS,
1768 KnownRHS,
Depth + 1);
1772 case TargetOpcode::G_FPOWI: {
1777 LLT ExpTy = MRI.getType(Exp);
1779 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1782 if (InterestedClasses &
fcNan)
1783 InterestedSrcs |=
fcNan;
1784 if (!ExponentKnownBits.
isZero()) {
1785 if (InterestedClasses &
fcInf)
1791 KnownFPClass KnownSrc;
1792 if (InterestedSrcs !=
fcNone) {
1794 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1801 case TargetOpcode::G_FLDEXP:
1802 case TargetOpcode::G_STRICT_FLDEXP: {
1804 KnownFPClass KnownSrc;
1805 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1813 LLT ExpTy = MRI.getType(ExpReg);
1815 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1820 DenormalMode
Mode = MF->getDenormalMode(Flt);
1824 case TargetOpcode::G_FADD:
1825 case TargetOpcode::G_STRICT_FADD:
1826 case TargetOpcode::G_FSUB:
1827 case TargetOpcode::G_STRICT_FSUB: {
1830 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1831 Opcode == TargetOpcode::G_STRICT_FADD);
1835 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1838 if (!WantNaN && !WantNegative && !WantNegZero) {
1848 if (InterestedClasses &
fcNan)
1849 InterestedSrcs |=
fcInf;
1853 KnownFPClass KnownSelf;
1854 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1860 KnownFPClass KnownLHS, KnownRHS;
1861 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1865 WantNegZero || !IsAdd) {
1868 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1878 case TargetOpcode::G_FMUL:
1879 case TargetOpcode::G_STRICT_FMUL: {
1887 KnownFPClass KnownSrc;
1894 KnownFPClass KnownLHS;
1898 KnownFPClass KnownLHS, KnownRHS;
1914 case TargetOpcode::G_FDIV: {
1915 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1930 KnownFPClass KnownSrc;
1931 computeKnownFPClass(
LHS, DemandedElts,
1940 if (!WantNan && !WantNegative && !WantPositive)
1943 KnownFPClass KnownLHS, KnownRHS;
1946 bool KnowSomethingUseful =
1951 if (KnowSomethingUseful)
1957 case TargetOpcode::G_FREM: {
1958 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1975 KnownFPClass KnownSrc;
1976 computeKnownFPClass(
LHS, DemandedElts,
1985 if (!WantNan && !WantNegative && !WantPositive)
1988 KnownFPClass KnownLHS, KnownRHS;
1990 KnownRHS,
Depth + 1);
1996 if (KnowSomethingUseful || WantPositive)
2003 case TargetOpcode::G_FFREXP: {
2005 if (R !=
MI.getOperand(0).getReg())
2008 KnownFPClass KnownSrc;
2009 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
2016 case TargetOpcode::G_FPEXT: {
2018 KnownFPClass KnownSrc;
2019 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
2024 LLT SrcTy = MRI.getType(Src).getScalarType();
2030 case TargetOpcode::G_FPTRUNC: {
2031 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses,
Known,
2035 case TargetOpcode::G_SITOFP:
2036 case TargetOpcode::G_UITOFP: {
2047 if (Opcode == TargetOpcode::G_UITOFP)
2048 Known.signBitMustBeZero();
2055 LLT Ty = MRI.getType(Val);
2057 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
2063 if (Opcode == TargetOpcode::G_SITOFP) {
2068 Known.signBitMustBeZero();
2070 Known.signBitMustBeOne();
2073 if (InterestedClasses &
fcInf) {
2080 if (Opcode == TargetOpcode::G_UITOFP)
2094 case TargetOpcode::G_BUILD_VECTOR:
2095 case TargetOpcode::G_CONCAT_VECTORS: {
2102 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
2104 bool NeedsElt = DemandedElts[Idx];
2110 computeKnownFPClass(Src,
Known, InterestedClasses,
Depth + 1);
2113 KnownFPClass Known2;
2114 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
2119 if (
Known.isUnknown())
2126 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2136 LLT VecTy = MRI.getType(Vec);
2141 if (CIdx && CIdx->ult(NumElts))
2143 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses,
Known,
2149 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2155 LLT VecTy = MRI.getType(Vec);
2163 APInt DemandedVecElts = DemandedElts;
2164 bool NeedsElt =
true;
2166 if (CIdx && CIdx->ult(NumElts)) {
2167 DemandedVecElts.
clearBit(CIdx->getZExtValue());
2168 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2173 computeKnownFPClass(Elt,
Known, InterestedClasses,
Depth + 1);
2175 if (
Known.isUnknown())
2182 if (!DemandedVecElts.
isZero()) {
2183 KnownFPClass Known2;
2184 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
2191 case TargetOpcode::G_SHUFFLE_VECTOR: {
2195 APInt DemandedLHS, DemandedRHS;
2197 assert(DemandedElts == APInt(1, 1));
2198 DemandedLHS = DemandedRHS = DemandedElts;
2200 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
2202 DemandedLHS, DemandedRHS)) {
2208 if (!!DemandedLHS) {
2210 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses,
Known,
2214 if (
Known.isUnknown())
2220 if (!!DemandedRHS) {
2221 KnownFPClass Known2;
2223 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
2229 case TargetOpcode::G_PHI: {
2238 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
2239 const MachineOperand &Src =
MI.getOperand(Idx);
2242 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses,
Known,
2246 KnownFPClass Known2;
2247 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
2251 if (
Known.isUnknown())
2256 case TargetOpcode::COPY: {
2259 if (!Src.isVirtual())
2262 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
Depth + 1);
2273 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
2274 return KnownClasses;
2280 computeKnownFPClass(R,
Known, InterestedClasses,
Depth);
2288 InterestedClasses &=
~fcNan;
2290 InterestedClasses &=
~fcInf;
2293 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
2296 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~
fcNan);
2298 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~
fcInf);
2304 LLT Ty = MRI.getType(R);
2305 APInt DemandedElts =
2307 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
2322 switch (
DefMI->getOpcode()) {
2325 case TargetOpcode::G_FADD:
2326 case TargetOpcode::G_STRICT_FADD:
2327 case TargetOpcode::G_FSUB:
2328 case TargetOpcode::G_STRICT_FSUB:
2329 case TargetOpcode::G_FMUL:
2330 case TargetOpcode::G_STRICT_FMUL:
2331 case TargetOpcode::G_FDIV:
2332 case TargetOpcode::G_FREM:
2333 case TargetOpcode::G_FMA:
2334 case TargetOpcode::G_STRICT_FMA:
2335 case TargetOpcode::G_FMAD:
2336 case TargetOpcode::G_FSQRT:
2337 case TargetOpcode::G_STRICT_FSQRT:
2341 case TargetOpcode::G_FSIN:
2342 case TargetOpcode::G_FCOS:
2343 case TargetOpcode::G_FSINCOS:
2344 case TargetOpcode::G_FTAN:
2345 case TargetOpcode::G_FASIN:
2346 case TargetOpcode::G_FACOS:
2347 case TargetOpcode::G_FATAN:
2348 case TargetOpcode::G_FATAN2:
2349 case TargetOpcode::G_FSINH:
2350 case TargetOpcode::G_FCOSH:
2351 case TargetOpcode::G_FTANH:
2352 case TargetOpcode::G_FEXP:
2353 case TargetOpcode::G_FEXP2:
2354 case TargetOpcode::G_FEXP10:
2355 case TargetOpcode::G_FLOG:
2356 case TargetOpcode::G_FLOG2:
2357 case TargetOpcode::G_FLOG10:
2358 case TargetOpcode::G_FPOW:
2359 case TargetOpcode::G_FPOWI:
2360 case TargetOpcode::G_FLDEXP:
2361 case TargetOpcode::G_STRICT_FLDEXP:
2362 case TargetOpcode::G_FFREXP:
2363 case TargetOpcode::G_INTRINSIC_TRUNC:
2364 case TargetOpcode::G_INTRINSIC_ROUND:
2365 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2366 case TargetOpcode::G_FFLOOR:
2367 case TargetOpcode::G_FCEIL:
2368 case TargetOpcode::G_FRINT:
2369 case TargetOpcode::G_FNEARBYINT:
2370 case TargetOpcode::G_FPEXT:
2371 case TargetOpcode::G_FPTRUNC:
2372 case TargetOpcode::G_FCANONICALIZE:
2373 case TargetOpcode::G_FMINNUM:
2374 case TargetOpcode::G_FMAXNUM:
2375 case TargetOpcode::G_FMINNUM_IEEE:
2376 case TargetOpcode::G_FMAXNUM_IEEE:
2377 case TargetOpcode::G_FMINIMUM:
2378 case TargetOpcode::G_FMAXIMUM:
2379 case TargetOpcode::G_FMINIMUMNUM:
2380 case TargetOpcode::G_FMAXIMUMNUM:
2396 return Known.isKnownNeverLogicalZero(
2401unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2402 const APInt &DemandedElts,
2406 if (Src1SignBits == 1)
2416 const MDNode *Ranges = Ld->getRanges();
2422 switch (Ld->getOpcode()) {
2423 case TargetOpcode::G_SEXTLOAD:
2426 case TargetOpcode::G_ZEXTLOAD:
2439 const APInt &DemandedElts,
2442 unsigned Opcode =
MI.getOpcode();
2444 if (Opcode == TargetOpcode::G_CONSTANT)
2445 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2453 LLT DstTy = MRI.getType(R);
2463 unsigned FirstAnswer = 1;
2465 case TargetOpcode::COPY: {
2467 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2468 MRI.getType(Src.getReg()).isValid()) {
2475 case TargetOpcode::G_SEXT: {
2477 LLT SrcTy = MRI.getType(Src);
2478 unsigned Tmp = TyBits - SrcTy.getScalarSizeInBits();
2481 case TargetOpcode::G_ASSERT_SEXT:
2482 case TargetOpcode::G_SEXT_INREG: {
2485 unsigned SrcBits =
MI.getOperand(2).getImm();
2486 unsigned InRegBits = TyBits - SrcBits + 1;
2490 case TargetOpcode::G_LOAD: {
2497 case TargetOpcode::G_SEXTLOAD: {
2512 case TargetOpcode::G_ZEXTLOAD: {
2527 case TargetOpcode::G_AND:
2528 case TargetOpcode::G_OR:
2529 case TargetOpcode::G_XOR: {
2531 unsigned Src1NumSignBits =
2533 if (Src1NumSignBits != 1) {
2535 unsigned Src2NumSignBits =
2537 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2541 case TargetOpcode::G_ASHR: {
2546 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2549 case TargetOpcode::G_SHL: {
2552 if (std::optional<ConstantRange> ShAmtRange =
2554 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2555 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2565 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2566 ExtOpc == TargetOpcode::G_ANYEXT) {
2567 LLT ExtTy = MRI.getType(Src1);
2569 LLT ExtendeeTy = MRI.getType(Extendee);
2573 if (SizeDiff <= MinShAmt) {
2577 return Tmp - MaxShAmt;
2583 return Tmp - MaxShAmt;
2587 case TargetOpcode::G_ROTL:
2588 case TargetOpcode::G_ROTR: {
2597 case TargetOpcode::G_SAVGFLOOR:
2598 case TargetOpcode::G_SAVGCEIL: {
2601 FirstAnswer = computeNumSignBitsMin(Src1, Src2, DemandedElts,
Depth + 1);
2604 case TargetOpcode::G_SREM: {
2612 case TargetOpcode::G_TRUNC: {
2614 LLT SrcTy = MRI.getType(Src);
2619 if (NumSrcSignBits > (NumSrcBits - TyBits))
2620 return NumSrcSignBits - (NumSrcBits - TyBits);
2623 case TargetOpcode::G_SELECT: {
2624 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2625 MI.getOperand(3).getReg(), DemandedElts,
2628 case TargetOpcode::G_SMIN:
2629 case TargetOpcode::G_SMAX:
2630 case TargetOpcode::G_UMIN:
2631 case TargetOpcode::G_UMAX:
2633 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2634 MI.getOperand(2).getReg(), DemandedElts,
2636 case TargetOpcode::G_SADDO:
2637 case TargetOpcode::G_SADDE:
2638 case TargetOpcode::G_UADDO:
2639 case TargetOpcode::G_UADDE:
2640 case TargetOpcode::G_SSUBO:
2641 case TargetOpcode::G_SSUBE:
2642 case TargetOpcode::G_USUBO:
2643 case TargetOpcode::G_USUBE:
2644 case TargetOpcode::G_SMULO:
2645 case TargetOpcode::G_UMULO: {
2649 if (
MI.getOperand(1).getReg() == R) {
2650 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2657 case TargetOpcode::G_SUB: {
2659 unsigned Src2NumSignBits =
2661 if (Src2NumSignBits == 1)
2671 if ((Known2.
Zero | 1).isAllOnes())
2678 FirstAnswer = Src2NumSignBits;
2685 unsigned Src1NumSignBits =
2687 if (Src1NumSignBits == 1)
2692 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2695 case TargetOpcode::G_ADD: {
2697 unsigned Src2NumSignBits =
2699 if (Src2NumSignBits <= 2)
2703 unsigned Src1NumSignBits =
2705 if (Src1NumSignBits == 1)
2714 if ((Known1.
Zero | 1).isAllOnes())
2720 FirstAnswer = Src1NumSignBits;
2729 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2732 case TargetOpcode::G_FCMP:
2733 case TargetOpcode::G_ICMP: {
2734 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2737 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2744 case TargetOpcode::G_UNMERGE_VALUES: {
2745 unsigned NumOps =
MI.getNumOperands();
2747 LLT SrcTy = MRI.getType(SrcReg);
2749 if ((SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType()) ||
2750 (SrcTy.isScalar() && DstTy.
isVector()))
2754 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
2756 APInt SubDemandedElts = DemandedElts;
2758 if (SrcTy.isVector()) {
2760 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
2763 unsigned SrcOpKnown =
2765 if (SrcTy.isVector()) {
2766 FirstAnswer = SrcOpKnown;
2767 }
else if (SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 2) * TyBits) {
2768 FirstAnswer = SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 1) * TyBits
2770 : SrcOpKnown % TyBits;
2774 case TargetOpcode::G_BUILD_VECTOR: {
2776 FirstAnswer = TyBits;
2777 APInt SingleDemandedElt(1, 1);
2779 if (!DemandedElts[
I])
2784 FirstAnswer = std::min(FirstAnswer, Tmp2);
2787 if (FirstAnswer == 1)
2792 case TargetOpcode::G_CONCAT_VECTORS: {
2793 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2795 FirstAnswer = TyBits;
2798 unsigned NumSubVectorElts =
2799 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2802 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2807 FirstAnswer = std::min(FirstAnswer, Tmp2);
2810 if (FirstAnswer == 1)
2815 case TargetOpcode::G_VECTOR_COMPRESS: {
2819 Register PassThru =
MI.getOperand(3).getReg();
2828 FirstAnswer = std::min(Tmp, Tmp2);
2831 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2835 LLT VecVT = MRI.getType(InVec);
2840 APInt DemandedSrcElts =
2841 ConstEltNo && ConstEltNo->ult(NumSrcElts)
2846 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
2849 LLT SrcTy = MRI.getType(SrcReg);
2850 APInt DemandedSrcElts;
2851 if (SrcTy.isScalableVector()) {
2852 DemandedSrcElts =
APInt(1, 1);
2854 uint64_t Idx =
MI.getOperand(2).getImm();
2855 unsigned NumSrcElts = SrcTy.getNumElements();
2856 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
2860 case TargetOpcode::G_SHUFFLE_VECTOR: {
2863 APInt DemandedLHS, DemandedRHS;
2865 unsigned NumElts = MRI.getType(Src1).getNumElements();
2867 DemandedElts, DemandedLHS, DemandedRHS))
2873 if (FirstAnswer == 1)
2875 if (!!DemandedRHS) {
2878 FirstAnswer = std::min(FirstAnswer, Tmp2);
2882 case TargetOpcode::G_SPLAT_VECTOR: {
2886 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2887 if (NumSrcSignBits > (NumSrcBits - TyBits))
2888 return NumSrcSignBits - (NumSrcBits - TyBits);
2891 case TargetOpcode::G_INTRINSIC:
2892 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2893 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2894 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2897 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2899 FirstAnswer = std::max(FirstAnswer, NumBits);
2907 return std::max(FirstAnswer,
Known.countMinSignBits());
2911 LLT Ty = MRI.getType(R);
2912 APInt DemandedElts =
2921 unsigned Opcode =
MI.getOpcode();
2923 LLT Ty = MRI.getType(R);
2924 unsigned BitWidth = Ty.getScalarSizeInBits();
2926 if (Opcode == TargetOpcode::G_CONSTANT) {
2927 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2929 return std::nullopt;
2933 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2934 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2935 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2936 if (!DemandedElts[
I])
2939 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2940 MinAmt = MaxAmt =
nullptr;
2944 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2946 return std::nullopt;
2947 if (!MinAmt || MinAmt->
ugt(ShAmt))
2949 if (!MaxAmt || MaxAmt->ult(ShAmt))
2952 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2953 "Failed to find matching min/max shift amounts");
2954 if (MinAmt && MaxAmt)
2964 return std::nullopt;
2969 if (std::optional<ConstantRange> AmtRange =
2971 return AmtRange->getUnsignedMin().getZExtValue();
2972 return std::nullopt;
2990 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
3002 return Result(MF, MaxDepth);
3008 bool PrintFPClass) {
3018 if (!MO.isReg() || MO.getReg().isPhysical())
3021 if (!MRI.getType(
Reg).isValid())
3026 <<
" SignBitKnown:";
3034 unsigned SignedBits = VTA.computeNumSignBits(
Reg);
3035 bool IsKnownNeverZero = VTA.isKnownNeverZero(
Reg);
3036 OS <<
" " << MO <<
" KnownBits:" <<
Known
3037 <<
" SignBits:" << SignedBits
3038 <<
" 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 PreservedAnalyses printGISelValueTracking(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM, raw_ostream &OS, bool PrintFPClass)
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)
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.
This class implements an extremely fast bulk output stream that can only output to a stream.
#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.
std::optional< bool > getSignBit() const
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
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.