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();
116[[maybe_unused]]
static void
119 <<
"] Computed for: " <<
MI <<
"[" <<
Depth <<
"] Known: 0x"
130 const APInt &DemandedElts,
136 if (
Known.isUnknown())
161 const APInt &DemandedElts,
164 unsigned Opcode =
MI.getOpcode();
165 LLT DstTy = MRI.getType(R);
179 "DemandedElt width should equal the fixed vector number of elements");
182 "DemandedElt width should be 1 for scalars or scalable vectors");
207 TL.computeKnownBitsForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
210 case TargetOpcode::G_BUILD_VECTOR: {
212 Known.Zero.setAllBits();
213 Known.One.setAllBits();
215 if (!DemandedElts[
I])
224 if (
Known.isUnknown())
229 case TargetOpcode::G_SPLAT_VECTOR: {
237 case TargetOpcode::COPY:
238 case TargetOpcode::G_PHI:
239 case TargetOpcode::PHI: {
245 assert(
MI.getOperand(0).getSubReg() == 0 &&
"Is this code in SSA?");
248 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
251 LLT SrcTy = MRI.getType(SrcReg);
259 if (SrcReg.
isVirtual() && Src.getSubReg() == 0 &&
261 APInt NowDemandedElts;
262 if (!SrcTy.isFixedVector()) {
263 NowDemandedElts =
APInt(1, 1);
266 NowDemandedElts = DemandedElts;
273 Depth + (Opcode != TargetOpcode::COPY));
278 if (
Known.isUnknown())
288 case TargetOpcode::G_STEP_VECTOR: {
289 APInt Step =
MI.getOperand(1).getCImm()->getValue();
297 const APInt MinNumElts =
303 .
umul_ov(MinNumElts, Overflow);
306 const APInt MaxValue = (MaxNumElts - 1).
umul_ov(Step, Overflow);
312 case TargetOpcode::G_CONSTANT: {
316 case TargetOpcode::G_FRAME_INDEX: {
317 int FrameIdx =
MI.getOperand(1).getIndex();
318 TL.computeKnownBitsForStackObjectPointer(
319 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
322 case TargetOpcode::G_SUB: {
331 case TargetOpcode::G_XOR: {
340 case TargetOpcode::G_PTR_ADD: {
344 LLT Ty = MRI.getType(
MI.getOperand(1).getReg());
345 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
349 case TargetOpcode::G_ADD: {
357 case TargetOpcode::G_AND: {
367 case TargetOpcode::G_OR: {
377 case TargetOpcode::G_MUL: {
385 case TargetOpcode::G_UMULH: {
393 case TargetOpcode::G_SMULH: {
401 case TargetOpcode::G_ABDU: {
409 case TargetOpcode::G_ABDS: {
418 if (SignBits1 == 1) {
424 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
427 case TargetOpcode::G_SADDSAT: {
435 case TargetOpcode::G_UADDSAT: {
443 case TargetOpcode::G_SSUBSAT: {
451 case TargetOpcode::G_USUBSAT: {
459 case TargetOpcode::G_UDIV: {
468 case TargetOpcode::G_SDIV: {
477 case TargetOpcode::G_UREM: {
489 case TargetOpcode::G_SREM: {
501 case TargetOpcode::G_SELECT: {
502 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
506 case TargetOpcode::G_SMIN: {
516 case TargetOpcode::G_SMAX: {
526 case TargetOpcode::G_UMIN: {
535 case TargetOpcode::G_UMAX: {
544 case TargetOpcode::G_FCMP:
545 case TargetOpcode::G_ICMP: {
548 if (TL.getBooleanContents(DstTy.
isVector(),
549 Opcode == TargetOpcode::G_FCMP) ==
552 Known.Zero.setBitsFrom(1);
555 case TargetOpcode::G_SEXT: {
563 case TargetOpcode::G_ASSERT_SEXT:
564 case TargetOpcode::G_SEXT_INREG: {
570 case TargetOpcode::G_ANYEXT: {
576 case TargetOpcode::G_LOAD: {
584 case TargetOpcode::G_SEXTLOAD:
585 case TargetOpcode::G_ZEXTLOAD: {
592 Known = Opcode == TargetOpcode::G_SEXTLOAD
597 case TargetOpcode::G_ASHR: {
606 case TargetOpcode::G_LSHR: {
615 case TargetOpcode::G_SHL: {
624 case TargetOpcode::G_ROTL:
625 case TargetOpcode::G_ROTR: {
626 MachineInstr *AmtOpMI = MRI.getVRegDef(
MI.getOperand(2).getReg());
634 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
637 if (Opcode == TargetOpcode::G_ROTL)
644 case TargetOpcode::G_FSHL:
645 case TargetOpcode::G_FSHR: {
646 MachineInstr *AmtOpMI = MRI.getVRegDef(
MI.getOperand(3).getReg());
651 const APInt Amt = *MaybeAmtOp;
656 Known = Opcode == TargetOpcode::G_FSHL
661 case TargetOpcode::G_INTTOPTR:
662 case TargetOpcode::G_PTRTOINT:
667 case TargetOpcode::G_ZEXT:
668 case TargetOpcode::G_TRUNC: {
674 case TargetOpcode::G_ASSERT_ZEXT: {
678 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
679 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
681 Known.Zero |= (~InMask);
685 case TargetOpcode::G_ASSERT_ALIGN: {
686 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
691 Known.Zero.setLowBits(LogOfAlign);
692 Known.One.clearLowBits(LogOfAlign);
695 case TargetOpcode::G_MERGE_VALUES: {
696 unsigned NumOps =
MI.getNumOperands();
697 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
699 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
702 DemandedElts,
Depth + 1);
703 Known.insertBits(SrcOpKnown,
I * OpSize);
707 case TargetOpcode::G_UNMERGE_VALUES: {
708 unsigned NumOps =
MI.getNumOperands();
710 LLT SrcTy = MRI.getType(SrcReg);
712 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
717 for (; DstIdx !=
NumOps - 1 &&
MI.getOperand(DstIdx).
getReg() != R;
721 APInt SubDemandedElts = DemandedElts;
722 if (SrcTy.isVector()) {
725 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
731 if (SrcTy.isVector())
732 Known = std::move(SrcOpKnown);
737 case TargetOpcode::G_BSWAP: {
743 case TargetOpcode::G_BITREVERSE: {
749 case TargetOpcode::G_CTPOP: {
756 Known.Zero.setBitsFrom(LowBits);
761 case TargetOpcode::G_UBFX: {
762 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
772 case TargetOpcode::G_SBFX: {
773 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
790 case TargetOpcode::G_UADDO:
791 case TargetOpcode::G_UADDE:
792 case TargetOpcode::G_SADDO:
793 case TargetOpcode::G_SADDE: {
794 if (
MI.getOperand(1).getReg() == R) {
797 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
800 Known.Zero.setBitsFrom(1);
804 assert(
MI.getOperand(0).getReg() == R &&
805 "We only compute knownbits for the sum here.");
808 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
812 Carry = Carry.
trunc(1);
824 case TargetOpcode::G_USUBO:
825 case TargetOpcode::G_USUBE:
826 case TargetOpcode::G_SSUBO:
827 case TargetOpcode::G_SSUBE:
828 case TargetOpcode::G_UMULO:
829 case TargetOpcode::G_SMULO: {
830 if (
MI.getOperand(1).getReg() == R) {
833 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
836 Known.Zero.setBitsFrom(1);
840 case TargetOpcode::G_CTTZ:
841 case TargetOpcode::G_CTTZ_ZERO_POISON: {
848 Known.Zero.setBitsFrom(LowBits);
851 case TargetOpcode::G_CTLZ:
852 case TargetOpcode::G_CTLZ_ZERO_POISON: {
859 Known.Zero.setBitsFrom(LowBits);
862 case TargetOpcode::G_CTLS: {
866 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
874 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
881 LLT VecVT = MRI.getType(InVec);
893 Known.Zero.setAllBits();
894 Known.One.setAllBits();
899 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
906 case TargetOpcode::G_INSERT_VECTOR_ELT: {
908 Register InVec = Insert.getVectorReg();
909 Register InVal = Insert.getElementReg();
910 Register EltNo = Insert.getIndexReg();
911 LLT VecVT = MRI.getType(InVec);
919 bool DemandedVal =
true;
920 APInt DemandedVecElts = DemandedElts;
921 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
922 unsigned EltIdx = ConstEltNo->getZExtValue();
923 DemandedVal = !!DemandedElts[EltIdx];
926 Known.setAllConflict();
931 if (!!DemandedVecElts) {
937 case TargetOpcode::G_SHUFFLE_VECTOR: {
938 APInt DemandedLHS, DemandedRHS;
941 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
943 DemandedElts, DemandedLHS, DemandedRHS))
947 Known.Zero.setAllBits();
948 Known.One.setAllBits();
955 if (
Known.isUnknown())
964 case TargetOpcode::G_CONCAT_VECTORS: {
965 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
968 Known.Zero.setAllBits();
969 Known.One.setAllBits();
970 unsigned NumSubVectorElts =
971 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
975 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
982 if (
Known.isUnknown())
987 case TargetOpcode::G_ABS: {
1004 APInt DemandedElts =
1018void GISelValueTracking::computeKnownFPClassForFPTrunc(
1026 KnownFPClass KnownSrc;
1027 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1032void GISelValueTracking::computeKnownFPClass(
Register R,
1033 const APInt &DemandedElts,
1037 assert(
Known.isUnknown() &&
"should not be called with known information");
1039 if (!DemandedElts) {
1047 MachineInstr &
MI = *MRI.getVRegDef(R);
1048 unsigned Opcode =
MI.getOpcode();
1049 LLT DstTy = MRI.getType(R);
1057 switch (Cst->getKind()) {
1059 auto APF = Cst->getScalarValue();
1060 Known.KnownFPClasses = APF.classify();
1061 Known.SignBit = APF.isNegative();
1066 bool SignBitAllZero =
true;
1067 bool SignBitAllOne =
true;
1069 for (
auto C : *Cst) {
1070 Known.KnownFPClasses |=
C.classify();
1072 SignBitAllZero =
false;
1074 SignBitAllOne =
false;
1077 if (SignBitAllOne != SignBitAllZero)
1078 Known.SignBit = SignBitAllOne;
1093 KnownNotFromFlags |=
fcNan;
1095 KnownNotFromFlags |=
fcInf;
1099 InterestedClasses &= ~KnownNotFromFlags;
1102 [=, &
Known] {
Known.knownNot(KnownNotFromFlags); });
1108 const MachineFunction *MF =
MI.getMF();
1112 TL.computeKnownFPClassForTargetInstr(*
this, R,
Known, DemandedElts, MRI,
1115 case TargetOpcode::G_FNEG: {
1117 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1121 case TargetOpcode::G_SELECT: {
1144 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1145 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1151 MaskIfTrue = TestedMask;
1152 MaskIfFalse = ~TestedMask;
1155 if (TestedValue ==
LHS) {
1157 FilterLHS = MaskIfTrue;
1158 }
else if (TestedValue ==
RHS) {
1160 FilterRHS = MaskIfFalse;
1163 KnownFPClass Known2;
1164 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS,
Known,
1166 Known.KnownFPClasses &= FilterLHS;
1168 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1175 case TargetOpcode::G_FCOPYSIGN: {
1176 Register Magnitude =
MI.getOperand(1).getReg();
1179 KnownFPClass KnownSign;
1181 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses,
Known,
1183 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1185 Known.copysign(KnownSign);
1188 case TargetOpcode::G_FMA:
1189 case TargetOpcode::G_STRICT_FMA:
1190 case TargetOpcode::G_FMAD: {
1203 KnownFPClass KnownSrc, KnownAddend;
1204 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1206 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1208 if (KnownNotFromFlags) {
1209 KnownSrc.
knownNot(KnownNotFromFlags);
1210 KnownAddend.
knownNot(KnownNotFromFlags);
1214 KnownFPClass KnownSrc[3];
1215 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1217 if (KnownSrc[0].isUnknown())
1219 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1221 if (KnownSrc[1].isUnknown())
1223 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1225 if (KnownSrc[2].isUnknown())
1227 if (KnownNotFromFlags) {
1228 KnownSrc[0].
knownNot(KnownNotFromFlags);
1229 KnownSrc[1].
knownNot(KnownNotFromFlags);
1230 KnownSrc[2].
knownNot(KnownNotFromFlags);
1236 case TargetOpcode::G_FSQRT:
1237 case TargetOpcode::G_STRICT_FSQRT: {
1238 KnownFPClass KnownSrc;
1240 if (InterestedClasses &
fcNan)
1244 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1253 case TargetOpcode::G_FABS: {
1258 computeKnownFPClass(Val, DemandedElts, InterestedClasses,
Known,
1264 case TargetOpcode::G_FATAN2: {
1267 KnownFPClass KnownY, KnownX;
1268 computeKnownFPClass(
Y, DemandedElts, InterestedClasses, KnownY,
Depth + 1);
1269 computeKnownFPClass(
X, DemandedElts, InterestedClasses, KnownX,
Depth + 1);
1273 case TargetOpcode::G_FSINH: {
1275 KnownFPClass KnownSrc;
1276 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1281 case TargetOpcode::G_FCOSH: {
1283 KnownFPClass KnownSrc;
1284 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1289 case TargetOpcode::G_FTANH: {
1291 KnownFPClass KnownSrc;
1292 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1297 case TargetOpcode::G_FASIN: {
1299 KnownFPClass KnownSrc;
1300 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1305 case TargetOpcode::G_FACOS: {
1307 KnownFPClass KnownSrc;
1308 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1313 case TargetOpcode::G_FATAN: {
1315 KnownFPClass KnownSrc;
1316 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1321 case TargetOpcode::G_FTAN: {
1323 KnownFPClass KnownSrc;
1324 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1329 case TargetOpcode::G_FSIN:
1330 case TargetOpcode::G_FCOS: {
1333 KnownFPClass KnownSrc;
1334 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1337 : KnownFPClass::sin(KnownSrc);
1340 case TargetOpcode::G_FSINCOS: {
1343 KnownFPClass KnownSrc;
1344 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1346 if (R ==
MI.getOperand(0).getReg())
1352 case TargetOpcode::G_FMAXNUM:
1353 case TargetOpcode::G_FMINNUM:
1354 case TargetOpcode::G_FMINNUM_IEEE:
1355 case TargetOpcode::G_FMAXIMUM:
1356 case TargetOpcode::G_FMINIMUM:
1357 case TargetOpcode::G_FMAXNUM_IEEE:
1358 case TargetOpcode::G_FMAXIMUMNUM:
1359 case TargetOpcode::G_FMINIMUMNUM: {
1362 KnownFPClass KnownLHS, KnownRHS;
1364 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1366 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1371 case TargetOpcode::G_FMINIMUM:
1374 case TargetOpcode::G_FMAXIMUM:
1377 case TargetOpcode::G_FMINIMUMNUM:
1380 case TargetOpcode::G_FMAXIMUMNUM:
1383 case TargetOpcode::G_FMINNUM:
1384 case TargetOpcode::G_FMINNUM_IEEE:
1387 case TargetOpcode::G_FMAXNUM:
1388 case TargetOpcode::G_FMAXNUM_IEEE:
1400 case TargetOpcode::G_FCANONICALIZE: {
1402 KnownFPClass KnownSrc;
1403 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1408 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1412 case TargetOpcode::G_VECREDUCE_FMAX:
1413 case TargetOpcode::G_VECREDUCE_FMIN:
1414 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1415 case TargetOpcode::G_VECREDUCE_FMINIMUM: {
1421 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1423 if (!
Known.isKnownNeverNaN())
1424 Known.SignBit.reset();
1427 case TargetOpcode::G_FFLOOR:
1428 case TargetOpcode::G_FCEIL:
1429 case TargetOpcode::G_FRINT:
1430 case TargetOpcode::G_FNEARBYINT:
1431 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1432 case TargetOpcode::G_INTRINSIC_ROUND:
1433 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1434 case TargetOpcode::G_INTRINSIC_TRUNC: {
1436 KnownFPClass KnownSrc;
1442 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1445 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1450 case TargetOpcode::G_FEXP:
1451 case TargetOpcode::G_FEXP2:
1452 case TargetOpcode::G_FEXP10: {
1454 KnownFPClass KnownSrc;
1455 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1460 case TargetOpcode::G_FLOG:
1461 case TargetOpcode::G_FLOG2:
1462 case TargetOpcode::G_FLOG10: {
1477 KnownFPClass KnownSrc;
1478 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1482 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1486 case TargetOpcode::G_FPOWI: {
1491 LLT ExpTy = MRI.getType(Exp);
1493 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1496 if (InterestedClasses &
fcNan)
1497 InterestedSrcs |=
fcNan;
1498 if (!ExponentKnownBits.
isZero()) {
1499 if (InterestedClasses &
fcInf)
1505 KnownFPClass KnownSrc;
1506 if (InterestedSrcs !=
fcNone) {
1508 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1515 case TargetOpcode::G_FLDEXP:
1516 case TargetOpcode::G_STRICT_FLDEXP: {
1518 KnownFPClass KnownSrc;
1519 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1527 LLT ExpTy = MRI.getType(ExpReg);
1529 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1534 DenormalMode
Mode = MF->getDenormalMode(Flt);
1538 case TargetOpcode::G_FADD:
1539 case TargetOpcode::G_STRICT_FADD:
1540 case TargetOpcode::G_FSUB:
1541 case TargetOpcode::G_STRICT_FSUB: {
1544 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1545 Opcode == TargetOpcode::G_STRICT_FADD);
1549 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1552 if (!WantNaN && !WantNegative && !WantNegZero) {
1562 if (InterestedClasses &
fcNan)
1563 InterestedSrcs |=
fcInf;
1567 KnownFPClass KnownSelf;
1568 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1574 KnownFPClass KnownLHS, KnownRHS;
1575 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1579 WantNegZero || !IsAdd) {
1582 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1592 case TargetOpcode::G_FMUL:
1593 case TargetOpcode::G_STRICT_FMUL: {
1601 KnownFPClass KnownSrc;
1608 KnownFPClass KnownLHS;
1612 KnownFPClass KnownLHS, KnownRHS;
1628 case TargetOpcode::G_FDIV:
1629 case TargetOpcode::G_FREM: {
1633 if (Opcode == TargetOpcode::G_FREM)
1640 if (Opcode == TargetOpcode::G_FDIV) {
1641 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1647 KnownFPClass KnownSrc;
1648 computeKnownFPClass(
LHS, DemandedElts,
1653 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1659 KnownFPClass KnownSrc;
1660 computeKnownFPClass(
LHS, DemandedElts,
1668 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1670 const bool WantPositive = Opcode == TargetOpcode::G_FREM &&
1672 if (!WantNan && !WantNegative && !WantPositive) {
1676 KnownFPClass KnownLHS, KnownRHS;
1679 KnownRHS,
Depth + 1);
1685 if (KnowSomethingUseful || WantPositive) {
1689 if (Opcode == TargetOpcode::G_FDIV) {
1713 case TargetOpcode::G_FFREXP: {
1715 if (R !=
MI.getOperand(0).getReg())
1718 KnownFPClass KnownSrc;
1719 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1726 case TargetOpcode::G_FPEXT: {
1728 KnownFPClass KnownSrc;
1729 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1734 LLT SrcTy = MRI.getType(Src).getScalarType();
1740 case TargetOpcode::G_FPTRUNC: {
1741 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses,
Known,
1745 case TargetOpcode::G_SITOFP:
1746 case TargetOpcode::G_UITOFP: {
1757 if (Opcode == TargetOpcode::G_UITOFP)
1758 Known.signBitMustBeZero();
1765 LLT Ty = MRI.getType(Val);
1767 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1773 if (Opcode == TargetOpcode::G_SITOFP) {
1778 Known.signBitMustBeZero();
1780 Known.signBitMustBeOne();
1783 if (InterestedClasses &
fcInf) {
1790 if (Opcode == TargetOpcode::G_UITOFP)
1804 case TargetOpcode::G_BUILD_VECTOR:
1805 case TargetOpcode::G_CONCAT_VECTORS: {
1812 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
1814 bool NeedsElt = DemandedElts[Idx];
1820 computeKnownFPClass(Src,
Known, InterestedClasses,
Depth + 1);
1823 KnownFPClass Known2;
1824 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
1829 if (
Known.isUnknown())
1836 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1846 LLT VecTy = MRI.getType(Vec);
1851 if (CIdx && CIdx->ult(NumElts))
1853 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses,
Known,
1859 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1865 LLT VecTy = MRI.getType(Vec);
1873 APInt DemandedVecElts = DemandedElts;
1874 bool NeedsElt =
true;
1876 if (CIdx && CIdx->ult(NumElts)) {
1877 DemandedVecElts.
clearBit(CIdx->getZExtValue());
1878 NeedsElt = DemandedElts[CIdx->getZExtValue()];
1883 computeKnownFPClass(Elt,
Known, InterestedClasses,
Depth + 1);
1885 if (
Known.isUnknown())
1892 if (!DemandedVecElts.
isZero()) {
1893 KnownFPClass Known2;
1894 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
1901 case TargetOpcode::G_SHUFFLE_VECTOR: {
1905 APInt DemandedLHS, DemandedRHS;
1907 assert(DemandedElts == APInt(1, 1));
1908 DemandedLHS = DemandedRHS = DemandedElts;
1910 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
1912 DemandedLHS, DemandedRHS)) {
1918 if (!!DemandedLHS) {
1920 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses,
Known,
1924 if (
Known.isUnknown())
1930 if (!!DemandedRHS) {
1931 KnownFPClass Known2;
1933 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
1939 case TargetOpcode::G_PHI: {
1948 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
1949 const MachineOperand &Src =
MI.getOperand(Idx);
1952 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses,
Known,
1956 KnownFPClass Known2;
1957 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
1961 if (
Known.isUnknown())
1966 case TargetOpcode::COPY: {
1969 if (!Src.isVirtual())
1972 computeKnownFPClass(Src, DemandedElts, InterestedClasses,
Known,
Depth + 1);
1983 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
1984 return KnownClasses;
1990 computeKnownFPClass(R,
Known, InterestedClasses,
Depth);
1998 InterestedClasses &=
~fcNan;
2000 InterestedClasses &=
~fcInf;
2003 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
2006 Result.KnownFPClasses &=
~fcNan;
2008 Result.KnownFPClasses &=
~fcInf;
2014 LLT Ty = MRI.getType(R);
2015 APInt DemandedElts =
2017 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
2032 switch (
DefMI->getOpcode()) {
2035 case TargetOpcode::G_FADD:
2036 case TargetOpcode::G_STRICT_FADD:
2037 case TargetOpcode::G_FSUB:
2038 case TargetOpcode::G_STRICT_FSUB:
2039 case TargetOpcode::G_FMUL:
2040 case TargetOpcode::G_STRICT_FMUL:
2041 case TargetOpcode::G_FDIV:
2042 case TargetOpcode::G_FREM:
2043 case TargetOpcode::G_FMA:
2044 case TargetOpcode::G_STRICT_FMA:
2045 case TargetOpcode::G_FMAD:
2046 case TargetOpcode::G_FSQRT:
2047 case TargetOpcode::G_STRICT_FSQRT:
2051 case TargetOpcode::G_FSIN:
2052 case TargetOpcode::G_FCOS:
2053 case TargetOpcode::G_FSINCOS:
2054 case TargetOpcode::G_FTAN:
2055 case TargetOpcode::G_FASIN:
2056 case TargetOpcode::G_FACOS:
2057 case TargetOpcode::G_FATAN:
2058 case TargetOpcode::G_FATAN2:
2059 case TargetOpcode::G_FSINH:
2060 case TargetOpcode::G_FCOSH:
2061 case TargetOpcode::G_FTANH:
2062 case TargetOpcode::G_FEXP:
2063 case TargetOpcode::G_FEXP2:
2064 case TargetOpcode::G_FEXP10:
2065 case TargetOpcode::G_FLOG:
2066 case TargetOpcode::G_FLOG2:
2067 case TargetOpcode::G_FLOG10:
2068 case TargetOpcode::G_FPOWI:
2069 case TargetOpcode::G_FLDEXP:
2070 case TargetOpcode::G_STRICT_FLDEXP:
2071 case TargetOpcode::G_FFREXP:
2072 case TargetOpcode::G_INTRINSIC_TRUNC:
2073 case TargetOpcode::G_INTRINSIC_ROUND:
2074 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2075 case TargetOpcode::G_FFLOOR:
2076 case TargetOpcode::G_FCEIL:
2077 case TargetOpcode::G_FRINT:
2078 case TargetOpcode::G_FNEARBYINT:
2079 case TargetOpcode::G_FPEXT:
2080 case TargetOpcode::G_FPTRUNC:
2081 case TargetOpcode::G_FCANONICALIZE:
2082 case TargetOpcode::G_FMINNUM:
2083 case TargetOpcode::G_FMAXNUM:
2084 case TargetOpcode::G_FMINNUM_IEEE:
2085 case TargetOpcode::G_FMAXNUM_IEEE:
2086 case TargetOpcode::G_FMINIMUM:
2087 case TargetOpcode::G_FMAXIMUM:
2088 case TargetOpcode::G_FMINIMUMNUM:
2089 case TargetOpcode::G_FMAXIMUMNUM:
2103unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2104 const APInt &DemandedElts,
2108 if (Src1SignBits == 1)
2125 case TargetOpcode::G_SEXTLOAD:
2128 case TargetOpcode::G_ZEXTLOAD:
2141 const APInt &DemandedElts,
2144 unsigned Opcode =
MI.getOpcode();
2146 if (Opcode == TargetOpcode::G_CONSTANT)
2147 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2155 LLT DstTy = MRI.getType(R);
2165 unsigned FirstAnswer = 1;
2167 case TargetOpcode::COPY: {
2169 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2170 MRI.getType(Src.getReg()).isValid()) {
2177 case TargetOpcode::G_SEXT: {
2179 LLT SrcTy = MRI.getType(Src);
2183 case TargetOpcode::G_ASSERT_SEXT:
2184 case TargetOpcode::G_SEXT_INREG: {
2187 unsigned SrcBits =
MI.getOperand(2).getImm();
2188 unsigned InRegBits = TyBits - SrcBits + 1;
2192 case TargetOpcode::G_LOAD: {
2199 case TargetOpcode::G_SEXTLOAD: {
2214 case TargetOpcode::G_ZEXTLOAD: {
2229 case TargetOpcode::G_AND:
2230 case TargetOpcode::G_OR:
2231 case TargetOpcode::G_XOR: {
2233 unsigned Src1NumSignBits =
2235 if (Src1NumSignBits != 1) {
2237 unsigned Src2NumSignBits =
2239 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2243 case TargetOpcode::G_ASHR: {
2248 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2251 case TargetOpcode::G_SHL: {
2254 if (std::optional<ConstantRange> ShAmtRange =
2256 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2257 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2267 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2268 ExtOpc == TargetOpcode::G_ANYEXT) {
2269 LLT ExtTy = MRI.getType(Src1);
2271 LLT ExtendeeTy = MRI.getType(Extendee);
2275 if (SizeDiff <= MinShAmt) {
2279 return Tmp - MaxShAmt;
2285 return Tmp - MaxShAmt;
2289 case TargetOpcode::G_SREM: {
2297 case TargetOpcode::G_TRUNC: {
2299 LLT SrcTy = MRI.getType(Src);
2303 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2305 if (NumSrcSignBits > (NumSrcBits - DstTyBits))
2306 return NumSrcSignBits - (NumSrcBits - DstTyBits);
2309 case TargetOpcode::G_SELECT: {
2310 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2311 MI.getOperand(3).getReg(), DemandedElts,
2314 case TargetOpcode::G_SMIN:
2315 case TargetOpcode::G_SMAX:
2316 case TargetOpcode::G_UMIN:
2317 case TargetOpcode::G_UMAX:
2319 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2320 MI.getOperand(2).getReg(), DemandedElts,
2322 case TargetOpcode::G_SADDO:
2323 case TargetOpcode::G_SADDE:
2324 case TargetOpcode::G_UADDO:
2325 case TargetOpcode::G_UADDE:
2326 case TargetOpcode::G_SSUBO:
2327 case TargetOpcode::G_SSUBE:
2328 case TargetOpcode::G_USUBO:
2329 case TargetOpcode::G_USUBE:
2330 case TargetOpcode::G_SMULO:
2331 case TargetOpcode::G_UMULO: {
2335 if (
MI.getOperand(1).getReg() == R) {
2336 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2343 case TargetOpcode::G_SUB: {
2345 unsigned Src2NumSignBits =
2347 if (Src2NumSignBits == 1)
2357 if ((Known2.
Zero | 1).isAllOnes())
2364 FirstAnswer = Src2NumSignBits;
2371 unsigned Src1NumSignBits =
2373 if (Src1NumSignBits == 1)
2378 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2381 case TargetOpcode::G_ADD: {
2383 unsigned Src2NumSignBits =
2385 if (Src2NumSignBits <= 2)
2389 unsigned Src1NumSignBits =
2391 if (Src1NumSignBits == 1)
2400 if ((Known1.
Zero | 1).isAllOnes())
2406 FirstAnswer = Src1NumSignBits;
2415 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2418 case TargetOpcode::G_FCMP:
2419 case TargetOpcode::G_ICMP: {
2420 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2423 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2430 case TargetOpcode::G_BUILD_VECTOR: {
2432 FirstAnswer = TyBits;
2433 APInt SingleDemandedElt(1, 1);
2435 if (!DemandedElts[
I])
2440 FirstAnswer = std::min(FirstAnswer, Tmp2);
2443 if (FirstAnswer == 1)
2448 case TargetOpcode::G_CONCAT_VECTORS: {
2449 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2451 FirstAnswer = TyBits;
2454 unsigned NumSubVectorElts =
2455 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2458 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2463 FirstAnswer = std::min(FirstAnswer, Tmp2);
2466 if (FirstAnswer == 1)
2471 case TargetOpcode::G_SHUFFLE_VECTOR: {
2474 APInt DemandedLHS, DemandedRHS;
2476 unsigned NumElts = MRI.getType(Src1).getNumElements();
2478 DemandedElts, DemandedLHS, DemandedRHS))
2484 if (FirstAnswer == 1)
2486 if (!!DemandedRHS) {
2489 FirstAnswer = std::min(FirstAnswer, Tmp2);
2493 case TargetOpcode::G_SPLAT_VECTOR: {
2497 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2498 if (NumSrcSignBits > (NumSrcBits - TyBits))
2499 return NumSrcSignBits - (NumSrcBits - TyBits);
2502 case TargetOpcode::G_INTRINSIC:
2503 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2504 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2505 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2508 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2510 FirstAnswer = std::max(FirstAnswer, NumBits);
2518 return std::max(FirstAnswer,
Known.countMinSignBits());
2522 LLT Ty = MRI.getType(R);
2523 APInt DemandedElts =
2532 unsigned Opcode =
MI.getOpcode();
2534 LLT Ty = MRI.getType(R);
2535 unsigned BitWidth = Ty.getScalarSizeInBits();
2537 if (Opcode == TargetOpcode::G_CONSTANT) {
2538 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2540 return std::nullopt;
2544 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2545 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2546 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2547 if (!DemandedElts[
I])
2550 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2551 MinAmt = MaxAmt =
nullptr;
2555 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2557 return std::nullopt;
2558 if (!MinAmt || MinAmt->
ugt(ShAmt))
2560 if (!MaxAmt || MaxAmt->ult(ShAmt))
2563 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2564 "Failed to find matching min/max shift amounts");
2565 if (MinAmt && MaxAmt)
2575 return std::nullopt;
2580 if (std::optional<ConstantRange> AmtRange =
2582 return AmtRange->getUnsignedMin().getZExtValue();
2583 return std::nullopt;
2601 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2626 if (!MO.isReg() || MO.getReg().isPhysical())
2629 if (!MRI.getType(Reg).isValid())
2632 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2633 OS <<
" " << MO <<
" KnownBits:" <<
Known <<
" SignBits:" << SignedBits
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< 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 make_scope_exit function, which executes user-defined cleanup logic at scope ex...
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)
Represents an insert vector element.
Register getCondReg() const
Register getFalseReg() const
Register getTrueReg() const
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.
@ C
The default llvm calling convention, compatible with C.
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 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.
LLVM_ABI std::optional< APInt > isConstantOrConstantSplatVector(MachineInstr &MI, const MachineRegisterInfo &MRI)
Determines if MI defines a constant integer or a splat vector of constant integers.
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).
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).
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 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.
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.