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_UREM: {
324 case TargetOpcode::G_CONSTANT: {
328 case TargetOpcode::G_FRAME_INDEX: {
329 int FrameIdx =
MI.getOperand(1).getIndex();
330 TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
333 case TargetOpcode::G_SUB: {
342 case TargetOpcode::G_XOR: {
351 case TargetOpcode::G_PTR_ADD: {
355 LLT Ty = MRI.getType(
MI.getOperand(1).getReg());
356 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
360 case TargetOpcode::G_ADD: {
368 case TargetOpcode::G_AND: {
378 case TargetOpcode::G_OR: {
388 case TargetOpcode::G_MUL: {
396 case TargetOpcode::G_UMULH: {
404 case TargetOpcode::G_SMULH: {
412 case TargetOpcode::G_ABDU: {
420 case TargetOpcode::G_ABDS: {
429 if (SignBits1 == 1) {
438 case TargetOpcode::G_UDIV: {
447 case TargetOpcode::G_SDIV: {
456 case TargetOpcode::G_SELECT: {
457 computeKnownBitsMin(
MI.getOperand(2).getReg(),
MI.getOperand(3).getReg(),
458 Known, DemandedElts,
Depth + 1);
461 case TargetOpcode::G_SMIN: {
471 case TargetOpcode::G_SMAX: {
481 case TargetOpcode::G_UMIN: {
490 case TargetOpcode::G_UMAX: {
499 case TargetOpcode::G_FCMP:
500 case TargetOpcode::G_ICMP: {
503 if (TL.getBooleanContents(DstTy.
isVector(),
504 Opcode == TargetOpcode::G_FCMP) ==
510 case TargetOpcode::G_SEXT: {
518 case TargetOpcode::G_ASSERT_SEXT:
519 case TargetOpcode::G_SEXT_INREG: {
522 Known = Known.
sextInReg(
MI.getOperand(2).getImm());
525 case TargetOpcode::G_ANYEXT: {
531 case TargetOpcode::G_LOAD: {
539 case TargetOpcode::G_SEXTLOAD:
540 case TargetOpcode::G_ZEXTLOAD: {
547 Known = Opcode == TargetOpcode::G_SEXTLOAD
552 case TargetOpcode::G_ASHR: {
561 case TargetOpcode::G_LSHR: {
570 case TargetOpcode::G_SHL: {
579 case TargetOpcode::G_ROTL:
580 case TargetOpcode::G_ROTR: {
581 MachineInstr *AmtOpMI = MRI.getVRegDef(
MI.getOperand(2).getReg());
589 unsigned Amt = MaybeAmtOp->urem(
BitWidth);
592 if (Opcode == TargetOpcode::G_ROTL)
599 case TargetOpcode::G_FSHL:
600 case TargetOpcode::G_FSHR: {
601 MachineInstr *AmtOpMI = MRI.getVRegDef(
MI.getOperand(3).getReg());
606 const APInt Amt = *MaybeAmtOp;
611 Known = Opcode == TargetOpcode::G_FSHL
616 case TargetOpcode::G_INTTOPTR:
617 case TargetOpcode::G_PTRTOINT:
622 case TargetOpcode::G_ZEXT:
623 case TargetOpcode::G_TRUNC: {
629 case TargetOpcode::G_ASSERT_ZEXT: {
633 unsigned SrcBitWidth =
MI.getOperand(2).getImm();
634 assert(SrcBitWidth &&
"SrcBitWidth can't be zero");
636 Known.
Zero |= (~InMask);
637 Known.
One &= (~Known.Zero);
640 case TargetOpcode::G_ASSERT_ALIGN: {
641 int64_t LogOfAlign =
Log2_64(
MI.getOperand(2).getImm());
650 case TargetOpcode::G_MERGE_VALUES: {
651 unsigned NumOps =
MI.getNumOperands();
652 unsigned OpSize = MRI.getType(
MI.getOperand(1).getReg()).getSizeInBits();
654 for (
unsigned I = 0;
I !=
NumOps - 1; ++
I) {
657 DemandedElts,
Depth + 1);
662 case TargetOpcode::G_UNMERGE_VALUES: {
663 unsigned NumOps =
MI.getNumOperands();
665 LLT SrcTy = MRI.getType(SrcReg);
667 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.
getScalarType())
672 for (; DstIdx !=
NumOps - 1 &&
MI.getOperand(DstIdx).
getReg() != R;
676 APInt SubDemandedElts = DemandedElts;
677 if (SrcTy.isVector()) {
680 DemandedElts.
zext(SrcTy.getNumElements()).
shl(DstIdx * DstLanes);
686 if (SrcTy.isVector())
687 Known = std::move(SrcOpKnown);
692 case TargetOpcode::G_BSWAP: {
698 case TargetOpcode::G_BITREVERSE: {
704 case TargetOpcode::G_CTPOP: {
716 case TargetOpcode::G_UBFX: {
717 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
727 case TargetOpcode::G_SBFX: {
728 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
745 case TargetOpcode::G_UADDO:
746 case TargetOpcode::G_UADDE:
747 case TargetOpcode::G_SADDO:
748 case TargetOpcode::G_SADDE: {
749 if (
MI.getOperand(1).getReg() == R) {
752 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
759 assert(
MI.getOperand(0).getReg() == R &&
760 "We only compute knownbits for the sum here.");
763 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
767 Carry = Carry.
trunc(1);
779 case TargetOpcode::G_USUBO:
780 case TargetOpcode::G_USUBE:
781 case TargetOpcode::G_SSUBO:
782 case TargetOpcode::G_SSUBE:
783 case TargetOpcode::G_UMULO:
784 case TargetOpcode::G_SMULO: {
785 if (
MI.getOperand(1).getReg() == R) {
788 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
795 case TargetOpcode::G_CTTZ:
796 case TargetOpcode::G_CTTZ_ZERO_UNDEF: {
806 case TargetOpcode::G_CTLZ:
807 case TargetOpcode::G_CTLZ_ZERO_UNDEF: {
817 case TargetOpcode::G_CTLS: {
821 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
826 Known =
Range.toKnownBits();
829 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
836 LLT VecVT = MRI.getType(InVec);
854 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
861 case TargetOpcode::G_SHUFFLE_VECTOR: {
862 APInt DemandedLHS, DemandedRHS;
865 unsigned NumElts = MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
867 DemandedElts, DemandedLHS, DemandedRHS))
888 case TargetOpcode::G_CONCAT_VECTORS: {
889 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
894 unsigned NumSubVectorElts =
895 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
899 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
911 case TargetOpcode::G_ABS: {
942void GISelValueTracking::computeKnownFPClassForFPTrunc(
950 KnownFPClass KnownSrc;
951 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
956void GISelValueTracking::computeKnownFPClass(
Register R,
957 const APInt &DemandedElts,
961 assert(Known.
isUnknown() &&
"should not be called with known information");
971 MachineInstr &
MI = *MRI.getVRegDef(R);
972 unsigned Opcode =
MI.getOpcode();
973 LLT DstTy = MRI.getType(R);
981 switch (Cst->getKind()) {
983 auto APF = Cst->getScalarValue();
985 Known.
SignBit = APF.isNegative();
990 bool SignBitAllZero =
true;
991 bool SignBitAllOne =
true;
993 for (
auto C : *Cst) {
996 SignBitAllZero =
false;
998 SignBitAllOne =
false;
1001 if (SignBitAllOne != SignBitAllZero)
1002 Known.
SignBit = SignBitAllOne;
1017 KnownNotFromFlags |=
fcNan;
1019 KnownNotFromFlags |=
fcInf;
1023 InterestedClasses &= ~KnownNotFromFlags;
1026 [=, &Known] { Known.
knownNot(KnownNotFromFlags); });
1032 const MachineFunction *MF =
MI.getMF();
1036 TL.computeKnownFPClassForTargetInstr(*
this, R, Known, DemandedElts, MRI,
1039 case TargetOpcode::G_FNEG: {
1041 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
Depth + 1);
1045 case TargetOpcode::G_SELECT: {
1068 bool LookThroughFAbsFNeg = CmpLHS !=
LHS && CmpLHS !=
RHS;
1069 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1075 MaskIfTrue = TestedMask;
1076 MaskIfFalse = ~TestedMask;
1079 if (TestedValue ==
LHS) {
1081 FilterLHS = MaskIfTrue;
1082 }
else if (TestedValue ==
RHS) {
1084 FilterRHS = MaskIfFalse;
1087 KnownFPClass Known2;
1088 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses & FilterLHS, Known,
1092 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses & FilterRHS,
1099 case TargetOpcode::G_FCOPYSIGN: {
1100 Register Magnitude =
MI.getOperand(1).getReg();
1103 KnownFPClass KnownSign;
1105 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses, Known,
1107 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1112 case TargetOpcode::G_FMA:
1113 case TargetOpcode::G_STRICT_FMA:
1114 case TargetOpcode::G_FMAD: {
1127 KnownFPClass KnownSrc, KnownAddend;
1128 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownAddend,
1130 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc,
1132 if (KnownNotFromFlags) {
1133 KnownSrc.
knownNot(KnownNotFromFlags);
1134 KnownAddend.
knownNot(KnownNotFromFlags);
1138 KnownFPClass KnownSrc[3];
1139 computeKnownFPClass(
A, DemandedElts, InterestedClasses, KnownSrc[0],
1141 if (KnownSrc[0].isUnknown())
1143 computeKnownFPClass(
B, DemandedElts, InterestedClasses, KnownSrc[1],
1145 if (KnownSrc[1].isUnknown())
1147 computeKnownFPClass(
C, DemandedElts, InterestedClasses, KnownSrc[2],
1149 if (KnownSrc[2].isUnknown())
1151 if (KnownNotFromFlags) {
1152 KnownSrc[0].
knownNot(KnownNotFromFlags);
1153 KnownSrc[1].
knownNot(KnownNotFromFlags);
1154 KnownSrc[2].
knownNot(KnownNotFromFlags);
1160 case TargetOpcode::G_FSQRT:
1161 case TargetOpcode::G_STRICT_FSQRT: {
1162 KnownFPClass KnownSrc;
1164 if (InterestedClasses &
fcNan)
1168 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1177 case TargetOpcode::G_FABS: {
1182 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
1188 case TargetOpcode::G_FATAN2: {
1191 KnownFPClass KnownY, KnownX;
1192 computeKnownFPClass(
Y, DemandedElts, InterestedClasses, KnownY,
Depth + 1);
1193 computeKnownFPClass(
X, DemandedElts, InterestedClasses, KnownX,
Depth + 1);
1197 case TargetOpcode::G_FSINH: {
1199 KnownFPClass KnownSrc;
1200 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1205 case TargetOpcode::G_FCOSH: {
1207 KnownFPClass KnownSrc;
1208 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1213 case TargetOpcode::G_FTANH: {
1215 KnownFPClass KnownSrc;
1216 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1221 case TargetOpcode::G_FASIN: {
1223 KnownFPClass KnownSrc;
1224 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1229 case TargetOpcode::G_FACOS: {
1231 KnownFPClass KnownSrc;
1232 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1237 case TargetOpcode::G_FATAN: {
1239 KnownFPClass KnownSrc;
1240 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1245 case TargetOpcode::G_FTAN: {
1247 KnownFPClass KnownSrc;
1248 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1253 case TargetOpcode::G_FSIN:
1254 case TargetOpcode::G_FCOS: {
1257 KnownFPClass KnownSrc;
1258 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1261 : KnownFPClass::sin(KnownSrc);
1264 case TargetOpcode::G_FSINCOS: {
1267 KnownFPClass KnownSrc;
1268 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1270 if (R ==
MI.getOperand(0).getReg())
1276 case TargetOpcode::G_FMAXNUM:
1277 case TargetOpcode::G_FMINNUM:
1278 case TargetOpcode::G_FMINNUM_IEEE:
1279 case TargetOpcode::G_FMAXIMUM:
1280 case TargetOpcode::G_FMINIMUM:
1281 case TargetOpcode::G_FMAXNUM_IEEE:
1282 case TargetOpcode::G_FMAXIMUMNUM:
1283 case TargetOpcode::G_FMINIMUMNUM: {
1286 KnownFPClass KnownLHS, KnownRHS;
1288 computeKnownFPClass(
LHS, DemandedElts, InterestedClasses, KnownLHS,
1290 computeKnownFPClass(
RHS, DemandedElts, InterestedClasses, KnownRHS,
1295 case TargetOpcode::G_FMINIMUM:
1298 case TargetOpcode::G_FMAXIMUM:
1301 case TargetOpcode::G_FMINIMUMNUM:
1304 case TargetOpcode::G_FMAXIMUMNUM:
1307 case TargetOpcode::G_FMINNUM:
1308 case TargetOpcode::G_FMINNUM_IEEE:
1311 case TargetOpcode::G_FMAXNUM:
1312 case TargetOpcode::G_FMAXNUM_IEEE:
1324 case TargetOpcode::G_FCANONICALIZE: {
1326 KnownFPClass KnownSrc;
1327 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1332 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1336 case TargetOpcode::G_VECREDUCE_FMAX:
1337 case TargetOpcode::G_VECREDUCE_FMIN:
1338 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1339 case TargetOpcode::G_VECREDUCE_FMINIMUM: {
1345 computeKnownFPClass(Val,
MI.getFlags(), InterestedClasses,
Depth + 1);
1351 case TargetOpcode::G_FFLOOR:
1352 case TargetOpcode::G_FCEIL:
1353 case TargetOpcode::G_FRINT:
1354 case TargetOpcode::G_FNEARBYINT:
1355 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1356 case TargetOpcode::G_INTRINSIC_ROUND:
1357 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1358 case TargetOpcode::G_INTRINSIC_TRUNC: {
1360 KnownFPClass KnownSrc;
1366 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1369 bool IsTrunc = Opcode == TargetOpcode::G_INTRINSIC_TRUNC;
1374 case TargetOpcode::G_FEXP:
1375 case TargetOpcode::G_FEXP2:
1376 case TargetOpcode::G_FEXP10: {
1378 KnownFPClass KnownSrc;
1379 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1384 case TargetOpcode::G_FLOG:
1385 case TargetOpcode::G_FLOG2:
1386 case TargetOpcode::G_FLOG10: {
1401 KnownFPClass KnownSrc;
1402 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
Depth + 1);
1406 DenormalMode
Mode = MF->getDenormalMode(FltSem);
1410 case TargetOpcode::G_FPOWI: {
1415 LLT ExpTy = MRI.getType(Exp);
1417 Exp, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1420 if (InterestedClasses &
fcNan)
1421 InterestedSrcs |=
fcNan;
1422 if (!ExponentKnownBits.
isZero()) {
1423 if (InterestedClasses &
fcInf)
1429 KnownFPClass KnownSrc;
1430 if (InterestedSrcs !=
fcNone) {
1432 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1439 case TargetOpcode::G_FLDEXP:
1440 case TargetOpcode::G_STRICT_FLDEXP: {
1442 KnownFPClass KnownSrc;
1443 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1451 LLT ExpTy = MRI.getType(ExpReg);
1453 ExpReg, ExpTy.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1458 DenormalMode
Mode = MF->getDenormalMode(Flt);
1462 case TargetOpcode::G_FADD:
1463 case TargetOpcode::G_STRICT_FADD:
1464 case TargetOpcode::G_FSUB:
1465 case TargetOpcode::G_STRICT_FSUB: {
1468 bool IsAdd = (Opcode == TargetOpcode::G_FADD ||
1469 Opcode == TargetOpcode::G_STRICT_FADD);
1473 bool WantNaN = (InterestedClasses &
fcNan) !=
fcNone;
1476 if (!WantNaN && !WantNegative && !WantNegZero) {
1486 if (InterestedClasses &
fcNan)
1487 InterestedSrcs |=
fcInf;
1491 KnownFPClass KnownSelf;
1492 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownSelf,
1498 KnownFPClass KnownLHS, KnownRHS;
1499 computeKnownFPClass(
RHS, DemandedElts, InterestedSrcs, KnownRHS,
Depth + 1);
1503 WantNegZero || !IsAdd) {
1506 computeKnownFPClass(
LHS, DemandedElts, InterestedSrcs, KnownLHS,
1516 case TargetOpcode::G_FMUL:
1517 case TargetOpcode::G_STRICT_FMUL: {
1525 KnownFPClass KnownSrc;
1532 KnownFPClass KnownLHS;
1536 KnownFPClass KnownLHS, KnownRHS;
1552 case TargetOpcode::G_FDIV:
1553 case TargetOpcode::G_FREM: {
1557 if (Opcode == TargetOpcode::G_FREM)
1564 if (Opcode == TargetOpcode::G_FDIV) {
1565 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1571 KnownFPClass KnownSrc;
1572 computeKnownFPClass(
LHS, DemandedElts,
1577 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1583 KnownFPClass KnownSrc;
1584 computeKnownFPClass(
LHS, DemandedElts,
1592 const bool WantNan = (InterestedClasses &
fcNan) !=
fcNone;
1594 const bool WantPositive = Opcode == TargetOpcode::G_FREM &&
1596 if (!WantNan && !WantNegative && !WantPositive) {
1600 KnownFPClass KnownLHS, KnownRHS;
1603 KnownRHS,
Depth + 1);
1609 if (KnowSomethingUseful || WantPositive) {
1613 if (Opcode == TargetOpcode::G_FDIV) {
1637 case TargetOpcode::G_FFREXP: {
1639 if (R !=
MI.getOperand(0).getReg())
1642 KnownFPClass KnownSrc;
1643 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1650 case TargetOpcode::G_FPEXT: {
1652 KnownFPClass KnownSrc;
1653 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1658 LLT SrcTy = MRI.getType(Src).getScalarType();
1664 case TargetOpcode::G_FPTRUNC: {
1665 computeKnownFPClassForFPTrunc(
MI, DemandedElts, InterestedClasses, Known,
1669 case TargetOpcode::G_SITOFP:
1670 case TargetOpcode::G_UITOFP: {
1681 if (Opcode == TargetOpcode::G_UITOFP)
1689 LLT Ty = MRI.getType(Val);
1691 Val, Ty.
isVector() ? DemandedElts : APInt(1, 1),
Depth + 1);
1697 if (Opcode == TargetOpcode::G_SITOFP) {
1707 if (InterestedClasses &
fcInf) {
1714 if (Opcode == TargetOpcode::G_UITOFP)
1728 case TargetOpcode::G_BUILD_VECTOR:
1729 case TargetOpcode::G_CONCAT_VECTORS: {
1736 for (
unsigned Idx = 0; Idx <
Merge.getNumSources(); ++Idx) {
1738 bool NeedsElt = DemandedElts[Idx];
1744 computeKnownFPClass(Src, Known, InterestedClasses,
Depth + 1);
1747 KnownFPClass Known2;
1748 computeKnownFPClass(Src, Known2, InterestedClasses,
Depth + 1);
1760 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1770 LLT VecTy = MRI.getType(Vec);
1775 if (CIdx && CIdx->ult(NumElts))
1777 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
1783 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1789 LLT VecTy = MRI.getType(Vec);
1797 APInt DemandedVecElts = DemandedElts;
1798 bool NeedsElt =
true;
1800 if (CIdx && CIdx->ult(NumElts)) {
1801 DemandedVecElts.
clearBit(CIdx->getZExtValue());
1802 NeedsElt = DemandedElts[CIdx->getZExtValue()];
1807 computeKnownFPClass(Elt, Known, InterestedClasses,
Depth + 1);
1816 if (!DemandedVecElts.
isZero()) {
1817 KnownFPClass Known2;
1818 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
1825 case TargetOpcode::G_SHUFFLE_VECTOR: {
1829 APInt DemandedLHS, DemandedRHS;
1831 assert(DemandedElts == APInt(1, 1));
1832 DemandedLHS = DemandedRHS = DemandedElts;
1834 unsigned NumElts = MRI.getType(Shuf.
getSrc1Reg()).getNumElements();
1836 DemandedLHS, DemandedRHS)) {
1842 if (!!DemandedLHS) {
1844 computeKnownFPClass(
LHS, DemandedLHS, InterestedClasses, Known,
1854 if (!!DemandedRHS) {
1855 KnownFPClass Known2;
1857 computeKnownFPClass(
RHS, DemandedRHS, InterestedClasses, Known2,
1863 case TargetOpcode::G_PHI: {
1872 for (
unsigned Idx = 1; Idx <
MI.getNumOperands(); Idx += 2) {
1873 const MachineOperand &Src =
MI.getOperand(Idx);
1876 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known,
1880 KnownFPClass Known2;
1881 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
1890 case TargetOpcode::COPY: {
1893 if (!Src.isVirtual())
1896 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known,
Depth + 1);
1907 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses,
Depth);
1908 return KnownClasses;
1914 computeKnownFPClass(R, Known, InterestedClasses,
Depth);
1922 InterestedClasses &=
~fcNan;
1924 InterestedClasses &=
~fcInf;
1927 computeKnownFPClass(R, DemandedElts, InterestedClasses,
Depth);
1930 Result.KnownFPClasses &=
~fcNan;
1932 Result.KnownFPClasses &=
~fcInf;
1938 LLT Ty = MRI.getType(R);
1939 APInt DemandedElts =
1941 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses,
Depth);
1956 switch (
DefMI->getOpcode()) {
1959 case TargetOpcode::G_FADD:
1960 case TargetOpcode::G_STRICT_FADD:
1961 case TargetOpcode::G_FSUB:
1962 case TargetOpcode::G_STRICT_FSUB:
1963 case TargetOpcode::G_FMUL:
1964 case TargetOpcode::G_STRICT_FMUL:
1965 case TargetOpcode::G_FDIV:
1966 case TargetOpcode::G_FREM:
1967 case TargetOpcode::G_FMA:
1968 case TargetOpcode::G_STRICT_FMA:
1969 case TargetOpcode::G_FMAD:
1970 case TargetOpcode::G_FSQRT:
1971 case TargetOpcode::G_STRICT_FSQRT:
1975 case TargetOpcode::G_FSIN:
1976 case TargetOpcode::G_FCOS:
1977 case TargetOpcode::G_FSINCOS:
1978 case TargetOpcode::G_FTAN:
1979 case TargetOpcode::G_FASIN:
1980 case TargetOpcode::G_FACOS:
1981 case TargetOpcode::G_FATAN:
1982 case TargetOpcode::G_FATAN2:
1983 case TargetOpcode::G_FSINH:
1984 case TargetOpcode::G_FCOSH:
1985 case TargetOpcode::G_FTANH:
1986 case TargetOpcode::G_FEXP:
1987 case TargetOpcode::G_FEXP2:
1988 case TargetOpcode::G_FEXP10:
1989 case TargetOpcode::G_FLOG:
1990 case TargetOpcode::G_FLOG2:
1991 case TargetOpcode::G_FLOG10:
1992 case TargetOpcode::G_FPOWI:
1993 case TargetOpcode::G_FLDEXP:
1994 case TargetOpcode::G_STRICT_FLDEXP:
1995 case TargetOpcode::G_FFREXP:
1996 case TargetOpcode::G_INTRINSIC_TRUNC:
1997 case TargetOpcode::G_INTRINSIC_ROUND:
1998 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1999 case TargetOpcode::G_FFLOOR:
2000 case TargetOpcode::G_FCEIL:
2001 case TargetOpcode::G_FRINT:
2002 case TargetOpcode::G_FNEARBYINT:
2003 case TargetOpcode::G_FPEXT:
2004 case TargetOpcode::G_FPTRUNC:
2005 case TargetOpcode::G_FCANONICALIZE:
2006 case TargetOpcode::G_FMINNUM:
2007 case TargetOpcode::G_FMAXNUM:
2008 case TargetOpcode::G_FMINNUM_IEEE:
2009 case TargetOpcode::G_FMAXNUM_IEEE:
2010 case TargetOpcode::G_FMINIMUM:
2011 case TargetOpcode::G_FMAXIMUM:
2012 case TargetOpcode::G_FMINIMUMNUM:
2013 case TargetOpcode::G_FMAXIMUMNUM:
2027unsigned GISelValueTracking::computeNumSignBitsMin(
Register Src0,
Register Src1,
2028 const APInt &DemandedElts,
2032 if (Src1SignBits == 1)
2049 case TargetOpcode::G_SEXTLOAD:
2052 case TargetOpcode::G_ZEXTLOAD:
2065 const APInt &DemandedElts,
2068 unsigned Opcode =
MI.getOpcode();
2070 if (Opcode == TargetOpcode::G_CONSTANT)
2071 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2079 LLT DstTy = MRI.getType(R);
2089 unsigned FirstAnswer = 1;
2091 case TargetOpcode::COPY: {
2093 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2094 MRI.getType(Src.getReg()).isValid()) {
2101 case TargetOpcode::G_SEXT: {
2103 LLT SrcTy = MRI.getType(Src);
2107 case TargetOpcode::G_ASSERT_SEXT:
2108 case TargetOpcode::G_SEXT_INREG: {
2111 unsigned SrcBits =
MI.getOperand(2).getImm();
2112 unsigned InRegBits = TyBits - SrcBits + 1;
2116 case TargetOpcode::G_LOAD: {
2123 case TargetOpcode::G_SEXTLOAD: {
2138 case TargetOpcode::G_ZEXTLOAD: {
2153 case TargetOpcode::G_AND:
2154 case TargetOpcode::G_OR:
2155 case TargetOpcode::G_XOR: {
2157 unsigned Src1NumSignBits =
2159 if (Src1NumSignBits != 1) {
2161 unsigned Src2NumSignBits =
2163 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2167 case TargetOpcode::G_ASHR: {
2172 FirstAnswer = std::min<uint64_t>(FirstAnswer + *
C, TyBits);
2175 case TargetOpcode::G_SHL: {
2178 if (std::optional<ConstantRange> ShAmtRange =
2180 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2181 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2191 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2192 ExtOpc == TargetOpcode::G_ANYEXT) {
2193 LLT ExtTy = MRI.getType(Src1);
2195 LLT ExtendeeTy = MRI.getType(Extendee);
2199 if (SizeDiff <= MinShAmt) {
2203 return Tmp - MaxShAmt;
2209 return Tmp - MaxShAmt;
2213 case TargetOpcode::G_TRUNC: {
2215 LLT SrcTy = MRI.getType(Src);
2219 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2221 if (NumSrcSignBits > (NumSrcBits - DstTyBits))
2222 return NumSrcSignBits - (NumSrcBits - DstTyBits);
2225 case TargetOpcode::G_SELECT: {
2226 return computeNumSignBitsMin(
MI.getOperand(2).getReg(),
2227 MI.getOperand(3).getReg(), DemandedElts,
2230 case TargetOpcode::G_SMIN:
2231 case TargetOpcode::G_SMAX:
2232 case TargetOpcode::G_UMIN:
2233 case TargetOpcode::G_UMAX:
2235 return computeNumSignBitsMin(
MI.getOperand(1).getReg(),
2236 MI.getOperand(2).getReg(), DemandedElts,
2238 case TargetOpcode::G_SADDO:
2239 case TargetOpcode::G_SADDE:
2240 case TargetOpcode::G_UADDO:
2241 case TargetOpcode::G_UADDE:
2242 case TargetOpcode::G_SSUBO:
2243 case TargetOpcode::G_SSUBE:
2244 case TargetOpcode::G_USUBO:
2245 case TargetOpcode::G_USUBE:
2246 case TargetOpcode::G_SMULO:
2247 case TargetOpcode::G_UMULO: {
2251 if (
MI.getOperand(1).getReg() == R) {
2252 if (TL.getBooleanContents(DstTy.
isVector(),
false) ==
2259 case TargetOpcode::G_SUB: {
2261 unsigned Src2NumSignBits =
2263 if (Src2NumSignBits == 1)
2273 if ((Known2.
Zero | 1).isAllOnes())
2280 FirstAnswer = Src2NumSignBits;
2287 unsigned Src1NumSignBits =
2289 if (Src1NumSignBits == 1)
2294 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2297 case TargetOpcode::G_ADD: {
2299 unsigned Src2NumSignBits =
2301 if (Src2NumSignBits <= 2)
2305 unsigned Src1NumSignBits =
2307 if (Src1NumSignBits == 1)
2316 if ((Known1.
Zero | 1).isAllOnes())
2322 FirstAnswer = Src1NumSignBits;
2331 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2334 case TargetOpcode::G_FCMP:
2335 case TargetOpcode::G_ICMP: {
2336 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2339 auto BC = TL.getBooleanContents(DstTy.
isVector(), IsFP);
2346 case TargetOpcode::G_BUILD_VECTOR: {
2348 FirstAnswer = TyBits;
2349 APInt SingleDemandedElt(1, 1);
2351 if (!DemandedElts[
I])
2356 FirstAnswer = std::min(FirstAnswer, Tmp2);
2359 if (FirstAnswer == 1)
2364 case TargetOpcode::G_CONCAT_VECTORS: {
2365 if (MRI.getType(
MI.getOperand(0).getReg()).isScalableVector())
2367 FirstAnswer = TyBits;
2370 unsigned NumSubVectorElts =
2371 MRI.getType(
MI.getOperand(1).getReg()).getNumElements();
2374 DemandedElts.
extractBits(NumSubVectorElts,
I * NumSubVectorElts);
2379 FirstAnswer = std::min(FirstAnswer, Tmp2);
2382 if (FirstAnswer == 1)
2387 case TargetOpcode::G_SHUFFLE_VECTOR: {
2390 APInt DemandedLHS, DemandedRHS;
2392 unsigned NumElts = MRI.getType(Src1).getNumElements();
2394 DemandedElts, DemandedLHS, DemandedRHS))
2400 if (FirstAnswer == 1)
2402 if (!!DemandedRHS) {
2405 FirstAnswer = std::min(FirstAnswer, Tmp2);
2409 case TargetOpcode::G_SPLAT_VECTOR: {
2413 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2414 if (NumSrcSignBits > (NumSrcBits - TyBits))
2415 return NumSrcSignBits - (NumSrcBits - TyBits);
2418 case TargetOpcode::G_INTRINSIC:
2419 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2420 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2421 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2424 TL.computeNumSignBitsForTargetInstr(*
this, R, DemandedElts, MRI,
Depth);
2426 FirstAnswer = std::max(FirstAnswer, NumBits);
2446 Mask <<= Mask.getBitWidth() - TyBits;
2447 return std::max(FirstAnswer, Mask.countl_one());
2451 LLT Ty = MRI.getType(R);
2452 APInt DemandedElts =
2461 unsigned Opcode =
MI.getOpcode();
2463 LLT Ty = MRI.getType(R);
2464 unsigned BitWidth = Ty.getScalarSizeInBits();
2466 if (Opcode == TargetOpcode::G_CONSTANT) {
2467 const APInt &ShAmt =
MI.getOperand(1).getCImm()->getValue();
2469 return std::nullopt;
2473 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2474 const APInt *MinAmt =
nullptr, *MaxAmt =
nullptr;
2475 for (
unsigned I = 0, E =
MI.getNumOperands() - 1;
I != E; ++
I) {
2476 if (!DemandedElts[
I])
2479 if (
Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2480 MinAmt = MaxAmt =
nullptr;
2484 const APInt &ShAmt =
Op->getOperand(1).getCImm()->getValue();
2486 return std::nullopt;
2487 if (!MinAmt || MinAmt->
ugt(ShAmt))
2489 if (!MaxAmt || MaxAmt->ult(ShAmt))
2492 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2493 "Failed to find matching min/max shift amounts");
2494 if (MinAmt && MaxAmt)
2504 return std::nullopt;
2509 if (std::optional<ConstantRange> AmtRange =
2511 return AmtRange->getUnsignedMin().getZExtValue();
2512 return std::nullopt;
2530 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2555 if (!MO.isReg() || MO.getReg().isPhysical())
2558 if (!MRI.getType(Reg).isValid())
2560 KnownBits Known = VTA.getKnownBits(Reg);
2561 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2562 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).
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.
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 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.