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_UREM: {
456 case TargetOpcode::G_SREM: {
468 case TargetOpcode::G_SELECT: {
469 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
470 Known, DemandedElts,
Depth + 1);
473 case TargetOpcode::G_SMIN: {
483 case TargetOpcode::G_SMAX: {
493 case TargetOpcode::G_UMIN: {
502 case TargetOpcode::G_UMAX: {
511 case TargetOpcode::G_FCMP:
512 case TargetOpcode::G_ICMP: {
515 if (TL.getBooleanContents(DstTy.
isVector(),
516 Opcode == TargetOpcode::G_FCMP) ==
522 case TargetOpcode::G_SEXT: {
530 case TargetOpcode::G_ASSERT_SEXT:
531 case TargetOpcode::G_SEXT_INREG: {
534 Known = Known.
sextInReg(
MI.getOperand(2).getImm());
537 case TargetOpcode::G_ANYEXT: {
543 case TargetOpcode::G_LOAD: {
551 case TargetOpcode::G_SEXTLOAD:
552 case TargetOpcode::G_ZEXTLOAD: {
559 Known = Opcode == TargetOpcode::G_SEXTLOAD
564 case TargetOpcode::G_ASHR: {
573 case TargetOpcode::G_LSHR: {
582 case TargetOpcode::G_SHL: {
591 case TargetOpcode::G_ROTL:
592 case TargetOpcode::G_ROTR: {
593 MachineInstr *AmtOpMI = MRI.getVRegDef(
MI.getOperand(2).getReg());
601 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
604 if (Opcode == TargetOpcode::G_ROTL)
611 case TargetOpcode::G_FSHL:
612 case TargetOpcode::G_FSHR: {
613 MachineInstr *AmtOpMI = MRI.getVRegDef(
MI.getOperand(3).getReg());
618 const APInt Amt = *MaybeAmtOp;
623 Known = Opcode == TargetOpcode::G_FSHL
628 case TargetOpcode::G_INTTOPTR:
629 case TargetOpcode::G_PTRTOINT:
634 case TargetOpcode::G_ZEXT:
635 case TargetOpcode::G_TRUNC: {
641 case TargetOpcode::G_ASSERT_ZEXT: {
645 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
646 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
648 Known.
Zero |= (~InMask);
649 Known.
One &= (~Known.Zero);
652 case TargetOpcode::G_ASSERT_ALIGN: {
653 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
662 case TargetOpcode::G_MERGE_VALUES: {
663 unsigned NumOps =
MI.getNumOperands();
664 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
666 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
669 DemandedElts,
Depth + 1);
674 case TargetOpcode::G_UNMERGE_VALUES: {
675 unsigned NumOps =
MI.getNumOperands();
677 LLT SrcTy = MRI.getType(SrcReg);
679 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
684 for (; DstIdx !=
NumOps - 1 &&
MI.getOperand(DstIdx).
getReg() != R;
688 APInt SubDemandedElts = DemandedElts;
689 if (SrcTy.isVector()) {
692 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
698 if (SrcTy.isVector())
699 Known = std::move(SrcOpKnown);
704 case TargetOpcode::G_BSWAP: {
710 case TargetOpcode::G_BITREVERSE: {
716 case TargetOpcode::G_CTPOP: {
728 case TargetOpcode::G_UBFX: {
729 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
739 case TargetOpcode::G_SBFX: {
740 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
757 case TargetOpcode::G_UADDO:
758 case TargetOpcode::G_UADDE:
759 case TargetOpcode::G_SADDO:
760 case TargetOpcode::G_SADDE: {
761 if (
MI.getOperand(1).getReg() == R) {
764 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
771 assert(
MI.getOperand(0).getReg() == R &&
772 "We only compute knownbits for the sum here.");
775 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
779 Carry = Carry.
trunc(1);
791 case TargetOpcode::G_USUBO:
792 case TargetOpcode::G_USUBE:
793 case TargetOpcode::G_SSUBO:
794 case TargetOpcode::G_SSUBE:
795 case TargetOpcode::G_UMULO:
796 case TargetOpcode::G_SMULO: {
797 if (
MI.getOperand(1).getReg() == R) {
800 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
807 case TargetOpcode::G_CTTZ:
808 case TargetOpcode::G_CTTZ_ZERO_POISON: {
818 case TargetOpcode::G_CTLZ:
819 case TargetOpcode::G_CTLZ_ZERO_POISON: {
829 case TargetOpcode::G_CTLS: {
833 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
838 Known =
Range.toKnownBits();
841 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
848 LLT VecVT = MRI.getType(InVec);
866 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
873 case TargetOpcode::G_INSERT_VECTOR_ELT: {
875 Register InVec = Insert.getVectorReg();
876 Register InVal = Insert.getElementReg();
877 Register EltNo = Insert.getIndexReg();
878 LLT VecVT = MRI.getType(InVec);
886 bool DemandedVal =
true;
887 APInt DemandedVecElts = DemandedElts;
888 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
889 unsigned EltIdx = ConstEltNo->getZExtValue();
890 DemandedVal = !!DemandedElts[EltIdx];
898 if (!!DemandedVecElts) {
904 case TargetOpcode::G_SHUFFLE_VECTOR: {
905 APInt DemandedLHS, DemandedRHS;
908 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
910 DemandedElts, DemandedLHS, DemandedRHS))
931 case TargetOpcode::G_CONCAT_VECTORS: {
932 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
937 unsigned NumSubVectorElts =
938 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
942 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
954 case TargetOpcode::G_ABS: {
985void GISelValueTracking::computeKnownFPClassForFPTrunc(
993 KnownFPClass KnownSrc;
994 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
999void GISelValueTracking::computeKnownFPClass(
Register R,
1000 const APInt &DemandedElts,
1004 assert(Known.
isUnknown() &&
"should not be called with known information");
1006 if (!DemandedElts) {
1014 MachineInstr &
MI = *MRI.getVRegDef(R);
1015 unsigned Opcode =
MI.getOpcode();
1016 LLT DstTy = MRI.getType(R);
1024 switch (Cst->getKind()) {
1026 auto APF = Cst->getScalarValue();
1028 Known.
SignBit = APF.isNegative();
1033 bool SignBitAllZero =
true;
1034 bool SignBitAllOne =
true;
1036 for (
auto C : *Cst) {
1039 SignBitAllZero =
false;
1041 SignBitAllOne =
false;
1044 if (SignBitAllOne != SignBitAllZero)
1045 Known.
SignBit = SignBitAllOne;
1060 KnownNotFromFlags |=
fcNan;
1062 KnownNotFromFlags |=
fcInf;
1066 InterestedClasses &= ~KnownNotFromFlags;
1069 [=, &Known] { Known.
knownNot(KnownNotFromFlags); });
1075 const MachineFunction *MF =
MI.getMF();
1079 TL.computeKnownFPClassForTargetInstr(*
this, R, Known, DemandedElts, MRI,
1082 case TargetOpcode::G_FNEG: {
1084 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
Depth + 1);
1088 case TargetOpcode::G_SELECT: {
1111 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1112 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1118 MaskIfTrue = TestedMask;
1119 MaskIfFalse = ~TestedMask;
1122 if (TestedValue ==
LHS) {
1124 FilterLHS = MaskIfTrue;
1125 }
else if (TestedValue ==
RHS) {
1127 FilterRHS = MaskIfFalse;
1130 KnownFPClass Known2;
1131 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS, Known,
1135 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1142 case TargetOpcode::G_FCOPYSIGN: {
1143 Register Magnitude =
MI.getOperand(1).getReg();
1146 KnownFPClass KnownSign;
1148 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses, Known,
1150 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1155 case TargetOpcode::G_FMA:
1156 case TargetOpcode::G_STRICT_FMA:
1157 case TargetOpcode::G_FMAD: {
1170 KnownFPClass KnownSrc, KnownAddend;
1171 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1173 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1175 if (KnownNotFromFlags) {
1176 KnownSrc.
knownNot(KnownNotFromFlags);
1177 KnownAddend.
knownNot(KnownNotFromFlags);
1181 KnownFPClass KnownSrc[3];
1182 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1184 if (KnownSrc[0].isUnknown())
1186 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1188 if (KnownSrc[1].isUnknown())
1190 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1192 if (KnownSrc[2].isUnknown())
1194 if (KnownNotFromFlags) {
1195 KnownSrc[0].
knownNot(KnownNotFromFlags);
1196 KnownSrc[1].
knownNot(KnownNotFromFlags);
1197 KnownSrc[2].
knownNot(KnownNotFromFlags);
1203 case TargetOpcode::G_FSQRT:
1204 case TargetOpcode::G_STRICT_FSQRT: {
1205 KnownFPClass KnownSrc;
1207 if (InterestedClasses &
fcNan)
1211 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1220 case TargetOpcode::G_FABS: {
1225 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
1231 case TargetOpcode::G_FATAN2: {
1234 KnownFPClass KnownY, KnownX;
1235 computeKnownFPClass(
Y, DemandedElts, InterestedClasses, KnownY,
Depth + 1);
1236 computeKnownFPClass(
X, DemandedElts, InterestedClasses, KnownX,
Depth + 1);
1240 case TargetOpcode::G_FSINH: {
1242 KnownFPClass KnownSrc;
1243 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1248 case TargetOpcode::G_FCOSH: {
1250 KnownFPClass KnownSrc;
1251 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1256 case TargetOpcode::G_FTANH: {
1258 KnownFPClass KnownSrc;
1259 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1264 case TargetOpcode::G_FASIN: {
1266 KnownFPClass KnownSrc;
1267 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1272 case TargetOpcode::G_FACOS: {
1274 KnownFPClass KnownSrc;
1275 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1280 case TargetOpcode::G_FATAN: {
1282 KnownFPClass KnownSrc;
1283 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1288 case TargetOpcode::G_FTAN: {
1290 KnownFPClass KnownSrc;
1291 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1296 case TargetOpcode::G_FSIN:
1297 case TargetOpcode::G_FCOS: {
1300 KnownFPClass KnownSrc;
1301 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1304 : KnownFPClass::sin(KnownSrc);
1307 case TargetOpcode::G_FSINCOS: {
1310 KnownFPClass KnownSrc;
1311 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1313 if (R ==
MI.getOperand(0).getReg())
1319 case TargetOpcode::G_FMAXNUM:
1320 case TargetOpcode::G_FMINNUM:
1321 case TargetOpcode::G_FMINNUM_IEEE:
1322 case TargetOpcode::G_FMAXIMUM:
1323 case TargetOpcode::G_FMINIMUM:
1324 case TargetOpcode::G_FMAXNUM_IEEE:
1325 case TargetOpcode::G_FMAXIMUMNUM:
1326 case TargetOpcode::G_FMINIMUMNUM: {
1329 KnownFPClass KnownLHS, KnownRHS;
1331 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1333 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1338 case TargetOpcode::G_FMINIMUM:
1341 case TargetOpcode::G_FMAXIMUM:
1344 case TargetOpcode::G_FMINIMUMNUM:
1347 case TargetOpcode::G_FMAXIMUMNUM:
1350 case TargetOpcode::G_FMINNUM:
1351 case TargetOpcode::G_FMINNUM_IEEE:
1354 case TargetOpcode::G_FMAXNUM:
1355 case TargetOpcode::G_FMAXNUM_IEEE:
1367 case TargetOpcode::G_FCANONICALIZE: {
1369 KnownFPClass KnownSrc;
1370 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1375 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1379 case TargetOpcode::G_VECREDUCE_FMAX:
1380 case TargetOpcode::G_VECREDUCE_FMIN:
1381 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1382 case TargetOpcode::G_VECREDUCE_FMINIMUM: {
1388 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1394 case TargetOpcode::G_FFLOOR:
1395 case TargetOpcode::G_FCEIL:
1396 case TargetOpcode::G_FRINT:
1397 case TargetOpcode::G_FNEARBYINT:
1398 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1399 case TargetOpcode::G_INTRINSIC_ROUND:
1400 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1401 case TargetOpcode::G_INTRINSIC_TRUNC: {
1403 KnownFPClass KnownSrc;
1409 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1412 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1417 case TargetOpcode::G_FEXP:
1418 case TargetOpcode::G_FEXP2:
1419 case TargetOpcode::G_FEXP10: {
1421 KnownFPClass KnownSrc;
1422 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1427 case TargetOpcode::G_FLOG:
1428 case TargetOpcode::G_FLOG2:
1429 case TargetOpcode::G_FLOG10: {
1444 KnownFPClass KnownSrc;
1445 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1449 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1453 case TargetOpcode::G_FPOWI: {
1458 LLT ExpTy = MRI.getType(Exp);
1460 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1463 if (InterestedClasses &
fcNan)
1464 InterestedSrcs |=
fcNan;
1465 if (!ExponentKnownBits.
isZero()) {
1466 if (InterestedClasses &
fcInf)
1472 KnownFPClass KnownSrc;
1473 if (InterestedSrcs !=
fcNone) {
1475 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1482 case TargetOpcode::G_FLDEXP:
1483 case TargetOpcode::G_STRICT_FLDEXP: {
1485 KnownFPClass KnownSrc;
1486 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1494 LLT ExpTy = MRI.getType(ExpReg);
1496 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1501 DenormalMode
Mode = MF->getDenormalMode(Flt);
1505 case TargetOpcode::G_FADD:
1506 case TargetOpcode::G_STRICT_FADD:
1507 case TargetOpcode::G_FSUB:
1508 case TargetOpcode::G_STRICT_FSUB: {
1511 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1512 Opcode == TargetOpcode::G_STRICT_FADD);
1516 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1519 if (!WantNaN && !WantNegative && !WantNegZero) {
1529 if (InterestedClasses &
fcNan)
1530 InterestedSrcs |=
fcInf;
1534 KnownFPClass KnownSelf;
1535 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1541 KnownFPClass KnownLHS, KnownRHS;
1542 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1546 WantNegZero || !IsAdd) {
1549 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1559 case TargetOpcode::G_FMUL:
1560 case TargetOpcode::G_STRICT_FMUL: {
1568 KnownFPClass KnownSrc;
1575 KnownFPClass KnownLHS;
1579 KnownFPClass KnownLHS, KnownRHS;
1595 case TargetOpcode::G_FDIV:
1596 case TargetOpcode::G_FREM: {
1600 if (Opcode == TargetOpcode::G_FREM)
1607 if (Opcode == TargetOpcode::G_FDIV) {
1608 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1614 KnownFPClass KnownSrc;
1615 computeKnownFPClass(
LHS, DemandedElts,
1620 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1626 KnownFPClass KnownSrc;
1627 computeKnownFPClass(
LHS, DemandedElts,
1635 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1637 const bool WantPositive = Opcode == TargetOpcode::G_FREM &&
1639 if (!WantNan && !WantNegative && !WantPositive) {
1643 KnownFPClass KnownLHS, KnownRHS;
1646 KnownRHS,
Depth + 1);
1652 if (KnowSomethingUseful || WantPositive) {
1656 if (Opcode == TargetOpcode::G_FDIV) {
1680 case TargetOpcode::G_FFREXP: {
1682 if (R !=
MI.getOperand(0).getReg())
1685 KnownFPClass KnownSrc;
1686 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1693 case TargetOpcode::G_FPEXT: {
1695 KnownFPClass KnownSrc;
1696 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1701 LLT SrcTy = MRI.getType(Src).getScalarType();
1707 case TargetOpcode::G_FPTRUNC: {
1708 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses, Known,
1712 case TargetOpcode::G_SITOFP:
1713 case TargetOpcode::G_UITOFP: {
1724 if (Opcode == TargetOpcode::G_UITOFP)
1732 LLT Ty = MRI.getType(Val);
1734 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1740 if (Opcode == TargetOpcode::G_SITOFP) {
1750 if (InterestedClasses &
fcInf) {
1757 if (Opcode == TargetOpcode::G_UITOFP)
1771 case TargetOpcode::G_BUILD_VECTOR:
1772 case TargetOpcode::G_CONCAT_VECTORS: {
1779 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
1781 bool NeedsElt = DemandedElts[Idx];
1787 computeKnownFPClass(Src, Known, InterestedClasses,
Depth + 1);
1790 KnownFPClass Known2;
1791 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
1803 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1813 LLT VecTy = MRI.getType(Vec);
1818 if (CIdx && CIdx->ult(NumElts))
1820 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
1826 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1832 LLT VecTy = MRI.getType(Vec);
1840 APInt DemandedVecElts = DemandedElts;
1841 bool NeedsElt =
true;
1843 if (CIdx && CIdx->ult(NumElts)) {
1844 DemandedVecElts.
clearBit(CIdx->getZExtValue());
1845 NeedsElt = DemandedElts[CIdx->getZExtValue()];
1850 computeKnownFPClass(Elt, Known, InterestedClasses,
Depth + 1);
1859 if (!DemandedVecElts.
isZero()) {
1860 KnownFPClass Known2;
1861 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
1868 case TargetOpcode::G_SHUFFLE_VECTOR: {
1872 APInt DemandedLHS, DemandedRHS;
1874 assert(DemandedElts == APInt(1, 1));
1875 DemandedLHS = DemandedRHS = DemandedElts;
1877 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
1879 DemandedLHS, DemandedRHS)) {
1885 if (!!DemandedLHS) {
1887 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses, Known,
1897 if (!!DemandedRHS) {
1898 KnownFPClass Known2;
1900 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
1906 case TargetOpcode::G_PHI: {
1915 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
1916 const MachineOperand &Src =
MI.getOperand(Idx);
1919 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known,
1923 KnownFPClass Known2;
1924 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
1933 case TargetOpcode::COPY: {
1936 if (!Src.isVirtual())
1939 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known,
Depth + 1);
1950 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
1951 return KnownClasses;
1957 computeKnownFPClass(R, Known, InterestedClasses,
Depth);
1965 InterestedClasses &=
~fcNan;
1967 InterestedClasses &=
~fcInf;
1970 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
1973 Result.KnownFPClasses &=
~fcNan;
1975 Result.KnownFPClasses &=
~fcInf;
1981 LLT Ty = MRI.getType(R);
1982 APInt DemandedElts =
1984 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
1999 switch (
DefMI->getOpcode()) {
2002 case TargetOpcode::G_FADD:
2003 case TargetOpcode::G_STRICT_FADD:
2004 case TargetOpcode::G_FSUB:
2005 case TargetOpcode::G_STRICT_FSUB:
2006 case TargetOpcode::G_FMUL:
2007 case TargetOpcode::G_STRICT_FMUL:
2008 case TargetOpcode::G_FDIV:
2009 case TargetOpcode::G_FREM:
2010 case TargetOpcode::G_FMA:
2011 case TargetOpcode::G_STRICT_FMA:
2012 case TargetOpcode::G_FMAD:
2013 case TargetOpcode::G_FSQRT:
2014 case TargetOpcode::G_STRICT_FSQRT:
2018 case TargetOpcode::G_FSIN:
2019 case TargetOpcode::G_FCOS:
2020 case TargetOpcode::G_FSINCOS:
2021 case TargetOpcode::G_FTAN:
2022 case TargetOpcode::G_FASIN:
2023 case TargetOpcode::G_FACOS:
2024 case TargetOpcode::G_FATAN:
2025 case TargetOpcode::G_FATAN2:
2026 case TargetOpcode::G_FSINH:
2027 case TargetOpcode::G_FCOSH:
2028 case TargetOpcode::G_FTANH:
2029 case TargetOpcode::G_FEXP:
2030 case TargetOpcode::G_FEXP2:
2031 case TargetOpcode::G_FEXP10:
2032 case TargetOpcode::G_FLOG:
2033 case TargetOpcode::G_FLOG2:
2034 case TargetOpcode::G_FLOG10:
2035 case TargetOpcode::G_FPOWI:
2036 case TargetOpcode::G_FLDEXP:
2037 case TargetOpcode::G_STRICT_FLDEXP:
2038 case TargetOpcode::G_FFREXP:
2039 case TargetOpcode::G_INTRINSIC_TRUNC:
2040 case TargetOpcode::G_INTRINSIC_ROUND:
2041 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2042 case TargetOpcode::G_FFLOOR:
2043 case TargetOpcode::G_FCEIL:
2044 case TargetOpcode::G_FRINT:
2045 case TargetOpcode::G_FNEARBYINT:
2046 case TargetOpcode::G_FPEXT:
2047 case TargetOpcode::G_FPTRUNC:
2048 case TargetOpcode::G_FCANONICALIZE:
2049 case TargetOpcode::G_FMINNUM:
2050 case TargetOpcode::G_FMAXNUM:
2051 case TargetOpcode::G_FMINNUM_IEEE:
2052 case TargetOpcode::G_FMAXNUM_IEEE:
2053 case TargetOpcode::G_FMINIMUM:
2054 case TargetOpcode::G_FMAXIMUM:
2055 case TargetOpcode::G_FMINIMUMNUM:
2056 case TargetOpcode::G_FMAXIMUMNUM:
2070unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2071 const APInt &DemandedElts,
2075 if (Src1SignBits == 1)
2092 case TargetOpcode::G_SEXTLOAD:
2095 case TargetOpcode::G_ZEXTLOAD:
2108 const APInt &DemandedElts,
2111 unsigned Opcode =
MI.getOpcode();
2113 if (Opcode == TargetOpcode::G_CONSTANT)
2114 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2122 LLT DstTy = MRI.getType(R);
2132 unsigned FirstAnswer = 1;
2134 case TargetOpcode::COPY: {
2136 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2137 MRI.getType(Src.getReg()).isValid()) {
2144 case TargetOpcode::G_SEXT: {
2146 LLT SrcTy = MRI.getType(Src);
2150 case TargetOpcode::G_ASSERT_SEXT:
2151 case TargetOpcode::G_SEXT_INREG: {
2154 unsigned SrcBits =
MI.getOperand(2).getImm();
2155 unsigned InRegBits = TyBits - SrcBits + 1;
2159 case TargetOpcode::G_LOAD: {
2166 case TargetOpcode::G_SEXTLOAD: {
2181 case TargetOpcode::G_ZEXTLOAD: {
2196 case TargetOpcode::G_AND:
2197 case TargetOpcode::G_OR:
2198 case TargetOpcode::G_XOR: {
2200 unsigned Src1NumSignBits =
2202 if (Src1NumSignBits != 1) {
2204 unsigned Src2NumSignBits =
2206 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2210 case TargetOpcode::G_ASHR: {
2215 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2218 case TargetOpcode::G_SHL: {
2221 if (std::optional<ConstantRange> ShAmtRange =
2223 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2224 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2234 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2235 ExtOpc == TargetOpcode::G_ANYEXT) {
2236 LLT ExtTy = MRI.getType(Src1);
2238 LLT ExtendeeTy = MRI.getType(Extendee);
2242 if (SizeDiff <= MinShAmt) {
2246 return Tmp - MaxShAmt;
2252 return Tmp - MaxShAmt;
2256 case TargetOpcode::G_SREM: {
2264 case TargetOpcode::G_TRUNC: {
2266 LLT SrcTy = MRI.getType(Src);
2270 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2272 if (NumSrcSignBits > (NumSrcBits - DstTyBits))
2273 return NumSrcSignBits - (NumSrcBits - DstTyBits);
2276 case TargetOpcode::G_SELECT: {
2277 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2278 MI.getOperand(3).getReg(), DemandedElts,
2281 case TargetOpcode::G_SMIN:
2282 case TargetOpcode::G_SMAX:
2283 case TargetOpcode::G_UMIN:
2284 case TargetOpcode::G_UMAX:
2286 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2287 MI.getOperand(2).getReg(), DemandedElts,
2289 case TargetOpcode::G_SADDO:
2290 case TargetOpcode::G_SADDE:
2291 case TargetOpcode::G_UADDO:
2292 case TargetOpcode::G_UADDE:
2293 case TargetOpcode::G_SSUBO:
2294 case TargetOpcode::G_SSUBE:
2295 case TargetOpcode::G_USUBO:
2296 case TargetOpcode::G_USUBE:
2297 case TargetOpcode::G_SMULO:
2298 case TargetOpcode::G_UMULO: {
2302 if (
MI.getOperand(1).getReg() == R) {
2303 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2310 case TargetOpcode::G_SUB: {
2312 unsigned Src2NumSignBits =
2314 if (Src2NumSignBits == 1)
2324 if ((Known2.
Zero | 1).isAllOnes())
2331 FirstAnswer = Src2NumSignBits;
2338 unsigned Src1NumSignBits =
2340 if (Src1NumSignBits == 1)
2345 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2348 case TargetOpcode::G_ADD: {
2350 unsigned Src2NumSignBits =
2352 if (Src2NumSignBits <= 2)
2356 unsigned Src1NumSignBits =
2358 if (Src1NumSignBits == 1)
2367 if ((Known1.
Zero | 1).isAllOnes())
2373 FirstAnswer = Src1NumSignBits;
2382 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2385 case TargetOpcode::G_FCMP:
2386 case TargetOpcode::G_ICMP: {
2387 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2390 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2397 case TargetOpcode::G_BUILD_VECTOR: {
2399 FirstAnswer = TyBits;
2400 APInt SingleDemandedElt(1, 1);
2402 if (!DemandedElts[
I])
2407 FirstAnswer = std::min(FirstAnswer, Tmp2);
2410 if (FirstAnswer == 1)
2415 case TargetOpcode::G_CONCAT_VECTORS: {
2416 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2418 FirstAnswer = TyBits;
2421 unsigned NumSubVectorElts =
2422 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2425 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2430 FirstAnswer = std::min(FirstAnswer, Tmp2);
2433 if (FirstAnswer == 1)
2438 case TargetOpcode::G_SHUFFLE_VECTOR: {
2441 APInt DemandedLHS, DemandedRHS;
2443 unsigned NumElts = MRI.getType(Src1).getNumElements();
2445 DemandedElts, DemandedLHS, DemandedRHS))
2451 if (FirstAnswer == 1)
2453 if (!!DemandedRHS) {
2456 FirstAnswer = std::min(FirstAnswer, Tmp2);
2460 case TargetOpcode::G_SPLAT_VECTOR: {
2464 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2465 if (NumSrcSignBits > (NumSrcBits - TyBits))
2466 return NumSrcSignBits - (NumSrcBits - TyBits);
2469 case TargetOpcode::G_INTRINSIC:
2470 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2471 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2472 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2475 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2477 FirstAnswer = std::max(FirstAnswer, NumBits);
2497 Mask <<= Mask.getBitWidth() - TyBits;
2498 return std::max(FirstAnswer, Mask.countl_one());
2502 LLT Ty = MRI.getType(R);
2503 APInt DemandedElts =
2512 unsigned Opcode =
MI.getOpcode();
2514 LLT Ty = MRI.getType(R);
2515 unsigned BitWidth = Ty.getScalarSizeInBits();
2517 if (Opcode == TargetOpcode::G_CONSTANT) {
2518 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2520 return std::nullopt;
2524 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2525 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2526 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2527 if (!DemandedElts[
I])
2530 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2531 MinAmt = MaxAmt =
nullptr;
2535 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2537 return std::nullopt;
2538 if (!MinAmt || MinAmt->
ugt(ShAmt))
2540 if (!MaxAmt || MaxAmt->ult(ShAmt))
2543 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2544 "Failed to find matching min/max shift amounts");
2545 if (MinAmt && MaxAmt)
2555 return std::nullopt;
2560 if (std::optional<ConstantRange> AmtRange =
2562 return AmtRange->getUnsignedMin().getZExtValue();
2563 return std::nullopt;
2581 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2606 if (!MO.isReg() || MO.getReg().isPhysical())
2609 if (!MRI.getType(Reg).isValid())
2611 KnownBits Known = VTA.getKnownBits(Reg);
2612 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2613 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)
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.
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).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(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.
void setAllConflict()
Make all bits known to be both zero and one.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
KnownBits byteSwap() const
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.
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 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.
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.