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::G_FREEZE: {
337 case TargetOpcode::COPY:
338 case TargetOpcode::G_PHI:
339 case TargetOpcode::PHI: {
345 assert(
MI.getOperand(0).getSubReg() == 0 &&
"Is this code in SSA?");
348 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
351 LLT SrcTy = MRI.getType(SrcReg);
359 if (SrcReg.
isVirtual() && Src.getSubReg() == 0 &&
361 APInt NowDemandedElts;
362 if (!SrcTy.isFixedVector()) {
363 NowDemandedElts =
APInt(1, 1);
366 NowDemandedElts = DemandedElts;
373 Depth + (Opcode != TargetOpcode::COPY));
378 if (
Known.isUnknown())
388 case TargetOpcode::G_STEP_VECTOR: {
389 APInt Step =
MI.getOperand(1).getCImm()->getValue();
397 const APInt MinNumElts =
403 .
umul_ov(MinNumElts, Overflow);
406 const APInt MaxValue = (MaxNumElts - 1).
umul_ov(Step, Overflow);
412 case TargetOpcode::G_VSCALE: {
414 const APInt &Multiplier =
MI.getOperand(1).getCImm()->getValue();
418 case TargetOpcode::G_CONSTANT: {
422 case TargetOpcode::G_FRAME_INDEX: {
423 int FrameIdx =
MI.getOperand(1).getIndex();
424 TL.computeKnownBitsForStackObjectPointer(
425 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
428 case TargetOpcode::G_SUB: {
437 case TargetOpcode::G_XOR: {
446 case TargetOpcode::G_PTR_ADD: {
450 LLT Ty = MRI.getType(
MI.getOperand(1).getReg());
451 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
455 case TargetOpcode::G_ADD: {
463 case TargetOpcode::G_AND: {
473 case TargetOpcode::G_OR: {
483 case TargetOpcode::G_MUL: {
491 case TargetOpcode::G_UMULH: {
499 case TargetOpcode::G_SMULH: {
507 case TargetOpcode::G_CLMUL: {
515 case TargetOpcode::G_UAVGFLOOR: {
523 case TargetOpcode::G_UAVGCEIL: {
531 case TargetOpcode::G_SAVGFLOOR: {
539 case TargetOpcode::G_SAVGCEIL: {
547 case TargetOpcode::G_ABDU: {
555 case TargetOpcode::G_ABDS: {
564 if (SignBits1 == 1) {
570 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
573 case TargetOpcode::G_SADDSAT: {
581 case TargetOpcode::G_UADDSAT: {
589 case TargetOpcode::G_SSUBSAT: {
597 case TargetOpcode::G_USUBSAT: {
605 case TargetOpcode::G_UDIV: {
614 case TargetOpcode::G_SDIV: {
623 case TargetOpcode::G_UREM: {
635 case TargetOpcode::G_SREM: {
647 case TargetOpcode::G_SELECT: {
648 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
652 case TargetOpcode::G_SMIN: {
662 case TargetOpcode::G_SMAX: {
672 case TargetOpcode::G_UMIN: {
681 case TargetOpcode::G_UMAX: {
690 case TargetOpcode::G_FCMP:
691 case TargetOpcode::G_ICMP: {
694 if (TL.getBooleanContents(DstTy.
isVector(),
695 Opcode == TargetOpcode::G_FCMP) ==
698 Known.Zero.setBitsFrom(1);
701 case TargetOpcode::G_SEXT: {
709 case TargetOpcode::G_ASSERT_SEXT:
710 case TargetOpcode::G_SEXT_INREG: {
716 case TargetOpcode::G_ANYEXT: {
722 case TargetOpcode::G_LOAD: {
730 case TargetOpcode::G_SEXTLOAD:
731 case TargetOpcode::G_ZEXTLOAD: {
738 Known = Opcode == TargetOpcode::G_SEXTLOAD
743 case TargetOpcode::G_ASHR: {
752 case TargetOpcode::G_LSHR: {
761 case TargetOpcode::G_SHL: {
770 case TargetOpcode::G_ROTL:
771 case TargetOpcode::G_ROTR: {
780 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
783 if (Opcode == TargetOpcode::G_ROTL)
790 case TargetOpcode::G_FSHL:
791 case TargetOpcode::G_FSHR: {
797 const APInt Amt = *MaybeAmtOp;
802 Known = Opcode == TargetOpcode::G_FSHL
807 case TargetOpcode::G_INTTOPTR:
808 case TargetOpcode::G_PTRTOINT:
813 case TargetOpcode::G_ZEXT:
814 case TargetOpcode::G_TRUNC: {
820 case TargetOpcode::G_TRUNC_SSAT_S: {
826 case TargetOpcode::G_TRUNC_SSAT_U: {
832 case TargetOpcode::G_TRUNC_USAT_U: {
838 case TargetOpcode::G_ASSERT_ZEXT: {
842 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
843 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
845 Known.Zero |= (~InMask);
849 case TargetOpcode::G_ASSERT_ALIGN: {
850 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
855 Known.Zero.setLowBits(LogOfAlign);
856 Known.One.clearLowBits(LogOfAlign);
859 case TargetOpcode::G_MERGE_VALUES: {
860 unsigned NumOps =
MI.getNumOperands();
861 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
863 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
866 DemandedElts,
Depth + 1);
867 Known.insertBits(SrcOpKnown,
I * OpSize);
871 case TargetOpcode::G_UNMERGE_VALUES: {
872 unsigned NumOps =
MI.getNumOperands();
874 LLT SrcTy = MRI.getType(SrcReg);
876 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
880 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
882 APInt SubDemandedElts = DemandedElts;
883 if (SrcTy.isVector()) {
886 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
892 if (SrcTy.isVector())
893 Known = std::move(SrcOpKnown);
898 case TargetOpcode::G_BSWAP: {
904 case TargetOpcode::G_BITREVERSE: {
910 case TargetOpcode::G_CTPOP: {
917 Known.Zero.setBitsFrom(LowBits);
922 case TargetOpcode::G_UBFX: {
923 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
933 case TargetOpcode::G_SBFX: {
934 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
951 case TargetOpcode::G_UADDO:
952 case TargetOpcode::G_UADDE:
953 case TargetOpcode::G_SADDO:
954 case TargetOpcode::G_SADDE: {
955 if (
MI.getOperand(1).getReg() == R) {
958 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
961 Known.Zero.setBitsFrom(1);
965 assert(
MI.getOperand(0).getReg() == R &&
966 "We only compute knownbits for the sum here.");
969 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
973 Carry = Carry.
trunc(1);
985 case TargetOpcode::G_USUBO:
986 case TargetOpcode::G_USUBE:
987 case TargetOpcode::G_SSUBO:
988 case TargetOpcode::G_SSUBE:
989 case TargetOpcode::G_UMULO:
990 case TargetOpcode::G_SMULO: {
991 if (
MI.getOperand(1).getReg() == R) {
994 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
997 Known.Zero.setBitsFrom(1);
1001 case TargetOpcode::G_CTTZ:
1002 case TargetOpcode::G_CTTZ_ZERO_POISON: {
1009 Known.Zero.setBitsFrom(LowBits);
1012 case TargetOpcode::G_CTLZ:
1013 case TargetOpcode::G_CTLZ_ZERO_POISON: {
1020 Known.Zero.setBitsFrom(LowBits);
1023 case TargetOpcode::G_CTLS: {
1027 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
1035 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1042 LLT VecVT = MRI.getType(InVec);
1054 Known.Zero.setAllBits();
1055 Known.One.setAllBits();
1060 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
1067 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1069 Register InVec = Insert.getVectorReg();
1070 Register InVal = Insert.getElementReg();
1071 Register EltNo = Insert.getIndexReg();
1072 LLT VecVT = MRI.getType(InVec);
1080 bool DemandedVal =
true;
1081 APInt DemandedVecElts = DemandedElts;
1082 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
1083 unsigned EltIdx = ConstEltNo->getZExtValue();
1084 DemandedVal = !!DemandedElts[EltIdx];
1087 Known.setAllConflict();
1092 if (!!DemandedVecElts) {
1098 case TargetOpcode::G_INSERT_SUBVECTOR: {
1102 uint64_t Idx = Insert.getIndexImm();
1103 LLT SrcTy = MRI.getType(Src);
1104 LLT SubTy = MRI.getType(
Sub);
1105 APInt DemandedSubElts;
1106 APInt DemandedSrcElts;
1108 if (SrcTy.isScalableVector()) {
1112 DemandedSrcElts =
APInt(1, 1);
1115 DemandedSubElts = DemandedElts.
extractBits(NumSubElts, Idx);
1116 DemandedSrcElts = DemandedElts;
1117 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
1120 Known.setAllConflict();
1121 if (!!DemandedSubElts) {
1124 if (
Known.isUnknown())
1128 if (!!DemandedSrcElts) {
1135 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1137 LLT SrcTy = MRI.getType(SrcReg);
1138 APInt DemandedSrcElts;
1139 if (SrcTy.isScalableVector()) {
1140 DemandedSrcElts =
APInt(1, 1);
1142 uint64_t Idx =
MI.getOperand(2).getImm();
1143 unsigned NumSrcElts = SrcTy.getNumElements();
1144 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
1149 case TargetOpcode::G_SHUFFLE_VECTOR: {
1150 APInt DemandedLHS, DemandedRHS;
1153 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1155 DemandedElts, DemandedLHS, DemandedRHS))
1159 Known.Zero.setAllBits();
1160 Known.One.setAllBits();
1161 if (!!DemandedLHS) {
1167 if (
Known.isUnknown())
1169 if (!!DemandedRHS) {
1176 case TargetOpcode::G_CONCAT_VECTORS: {
1177 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
1180 Known.Zero.setAllBits();
1181 Known.One.setAllBits();
1182 unsigned NumSubVectorElts =
1183 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1187 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
1188 if (!!DemandedSub) {
1194 if (
Known.isUnknown())
1199 case TargetOpcode::G_VECTOR_COMPRESS: {
1203 Register PassThru =
MI.getOperand(3).getReg();
1206 if (
Known.isUnknown())
1215 case TargetOpcode::G_ABS: {
1232 APInt DemandedElts =
1246void GISelValueTracking::computeKnownFPClassForFPTrunc(
1254 KnownFPClass KnownSrc;
1255 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1260void GISelValueTracking::computeKnownFPClass(
Register R,
1261 const APInt &DemandedElts,
1265 assert(
Known.isUnknown() &&
"should not be called with known information");
1267 if (!DemandedElts) {
1275 MachineInstr &
MI = *MRI.getVRegDef(R);
1276 unsigned Opcode =
MI.getOpcode();
1277 LLT DstTy = MRI.getType(R);
1285 switch (Cst->getKind()) {
1287 auto APF = Cst->getScalarValue();
1288 Known.setKnownFPClasses(APF.classify());
1289 Known.setSignBit(APF.isNegative());
1294 bool SignBitAllZero =
true;
1295 bool SignBitAllOne =
true;
1297 for (
auto C : *Cst) {
1298 Known.setKnownFPClasses(
Known.getKnownFPClasses() |
C.classify());
1300 SignBitAllZero =
false;
1302 SignBitAllOne =
false;
1305 if (SignBitAllOne != SignBitAllZero)
1306 Known.setSignBit(SignBitAllOne);
1321 KnownNotFromFlags |=
fcNan;
1323 KnownNotFromFlags |=
fcInf;
1327 InterestedClasses &= ~KnownNotFromFlags;
1330 [=, &
Known] {
Known.knownNot(KnownNotFromFlags); });
1340 TL.computeKnownFPClassForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
1343 case TargetOpcode::G_FNEG: {
1345 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1349 case TargetOpcode::G_SELECT: {
1372 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1373 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1379 MaskIfTrue = TestedMask;
1380 MaskIfFalse = ~TestedMask;
1383 if (TestedValue ==
LHS) {
1385 FilterLHS = MaskIfTrue;
1386 }
else if (TestedValue ==
RHS) {
1388 FilterRHS = MaskIfFalse;
1391 KnownFPClass Known2;
1392 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS,
Known,
1394 Known.setKnownFPClasses(
Known.getKnownFPClasses() & FilterLHS);
1396 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1403 case TargetOpcode::G_FCOPYSIGN: {
1404 Register Magnitude =
MI.getOperand(1).getReg();
1407 KnownFPClass KnownSign;
1409 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses,
Known,
1411 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1413 Known.copysign(KnownSign);
1416 case TargetOpcode::G_FMA:
1417 case TargetOpcode::G_STRICT_FMA:
1418 case TargetOpcode::G_FMAD: {
1431 KnownFPClass KnownSrc, KnownAddend;
1432 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1434 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1436 if (KnownNotFromFlags) {
1437 KnownSrc.
knownNot(KnownNotFromFlags);
1438 KnownAddend.
knownNot(KnownNotFromFlags);
1442 KnownFPClass KnownSrc[3];
1443 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1445 if (KnownSrc[0].isUnknown())
1447 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1449 if (KnownSrc[1].isUnknown())
1451 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1453 if (KnownSrc[2].isUnknown())
1455 if (KnownNotFromFlags) {
1456 KnownSrc[0].
knownNot(KnownNotFromFlags);
1457 KnownSrc[1].
knownNot(KnownNotFromFlags);
1458 KnownSrc[2].
knownNot(KnownNotFromFlags);
1464 case TargetOpcode::G_FSQRT:
1465 case TargetOpcode::G_STRICT_FSQRT: {
1466 KnownFPClass KnownSrc;
1468 if (InterestedClasses &
fcNan)
1472 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1481 case TargetOpcode::G_FABS: {
1486 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
1492 case TargetOpcode::G_FATAN2: {
1510 KnownFPClass KnownY, KnownX;
1511 computeKnownFPClass(
Y, DemandedElts, InterestedY, KnownY,
Depth + 1);
1512 computeKnownFPClass(
X, DemandedElts, InterestedX, KnownX,
Depth + 1);
1518 case TargetOpcode::G_FSINH: {
1520 KnownFPClass KnownSrc;
1521 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1526 case TargetOpcode::G_FCOSH: {
1528 KnownFPClass KnownSrc;
1529 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1534 case TargetOpcode::G_FTANH: {
1536 KnownFPClass KnownSrc;
1537 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1542 case TargetOpcode::G_FASIN: {
1544 KnownFPClass KnownSrc;
1545 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1550 case TargetOpcode::G_FACOS: {
1552 KnownFPClass KnownSrc;
1553 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1558 case TargetOpcode::G_FATAN: {
1560 KnownFPClass KnownSrc;
1561 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1566 case TargetOpcode::G_FTAN: {
1568 KnownFPClass KnownSrc;
1569 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1574 case TargetOpcode::G_FSIN:
1575 case TargetOpcode::G_FCOS: {
1578 KnownFPClass KnownSrc;
1579 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1582 : KnownFPClass::sin(KnownSrc);
1585 case TargetOpcode::G_FSINCOS: {
1588 KnownFPClass KnownSrc;
1589 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1591 if (R ==
MI.getOperand(0).getReg())
1597 case TargetOpcode::G_FMAXNUM:
1598 case TargetOpcode::G_FMINNUM:
1599 case TargetOpcode::G_FMINNUM_IEEE:
1600 case TargetOpcode::G_FMAXIMUM:
1601 case TargetOpcode::G_FMINIMUM:
1602 case TargetOpcode::G_FMAXNUM_IEEE:
1603 case TargetOpcode::G_FMAXIMUMNUM:
1604 case TargetOpcode::G_FMINIMUMNUM: {
1607 KnownFPClass KnownLHS, KnownRHS;
1609 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1611 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1616 case TargetOpcode::G_FMINIMUM:
1619 case TargetOpcode::G_FMAXIMUM:
1622 case TargetOpcode::G_FMINIMUMNUM:
1625 case TargetOpcode::G_FMAXIMUMNUM:
1628 case TargetOpcode::G_FMINNUM:
1629 case TargetOpcode::G_FMINNUM_IEEE:
1632 case TargetOpcode::G_FMAXNUM:
1633 case TargetOpcode::G_FMAXNUM_IEEE:
1645 case TargetOpcode::G_FCANONICALIZE: {
1647 KnownFPClass KnownSrc;
1648 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1653 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1657 case TargetOpcode::G_VECREDUCE_FMAX:
1658 case TargetOpcode::G_VECREDUCE_FMIN:
1659 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1660 case TargetOpcode::G_VECREDUCE_FMINIMUM:
1661 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
1662 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM: {
1668 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1670 if (!
Known.isKnownNeverNaN())
1671 Known.setSignBit(std::nullopt);
1674 case TargetOpcode::G_FFLOOR:
1675 case TargetOpcode::G_FCEIL:
1676 case TargetOpcode::G_FRINT:
1677 case TargetOpcode::G_FNEARBYINT:
1678 case TargetOpcode::G_INTRINSIC_ROUND:
1679 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1680 case TargetOpcode::G_INTRINSIC_TRUNC: {
1682 KnownFPClass KnownSrc;
1688 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1691 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1696 case TargetOpcode::G_FEXP:
1697 case TargetOpcode::G_FEXP2:
1698 case TargetOpcode::G_FEXP10: {
1700 KnownFPClass KnownSrc;
1701 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1706 case TargetOpcode::G_FLOG:
1707 case TargetOpcode::G_FLOG2:
1708 case TargetOpcode::G_FLOG10: {
1732 KnownFPClass KnownSrc;
1733 if (InterestedSrcs !=
fcNone)
1734 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1739 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1743 case TargetOpcode::G_FPOW: {
1744 const bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1746 if (!WantNaN && !WantNegative)
1755 InterestedRHS |=
fcNan;
1764 KnownFPClass KnownLHS;
1765 computeKnownFPClass(
MI.getOperand(1).getReg(), DemandedElts, InterestedLHS,
1766 KnownLHS,
Depth + 1);
1773 KnownFPClass KnownRHS;
1774 computeKnownFPClass(
MI.getOperand(2).getReg(), DemandedElts, InterestedRHS,
1775 KnownRHS,
Depth + 1);
1779 case TargetOpcode::G_FPOWI: {
1784 LLT ExpTy = MRI.getType(Exp);
1786 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1789 if (InterestedClasses &
fcNan)
1790 InterestedSrcs |=
fcNan;
1791 if (!ExponentKnownBits.
isZero()) {
1792 if (InterestedClasses &
fcInf)
1798 KnownFPClass KnownSrc;
1799 if (InterestedSrcs !=
fcNone) {
1801 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1808 case TargetOpcode::G_FLDEXP:
1809 case TargetOpcode::G_STRICT_FLDEXP: {
1811 KnownFPClass KnownSrc;
1812 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1820 LLT ExpTy = MRI.getType(ExpReg);
1822 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1827 DenormalMode
Mode = MF->getDenormalMode(Flt);
1831 case TargetOpcode::G_FADD:
1832 case TargetOpcode::G_STRICT_FADD:
1833 case TargetOpcode::G_FSUB:
1834 case TargetOpcode::G_STRICT_FSUB: {
1837 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1838 Opcode == TargetOpcode::G_STRICT_FADD);
1842 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1845 if (!WantNaN && !WantNegative && !WantNegZero) {
1855 if (InterestedClasses &
fcNan)
1856 InterestedSrcs |=
fcInf;
1860 KnownFPClass KnownSelf;
1861 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1867 KnownFPClass KnownLHS, KnownRHS;
1868 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1872 WantNegZero || !IsAdd) {
1875 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1885 case TargetOpcode::G_FMUL:
1886 case TargetOpcode::G_STRICT_FMUL: {
1894 KnownFPClass KnownSrc;
1901 KnownFPClass KnownLHS;
1905 KnownFPClass KnownLHS, KnownRHS;
1921 case TargetOpcode::G_FDIV: {
1922 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1937 KnownFPClass KnownSrc;
1938 computeKnownFPClass(
LHS, DemandedElts,
1947 if (!WantNan && !WantNegative && !WantPositive)
1950 KnownFPClass KnownLHS, KnownRHS;
1953 bool KnowSomethingUseful =
1958 if (KnowSomethingUseful)
1964 case TargetOpcode::G_FREM: {
1965 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1982 KnownFPClass KnownSrc;
1983 computeKnownFPClass(
LHS, DemandedElts,
1992 if (!WantNan && !WantNegative && !WantPositive)
1995 KnownFPClass KnownLHS, KnownRHS;
1997 KnownRHS,
Depth + 1);
2003 if (KnowSomethingUseful || WantPositive)
2010 case TargetOpcode::G_FFREXP: {
2012 if (R !=
MI.getOperand(0).getReg())
2015 KnownFPClass KnownSrc;
2016 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
2023 case TargetOpcode::G_FPEXT: {
2025 KnownFPClass KnownSrc;
2026 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
2031 LLT SrcTy = MRI.getType(Src).getScalarType();
2037 case TargetOpcode::G_FPTRUNC:
2038 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND: {
2039 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses,
Known,
2043 case TargetOpcode::G_SITOFP:
2044 case TargetOpcode::G_UITOFP: {
2055 if (Opcode == TargetOpcode::G_UITOFP)
2056 Known.signBitMustBeZero();
2063 LLT Ty = MRI.getType(Val);
2065 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
2071 if (Opcode == TargetOpcode::G_SITOFP) {
2076 Known.signBitMustBeZero();
2078 Known.signBitMustBeOne();
2081 if (InterestedClasses &
fcInf) {
2088 if (Opcode == TargetOpcode::G_UITOFP)
2102 case TargetOpcode::G_BUILD_VECTOR:
2103 case TargetOpcode::G_CONCAT_VECTORS: {
2110 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
2112 bool NeedsElt = DemandedElts[Idx];
2118 computeKnownFPClass(Src,
Known, InterestedClasses,
Depth + 1);
2121 KnownFPClass Known2;
2122 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
2127 if (
Known.isUnknown())
2134 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2144 LLT VecTy = MRI.getType(Vec);
2149 if (CIdx && CIdx->ult(NumElts))
2151 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses,
Known,
2157 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2163 LLT VecTy = MRI.getType(Vec);
2171 APInt DemandedVecElts = DemandedElts;
2172 bool NeedsElt =
true;
2174 if (CIdx && CIdx->ult(NumElts)) {
2175 DemandedVecElts.
clearBit(CIdx->getZExtValue());
2176 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2181 computeKnownFPClass(Elt,
Known, InterestedClasses,
Depth + 1);
2183 if (
Known.isUnknown())
2190 if (!DemandedVecElts.
isZero()) {
2191 KnownFPClass Known2;
2192 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
2199 case TargetOpcode::G_SHUFFLE_VECTOR: {
2203 APInt DemandedLHS, DemandedRHS;
2205 assert(DemandedElts == APInt(1, 1));
2206 DemandedLHS = DemandedRHS = DemandedElts;
2208 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
2210 DemandedLHS, DemandedRHS)) {
2216 if (!!DemandedLHS) {
2218 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses,
Known,
2222 if (
Known.isUnknown())
2228 if (!!DemandedRHS) {
2229 KnownFPClass Known2;
2231 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
2237 case TargetOpcode::G_PHI: {
2246 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
2247 const MachineOperand &Src =
MI.getOperand(Idx);
2250 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses,
Known,
2254 KnownFPClass Known2;
2255 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
2259 if (
Known.isUnknown())
2264 case TargetOpcode::G_FREEZE: {
2267 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
2272 case TargetOpcode::COPY: {
2275 if (!Src.isVirtual())
2278 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
Depth + 1);
2289 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
2290 return KnownClasses;
2296 computeKnownFPClass(R,
Known, InterestedClasses,
Depth);
2304 InterestedClasses &=
~fcNan;
2306 InterestedClasses &=
~fcInf;
2309 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
2312 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~
fcNan);
2314 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~
fcInf);
2320 LLT Ty = MRI.getType(R);
2321 APInt DemandedElts =
2323 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
2338 switch (
DefMI->getOpcode()) {
2341 case TargetOpcode::G_FADD:
2342 case TargetOpcode::G_STRICT_FADD:
2343 case TargetOpcode::G_FSUB:
2344 case TargetOpcode::G_STRICT_FSUB:
2345 case TargetOpcode::G_FMUL:
2346 case TargetOpcode::G_STRICT_FMUL:
2347 case TargetOpcode::G_FDIV:
2348 case TargetOpcode::G_FREM:
2349 case TargetOpcode::G_FMA:
2350 case TargetOpcode::G_STRICT_FMA:
2351 case TargetOpcode::G_FMAD:
2352 case TargetOpcode::G_FSQRT:
2353 case TargetOpcode::G_STRICT_FSQRT:
2357 case TargetOpcode::G_FSIN:
2358 case TargetOpcode::G_FCOS:
2359 case TargetOpcode::G_FSINCOS:
2360 case TargetOpcode::G_FTAN:
2361 case TargetOpcode::G_FASIN:
2362 case TargetOpcode::G_FACOS:
2363 case TargetOpcode::G_FATAN:
2364 case TargetOpcode::G_FATAN2:
2365 case TargetOpcode::G_FSINH:
2366 case TargetOpcode::G_FCOSH:
2367 case TargetOpcode::G_FTANH:
2368 case TargetOpcode::G_FEXP:
2369 case TargetOpcode::G_FEXP2:
2370 case TargetOpcode::G_FEXP10:
2371 case TargetOpcode::G_FLOG:
2372 case TargetOpcode::G_FLOG2:
2373 case TargetOpcode::G_FLOG10:
2374 case TargetOpcode::G_FPOW:
2375 case TargetOpcode::G_FPOWI:
2376 case TargetOpcode::G_FLDEXP:
2377 case TargetOpcode::G_STRICT_FLDEXP:
2378 case TargetOpcode::G_FFREXP:
2379 case TargetOpcode::G_INTRINSIC_TRUNC:
2380 case TargetOpcode::G_INTRINSIC_ROUND:
2381 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2382 case TargetOpcode::G_FFLOOR:
2383 case TargetOpcode::G_FCEIL:
2384 case TargetOpcode::G_FRINT:
2385 case TargetOpcode::G_FNEARBYINT:
2386 case TargetOpcode::G_FPEXT:
2387 case TargetOpcode::G_FPTRUNC:
2388 case TargetOpcode::G_FCANONICALIZE:
2389 case TargetOpcode::G_FMINNUM:
2390 case TargetOpcode::G_FMAXNUM:
2391 case TargetOpcode::G_FMINNUM_IEEE:
2392 case TargetOpcode::G_FMAXNUM_IEEE:
2393 case TargetOpcode::G_FMINIMUM:
2394 case TargetOpcode::G_FMAXIMUM:
2395 case TargetOpcode::G_FMINIMUMNUM:
2396 case TargetOpcode::G_FMAXIMUMNUM:
2412 return Known.isKnownNeverLogicalZero(
2417unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2418 const APInt &DemandedElts,
2422 if (Src1SignBits == 1)
2432 const MDNode *Ranges = Ld->getRanges();
2438 switch (Ld->getOpcode()) {
2439 case TargetOpcode::G_SEXTLOAD:
2442 case TargetOpcode::G_ZEXTLOAD:
2455 const APInt &DemandedElts,
2458 unsigned Opcode =
MI.getOpcode();
2460 if (Opcode == TargetOpcode::G_CONSTANT)
2461 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2469 LLT DstTy = MRI.getType(R);
2479 unsigned FirstAnswer = 1;
2481 case TargetOpcode::COPY: {
2483 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2484 MRI.getType(Src.getReg()).isValid()) {
2491 case TargetOpcode::G_FREEZE: {
2497 case TargetOpcode::G_SEXT: {
2499 LLT SrcTy = MRI.getType(Src);
2500 unsigned Tmp = TyBits - SrcTy.getScalarSizeInBits();
2503 case TargetOpcode::G_ASSERT_SEXT:
2504 case TargetOpcode::G_SEXT_INREG: {
2507 unsigned SrcBits =
MI.getOperand(2).getImm();
2508 unsigned InRegBits = TyBits - SrcBits + 1;
2512 case TargetOpcode::G_LOAD: {
2519 case TargetOpcode::G_SEXTLOAD: {
2534 case TargetOpcode::G_ZEXTLOAD: {
2549 case TargetOpcode::G_AND:
2550 case TargetOpcode::G_OR:
2551 case TargetOpcode::G_XOR: {
2553 unsigned Src1NumSignBits =
2555 if (Src1NumSignBits != 1) {
2557 unsigned Src2NumSignBits =
2559 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2563 case TargetOpcode::G_ASHR: {
2568 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2571 case TargetOpcode::G_SHL: {
2574 if (std::optional<ConstantRange> ShAmtRange =
2576 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2577 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2587 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2588 ExtOpc == TargetOpcode::G_ANYEXT) {
2589 LLT ExtTy = MRI.getType(Src1);
2591 LLT ExtendeeTy = MRI.getType(Extendee);
2595 if (SizeDiff <= MinShAmt) {
2599 return Tmp - MaxShAmt;
2605 return Tmp - MaxShAmt;
2609 case TargetOpcode::G_ROTL:
2610 case TargetOpcode::G_ROTR: {
2619 case TargetOpcode::G_SAVGFLOOR:
2620 case TargetOpcode::G_SAVGCEIL: {
2623 FirstAnswer = computeNumSignBitsMin(Src1, Src2, DemandedElts,
Depth + 1);
2626 case TargetOpcode::G_SREM: {
2634 case TargetOpcode::G_TRUNC: {
2636 LLT SrcTy = MRI.getType(Src);
2641 if (NumSrcSignBits > (NumSrcBits - TyBits))
2642 return NumSrcSignBits - (NumSrcBits - TyBits);
2645 case TargetOpcode::G_SELECT: {
2646 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2647 MI.getOperand(3).getReg(), DemandedElts,
2650 case TargetOpcode::G_SMIN:
2651 case TargetOpcode::G_SMAX:
2652 case TargetOpcode::G_UMIN:
2653 case TargetOpcode::G_UMAX:
2655 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2656 MI.getOperand(2).getReg(), DemandedElts,
2658 case TargetOpcode::G_SADDO:
2659 case TargetOpcode::G_SADDE:
2660 case TargetOpcode::G_UADDO:
2661 case TargetOpcode::G_UADDE:
2662 case TargetOpcode::G_SSUBO:
2663 case TargetOpcode::G_SSUBE:
2664 case TargetOpcode::G_USUBO:
2665 case TargetOpcode::G_USUBE:
2666 case TargetOpcode::G_SMULO:
2667 case TargetOpcode::G_UMULO: {
2671 if (
MI.getOperand(1).getReg() == R) {
2672 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2679 case TargetOpcode::G_SUB: {
2681 unsigned Src2NumSignBits =
2683 if (Src2NumSignBits == 1)
2693 if ((Known2.
Zero | 1).isAllOnes())
2700 FirstAnswer = Src2NumSignBits;
2707 unsigned Src1NumSignBits =
2709 if (Src1NumSignBits == 1)
2714 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2717 case TargetOpcode::G_ADD: {
2719 unsigned Src2NumSignBits =
2721 if (Src2NumSignBits <= 2)
2725 unsigned Src1NumSignBits =
2727 if (Src1NumSignBits == 1)
2736 if ((Known1.
Zero | 1).isAllOnes())
2742 FirstAnswer = Src1NumSignBits;
2751 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2754 case TargetOpcode::G_FCMP:
2755 case TargetOpcode::G_ICMP: {
2756 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2759 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2766 case TargetOpcode::G_UNMERGE_VALUES: {
2767 unsigned NumOps =
MI.getNumOperands();
2769 LLT SrcTy = MRI.getType(SrcReg);
2771 if ((SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType()) ||
2772 (SrcTy.isScalar() && DstTy.
isVector()))
2776 unsigned DstIdx =
MI.findRegisterDefOperandIdx(R,
nullptr);
2778 APInt SubDemandedElts = DemandedElts;
2780 if (SrcTy.isVector()) {
2782 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
2785 unsigned SrcOpKnown =
2787 if (SrcTy.isVector()) {
2788 FirstAnswer = SrcOpKnown;
2789 }
else if (SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 2) * TyBits) {
2790 FirstAnswer = SrcOpKnown >= (
MI.getNumOperands() - DstIdx - 1) * TyBits
2792 : SrcOpKnown % TyBits;
2796 case TargetOpcode::G_BUILD_VECTOR: {
2798 FirstAnswer = TyBits;
2799 APInt SingleDemandedElt(1, 1);
2801 if (!DemandedElts[
I])
2806 FirstAnswer = std::min(FirstAnswer, Tmp2);
2809 if (FirstAnswer == 1)
2814 case TargetOpcode::G_CONCAT_VECTORS: {
2815 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2817 FirstAnswer = TyBits;
2820 unsigned NumSubVectorElts =
2821 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2824 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2829 FirstAnswer = std::min(FirstAnswer, Tmp2);
2832 if (FirstAnswer == 1)
2837 case TargetOpcode::G_VECTOR_COMPRESS: {
2841 Register PassThru =
MI.getOperand(3).getReg();
2850 FirstAnswer = std::min(Tmp, Tmp2);
2853 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2857 LLT VecVT = MRI.getType(InVec);
2862 APInt DemandedSrcElts =
2863 ConstEltNo && ConstEltNo->ult(NumSrcElts)
2868 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
2871 LLT SrcTy = MRI.getType(SrcReg);
2872 APInt DemandedSrcElts;
2873 if (SrcTy.isScalableVector()) {
2874 DemandedSrcElts =
APInt(1, 1);
2876 uint64_t Idx =
MI.getOperand(2).getImm();
2877 unsigned NumSrcElts = SrcTy.getNumElements();
2878 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
2882 case TargetOpcode::G_SHUFFLE_VECTOR: {
2885 APInt DemandedLHS, DemandedRHS;
2887 unsigned NumElts = MRI.getType(Src1).getNumElements();
2889 DemandedElts, DemandedLHS, DemandedRHS))
2895 if (FirstAnswer == 1)
2897 if (!!DemandedRHS) {
2900 FirstAnswer = std::min(FirstAnswer, Tmp2);
2904 case TargetOpcode::G_SPLAT_VECTOR: {
2908 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2909 if (NumSrcSignBits > (NumSrcBits - TyBits))
2910 return NumSrcSignBits - (NumSrcBits - TyBits);
2913 case TargetOpcode::G_INTRINSIC:
2914 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2915 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2916 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2919 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2921 FirstAnswer = std::max(FirstAnswer, NumBits);
2929 return std::max(FirstAnswer,
Known.countMinSignBits());
2933 LLT Ty = MRI.getType(R);
2934 APInt DemandedElts =
2943 unsigned Opcode =
MI.getOpcode();
2945 LLT Ty = MRI.getType(R);
2946 unsigned BitWidth = Ty.getScalarSizeInBits();
2948 if (Opcode == TargetOpcode::G_CONSTANT) {
2949 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2951 return std::nullopt;
2955 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2956 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2957 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2958 if (!DemandedElts[
I])
2961 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2962 MinAmt = MaxAmt =
nullptr;
2966 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2968 return std::nullopt;
2969 if (!MinAmt || MinAmt->
ugt(ShAmt))
2971 if (!MaxAmt || MaxAmt->ult(ShAmt))
2974 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2975 "Failed to find matching min/max shift amounts");
2976 if (MinAmt && MaxAmt)
2986 return std::nullopt;
2991 if (std::optional<ConstantRange> AmtRange =
2993 return AmtRange->getUnsignedMin().getZExtValue();
2994 return std::nullopt;
3012 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
3024 return Result(MF, MaxDepth);
3030 bool PrintFPClass) {
3040 if (!MO.isReg() || MO.getReg().isPhysical())
3043 if (!MRI.getType(
Reg).isValid())
3048 <<
" SignBitKnown:";
3056 unsigned SignedBits = VTA.computeNumSignBits(
Reg);
3057 bool IsKnownNeverZero = VTA.isKnownNeverZero(
Reg);
3058 OS <<
" " << MO <<
" KnownBits:" <<
Known
3059 <<
" SignBits:" << SignedBits
3060 <<
" 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
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
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.