42#define DEBUG_TYPE "gisel-known-bits"
50 "Analysis for ComputingKnownBits",
false,
true)
53 : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
58 switch (
MI->getOpcode()) {
59 case TargetOpcode::COPY:
61 case TargetOpcode::G_ASSERT_ALIGN: {
63 return Align(
MI->getOperand(2).getImm());
65 case TargetOpcode::G_FRAME_INDEX: {
66 int FrameIdx =
MI->getOperand(1).getIndex();
67 return MF.getFrameInfo().getObjectAlign(FrameIdx);
69 case TargetOpcode::G_INTRINSIC:
70 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
71 case TargetOpcode::G_INTRINSIC_CONVERGENT:
72 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
74 return TL.computeKnownAlignForTargetInstr(*
this, R, MRI,
Depth + 1);
79 assert(
MI.getNumExplicitDefs() == 1 &&
80 "expected single return generic instruction");
85 const LLT Ty = MRI.getType(R);
95 const APInt &DemandedElts,
103 LLT Ty = MRI.getType(R);
104 unsigned BitWidth = Ty.getScalarSizeInBits();
109 LLT Ty = MRI.getType(R);
110 const APInt ScalarDemandedElts(1, 1);
111 APInt DemandedElts = Ty.isFixedVector()
113 : ScalarDemandedElts;
122 const APInt ScalarDemandedElts(1, 1);
125 switch (
MI.getOpcode()) {
129 case TargetOpcode::G_BUILD_VECTOR: {
131 if (!DemandedElts[
I])
139 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
142 LLT VecTy = MRI.getType(InVec);
150 if (Idx->ult(NumSrcElts))
156 case TargetOpcode::G_SHUFFLE_VECTOR: {
159 if (SrcTy.isScalableVector())
161 APInt DemandedLHS, DemandedRHS;
163 DemandedElts, DemandedLHS, DemandedRHS))
165 if (!DemandedLHS.
isZero() &&
168 if (!DemandedRHS.
isZero() &&
174 case TargetOpcode::G_OR:
179 case TargetOpcode::G_SELECT:
184 case TargetOpcode::G_SHL: {
214[[maybe_unused]]
static void
217 <<
"] Computed for: " <<
MI <<
"[" <<
Depth <<
"] Known: 0x"
228 const APInt &DemandedElts,
234 if (
Known.isUnknown())
259 const APInt &DemandedElts,
262 unsigned Opcode =
MI.getOpcode();
263 LLT DstTy = MRI.getType(R);
277 "DemandedElt width should equal the fixed vector number of elements");
280 "DemandedElt width should be 1 for scalars or scalable vectors");
305 TL.computeKnownBitsForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
308 case TargetOpcode::G_BUILD_VECTOR: {
310 Known.Zero.setAllBits();
311 Known.One.setAllBits();
313 if (!DemandedElts[
I])
322 if (
Known.isUnknown())
327 case TargetOpcode::G_SPLAT_VECTOR: {
335 case TargetOpcode::COPY:
336 case TargetOpcode::G_PHI:
337 case TargetOpcode::PHI: {
343 assert(
MI.getOperand(0).getSubReg() == 0 &&
"Is this code in SSA?");
346 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
349 LLT SrcTy = MRI.getType(SrcReg);
357 if (SrcReg.
isVirtual() && Src.getSubReg() == 0 &&
359 APInt NowDemandedElts;
360 if (!SrcTy.isFixedVector()) {
361 NowDemandedElts =
APInt(1, 1);
364 NowDemandedElts = DemandedElts;
371 Depth + (Opcode != TargetOpcode::COPY));
376 if (
Known.isUnknown())
386 case TargetOpcode::G_STEP_VECTOR: {
387 APInt Step =
MI.getOperand(1).getCImm()->getValue();
395 const APInt MinNumElts =
401 .
umul_ov(MinNumElts, Overflow);
404 const APInt MaxValue = (MaxNumElts - 1).
umul_ov(Step, Overflow);
410 case TargetOpcode::G_CONSTANT: {
414 case TargetOpcode::G_FRAME_INDEX: {
415 int FrameIdx =
MI.getOperand(1).getIndex();
416 TL.computeKnownBitsForStackObjectPointer(
417 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
420 case TargetOpcode::G_SUB: {
429 case TargetOpcode::G_XOR: {
438 case TargetOpcode::G_PTR_ADD: {
442 LLT Ty = MRI.getType(
MI.getOperand(1).getReg());
443 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
447 case TargetOpcode::G_ADD: {
455 case TargetOpcode::G_AND: {
465 case TargetOpcode::G_OR: {
475 case TargetOpcode::G_MUL: {
483 case TargetOpcode::G_UMULH: {
491 case TargetOpcode::G_SMULH: {
499 case TargetOpcode::G_UAVGFLOOR: {
507 case TargetOpcode::G_UAVGCEIL: {
515 case TargetOpcode::G_SAVGFLOOR: {
523 case TargetOpcode::G_SAVGCEIL: {
531 case TargetOpcode::G_ABDU: {
539 case TargetOpcode::G_ABDS: {
548 if (SignBits1 == 1) {
554 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
557 case TargetOpcode::G_SADDSAT: {
565 case TargetOpcode::G_UADDSAT: {
573 case TargetOpcode::G_SSUBSAT: {
581 case TargetOpcode::G_USUBSAT: {
589 case TargetOpcode::G_UDIV: {
598 case TargetOpcode::G_SDIV: {
607 case TargetOpcode::G_UREM: {
619 case TargetOpcode::G_SREM: {
631 case TargetOpcode::G_SELECT: {
632 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
636 case TargetOpcode::G_SMIN: {
646 case TargetOpcode::G_SMAX: {
656 case TargetOpcode::G_UMIN: {
665 case TargetOpcode::G_UMAX: {
674 case TargetOpcode::G_FCMP:
675 case TargetOpcode::G_ICMP: {
678 if (TL.getBooleanContents(DstTy.
isVector(),
679 Opcode == TargetOpcode::G_FCMP) ==
682 Known.Zero.setBitsFrom(1);
685 case TargetOpcode::G_SEXT: {
693 case TargetOpcode::G_ASSERT_SEXT:
694 case TargetOpcode::G_SEXT_INREG: {
700 case TargetOpcode::G_ANYEXT: {
706 case TargetOpcode::G_LOAD: {
714 case TargetOpcode::G_SEXTLOAD:
715 case TargetOpcode::G_ZEXTLOAD: {
722 Known = Opcode == TargetOpcode::G_SEXTLOAD
727 case TargetOpcode::G_ASHR: {
736 case TargetOpcode::G_LSHR: {
745 case TargetOpcode::G_SHL: {
754 case TargetOpcode::G_ROTL:
755 case TargetOpcode::G_ROTR: {
764 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
767 if (Opcode == TargetOpcode::G_ROTL)
774 case TargetOpcode::G_FSHL:
775 case TargetOpcode::G_FSHR: {
781 const APInt Amt = *MaybeAmtOp;
786 Known = Opcode == TargetOpcode::G_FSHL
791 case TargetOpcode::G_INTTOPTR:
792 case TargetOpcode::G_PTRTOINT:
797 case TargetOpcode::G_ZEXT:
798 case TargetOpcode::G_TRUNC: {
804 case TargetOpcode::G_ASSERT_ZEXT: {
808 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
809 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
811 Known.Zero |= (~InMask);
815 case TargetOpcode::G_ASSERT_ALIGN: {
816 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
821 Known.Zero.setLowBits(LogOfAlign);
822 Known.One.clearLowBits(LogOfAlign);
825 case TargetOpcode::G_MERGE_VALUES: {
826 unsigned NumOps =
MI.getNumOperands();
827 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
829 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
832 DemandedElts,
Depth + 1);
833 Known.insertBits(SrcOpKnown,
I * OpSize);
837 case TargetOpcode::G_UNMERGE_VALUES: {
838 unsigned NumOps =
MI.getNumOperands();
840 LLT SrcTy = MRI.getType(SrcReg);
842 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
847 for (; DstIdx !=
NumOps - 1 &&
MI.getOperand(DstIdx).
getReg() != R;
851 APInt SubDemandedElts = DemandedElts;
852 if (SrcTy.isVector()) {
855 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
861 if (SrcTy.isVector())
862 Known = std::move(SrcOpKnown);
867 case TargetOpcode::G_BSWAP: {
873 case TargetOpcode::G_BITREVERSE: {
879 case TargetOpcode::G_CTPOP: {
886 Known.Zero.setBitsFrom(LowBits);
891 case TargetOpcode::G_UBFX: {
892 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
902 case TargetOpcode::G_SBFX: {
903 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
920 case TargetOpcode::G_UADDO:
921 case TargetOpcode::G_UADDE:
922 case TargetOpcode::G_SADDO:
923 case TargetOpcode::G_SADDE: {
924 if (
MI.getOperand(1).getReg() == R) {
927 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
930 Known.Zero.setBitsFrom(1);
934 assert(
MI.getOperand(0).getReg() == R &&
935 "We only compute knownbits for the sum here.");
938 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
942 Carry = Carry.
trunc(1);
954 case TargetOpcode::G_USUBO:
955 case TargetOpcode::G_USUBE:
956 case TargetOpcode::G_SSUBO:
957 case TargetOpcode::G_SSUBE:
958 case TargetOpcode::G_UMULO:
959 case TargetOpcode::G_SMULO: {
960 if (
MI.getOperand(1).getReg() == R) {
963 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
966 Known.Zero.setBitsFrom(1);
970 case TargetOpcode::G_CTTZ:
971 case TargetOpcode::G_CTTZ_ZERO_POISON: {
978 Known.Zero.setBitsFrom(LowBits);
981 case TargetOpcode::G_CTLZ:
982 case TargetOpcode::G_CTLZ_ZERO_POISON: {
989 Known.Zero.setBitsFrom(LowBits);
992 case TargetOpcode::G_CTLS: {
996 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
1004 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1011 LLT VecVT = MRI.getType(InVec);
1023 Known.Zero.setAllBits();
1024 Known.One.setAllBits();
1029 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
1036 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1038 Register InVec = Insert.getVectorReg();
1039 Register InVal = Insert.getElementReg();
1040 Register EltNo = Insert.getIndexReg();
1041 LLT VecVT = MRI.getType(InVec);
1049 bool DemandedVal =
true;
1050 APInt DemandedVecElts = DemandedElts;
1051 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
1052 unsigned EltIdx = ConstEltNo->getZExtValue();
1053 DemandedVal = !!DemandedElts[EltIdx];
1056 Known.setAllConflict();
1061 if (!!DemandedVecElts) {
1067 case TargetOpcode::G_SHUFFLE_VECTOR: {
1068 APInt DemandedLHS, DemandedRHS;
1071 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1073 DemandedElts, DemandedLHS, DemandedRHS))
1077 Known.Zero.setAllBits();
1078 Known.One.setAllBits();
1079 if (!!DemandedLHS) {
1085 if (
Known.isUnknown())
1087 if (!!DemandedRHS) {
1094 case TargetOpcode::G_CONCAT_VECTORS: {
1095 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
1098 Known.Zero.setAllBits();
1099 Known.One.setAllBits();
1100 unsigned NumSubVectorElts =
1101 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
1105 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
1106 if (!!DemandedSub) {
1112 if (
Known.isUnknown())
1117 case TargetOpcode::G_ABS: {
1134 APInt DemandedElts =
1148void GISelValueTracking::computeKnownFPClassForFPTrunc(
1156 KnownFPClass KnownSrc;
1157 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1162void GISelValueTracking::computeKnownFPClass(
Register R,
1163 const APInt &DemandedElts,
1167 assert(
Known.isUnknown() &&
"should not be called with known information");
1169 if (!DemandedElts) {
1177 MachineInstr &
MI = *MRI.getVRegDef(R);
1178 unsigned Opcode =
MI.getOpcode();
1179 LLT DstTy = MRI.getType(R);
1187 switch (Cst->getKind()) {
1189 auto APF = Cst->getScalarValue();
1190 Known.KnownFPClasses = APF.classify();
1191 Known.SignBit = APF.isNegative();
1196 bool SignBitAllZero =
true;
1197 bool SignBitAllOne =
true;
1199 for (
auto C : *Cst) {
1200 Known.KnownFPClasses |=
C.classify();
1202 SignBitAllZero =
false;
1204 SignBitAllOne =
false;
1207 if (SignBitAllOne != SignBitAllZero)
1208 Known.SignBit = SignBitAllOne;
1223 KnownNotFromFlags |=
fcNan;
1225 KnownNotFromFlags |=
fcInf;
1229 InterestedClasses &= ~KnownNotFromFlags;
1232 [=, &
Known] {
Known.knownNot(KnownNotFromFlags); });
1238 const MachineFunction *MF =
MI.getMF();
1242 TL.computeKnownFPClassForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
1245 case TargetOpcode::G_FNEG: {
1247 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1251 case TargetOpcode::G_SELECT: {
1274 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1275 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1281 MaskIfTrue = TestedMask;
1282 MaskIfFalse = ~TestedMask;
1285 if (TestedValue ==
LHS) {
1287 FilterLHS = MaskIfTrue;
1288 }
else if (TestedValue ==
RHS) {
1290 FilterRHS = MaskIfFalse;
1293 KnownFPClass Known2;
1294 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS,
Known,
1296 Known.KnownFPClasses &= FilterLHS;
1298 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1305 case TargetOpcode::G_FCOPYSIGN: {
1306 Register Magnitude =
MI.getOperand(1).getReg();
1309 KnownFPClass KnownSign;
1311 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses,
Known,
1313 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1315 Known.copysign(KnownSign);
1318 case TargetOpcode::G_FMA:
1319 case TargetOpcode::G_STRICT_FMA:
1320 case TargetOpcode::G_FMAD: {
1333 KnownFPClass KnownSrc, KnownAddend;
1334 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1336 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1338 if (KnownNotFromFlags) {
1339 KnownSrc.
knownNot(KnownNotFromFlags);
1340 KnownAddend.
knownNot(KnownNotFromFlags);
1344 KnownFPClass KnownSrc[3];
1345 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1347 if (KnownSrc[0].isUnknown())
1349 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1351 if (KnownSrc[1].isUnknown())
1353 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1355 if (KnownSrc[2].isUnknown())
1357 if (KnownNotFromFlags) {
1358 KnownSrc[0].
knownNot(KnownNotFromFlags);
1359 KnownSrc[1].
knownNot(KnownNotFromFlags);
1360 KnownSrc[2].
knownNot(KnownNotFromFlags);
1366 case TargetOpcode::G_FSQRT:
1367 case TargetOpcode::G_STRICT_FSQRT: {
1368 KnownFPClass KnownSrc;
1370 if (InterestedClasses &
fcNan)
1374 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1383 case TargetOpcode::G_FABS: {
1388 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
1394 case TargetOpcode::G_FATAN2: {
1397 KnownFPClass KnownY, KnownX;
1398 computeKnownFPClass(
Y, DemandedElts, InterestedClasses, KnownY,
Depth + 1);
1399 computeKnownFPClass(
X, DemandedElts, InterestedClasses, KnownX,
Depth + 1);
1403 case TargetOpcode::G_FSINH: {
1405 KnownFPClass KnownSrc;
1406 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1411 case TargetOpcode::G_FCOSH: {
1413 KnownFPClass KnownSrc;
1414 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1419 case TargetOpcode::G_FTANH: {
1421 KnownFPClass KnownSrc;
1422 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1427 case TargetOpcode::G_FASIN: {
1429 KnownFPClass KnownSrc;
1430 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1435 case TargetOpcode::G_FACOS: {
1437 KnownFPClass KnownSrc;
1438 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1443 case TargetOpcode::G_FATAN: {
1445 KnownFPClass KnownSrc;
1446 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1451 case TargetOpcode::G_FTAN: {
1453 KnownFPClass KnownSrc;
1454 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1459 case TargetOpcode::G_FSIN:
1460 case TargetOpcode::G_FCOS: {
1463 KnownFPClass KnownSrc;
1464 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1467 : KnownFPClass::sin(KnownSrc);
1470 case TargetOpcode::G_FSINCOS: {
1473 KnownFPClass KnownSrc;
1474 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1476 if (R ==
MI.getOperand(0).getReg())
1482 case TargetOpcode::G_FMAXNUM:
1483 case TargetOpcode::G_FMINNUM:
1484 case TargetOpcode::G_FMINNUM_IEEE:
1485 case TargetOpcode::G_FMAXIMUM:
1486 case TargetOpcode::G_FMINIMUM:
1487 case TargetOpcode::G_FMAXNUM_IEEE:
1488 case TargetOpcode::G_FMAXIMUMNUM:
1489 case TargetOpcode::G_FMINIMUMNUM: {
1492 KnownFPClass KnownLHS, KnownRHS;
1494 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1496 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1501 case TargetOpcode::G_FMINIMUM:
1504 case TargetOpcode::G_FMAXIMUM:
1507 case TargetOpcode::G_FMINIMUMNUM:
1510 case TargetOpcode::G_FMAXIMUMNUM:
1513 case TargetOpcode::G_FMINNUM:
1514 case TargetOpcode::G_FMINNUM_IEEE:
1517 case TargetOpcode::G_FMAXNUM:
1518 case TargetOpcode::G_FMAXNUM_IEEE:
1530 case TargetOpcode::G_FCANONICALIZE: {
1532 KnownFPClass KnownSrc;
1533 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1538 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1542 case TargetOpcode::G_VECREDUCE_FMAX:
1543 case TargetOpcode::G_VECREDUCE_FMIN:
1544 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1545 case TargetOpcode::G_VECREDUCE_FMINIMUM: {
1551 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1553 if (!
Known.isKnownNeverNaN())
1554 Known.SignBit.reset();
1557 case TargetOpcode::G_FFLOOR:
1558 case TargetOpcode::G_FCEIL:
1559 case TargetOpcode::G_FRINT:
1560 case TargetOpcode::G_FNEARBYINT:
1561 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1562 case TargetOpcode::G_INTRINSIC_ROUND:
1563 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1564 case TargetOpcode::G_INTRINSIC_TRUNC: {
1566 KnownFPClass KnownSrc;
1572 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1575 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1580 case TargetOpcode::G_FEXP:
1581 case TargetOpcode::G_FEXP2:
1582 case TargetOpcode::G_FEXP10: {
1584 KnownFPClass KnownSrc;
1585 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1590 case TargetOpcode::G_FLOG:
1591 case TargetOpcode::G_FLOG2:
1592 case TargetOpcode::G_FLOG10: {
1607 KnownFPClass KnownSrc;
1608 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1612 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1616 case TargetOpcode::G_FPOWI: {
1621 LLT ExpTy = MRI.getType(Exp);
1623 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1626 if (InterestedClasses &
fcNan)
1627 InterestedSrcs |=
fcNan;
1628 if (!ExponentKnownBits.
isZero()) {
1629 if (InterestedClasses &
fcInf)
1635 KnownFPClass KnownSrc;
1636 if (InterestedSrcs !=
fcNone) {
1638 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1645 case TargetOpcode::G_FLDEXP:
1646 case TargetOpcode::G_STRICT_FLDEXP: {
1648 KnownFPClass KnownSrc;
1649 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1657 LLT ExpTy = MRI.getType(ExpReg);
1659 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1664 DenormalMode
Mode = MF->getDenormalMode(Flt);
1668 case TargetOpcode::G_FADD:
1669 case TargetOpcode::G_STRICT_FADD:
1670 case TargetOpcode::G_FSUB:
1671 case TargetOpcode::G_STRICT_FSUB: {
1674 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1675 Opcode == TargetOpcode::G_STRICT_FADD);
1679 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1682 if (!WantNaN && !WantNegative && !WantNegZero) {
1692 if (InterestedClasses &
fcNan)
1693 InterestedSrcs |=
fcInf;
1697 KnownFPClass KnownSelf;
1698 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1704 KnownFPClass KnownLHS, KnownRHS;
1705 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1709 WantNegZero || !IsAdd) {
1712 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1722 case TargetOpcode::G_FMUL:
1723 case TargetOpcode::G_STRICT_FMUL: {
1731 KnownFPClass KnownSrc;
1738 KnownFPClass KnownLHS;
1742 KnownFPClass KnownLHS, KnownRHS;
1758 case TargetOpcode::G_FDIV:
1759 case TargetOpcode::G_FREM: {
1763 if (Opcode == TargetOpcode::G_FREM)
1770 if (Opcode == TargetOpcode::G_FDIV) {
1771 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1777 KnownFPClass KnownSrc;
1778 computeKnownFPClass(
LHS, DemandedElts,
1783 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1789 KnownFPClass KnownSrc;
1790 computeKnownFPClass(
LHS, DemandedElts,
1798 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1800 const bool WantPositive = Opcode == TargetOpcode::G_FREM &&
1802 if (!WantNan && !WantNegative && !WantPositive) {
1806 KnownFPClass KnownLHS, KnownRHS;
1809 KnownRHS,
Depth + 1);
1815 if (KnowSomethingUseful || WantPositive) {
1819 if (Opcode == TargetOpcode::G_FDIV) {
1843 case TargetOpcode::G_FFREXP: {
1845 if (R !=
MI.getOperand(0).getReg())
1848 KnownFPClass KnownSrc;
1849 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1856 case TargetOpcode::G_FPEXT: {
1858 KnownFPClass KnownSrc;
1859 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1864 LLT SrcTy = MRI.getType(Src).getScalarType();
1870 case TargetOpcode::G_FPTRUNC: {
1871 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses,
Known,
1875 case TargetOpcode::G_SITOFP:
1876 case TargetOpcode::G_UITOFP: {
1887 if (Opcode == TargetOpcode::G_UITOFP)
1888 Known.signBitMustBeZero();
1895 LLT Ty = MRI.getType(Val);
1897 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1903 if (Opcode == TargetOpcode::G_SITOFP) {
1908 Known.signBitMustBeZero();
1910 Known.signBitMustBeOne();
1913 if (InterestedClasses &
fcInf) {
1920 if (Opcode == TargetOpcode::G_UITOFP)
1934 case TargetOpcode::G_BUILD_VECTOR:
1935 case TargetOpcode::G_CONCAT_VECTORS: {
1942 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
1944 bool NeedsElt = DemandedElts[Idx];
1950 computeKnownFPClass(Src,
Known, InterestedClasses,
Depth + 1);
1953 KnownFPClass Known2;
1954 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
1959 if (
Known.isUnknown())
1966 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1976 LLT VecTy = MRI.getType(Vec);
1981 if (CIdx && CIdx->ult(NumElts))
1983 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses,
Known,
1989 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1995 LLT VecTy = MRI.getType(Vec);
2003 APInt DemandedVecElts = DemandedElts;
2004 bool NeedsElt =
true;
2006 if (CIdx && CIdx->ult(NumElts)) {
2007 DemandedVecElts.
clearBit(CIdx->getZExtValue());
2008 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2013 computeKnownFPClass(Elt,
Known, InterestedClasses,
Depth + 1);
2015 if (
Known.isUnknown())
2022 if (!DemandedVecElts.
isZero()) {
2023 KnownFPClass Known2;
2024 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
2031 case TargetOpcode::G_SHUFFLE_VECTOR: {
2035 APInt DemandedLHS, DemandedRHS;
2037 assert(DemandedElts == APInt(1, 1));
2038 DemandedLHS = DemandedRHS = DemandedElts;
2040 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
2042 DemandedLHS, DemandedRHS)) {
2048 if (!!DemandedLHS) {
2050 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses,
Known,
2054 if (
Known.isUnknown())
2060 if (!!DemandedRHS) {
2061 KnownFPClass Known2;
2063 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
2069 case TargetOpcode::G_PHI: {
2078 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
2079 const MachineOperand &Src =
MI.getOperand(Idx);
2082 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses,
Known,
2086 KnownFPClass Known2;
2087 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
2091 if (
Known.isUnknown())
2096 case TargetOpcode::COPY: {
2099 if (!Src.isVirtual())
2102 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
Depth + 1);
2113 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
2114 return KnownClasses;
2120 computeKnownFPClass(R,
Known, InterestedClasses,
Depth);
2128 InterestedClasses &=
~fcNan;
2130 InterestedClasses &=
~fcInf;
2133 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
2136 Result.KnownFPClasses &=
~fcNan;
2138 Result.KnownFPClasses &=
~fcInf;
2144 LLT Ty = MRI.getType(R);
2145 APInt DemandedElts =
2147 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
2162 switch (
DefMI->getOpcode()) {
2165 case TargetOpcode::G_FADD:
2166 case TargetOpcode::G_STRICT_FADD:
2167 case TargetOpcode::G_FSUB:
2168 case TargetOpcode::G_STRICT_FSUB:
2169 case TargetOpcode::G_FMUL:
2170 case TargetOpcode::G_STRICT_FMUL:
2171 case TargetOpcode::G_FDIV:
2172 case TargetOpcode::G_FREM:
2173 case TargetOpcode::G_FMA:
2174 case TargetOpcode::G_STRICT_FMA:
2175 case TargetOpcode::G_FMAD:
2176 case TargetOpcode::G_FSQRT:
2177 case TargetOpcode::G_STRICT_FSQRT:
2181 case TargetOpcode::G_FSIN:
2182 case TargetOpcode::G_FCOS:
2183 case TargetOpcode::G_FSINCOS:
2184 case TargetOpcode::G_FTAN:
2185 case TargetOpcode::G_FASIN:
2186 case TargetOpcode::G_FACOS:
2187 case TargetOpcode::G_FATAN:
2188 case TargetOpcode::G_FATAN2:
2189 case TargetOpcode::G_FSINH:
2190 case TargetOpcode::G_FCOSH:
2191 case TargetOpcode::G_FTANH:
2192 case TargetOpcode::G_FEXP:
2193 case TargetOpcode::G_FEXP2:
2194 case TargetOpcode::G_FEXP10:
2195 case TargetOpcode::G_FLOG:
2196 case TargetOpcode::G_FLOG2:
2197 case TargetOpcode::G_FLOG10:
2198 case TargetOpcode::G_FPOWI:
2199 case TargetOpcode::G_FLDEXP:
2200 case TargetOpcode::G_STRICT_FLDEXP:
2201 case TargetOpcode::G_FFREXP:
2202 case TargetOpcode::G_INTRINSIC_TRUNC:
2203 case TargetOpcode::G_INTRINSIC_ROUND:
2204 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2205 case TargetOpcode::G_FFLOOR:
2206 case TargetOpcode::G_FCEIL:
2207 case TargetOpcode::G_FRINT:
2208 case TargetOpcode::G_FNEARBYINT:
2209 case TargetOpcode::G_FPEXT:
2210 case TargetOpcode::G_FPTRUNC:
2211 case TargetOpcode::G_FCANONICALIZE:
2212 case TargetOpcode::G_FMINNUM:
2213 case TargetOpcode::G_FMAXNUM:
2214 case TargetOpcode::G_FMINNUM_IEEE:
2215 case TargetOpcode::G_FMAXNUM_IEEE:
2216 case TargetOpcode::G_FMINIMUM:
2217 case TargetOpcode::G_FMAXIMUM:
2218 case TargetOpcode::G_FMINIMUMNUM:
2219 case TargetOpcode::G_FMAXIMUMNUM:
2233unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2234 const APInt &DemandedElts,
2238 if (Src1SignBits == 1)
2255 case TargetOpcode::G_SEXTLOAD:
2258 case TargetOpcode::G_ZEXTLOAD:
2271 const APInt &DemandedElts,
2274 unsigned Opcode =
MI.getOpcode();
2276 if (Opcode == TargetOpcode::G_CONSTANT)
2277 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2285 LLT DstTy = MRI.getType(R);
2295 unsigned FirstAnswer = 1;
2297 case TargetOpcode::COPY: {
2299 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2300 MRI.getType(Src.getReg()).isValid()) {
2307 case TargetOpcode::G_SEXT: {
2309 LLT SrcTy = MRI.getType(Src);
2313 case TargetOpcode::G_ASSERT_SEXT:
2314 case TargetOpcode::G_SEXT_INREG: {
2317 unsigned SrcBits =
MI.getOperand(2).getImm();
2318 unsigned InRegBits = TyBits - SrcBits + 1;
2322 case TargetOpcode::G_LOAD: {
2329 case TargetOpcode::G_SEXTLOAD: {
2344 case TargetOpcode::G_ZEXTLOAD: {
2359 case TargetOpcode::G_AND:
2360 case TargetOpcode::G_OR:
2361 case TargetOpcode::G_XOR: {
2363 unsigned Src1NumSignBits =
2365 if (Src1NumSignBits != 1) {
2367 unsigned Src2NumSignBits =
2369 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2373 case TargetOpcode::G_ASHR: {
2378 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2381 case TargetOpcode::G_SHL: {
2384 if (std::optional<ConstantRange> ShAmtRange =
2386 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2387 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2397 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2398 ExtOpc == TargetOpcode::G_ANYEXT) {
2399 LLT ExtTy = MRI.getType(Src1);
2401 LLT ExtendeeTy = MRI.getType(Extendee);
2405 if (SizeDiff <= MinShAmt) {
2409 return Tmp - MaxShAmt;
2415 return Tmp - MaxShAmt;
2419 case TargetOpcode::G_SREM: {
2427 case TargetOpcode::G_TRUNC: {
2429 LLT SrcTy = MRI.getType(Src);
2433 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2435 if (NumSrcSignBits > (NumSrcBits - DstTyBits))
2436 return NumSrcSignBits - (NumSrcBits - DstTyBits);
2439 case TargetOpcode::G_SELECT: {
2440 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2441 MI.getOperand(3).getReg(), DemandedElts,
2444 case TargetOpcode::G_SMIN:
2445 case TargetOpcode::G_SMAX:
2446 case TargetOpcode::G_UMIN:
2447 case TargetOpcode::G_UMAX:
2449 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2450 MI.getOperand(2).getReg(), DemandedElts,
2452 case TargetOpcode::G_SADDO:
2453 case TargetOpcode::G_SADDE:
2454 case TargetOpcode::G_UADDO:
2455 case TargetOpcode::G_UADDE:
2456 case TargetOpcode::G_SSUBO:
2457 case TargetOpcode::G_SSUBE:
2458 case TargetOpcode::G_USUBO:
2459 case TargetOpcode::G_USUBE:
2460 case TargetOpcode::G_SMULO:
2461 case TargetOpcode::G_UMULO: {
2465 if (
MI.getOperand(1).getReg() == R) {
2466 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2473 case TargetOpcode::G_SUB: {
2475 unsigned Src2NumSignBits =
2477 if (Src2NumSignBits == 1)
2487 if ((Known2.
Zero | 1).isAllOnes())
2494 FirstAnswer = Src2NumSignBits;
2501 unsigned Src1NumSignBits =
2503 if (Src1NumSignBits == 1)
2508 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2511 case TargetOpcode::G_ADD: {
2513 unsigned Src2NumSignBits =
2515 if (Src2NumSignBits <= 2)
2519 unsigned Src1NumSignBits =
2521 if (Src1NumSignBits == 1)
2530 if ((Known1.
Zero | 1).isAllOnes())
2536 FirstAnswer = Src1NumSignBits;
2545 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2548 case TargetOpcode::G_FCMP:
2549 case TargetOpcode::G_ICMP: {
2550 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2553 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2560 case TargetOpcode::G_BUILD_VECTOR: {
2562 FirstAnswer = TyBits;
2563 APInt SingleDemandedElt(1, 1);
2565 if (!DemandedElts[
I])
2570 FirstAnswer = std::min(FirstAnswer, Tmp2);
2573 if (FirstAnswer == 1)
2578 case TargetOpcode::G_CONCAT_VECTORS: {
2579 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2581 FirstAnswer = TyBits;
2584 unsigned NumSubVectorElts =
2585 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2588 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2593 FirstAnswer = std::min(FirstAnswer, Tmp2);
2596 if (FirstAnswer == 1)
2601 case TargetOpcode::G_SHUFFLE_VECTOR: {
2604 APInt DemandedLHS, DemandedRHS;
2606 unsigned NumElts = MRI.getType(Src1).getNumElements();
2608 DemandedElts, DemandedLHS, DemandedRHS))
2614 if (FirstAnswer == 1)
2616 if (!!DemandedRHS) {
2619 FirstAnswer = std::min(FirstAnswer, Tmp2);
2623 case TargetOpcode::G_SPLAT_VECTOR: {
2627 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2628 if (NumSrcSignBits > (NumSrcBits - TyBits))
2629 return NumSrcSignBits - (NumSrcBits - TyBits);
2632 case TargetOpcode::G_INTRINSIC:
2633 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2634 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2635 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2638 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2640 FirstAnswer = std::max(FirstAnswer, NumBits);
2648 return std::max(FirstAnswer,
Known.countMinSignBits());
2652 LLT Ty = MRI.getType(R);
2653 APInt DemandedElts =
2662 unsigned Opcode =
MI.getOpcode();
2664 LLT Ty = MRI.getType(R);
2665 unsigned BitWidth = Ty.getScalarSizeInBits();
2667 if (Opcode == TargetOpcode::G_CONSTANT) {
2668 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2670 return std::nullopt;
2674 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2675 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2676 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2677 if (!DemandedElts[
I])
2680 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2681 MinAmt = MaxAmt =
nullptr;
2685 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2687 return std::nullopt;
2688 if (!MinAmt || MinAmt->
ugt(ShAmt))
2690 if (!MaxAmt || MaxAmt->ult(ShAmt))
2693 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2694 "Failed to find matching min/max shift amounts");
2695 if (MinAmt && MaxAmt)
2705 return std::nullopt;
2710 if (std::optional<ConstantRange> AmtRange =
2712 return AmtRange->getUnsignedMin().getZExtValue();
2713 return std::nullopt;
2731 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2743 return Result(MF, MaxDepth);
2758 if (!MO.isReg() || MO.getReg().isPhysical())
2761 if (!MRI.getType(Reg).isValid())
2764 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2765 bool IsKnownNeverZero = VTA.isKnownNeverZero(Reg);
2766 OS <<
" " << MO <<
" KnownBits:" <<
Known <<
" SignBits:" << SignedBits
2767 <<
" IsKnownNeverZero:" << IsKnownNeverZero <<
'\n';
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Utilities for dealing with flags related to floating point properties and mode controls.
static void dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth)
static unsigned computeNumSignBitsFromRangeMetadata(const GAnyLoad *Ld, unsigned TyBits)
Compute the known number of sign bits with attached range metadata in the memory operand.
Provides analysis for querying information about KnownBits during GISel passes.
Declares convenience wrapper classes for interpreting MachineInstr instances as specific generic oper...
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
Implement a low-level type suitable for MachineInstr level instruction selection.
Contains matchers for matching SSA Machine Instructions.
Promote Memory to Register
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
static bool isAbsoluteValueULEOne(const Value *V)
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Class for arbitrary precision integers.
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
void clearBit(unsigned BitPosition)
Set a given bit to 0.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
unsigned countl_zero() const
The APInt version of std::countl_zero.
unsigned logBase2() const
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
APInt shl(unsigned shiftAmt) const
Left-shift function.
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
This class represents a range of values.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI 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 APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
Represents any generic load, including sign/zero extending variants.
const MDNode * getRanges() const
Returns the Ranges that describes the dereference.
static LLVM_ABI std::optional< GFConstant > getConstant(Register Const, const MachineRegisterInfo &MRI)
To use KnownBitsInfo analysis in a pass, KnownBitsInfo &Info = getAnalysis<GISelValueTrackingInfoAnal...
GISelValueTracking & get(MachineFunction &MF)
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
GISelValueTracking Result
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
unsigned getMaxDepth() const
KnownBits getKnownBits(Register R)
Align computeKnownAlignment(Register R, unsigned Depth=0)
std::optional< ConstantRange > getValidShiftAmountRange(Register R, const APInt &DemandedElts, unsigned Depth)
If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the eleme...
bool maskedValueIsZero(Register Val, const APInt &Mask)
std::optional< uint64_t > getValidMinimumShiftAmount(Register R, const APInt &DemandedElts, unsigned Depth=0)
If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the eleme...
bool signBitIsZero(Register Op)
const DataLayout & getDataLayout() const
unsigned computeNumSignBits(Register R, const APInt &DemandedElts, unsigned Depth=0)
const MachineFunction & getMachineFunction() const
bool isKnownNeverNaN(Register Val, bool SNaN=false)
Returns true if Val can be assumed to never be a NaN.
APInt getKnownOnes(Register R)
APInt getKnownZeroes(Register R)
void computeKnownBitsImpl(Register R, KnownBits &Known, const APInt &DemandedElts, unsigned Depth=0)
bool isKnownNeverZero(Register R, unsigned Depth=0)
Return true if the value defined by R is provably never zero.
Represents an insert vector element.
Register getCondReg() const
Register getFalseReg() const
Register getTrueReg() const
Represents a G_SHUFFLE_VECTOR.
Register getSrc2Reg() const
Register getSrc1Reg() const
ArrayRef< int > getMask() const
constexpr bool isScalableVector() const
Returns true if the LLT is a scalable vector.
constexpr unsigned getScalarSizeInBits() const
LLT getScalarType() const
constexpr bool isValid() const
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
constexpr bool isVector() const
constexpr ElementCount getElementCount() const
constexpr bool isFixedVector() const
Returns true if the LLT is a fixed vector.
TypeSize getValue() const
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
LLT getMemoryType() const
Return the memory type of the memory reference.
const MDNode * getRanges() const
Return the range tag for the memory reference.
LocationSize getSizeInBits() const
Return the size in bits of the memory reference.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
@ ZeroOrOneBooleanContent
@ ZeroOrNegativeOneBooleanContent
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
operand_type_match m_Reg()
UnaryOp_match< SrcTy, TargetOpcode::G_FFLOOR > m_GFFloor(const SrcTy &Src)
operand_type_match m_Pred()
bind_ty< FPClassTest > m_FPClassTest(FPClassTest &T)
deferred_ty< Register > m_DeferredReg(Register &R)
Similar to m_SpecificReg/Type, but the specific value to match originated from an earlier sub-pattern...
BinaryOp_match< LHS, RHS, TargetOpcode::G_FSUB, false > m_GFSub(const LHS &L, const RHS &R)
bool mi_match(Reg R, const MachineRegisterInfo &MRI, Pattern &&P)
ClassifyOp_match< LHS, Test, TargetOpcode::G_IS_FPCLASS > m_GIsFPClass(const LHS &L, const Test &T)
Matches the register and immediate used in a fpclass test G_IS_FPCLASS val, 96.
CompareOp_match< Pred, LHS, RHS, TargetOpcode::G_FCMP > m_GFCmp(const Pred &P, const LHS &L, const RHS &R)
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
LLVM_ABI std::optional< APInt > isConstantOrConstantSplatVector(Register Def, const MachineRegisterInfo &MRI)
Determines if Def defines a constant integer or a splat vector of constant integers.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
LLVM_ABI std::optional< APInt > getIConstantVRegVal(Register VReg, const MachineRegisterInfo &MRI)
If VReg is defined by a G_CONSTANT, return the corresponding value.
@ Known
Known to have no common set bits.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
LLVM_ABI const llvm::fltSemantics & getFltSemanticForLLT(LLT Ty)
Get the appropriate floating point arithmetic semantic based on the bit size of the given scalar LLT.
scope_exit(Callable) -> scope_exit< Callable >
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
std::tuple< Value *, FPClassTest, FPClassTest > fcmpImpliesClass(CmpInst::Predicate Pred, const Function &F, Value *LHS, FPClassTest RHSClass, bool LookThroughSrc=true)
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
constexpr unsigned MaxAnalysisRecursionDepth
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
DWARFExpression::Operation Op
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
static uint32_t extractBits(uint64_t Val, uint32_t Hi, uint32_t Lo)
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
This struct is a compact representation of a valid (non-zero power of two) alignment.
A special type used by analysis passes to provide an address that identifies that particular analysis...
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
static LLVM_ABI KnownBits sadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.sadd.sat(LHS, RHS)
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
bool isZero() const
Returns true if value is all zero.
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits ssub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.ssub.sat(LHS, RHS)
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
void setAllZero()
Make all bits known to be zero and discard any previous information.
unsigned getBitWidth() const
Get the bit width of this value.
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
bool isEven() const
Return if the value is known even (the low bit is 0).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
bool isNegative() const
Returns true if this value is known to be negative.
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits uadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.uadd.sat(LHS, RHS)
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
bool isAllOnes() const
Returns true if value is all one bits.
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
bool cannotBeOrderedGreaterThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never greater tha...
static LLVM_ABI KnownFPClass sin(const KnownFPClass &Src)
Report known values for sin.
static LLVM_ABI KnownFPClass fdiv_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv x, x.
static constexpr FPClassTest OrderedGreaterThanZeroMask
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.
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
static LLVM_ABI KnownFPClass log(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for log/log2/log10.
static LLVM_ABI KnownFPClass atan(const KnownFPClass &Src)
Report known values for atan.
static LLVM_ABI KnownFPClass atan2(const KnownFPClass &LHS, const KnownFPClass &RHS)
Report known values for atan2.
static LLVM_ABI KnownFPClass fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv.
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsTrunc, bool IsMultiUnitFPType)
Propagate known class for rounding intrinsics (trunc, floor, ceil, rint, nearbyint,...
static LLVM_ABI KnownFPClass cos(const KnownFPClass &Src)
Report known values for cos.
static LLVM_ABI KnownFPClass cosh(const KnownFPClass &Src)
Report known values for cosh.
static LLVM_ABI KnownFPClass minMaxLike(const KnownFPClass &LHS, const KnownFPClass &RHS, MinMaxKind Kind, DenormalMode DenormMode=DenormalMode::getDynamic())
static LLVM_ABI KnownFPClass exp(const KnownFPClass &Src)
Report known values for exp, exp2 and exp10.
static LLVM_ABI KnownFPClass frexp_mant(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for mantissa component of frexp.
static LLVM_ABI KnownFPClass asin(const KnownFPClass &Src)
Report known values for asin.
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
static LLVM_ABI KnownFPClass fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy)
Propagate known class for fpext.
static LLVM_ABI KnownFPClass fma(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma.
static LLVM_ABI KnownFPClass tan(const KnownFPClass &Src)
Report known values for tan.
static LLVM_ABI KnownFPClass fptrunc(const KnownFPClass &KnownSrc)
Propagate known class for fptrunc.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
static LLVM_ABI KnownFPClass sqrt(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for sqrt.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd.
static LLVM_ABI KnownFPClass fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma squared, squared, addend.
static LLVM_ABI KnownFPClass acos(const KnownFPClass &Src)
Report known values for acos.
static LLVM_ABI KnownFPClass frem_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem.
static LLVM_ABI KnownFPClass powi(const KnownFPClass &Src, const KnownBits &N)
Propagate known class for powi.
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.