1204 unsigned Depth,
bool AssumeSingleUse)
const {
1207 "Mask size mismatches value type size!");
1212 EVT VT =
Op.getValueType();
1214 unsigned NumElts = OriginalDemandedElts.
getBitWidth();
1216 "Unexpected vector size");
1219 APInt DemandedElts = OriginalDemandedElts;
1244 bool HasMultiUse =
false;
1245 if (!AssumeSingleUse && !
Op.getNode()->hasOneUse()) {
1254 }
else if (OriginalDemandedBits == 0 || OriginalDemandedElts == 0) {
1263 switch (
Op.getOpcode()) {
1267 if (!DemandedElts[0])
1272 unsigned SrcBitWidth = Src.getScalarValueSizeInBits();
1279 if (DemandedElts == 1)
1315 EVT MemVT = LD->getMemoryVT();
1317 Known.Zero.setBitsFrom(MemBits);
1332 APInt DemandedVecElts(DemandedElts);
1334 unsigned Idx = CIdx->getZExtValue();
1338 if (!DemandedElts[Idx])
1355 if (!!DemandedVecElts)
1367 uint64_t Idx =
Op.getConstantOperandVal(2);
1368 unsigned NumSubElts =
Sub.getValueType().getVectorNumElements();
1370 APInt DemandedSrcElts = DemandedElts;
1371 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
1381 Known.setAllConflict();
1382 if (!!DemandedSubElts)
1384 if (!!DemandedSrcElts)
1394 if (NewSub || NewSrc) {
1395 NewSub = NewSub ? NewSub :
Sub;
1396 NewSrc = NewSrc ? NewSrc : Src;
1409 if (Src.getValueType().isScalableVector())
1411 uint64_t Idx =
Op.getConstantOperandVal(1);
1412 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
1413 APInt DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
1434 Known.setAllConflict();
1435 EVT SubVT =
Op.getOperand(0).getValueType();
1436 unsigned NumSubVecs =
Op.getNumOperands();
1438 for (
unsigned i = 0; i != NumSubVecs; ++i) {
1439 APInt DemandedSubElts =
1440 DemandedElts.
extractBits(NumSubElts, i * NumSubElts);
1442 Known2, TLO,
Depth + 1))
1445 if (!!DemandedSubElts)
1455 APInt DemandedLHS, DemandedRHS;
1460 if (!!DemandedLHS || !!DemandedRHS) {
1464 Known.setAllConflict();
1465 if (!!DemandedLHS) {
1471 if (!!DemandedRHS) {
1483 if (DemandedOp0 || DemandedOp1) {
1484 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1485 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1520 LHSKnown.
One == ~RHSC->getAPIntValue()) {
1543 unsigned NumSubElts =
1564 Known2, TLO,
Depth + 1))
1590 if (DemandedOp0 || DemandedOp1) {
1591 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1592 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1611 Known2, TLO,
Depth + 1)) {
1635 if (DemandedOp0 || DemandedOp1) {
1636 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1637 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1695 if (
C->getAPIntValue() == Known2.
One) {
1704 if (!
C->isAllOnes() &&
DemandedBits.isSubsetOf(
C->getAPIntValue())) {
1716 if (ShiftC->getAPIntValue().ult(
BitWidth)) {
1717 uint64_t ShiftAmt = ShiftC->getZExtValue();
1720 : Ones.
lshr(ShiftAmt);
1737 if (!
C || !
C->isAllOnes())
1747 if (DemandedOp0 || DemandedOp1) {
1748 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1749 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1763 Known2, TLO,
Depth + 1))
1778 Known2, TLO,
Depth + 1))
1789 Known2, TLO,
Depth + 1))
1813 DemandedElts, KnownOp0, TLO,
Depth + 1))
1836 Known.Zero.setBitsFrom(1);
1844 if (std::optional<unsigned> KnownSA =
1846 unsigned ShAmt = *KnownSA;
1856 if (std::optional<unsigned> InnerSA =
1858 unsigned C1 = *InnerSA;
1860 int Diff = ShAmt - C1;
1879 if (ShAmt < InnerBits &&
DemandedBits.getActiveBits() <= InnerBits &&
1897 InnerOp, DemandedElts,
Depth + 2)) {
1898 unsigned InnerShAmt = *SA2;
1899 if (InnerShAmt < ShAmt && InnerShAmt < InnerBits &&
1901 (InnerBits - InnerShAmt + ShAmt) &&
1924 Known.Zero.setLowBits(ShAmt);
1929 Op0, InDemandedMask, DemandedElts, TLO.
DAG,
Depth + 1);
1940 Op.getNode()->hasOneUse()) {
1951 assert(DemandedSize <= SmallVTBits &&
1952 "Narrowed below demanded bits?");
1978 if (
bool IsNUW = (
Known.countMinLeadingZeros() >= HalfWidth)) {
1979 bool IsNSW =
Known.countMinSignBits() > HalfWidth;
1982 Flags.setNoUnsignedWrap(IsNUW);
1987 NewShiftAmt, Flags);
2013 if (std::optional<unsigned> MaxSA =
2015 unsigned ShAmt = *MaxSA;
2016 unsigned NumSignBits =
2019 if (NumSignBits > ShAmt && (NumSignBits - ShAmt) >= (UpperDemandedBits))
2029 if (std::optional<unsigned> KnownSA =
2031 unsigned ShAmt = *KnownSA;
2041 if (std::optional<unsigned> InnerSA =
2043 unsigned C1 = *InnerSA;
2045 int Diff = ShAmt - C1;
2061 if (std::optional<unsigned> InnerSA =
2063 unsigned C1 = *InnerSA;
2065 unsigned Combined = std::min(C1 + ShAmt,
BitWidth - 1);
2077 if (
Op->getFlags().hasExact())
2107 Known.Zero.setHighBits(ShAmt);
2112 Op0, InDemandedMask, DemandedElts, TLO.
DAG,
Depth + 1);
2126 if (std::optional<unsigned> MaxSA =
2128 unsigned ShAmt = *MaxSA;
2132 unsigned NumSignBits =
2141 DemandedElts,
Depth + 1))
2165 if (std::optional<unsigned> KnownSA =
2167 unsigned ShAmt = *KnownSA;
2174 if (std::optional<unsigned> InnerSA =
2176 unsigned LowBits =
BitWidth - ShAmt;
2181 if (*InnerSA == ShAmt) {
2191 unsigned NumSignBits =
2193 if (NumSignBits > ShAmt)
2203 if (
Op->getFlags().hasExact())
2235 Known.One.setHighBits(ShAmt);
2240 Op0, InDemandedMask, DemandedElts, TLO.
DAG,
Depth + 1);
2250 DemandedElts,
Depth + 1))
2263 unsigned Amt = SA->getAPIntValue().urem(
BitWidth);
2285 Known2 <<= (IsFSHL ? Amt : (
BitWidth - Amt));
2293 Op0, Demanded0, DemandedElts, TLO.
DAG,
Depth + 1);
2295 Op1, Demanded1, DemandedElts, TLO.
DAG,
Depth + 1);
2296 if (DemandedOp0 || DemandedOp1) {
2297 DemandedOp0 = DemandedOp0 ? DemandedOp0 : Op0;
2298 DemandedOp1 = DemandedOp1 ? DemandedOp1 : Op1;
2314 unsigned MaxShiftAmt =
2346 unsigned Amt = SA->getAPIntValue().urem(
BitWidth);
2362 DemandedBits.countr_zero() >= (IsROTL ? Amt : RevAmt)) {
2367 DemandedBits.countl_zero() >= (IsROTL ? RevAmt : Amt)) {
2386 unsigned Opc =
Op.getOpcode();
2393 unsigned NumSignBits =
2397 if (NumSignBits >= NumDemandedUpperBits)
2463 unsigned ShiftAmount = NLZ > NTZ ? NLZ - NTZ : NTZ - NLZ;
2510 Known.One.clearAllBits();
2523 unsigned MinSignedBits =
2525 bool AlreadySignExtended = ExVTBits >= MinSignedBits;
2528 if (!AlreadySignExtended) {
2546 InputDemandedBits.
setBit(ExVTBits - 1);
2556 if (
Known.Zero[ExVTBits - 1])
2560 if (
Known.One[ExVTBits - 1]) {
2561 Known.One.setBitsFrom(ExVTBits);
2570 EVT HalfVT =
Op.getOperand(0).getValueType();
2593 EVT SrcVT = Src.getValueType();
2602 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2613 APInt InDemandedElts = DemandedElts.
zext(InElts);
2619 assert(
Known.getBitWidth() == InBits &&
"Src width has changed?");
2624 Src, InDemandedBits, InDemandedElts, TLO.
DAG,
Depth + 1))
2634 EVT SrcVT = Src.getValueType();
2639 APInt InDemandedElts = DemandedElts.
zext(InElts);
2644 InDemandedBits.
setBit(InBits - 1);
2650 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2668 assert(
Known.getBitWidth() == InBits &&
"Src width has changed?");
2674 if (
Known.isNonNegative()) {
2687 Src, InDemandedBits, InDemandedElts, TLO.
DAG,
Depth + 1))
2697 EVT SrcVT = Src.getValueType();
2704 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2709 APInt InDemandedElts = DemandedElts.
zext(InElts);
2713 assert(
Known.getBitWidth() == InBits &&
"Src width has changed?");
2718 Src, InDemandedBits, InDemandedElts, TLO.
DAG,
Depth + 1))
2727 unsigned OperandBitWidth = Src.getScalarValueSizeInBits();
2740 Src, TruncMask, DemandedElts, TLO.
DAG,
Depth + 1))
2745 switch (Src.getOpcode()) {
2756 if (Src.getNode()->hasOneUse()) {
2768 std::optional<unsigned> ShAmtC =
2770 if (!ShAmtC || *ShAmtC >=
BitWidth)
2772 unsigned ShVal = *ShAmtC;
2802 Known.Zero |= ~InMask;
2809 ElementCount SrcEltCnt = Src.getValueType().getVectorElementCount();
2810 unsigned EltBitWidth = Src.getScalarValueSizeInBits();
2819 if (CIdx->getAPIntValue().ult(NumSrcElts))
2826 DemandedSrcBits = DemandedSrcBits.
trunc(EltBitWidth);
2835 Src, DemandedSrcBits, DemandedSrcElts, TLO.
DAG,
Depth + 1)) {
2837 TLO.
DAG.
getNode(
Op.getOpcode(), dl, VT, DemandedSrc, Idx);
2851 EVT SrcVT = Src.getValueType();
2863 unsigned ShVal =
Op.getValueSizeInBits() - 1;
2873 unsigned Scale =
BitWidth / NumSrcEltBits;
2876 for (
unsigned i = 0; i != Scale; ++i) {
2877 unsigned EltOffset = IsLE ? i : (Scale - 1 - i);
2878 unsigned BitOffset = EltOffset * NumSrcEltBits;
2879 DemandedSrcBits |=
DemandedBits.extractBits(NumSrcEltBits, BitOffset);
2886 APInt KnownSrcUndef, KnownSrcZero;
2888 KnownSrcZero, TLO,
Depth + 1))
2893 KnownSrcBits, TLO,
Depth + 1))
2895 }
else if (IsLE && (NumSrcEltBits %
BitWidth) == 0) {
2897 unsigned Scale = NumSrcEltBits /
BitWidth;
2901 for (
unsigned i = 0; i != NumElts; ++i)
2902 if (DemandedElts[i]) {
2905 DemandedSrcElts.
setBit(i / Scale);
2909 APInt KnownSrcUndef, KnownSrcZero;
2911 KnownSrcZero, TLO,
Depth + 1))
2917 KnownSrcBits, TLO,
Depth + 1))
2923 Src, DemandedSrcBits, DemandedSrcElts, TLO.
DAG,
Depth + 1)) {
2945 if (
C &&
C->getAPIntValue().countr_zero() == CTZ) {
2961 if (
Op.getOperand(0).getValueType() !=
Op.getOperand(1).getValueType())
2969 SDValue Op0 =
Op.getOperand(0), Op1 =
Op.getOperand(1);
2974 auto GetDemandedBitsLHSMask = [&](
APInt Demanded,
2983 DemandedElts, KnownOp0, TLO,
Depth + 1) ||
3000 Op0, LoMask, DemandedElts, TLO.
DAG,
Depth + 1);
3002 Op1, LoMask, DemandedElts, TLO.
DAG,
Depth + 1);
3003 if (DemandedOp0 || DemandedOp1) {
3004 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
3005 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
3019 if (
C && !
C->isAllOnes() && !
C->isOne() &&
3020 (
C->getAPIntValue() | HighMask).isAllOnes()) {
3032 auto getShiftLeftAmt = [&HighMask](
SDValue Mul) ->
unsigned {
3059 if (
unsigned ShAmt = getShiftLeftAmt(Op0))
3062 if (
unsigned ShAmt = getShiftLeftAmt(Op1))
3063 return foldMul(
ISD::SUB, Op1.getOperand(0), Op0, ShAmt);
3067 if (
unsigned ShAmt = getShiftLeftAmt(Op1))
3068 return foldMul(
ISD::ADD, Op1.getOperand(0), Op0, ShAmt);
3076 Op.getOpcode() !=
ISD::SUB, Flags.hasNoSignedWrap(),
3077 Flags.hasNoUnsignedWrap(), KnownOp0, KnownOp1);
3092 if (
Known.isNonNegative())
3094 if (
Known.isNegative())
3098 Known.Zero |= SignMask;
3099 Known.One &= ~SignMask;
3130 Known.Zero &= ~SignMask0;
3131 Known.One &= ~SignMask0;
3145 if (!
Known.isSignUnknown()) {
3146 Known.Zero ^= SignMask;
3147 Known.One ^= SignMask;
3158 if (
Op.getValueType().isScalableVector())
3177 auto *C = dyn_cast<ConstantSDNode>(V);
3178 return C && C->isOpaque();
3192 if (HasMultiUse &&
Known.isUnknown() && !OriginalDemandedElts.
isAllOnes())
3267 bool AssumeSingleUse)
const {
3268 EVT VT =
Op.getValueType();
3269 unsigned Opcode =
Op.getOpcode();
3270 APInt DemandedElts = OriginalDemandedElts;
3284 "Mask size mismatches value type element count!");
3293 if (!AssumeSingleUse && !
Op.getNode()->hasOneUse())
3297 if (DemandedElts == 0) {
3315 assert(ShrunkSize % EltSizeInBits == 0 &&
3316 "Shrunk size not a multiple of element size");
3318 "Shrunk size must be < original vector size");
3320 "Shrunk size must be >= demanded size");
3335 auto SimplifyDemandedVectorEltsBinOp = [&](
SDValue Op0,
SDValue Op1) {
3340 if (NewOp0 || NewOp1) {
3343 NewOp1 ? NewOp1 : Op1,
Op->getFlags());
3347 if (TryShrinkBinOp(Op0, Op1))
3355 if (!DemandedElts[0]) {
3364 EVT SrcVT = Src.getValueType();
3371 for (
unsigned I = 0;
I != NumElts; ++
I) {
3372 if (DemandedElts[
I]) {
3373 unsigned Offset =
I * EltSize;
3386 if (NumSrcElts == NumElts)
3388 KnownZero, TLO,
Depth + 1);
3390 APInt SrcDemandedElts, SrcZero, SrcUndef;
3394 if ((NumElts % NumSrcElts) == 0) {
3395 unsigned Scale = NumElts / NumSrcElts;
3407 for (
unsigned i = 0; i != NumElts; ++i)
3408 if (DemandedElts[i]) {
3409 unsigned Ofs = (i % Scale) * EltSizeInBits;
3410 SrcDemandedBits.
setBits(Ofs, Ofs + EltSizeInBits);
3422 for (
unsigned SubElt = 0; SubElt != Scale; ++SubElt) {
3423 if (!
Known.Zero.extractBits(EltSizeInBits, SubElt * EltSizeInBits)
3426 for (
unsigned SrcElt = 0; SrcElt != NumSrcElts; ++SrcElt) {
3427 unsigned Elt = Scale * SrcElt + SubElt;
3430 if (DemandedElts[Elt] && !SrcUndef[SrcElt])
3438 for (
unsigned i = 0; i != NumSrcElts; ++i) {
3439 if (SrcDemandedElts[i]) {
3441 KnownZero.
setBits(i * Scale, (i + 1) * Scale);
3443 KnownUndef.
setBits(i * Scale, (i + 1) * Scale);
3451 if ((NumSrcElts % NumElts) == 0) {
3452 unsigned Scale = NumSrcElts / NumElts;
3460 for (
unsigned i = 0; i != NumElts; ++i) {
3461 if (DemandedElts[i]) {
3490 [&](
SDValue Elt) { return Op.getOperand(0) != Elt; })) {
3492 bool Updated =
false;
3493 for (
unsigned i = 0; i != NumElts; ++i) {
3504 for (
unsigned i = 0; i != NumElts; ++i) {
3506 if (
SrcOp.isUndef()) {
3508 }
else if (EltSizeInBits ==
SrcOp.getScalarValueSizeInBits() &&
3516 EVT SubVT =
Op.getOperand(0).getValueType();
3517 unsigned NumSubVecs =
Op.getNumOperands();
3519 for (
unsigned i = 0; i != NumSubVecs; ++i) {
3522 APInt SubUndef, SubZero;
3526 KnownUndef.
insertBits(SubUndef, i * NumSubElts);
3527 KnownZero.
insertBits(SubZero, i * NumSubElts);
3532 bool FoundNewSub =
false;
3534 for (
unsigned i = 0; i != NumSubVecs; ++i) {
3538 SubOp, SubElts, TLO.
DAG,
Depth + 1);
3539 DemandedSubOps.
push_back(NewSubOp ? NewSubOp : SubOp);
3540 FoundNewSub = NewSubOp ?
true : FoundNewSub;
3555 uint64_t Idx =
Op.getConstantOperandVal(2);
3556 unsigned NumSubElts =
Sub.getValueType().getVectorNumElements();
3558 APInt DemandedSrcElts = DemandedElts;
3559 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
3562 if (!DemandedSubElts)
3565 APInt SubUndef, SubZero;
3571 if (!DemandedSrcElts && !Src.isUndef())
3585 Src, DemandedSrcElts, TLO.
DAG,
Depth + 1);
3588 if (NewSrc || NewSub) {
3589 NewSrc = NewSrc ? NewSrc : Src;
3590 NewSub = NewSub ? NewSub :
Sub;
3592 NewSub,
Op.getOperand(2));
3601 if (Src.getValueType().isScalableVector())
3603 uint64_t Idx =
Op.getConstantOperandVal(1);
3604 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3605 APInt DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
3607 APInt SrcUndef, SrcZero;
3631 if (CIdx && CIdx->getAPIntValue().ult(NumElts)) {
3632 unsigned Idx = CIdx->getZExtValue();
3633 if (!DemandedElts[Idx])
3636 APInt DemandedVecElts(DemandedElts);
3639 KnownZero, TLO,
Depth + 1))
3648 APInt VecUndef, VecZero;
3662 APInt UndefSel, ZeroSel;
3668 APInt DemandedLHS(DemandedElts);
3669 APInt DemandedRHS(DemandedElts);
3670 APInt UndefLHS, ZeroLHS;
3671 APInt UndefRHS, ZeroRHS;
3679 KnownUndef = UndefLHS & UndefRHS;
3680 KnownZero = ZeroLHS & ZeroRHS;
3684 APInt DemandedSel = DemandedElts & ~KnownZero;
3685 if (DemandedSel != DemandedElts)
3698 APInt DemandedLHS(NumElts, 0);
3699 APInt DemandedRHS(NumElts, 0);
3700 for (
unsigned i = 0; i != NumElts; ++i) {
3701 int M = ShuffleMask[i];
3702 if (M < 0 || !DemandedElts[i])
3704 assert(0 <= M && M < (
int)(2 * NumElts) &&
"Shuffle index out of range");
3705 if (M < (
int)NumElts)
3708 DemandedRHS.
setBit(M - NumElts);
3714 bool FoldLHS = !DemandedLHS && !LHS.isUndef();
3715 bool FoldRHS = !DemandedRHS && !RHS.isUndef();
3716 if (FoldLHS || FoldRHS) {
3717 LHS = FoldLHS ? TLO.
DAG.
getUNDEF(LHS.getValueType()) : LHS;
3718 RHS = FoldRHS ? TLO.
DAG.
getUNDEF(RHS.getValueType()) : RHS;
3725 APInt UndefLHS, ZeroLHS;
3726 APInt UndefRHS, ZeroRHS;
3735 bool Updated =
false;
3736 bool IdentityLHS =
true, IdentityRHS =
true;
3738 for (
unsigned i = 0; i != NumElts; ++i) {
3739 int &M = NewMask[i];
3742 if (!DemandedElts[i] || (M < (
int)NumElts && UndefLHS[M]) ||
3743 (M >= (
int)NumElts && UndefRHS[M - NumElts])) {
3747 IdentityLHS &= (M < 0) || (M == (
int)i);
3748 IdentityRHS &= (M < 0) || ((M - NumElts) == i);
3753 if (Updated && !IdentityLHS && !IdentityRHS && !TLO.
LegalOps) {
3761 for (
unsigned i = 0; i != NumElts; ++i) {
3762 int M = ShuffleMask[i];
3765 }
else if (M < (
int)NumElts) {
3771 if (UndefRHS[M - NumElts])
3773 if (ZeroRHS[M - NumElts])
3782 APInt SrcUndef, SrcZero;
3784 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3785 APInt DemandedSrcElts = DemandedElts.
zext(NumSrcElts);
3793 Op.getValueSizeInBits() == Src.getValueSizeInBits() &&
3794 DemandedSrcElts == 1) {
3807 if (IsLE && DemandedSrcElts == 1 && Src.getOpcode() ==
ISD::AND &&
3808 Op->isOnlyUserOf(Src.getNode()) &&
3809 Op.getValueSizeInBits() == Src.getValueSizeInBits()) {
3811 EVT SrcVT = Src.getValueType();
3825 ISD::AND,
DL, SrcVT, {Src.getOperand(1), Mask})) {
3839 if (Op0 == Op1 &&
Op->isOnlyUserOf(Op0.
getNode())) {
3840 APInt UndefLHS, ZeroLHS;
3864 APInt UndefRHS, ZeroRHS;
3868 APInt UndefLHS, ZeroLHS;
3873 KnownZero = ZeroLHS & ZeroRHS;
3879 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3891 APInt UndefRHS, ZeroRHS;
3895 APInt UndefLHS, ZeroLHS;
3900 KnownZero = ZeroLHS;
3901 KnownUndef = UndefLHS & UndefRHS;
3906 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3917 APInt SrcUndef, SrcZero;
3931 KnownUndef &= DemandedElts;
3932 KnownZero &= DemandedElts;
3937 if (DemandedElts.
isSubsetOf(SrcZero | KnownZero | SrcUndef | KnownUndef))
3944 KnownZero |= SrcZero;
3945 KnownUndef &= SrcUndef;
3946 KnownUndef &= ~KnownZero;
3950 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3958 KnownZero, TLO,
Depth + 1))
3963 Op.getOperand(0), DemandedElts, TLO.
DAG,
Depth + 1))
3978 KnownZero, TLO,
Depth + 1))
3985 KnownZero, TLO,
Depth))
3991 TLO,
Depth, AssumeSingleUse))
3998 assert((KnownUndef & KnownZero) == 0 &&
"Elements flagged as undef AND zero");
4825 const SDLoc &dl)
const {
4835 bool N0ConstOrSplat =
4837 bool N1ConstOrSplat =
4845 if (N0ConstOrSplat && !N1ConstOrSplat &&
4848 return DAG.
getSetCC(dl, VT, N1, N0, SwappedCC);
4854 if (!N0ConstOrSplat && !N1ConstOrSplat &&
4859 return DAG.
getSetCC(dl, VT, N1, N0, SwappedCC);
4868 const APInt &C1 = N1C->getAPIntValue();
4884 !Attr.hasFnAttr(Attribute::MinSize)) {
4888 return DAG.
getNode(LogicOp, dl, VT, IsXZero, IsYZero);
4934 const APInt &C1 = N1C->getAPIntValue();
4950 if ((
C->getAPIntValue()+1).isPowerOf2()) {
4951 MinBits =
C->getAPIntValue().countr_one();
4962 MinBits = LN0->getMemoryVT().getSizeInBits();
4966 MinBits = LN0->getMemoryVT().getSizeInBits();
4977 MinBits >= ReqdBits) {
4982 if (MinBits == 1 && C1 == 1)
5001 if (TopSetCC.
getValueType() == MVT::i1 && VT == MVT::i1 &&
5035 unsigned bestWidth = 0, bestOffset = 0;
5036 if (Lod->isSimple() && Lod->isUnindexed() &&
5037 (Lod->getMemoryVT().isByteSized() ||
5039 unsigned memWidth = Lod->getMemoryVT().getStoreSizeInBits();
5041 unsigned maskWidth = origWidth;
5045 origWidth = Lod->getMemoryVT().getSizeInBits();
5049 for (
unsigned width = 8; width < origWidth; width *= 2) {
5054 unsigned maxOffset = origWidth - width;
5055 for (
unsigned offset = 0; offset <= maxOffset; offset += 8) {
5056 if (Mask.isSubsetOf(newMask)) {
5057 unsigned ptrOffset =
5059 unsigned IsFast = 0;
5060 assert((ptrOffset % 8) == 0 &&
"Non-Bytealigned pointer offset");
5065 *DAG.
getContext(), Layout, newVT, Lod->getAddressSpace(),
5066 NewAlign, Lod->getMemOperand()->getFlags(), &IsFast) &&
5068 bestOffset = ptrOffset / 8;
5069 bestMask = Mask.lshr(offset);
5082 SDValue Ptr = Lod->getBasePtr();
5083 if (bestOffset != 0)
5086 DAG.
getLoad(newVT, dl, Lod->getChain(), Ptr,
5087 Lod->getPointerInfo().getWithOffset(bestOffset),
5088 Lod->getBaseAlign());
5167 ExtDstTy != ExtSrcTy &&
"Unexpected types!");
5174 return DAG.
getSetCC(dl, VT, ZextOp,
5176 }
else if ((N1C->isZero() || N1C->isOne()) &&
5223 return DAG.
getSetCC(dl, VT, Val, N1,
5226 }
else if (N1C->isOne()) {
5309 optimizeSetCCOfSignedTruncationCheck(VT, N0, N1,
Cond, DCI, dl))
5316 const APInt &C1 = N1C->getAPIntValue();
5318 APInt MinVal, MaxVal;
5340 (!N1C->isOpaque() || (
C.getBitWidth() <= 64 &&
5360 (!N1C->isOpaque() || (
C.getBitWidth() <= 64 &&
5408 if (
SDValue CC = optimizeSetCCByHoistingAndByConstFromLogicalShift(
5409 VT, N0, N1,
Cond, DCI, dl))
5416 bool CmpZero = N1C->isZero();
5417 bool CmpNegOne = N1C->isAllOnes();
5418 if ((CmpZero || CmpNegOne) && N0.
hasOneUse()) {
5421 unsigned EltBits = V.getScalarValueSizeInBits();
5422 if (V.getOpcode() !=
ISD::OR || (EltBits % 2) != 0)
5430 RHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5433 Hi = RHS.getOperand(0);
5438 LHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5441 Hi = LHS.getOperand(0);
5449 unsigned HalfBits = EltBits / 2;
5460 if (IsConcat(N0,
Lo,
Hi))
5461 return MergeConcat(
Lo,
Hi);
5499 const APInt &C1 = N1C->getAPIntValue();
5514 unsigned ShCt = AndRHS->getAPIntValue().logBase2();
5515 if (AndRHS->getAPIntValue().isPowerOf2() &&
5522 }
else if (
Cond ==
ISD::SETEQ && C1 == AndRHS->getAPIntValue()) {
5542 const APInt &AndRHSC = AndRHS->getAPIntValue();
5586 APInt RangeWidth = NewC;
5595 const APInt &AddVal = AddC->getAPIntValue();
5597 APInt RangeLower = -AddVal;
5599 (void)RangeLower.
uadd_ov(RangeWidth, Overflow);
5600 if (!RangeWidth.
isZero() && !Overflow) {
5609 return DAG.
getSetCC(dl, VT, ShiftedAdd, CmpRHS, NewCond);
5618 return DAG.
getSetCC(dl, VT, Shift, CmpRHS, NewCond);
5626 assert(!CFP->getValueAPF().isNaN() &&
"Unexpected NaN value");
5647 !
isFPImmLegal(CFP->getValueAPF(), CFP->getValueType(0))) {
5666 if (CFP->getValueAPF().isInfinity()) {
5667 bool IsNegInf = CFP->getValueAPF().isNegative();
5678 return DAG.
getSetCC(dl, VT, N0, N1, NewCond);
5687 "Integer types should be handled by FoldSetCC");
5693 if (UOF ==
unsigned(EqTrue))
5698 if (NewCond !=
Cond &&
5701 return DAG.
getSetCC(dl, VT, N0, N1, NewCond);
5708 if ((isSignedIntSetCC(
Cond) || isUnsignedIntSetCC(
Cond)) &&
5745 bool LegalRHSImm =
false;
5753 DAG.
getConstant(RHSC->getAPIntValue() - LHSR->getAPIntValue(),
5761 DAG.
getConstant(LHSR->getAPIntValue() ^ RHSC->getAPIntValue(),
5771 DAG.
getConstant(SUBC->getAPIntValue() - RHSC->getAPIntValue(),
5776 if (RHSC->getValueType(0).getSizeInBits() <= 64)
5785 if (
SDValue V = foldSetCCWithBinOp(VT, N0, N1,
Cond, dl, DCI))
5791 if (
SDValue V = foldSetCCWithBinOp(VT, N1, N0,
Cond, dl, DCI))
5794 if (
SDValue V = foldSetCCWithAnd(VT, N0, N1,
Cond, dl, DCI))
5797 if (
SDValue V = foldSetCCWithOr(VT, N0, N1,
Cond, dl, DCI))
5806 if (!
isIntDivCheap(VT, Attr) && !Attr.hasFnAttr(Attribute::MinSize)) {
5808 if (
SDValue Folded = buildUREMEqFold(VT, N0, N1,
Cond, DCI, dl))
5811 if (
SDValue Folded = buildSREMEqFold(VT, N0, N1,
Cond, DCI, dl))
5824 N0 = DAG.
getNOT(dl, Temp, OpVT);
5833 Temp = DAG.
getNOT(dl, N0, OpVT);
5840 Temp = DAG.
getNOT(dl, N1, OpVT);
5847 Temp = DAG.
getNOT(dl, N0, OpVT);
5854 Temp = DAG.
getNOT(dl, N1, OpVT);
5863 N0 = DAG.
getNode(ExtendCode, dl, VT, N0);