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,
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: {
215 if (!DemandedElts[
I])
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));
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.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
321 case TargetOpcode::G_SUB: {
330 case TargetOpcode::G_XOR: {
339 case TargetOpcode::G_PTR_ADD: {
343 LLT Ty = MRI.getType(
MI.getOperand(1).getReg());
344 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
348 case TargetOpcode::G_ADD: {
356 case TargetOpcode::G_AND: {
366 case TargetOpcode::G_OR: {
376 case TargetOpcode::G_MUL: {
384 case TargetOpcode::G_UMULH: {
392 case TargetOpcode::G_SMULH: {
400 case TargetOpcode::G_ABDU: {
408 case TargetOpcode::G_ABDS: {
417 if (SignBits1 == 1) {
426 case TargetOpcode::G_UDIV: {
435 case TargetOpcode::G_SDIV: {
444 case TargetOpcode::G_SELECT: {
445 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
446 Known, DemandedElts,
Depth + 1);
449 case TargetOpcode::G_SMIN: {
459 case TargetOpcode::G_SMAX: {
469 case TargetOpcode::G_UMIN: {
478 case TargetOpcode::G_UMAX: {
487 case TargetOpcode::G_FCMP:
488 case TargetOpcode::G_ICMP: {
491 if (TL.getBooleanContents(DstTy.
isVector(),
492 Opcode == TargetOpcode::G_FCMP) ==
498 case TargetOpcode::G_SEXT: {
506 case TargetOpcode::G_ASSERT_SEXT:
507 case TargetOpcode::G_SEXT_INREG: {
510 Known = Known.
sextInReg(
MI.getOperand(2).getImm());
513 case TargetOpcode::G_ANYEXT: {
519 case TargetOpcode::G_LOAD: {
527 case TargetOpcode::G_SEXTLOAD:
528 case TargetOpcode::G_ZEXTLOAD: {
535 Known = Opcode == TargetOpcode::G_SEXTLOAD
540 case TargetOpcode::G_ASHR: {
549 case TargetOpcode::G_LSHR: {
558 case TargetOpcode::G_SHL: {
567 case TargetOpcode::G_ROTL:
568 case TargetOpcode::G_ROTR: {
569 MachineInstr *AmtOpMI = MRI.getVRegDef(
MI.getOperand(2).getReg());
577 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
580 if (Opcode == TargetOpcode::G_ROTL)
587 case TargetOpcode::G_INTTOPTR:
588 case TargetOpcode::G_PTRTOINT:
593 case TargetOpcode::G_ZEXT:
594 case TargetOpcode::G_TRUNC: {
600 case TargetOpcode::G_ASSERT_ZEXT: {
604 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
605 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
607 Known.
Zero |= (~InMask);
608 Known.
One &= (~Known.Zero);
611 case TargetOpcode::G_ASSERT_ALIGN: {
612 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
621 case TargetOpcode::G_MERGE_VALUES: {
622 unsigned NumOps =
MI.getNumOperands();
623 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
625 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
628 DemandedElts,
Depth + 1);
633 case TargetOpcode::G_UNMERGE_VALUES: {
634 unsigned NumOps =
MI.getNumOperands();
636 LLT SrcTy = MRI.getType(SrcReg);
638 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
643 for (; DstIdx !=
NumOps - 1 &&
MI.getOperand(DstIdx).
getReg() != R;
647 APInt SubDemandedElts = DemandedElts;
648 if (SrcTy.isVector()) {
651 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
657 if (SrcTy.isVector())
658 Known = std::move(SrcOpKnown);
663 case TargetOpcode::G_BSWAP: {
669 case TargetOpcode::G_BITREVERSE: {
675 case TargetOpcode::G_CTPOP: {
687 case TargetOpcode::G_UBFX: {
688 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
698 case TargetOpcode::G_SBFX: {
699 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
716 case TargetOpcode::G_UADDO:
717 case TargetOpcode::G_UADDE:
718 case TargetOpcode::G_SADDO:
719 case TargetOpcode::G_SADDE: {
720 if (
MI.getOperand(1).getReg() == R) {
723 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
730 assert(
MI.getOperand(0).getReg() == R &&
731 "We only compute knownbits for the sum here.");
734 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
738 Carry = Carry.
trunc(1);
750 case TargetOpcode::G_USUBO:
751 case TargetOpcode::G_USUBE:
752 case TargetOpcode::G_SSUBO:
753 case TargetOpcode::G_SSUBE:
754 case TargetOpcode::G_UMULO:
755 case TargetOpcode::G_SMULO: {
756 if (
MI.getOperand(1).getReg() == R) {
759 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
766 case TargetOpcode::G_CTTZ:
767 case TargetOpcode::G_CTTZ_ZERO_UNDEF: {
777 case TargetOpcode::G_CTLZ:
778 case TargetOpcode::G_CTLZ_ZERO_UNDEF: {
788 case TargetOpcode::G_CTLS: {
792 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
797 Known =
Range.toKnownBits();
800 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
807 LLT VecVT = MRI.getType(InVec);
825 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
832 case TargetOpcode::G_SHUFFLE_VECTOR: {
833 APInt DemandedLHS, DemandedRHS;
836 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
838 DemandedElts, DemandedLHS, DemandedRHS))
859 case TargetOpcode::G_CONCAT_VECTORS: {
860 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
865 unsigned NumSubVectorElts =
866 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
870 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
882 case TargetOpcode::G_ABS: {
913void GISelValueTracking::computeKnownFPClassForFPTrunc(
921 KnownFPClass KnownSrc;
922 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
927void GISelValueTracking::computeKnownFPClass(
Register R,
928 const APInt &DemandedElts,
932 assert(Known.
isUnknown() &&
"should not be called with known information");
942 MachineInstr &
MI = *MRI.getVRegDef(R);
943 unsigned Opcode =
MI.getOpcode();
944 LLT DstTy = MRI.getType(R);
952 switch (Cst->getKind()) {
954 auto APF = Cst->getScalarValue();
956 Known.
SignBit = APF.isNegative();
961 bool SignBitAllZero =
true;
962 bool SignBitAllOne =
true;
964 for (
auto C : *Cst) {
967 SignBitAllZero =
false;
969 SignBitAllOne =
false;
972 if (SignBitAllOne != SignBitAllZero)
988 KnownNotFromFlags |=
fcNan;
990 KnownNotFromFlags |=
fcInf;
994 InterestedClasses &= ~KnownNotFromFlags;
997 [=, &Known] { Known.
knownNot(KnownNotFromFlags); });
1003 const MachineFunction *MF =
MI.getMF();
1007 TL.computeKnownFPClassForTargetInstr(*
this, R, Known, DemandedElts, MRI,
1010 case TargetOpcode::G_FNEG: {
1012 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
Depth + 1);
1016 case TargetOpcode::G_SELECT: {
1039 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1040 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1046 MaskIfTrue = TestedMask;
1047 MaskIfFalse = ~TestedMask;
1050 if (TestedValue ==
LHS) {
1052 FilterLHS = MaskIfTrue;
1053 }
else if (TestedValue ==
RHS) {
1055 FilterRHS = MaskIfFalse;
1058 KnownFPClass Known2;
1059 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS, Known,
1063 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1070 case TargetOpcode::G_FCOPYSIGN: {
1071 Register Magnitude =
MI.getOperand(1).getReg();
1074 KnownFPClass KnownSign;
1076 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses, Known,
1078 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1083 case TargetOpcode::G_FMA:
1084 case TargetOpcode::G_STRICT_FMA:
1085 case TargetOpcode::G_FMAD: {
1098 KnownFPClass KnownSrc, KnownAddend;
1099 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1101 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1103 if (KnownNotFromFlags) {
1104 KnownSrc.
knownNot(KnownNotFromFlags);
1105 KnownAddend.
knownNot(KnownNotFromFlags);
1109 KnownFPClass KnownSrc[3];
1110 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1112 if (KnownSrc[0].isUnknown())
1114 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1116 if (KnownSrc[1].isUnknown())
1118 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1120 if (KnownSrc[2].isUnknown())
1122 if (KnownNotFromFlags) {
1123 KnownSrc[0].
knownNot(KnownNotFromFlags);
1124 KnownSrc[1].
knownNot(KnownNotFromFlags);
1125 KnownSrc[2].
knownNot(KnownNotFromFlags);
1131 case TargetOpcode::G_FSQRT:
1132 case TargetOpcode::G_STRICT_FSQRT: {
1133 KnownFPClass KnownSrc;
1135 if (InterestedClasses &
fcNan)
1139 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1148 case TargetOpcode::G_FABS: {
1153 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
1159 case TargetOpcode::G_FATAN2: {
1162 KnownFPClass KnownY, KnownX;
1163 computeKnownFPClass(
Y, DemandedElts, InterestedClasses, KnownY,
Depth + 1);
1164 computeKnownFPClass(
X, DemandedElts, InterestedClasses, KnownX,
Depth + 1);
1168 case TargetOpcode::G_FSINH: {
1170 KnownFPClass KnownSrc;
1171 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1176 case TargetOpcode::G_FCOSH: {
1178 KnownFPClass KnownSrc;
1179 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1184 case TargetOpcode::G_FTANH: {
1186 KnownFPClass KnownSrc;
1187 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1192 case TargetOpcode::G_FASIN: {
1194 KnownFPClass KnownSrc;
1195 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1200 case TargetOpcode::G_FACOS: {
1202 KnownFPClass KnownSrc;
1203 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1208 case TargetOpcode::G_FATAN: {
1210 KnownFPClass KnownSrc;
1211 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1216 case TargetOpcode::G_FTAN: {
1218 KnownFPClass KnownSrc;
1219 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1224 case TargetOpcode::G_FSIN:
1225 case TargetOpcode::G_FCOS: {
1228 KnownFPClass KnownSrc;
1229 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1232 : KnownFPClass::sin(KnownSrc);
1235 case TargetOpcode::G_FSINCOS: {
1238 KnownFPClass KnownSrc;
1239 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1241 if (R ==
MI.getOperand(0).getReg())
1247 case TargetOpcode::G_FMAXNUM:
1248 case TargetOpcode::G_FMINNUM:
1249 case TargetOpcode::G_FMINNUM_IEEE:
1250 case TargetOpcode::G_FMAXIMUM:
1251 case TargetOpcode::G_FMINIMUM:
1252 case TargetOpcode::G_FMAXNUM_IEEE:
1253 case TargetOpcode::G_FMAXIMUMNUM:
1254 case TargetOpcode::G_FMINIMUMNUM: {
1257 KnownFPClass KnownLHS, KnownRHS;
1259 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1261 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1266 case TargetOpcode::G_FMINIMUM:
1269 case TargetOpcode::G_FMAXIMUM:
1272 case TargetOpcode::G_FMINIMUMNUM:
1275 case TargetOpcode::G_FMAXIMUMNUM:
1278 case TargetOpcode::G_FMINNUM:
1279 case TargetOpcode::G_FMINNUM_IEEE:
1282 case TargetOpcode::G_FMAXNUM:
1283 case TargetOpcode::G_FMAXNUM_IEEE:
1295 case TargetOpcode::G_FCANONICALIZE: {
1297 KnownFPClass KnownSrc;
1298 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1303 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1307 case TargetOpcode::G_VECREDUCE_FMAX:
1308 case TargetOpcode::G_VECREDUCE_FMIN:
1309 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1310 case TargetOpcode::G_VECREDUCE_FMINIMUM: {
1316 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1322 case TargetOpcode::G_FFLOOR:
1323 case TargetOpcode::G_FCEIL:
1324 case TargetOpcode::G_FRINT:
1325 case TargetOpcode::G_FNEARBYINT:
1326 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1327 case TargetOpcode::G_INTRINSIC_ROUND:
1328 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1329 case TargetOpcode::G_INTRINSIC_TRUNC: {
1331 KnownFPClass KnownSrc;
1337 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1340 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1345 case TargetOpcode::G_FEXP:
1346 case TargetOpcode::G_FEXP2:
1347 case TargetOpcode::G_FEXP10: {
1349 KnownFPClass KnownSrc;
1350 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1355 case TargetOpcode::G_FLOG:
1356 case TargetOpcode::G_FLOG2:
1357 case TargetOpcode::G_FLOG10: {
1372 KnownFPClass KnownSrc;
1373 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1377 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1381 case TargetOpcode::G_FPOWI: {
1386 LLT ExpTy = MRI.getType(Exp);
1388 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1391 if (InterestedClasses &
fcNan)
1392 InterestedSrcs |=
fcNan;
1393 if (!ExponentKnownBits.
isZero()) {
1394 if (InterestedClasses &
fcInf)
1400 KnownFPClass KnownSrc;
1401 if (InterestedSrcs !=
fcNone) {
1403 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1410 case TargetOpcode::G_FLDEXP:
1411 case TargetOpcode::G_STRICT_FLDEXP: {
1413 KnownFPClass KnownSrc;
1414 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1422 LLT ExpTy = MRI.getType(ExpReg);
1424 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1429 DenormalMode
Mode = MF->getDenormalMode(Flt);
1433 case TargetOpcode::G_FADD:
1434 case TargetOpcode::G_STRICT_FADD:
1435 case TargetOpcode::G_FSUB:
1436 case TargetOpcode::G_STRICT_FSUB: {
1439 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1440 Opcode == TargetOpcode::G_STRICT_FADD);
1444 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1447 if (!WantNaN && !WantNegative && !WantNegZero) {
1457 if (InterestedClasses &
fcNan)
1458 InterestedSrcs |=
fcInf;
1462 KnownFPClass KnownSelf;
1463 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1469 KnownFPClass KnownLHS, KnownRHS;
1470 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1474 WantNegZero || !IsAdd) {
1477 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1487 case TargetOpcode::G_FMUL:
1488 case TargetOpcode::G_STRICT_FMUL: {
1496 KnownFPClass KnownSrc;
1503 KnownFPClass KnownLHS;
1507 KnownFPClass KnownLHS, KnownRHS;
1523 case TargetOpcode::G_FDIV:
1524 case TargetOpcode::G_FREM: {
1528 if (Opcode == TargetOpcode::G_FREM)
1535 if (Opcode == TargetOpcode::G_FDIV) {
1536 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1542 KnownFPClass KnownSrc;
1543 computeKnownFPClass(
LHS, DemandedElts,
1548 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1554 KnownFPClass KnownSrc;
1555 computeKnownFPClass(
LHS, DemandedElts,
1563 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1565 const bool WantPositive = Opcode == TargetOpcode::G_FREM &&
1567 if (!WantNan && !WantNegative && !WantPositive) {
1571 KnownFPClass KnownLHS, KnownRHS;
1574 KnownRHS,
Depth + 1);
1580 if (KnowSomethingUseful || WantPositive) {
1584 if (Opcode == TargetOpcode::G_FDIV) {
1608 case TargetOpcode::G_FFREXP: {
1610 if (R !=
MI.getOperand(0).getReg())
1613 KnownFPClass KnownSrc;
1614 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1621 case TargetOpcode::G_FPEXT: {
1623 KnownFPClass KnownSrc;
1624 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1629 LLT SrcTy = MRI.getType(Src).getScalarType();
1635 case TargetOpcode::G_FPTRUNC: {
1636 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses, Known,
1640 case TargetOpcode::G_SITOFP:
1641 case TargetOpcode::G_UITOFP: {
1652 if (Opcode == TargetOpcode::G_UITOFP)
1660 LLT Ty = MRI.getType(Val);
1662 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1668 if (Opcode == TargetOpcode::G_SITOFP) {
1678 if (InterestedClasses &
fcInf) {
1685 if (Opcode == TargetOpcode::G_UITOFP)
1699 case TargetOpcode::G_BUILD_VECTOR:
1700 case TargetOpcode::G_CONCAT_VECTORS: {
1707 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
1709 bool NeedsElt = DemandedElts[Idx];
1715 computeKnownFPClass(Src, Known, InterestedClasses,
Depth + 1);
1718 KnownFPClass Known2;
1719 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
1731 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1741 LLT VecTy = MRI.getType(Vec);
1746 if (CIdx && CIdx->ult(NumElts))
1748 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
1754 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1760 LLT VecTy = MRI.getType(Vec);
1768 APInt DemandedVecElts = DemandedElts;
1769 bool NeedsElt =
true;
1771 if (CIdx && CIdx->ult(NumElts)) {
1772 DemandedVecElts.
clearBit(CIdx->getZExtValue());
1773 NeedsElt = DemandedElts[CIdx->getZExtValue()];
1778 computeKnownFPClass(Elt, Known, InterestedClasses,
Depth + 1);
1787 if (!DemandedVecElts.
isZero()) {
1788 KnownFPClass Known2;
1789 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
1796 case TargetOpcode::G_SHUFFLE_VECTOR: {
1800 APInt DemandedLHS, DemandedRHS;
1802 assert(DemandedElts == APInt(1, 1));
1803 DemandedLHS = DemandedRHS = DemandedElts;
1805 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
1807 DemandedLHS, DemandedRHS)) {
1813 if (!!DemandedLHS) {
1815 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses, Known,
1825 if (!!DemandedRHS) {
1826 KnownFPClass Known2;
1828 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
1834 case TargetOpcode::G_PHI: {
1843 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
1844 const MachineOperand &Src =
MI.getOperand(Idx);
1847 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known,
1851 KnownFPClass Known2;
1852 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
1861 case TargetOpcode::COPY: {
1864 if (!Src.isVirtual())
1867 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known,
Depth + 1);
1878 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
1879 return KnownClasses;
1885 computeKnownFPClass(R, Known, InterestedClasses,
Depth);
1893 InterestedClasses &=
~fcNan;
1895 InterestedClasses &=
~fcInf;
1898 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
1901 Result.KnownFPClasses &=
~fcNan;
1903 Result.KnownFPClasses &=
~fcInf;
1909 LLT Ty = MRI.getType(R);
1910 APInt DemandedElts =
1912 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
1927 switch (
DefMI->getOpcode()) {
1930 case TargetOpcode::G_FADD:
1931 case TargetOpcode::G_STRICT_FADD:
1932 case TargetOpcode::G_FSUB:
1933 case TargetOpcode::G_STRICT_FSUB:
1934 case TargetOpcode::G_FMUL:
1935 case TargetOpcode::G_STRICT_FMUL:
1936 case TargetOpcode::G_FDIV:
1937 case TargetOpcode::G_FREM:
1938 case TargetOpcode::G_FMA:
1939 case TargetOpcode::G_STRICT_FMA:
1940 case TargetOpcode::G_FMAD:
1941 case TargetOpcode::G_FSQRT:
1942 case TargetOpcode::G_STRICT_FSQRT:
1946 case TargetOpcode::G_FSIN:
1947 case TargetOpcode::G_FCOS:
1948 case TargetOpcode::G_FSINCOS:
1949 case TargetOpcode::G_FTAN:
1950 case TargetOpcode::G_FASIN:
1951 case TargetOpcode::G_FACOS:
1952 case TargetOpcode::G_FATAN:
1953 case TargetOpcode::G_FATAN2:
1954 case TargetOpcode::G_FSINH:
1955 case TargetOpcode::G_FCOSH:
1956 case TargetOpcode::G_FTANH:
1957 case TargetOpcode::G_FEXP:
1958 case TargetOpcode::G_FEXP2:
1959 case TargetOpcode::G_FEXP10:
1960 case TargetOpcode::G_FLOG:
1961 case TargetOpcode::G_FLOG2:
1962 case TargetOpcode::G_FLOG10:
1963 case TargetOpcode::G_FPOWI:
1964 case TargetOpcode::G_FLDEXP:
1965 case TargetOpcode::G_STRICT_FLDEXP:
1966 case TargetOpcode::G_FFREXP:
1967 case TargetOpcode::G_INTRINSIC_TRUNC:
1968 case TargetOpcode::G_INTRINSIC_ROUND:
1969 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1970 case TargetOpcode::G_FFLOOR:
1971 case TargetOpcode::G_FCEIL:
1972 case TargetOpcode::G_FRINT:
1973 case TargetOpcode::G_FNEARBYINT:
1974 case TargetOpcode::G_FPEXT:
1975 case TargetOpcode::G_FPTRUNC:
1976 case TargetOpcode::G_FCANONICALIZE:
1977 case TargetOpcode::G_FMINNUM:
1978 case TargetOpcode::G_FMAXNUM:
1979 case TargetOpcode::G_FMINNUM_IEEE:
1980 case TargetOpcode::G_FMAXNUM_IEEE:
1981 case TargetOpcode::G_FMINIMUM:
1982 case TargetOpcode::G_FMAXIMUM:
1983 case TargetOpcode::G_FMINIMUMNUM:
1984 case TargetOpcode::G_FMAXIMUMNUM:
1998unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
1999 const APInt &DemandedElts,
2003 if (Src1SignBits == 1)
2020 case TargetOpcode::G_SEXTLOAD:
2023 case TargetOpcode::G_ZEXTLOAD:
2036 const APInt &DemandedElts,
2039 unsigned Opcode =
MI.getOpcode();
2041 if (Opcode == TargetOpcode::G_CONSTANT)
2042 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2050 LLT DstTy = MRI.getType(R);
2060 unsigned FirstAnswer = 1;
2062 case TargetOpcode::COPY: {
2064 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2065 MRI.getType(Src.getReg()).isValid()) {
2072 case TargetOpcode::G_SEXT: {
2074 LLT SrcTy = MRI.getType(Src);
2078 case TargetOpcode::G_ASSERT_SEXT:
2079 case TargetOpcode::G_SEXT_INREG: {
2082 unsigned SrcBits =
MI.getOperand(2).getImm();
2083 unsigned InRegBits = TyBits - SrcBits + 1;
2087 case TargetOpcode::G_LOAD: {
2094 case TargetOpcode::G_SEXTLOAD: {
2109 case TargetOpcode::G_ZEXTLOAD: {
2124 case TargetOpcode::G_AND:
2125 case TargetOpcode::G_OR:
2126 case TargetOpcode::G_XOR: {
2128 unsigned Src1NumSignBits =
2130 if (Src1NumSignBits != 1) {
2132 unsigned Src2NumSignBits =
2134 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2138 case TargetOpcode::G_ASHR: {
2143 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2146 case TargetOpcode::G_SHL: {
2149 if (std::optional<ConstantRange> ShAmtRange =
2151 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2152 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2162 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2163 ExtOpc == TargetOpcode::G_ANYEXT) {
2164 LLT ExtTy = MRI.getType(Src1);
2166 LLT ExtendeeTy = MRI.getType(Extendee);
2170 if (SizeDiff <= MinShAmt) {
2174 return Tmp - MaxShAmt;
2180 return Tmp - MaxShAmt;
2184 case TargetOpcode::G_TRUNC: {
2186 LLT SrcTy = MRI.getType(Src);
2190 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2192 if (NumSrcSignBits > (NumSrcBits - DstTyBits))
2193 return NumSrcSignBits - (NumSrcBits - DstTyBits);
2196 case TargetOpcode::G_SELECT: {
2197 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2198 MI.getOperand(3).getReg(), DemandedElts,
2201 case TargetOpcode::G_SMIN:
2202 case TargetOpcode::G_SMAX:
2203 case TargetOpcode::G_UMIN:
2204 case TargetOpcode::G_UMAX:
2206 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2207 MI.getOperand(2).getReg(), DemandedElts,
2209 case TargetOpcode::G_SADDO:
2210 case TargetOpcode::G_SADDE:
2211 case TargetOpcode::G_UADDO:
2212 case TargetOpcode::G_UADDE:
2213 case TargetOpcode::G_SSUBO:
2214 case TargetOpcode::G_SSUBE:
2215 case TargetOpcode::G_USUBO:
2216 case TargetOpcode::G_USUBE:
2217 case TargetOpcode::G_SMULO:
2218 case TargetOpcode::G_UMULO: {
2222 if (
MI.getOperand(1).getReg() == R) {
2223 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2230 case TargetOpcode::G_SUB: {
2232 unsigned Src2NumSignBits =
2234 if (Src2NumSignBits == 1)
2244 if ((Known2.
Zero | 1).isAllOnes())
2251 FirstAnswer = Src2NumSignBits;
2258 unsigned Src1NumSignBits =
2260 if (Src1NumSignBits == 1)
2265 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2268 case TargetOpcode::G_ADD: {
2270 unsigned Src2NumSignBits =
2272 if (Src2NumSignBits <= 2)
2276 unsigned Src1NumSignBits =
2278 if (Src1NumSignBits == 1)
2287 if ((Known1.
Zero | 1).isAllOnes())
2293 FirstAnswer = Src1NumSignBits;
2302 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2305 case TargetOpcode::G_FCMP:
2306 case TargetOpcode::G_ICMP: {
2307 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2310 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2317 case TargetOpcode::G_BUILD_VECTOR: {
2319 FirstAnswer = TyBits;
2320 APInt SingleDemandedElt(1, 1);
2322 if (!DemandedElts[
I])
2327 FirstAnswer = std::min(FirstAnswer, Tmp2);
2330 if (FirstAnswer == 1)
2335 case TargetOpcode::G_CONCAT_VECTORS: {
2336 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2338 FirstAnswer = TyBits;
2341 unsigned NumSubVectorElts =
2342 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2345 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2350 FirstAnswer = std::min(FirstAnswer, Tmp2);
2353 if (FirstAnswer == 1)
2358 case TargetOpcode::G_SHUFFLE_VECTOR: {
2361 APInt DemandedLHS, DemandedRHS;
2363 unsigned NumElts = MRI.getType(Src1).getNumElements();
2365 DemandedElts, DemandedLHS, DemandedRHS))
2371 if (FirstAnswer == 1)
2373 if (!!DemandedRHS) {
2376 FirstAnswer = std::min(FirstAnswer, Tmp2);
2380 case TargetOpcode::G_SPLAT_VECTOR: {
2384 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2385 if (NumSrcSignBits > (NumSrcBits - TyBits))
2386 return NumSrcSignBits - (NumSrcBits - TyBits);
2389 case TargetOpcode::G_INTRINSIC:
2390 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2391 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2392 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2395 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2397 FirstAnswer = std::max(FirstAnswer, NumBits);
2417 Mask <<= Mask.getBitWidth() - TyBits;
2418 return std::max(FirstAnswer, Mask.countl_one());
2422 LLT Ty = MRI.getType(R);
2423 APInt DemandedElts =
2432 unsigned Opcode =
MI.getOpcode();
2434 LLT Ty = MRI.getType(R);
2435 unsigned BitWidth = Ty.getScalarSizeInBits();
2437 if (Opcode == TargetOpcode::G_CONSTANT) {
2438 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2440 return std::nullopt;
2444 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2445 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2446 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2447 if (!DemandedElts[
I])
2450 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2451 MinAmt = MaxAmt =
nullptr;
2455 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2457 return std::nullopt;
2458 if (!MinAmt || MinAmt->
ugt(ShAmt))
2460 if (!MaxAmt || MaxAmt->ult(ShAmt))
2463 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2464 "Failed to find matching min/max shift amounts");
2465 if (MinAmt && MaxAmt)
2475 return std::nullopt;
2480 if (std::optional<ConstantRange> AmtRange =
2482 return AmtRange->getUnsignedMin().getZExtValue();
2483 return std::nullopt;
2501 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2526 if (!MO.isReg() || MO.getReg().isPhysical())
2529 if (!MRI.getType(Reg).isValid())
2531 KnownBits Known = VTA.getKnownBits(Reg);
2532 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2533 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.
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
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.
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
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.
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
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.
void setAllBits()
Set every bit to 1.
APInt shl(unsigned shiftAmt) const
Left-shift function.
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
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)
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.
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.
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension 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 ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
bool isUnknown() const
Returns true if we don't know any bits.
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.
KnownBits byteSwap() const
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.
KnownBits reverseBits() const
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 intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
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 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 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.
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
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...
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
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.
void copysign(const KnownFPClass &Sign)
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 ldexp(const KnownFPClass &Src, const KnownBits &N, const fltSemantics &Flt, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ldexp.
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())
KnownFPClass intersectWith(const KnownFPClass &RHS) const
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.
std::optional< bool > SignBit
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
static LLVM_ABI KnownFPClass 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 -...
void signBitMustBeOne()
Assume the sign bit is one.
void signBitMustBeZero()
Assume the sign bit is zero.
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 sinh(const KnownFPClass &Src)
Report known values for sinh.
static LLVM_ABI KnownFPClass tanh(const KnownFPClass &Src)
Report known values for tanh.