3348 unsigned Depth)
const {
3349 unsigned BitWidth =
Op.getScalarValueSizeInBits();
3353 if (
auto OptAPInt =
Op->bitcastToAPInt()) {
3363 assert((!
Op.getValueType().isScalableVector() || NumElts == 1) &&
3364 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3365 assert((!
Op.getValueType().isFixedLengthVector() ||
3366 NumElts ==
Op.getValueType().getVectorNumElements()) &&
3367 "Unexpected vector size");
3372 unsigned Opcode =
Op.getOpcode();
3386 "Expected SPLAT_VECTOR implicit truncation");
3393 unsigned ScalarSize =
Op.getOperand(0).getScalarValueSizeInBits();
3395 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3402 const APInt &Step =
Op.getConstantOperandAPInt(0);
3411 const APInt MinNumElts =
3417 .
umul_ov(MinNumElts, Overflow);
3421 const APInt MaxValue = (MaxNumElts - 1).
umul_ov(Step, Overflow);
3429 assert(!
Op.getValueType().isScalableVector());
3431 Known.setAllConflict();
3432 for (
unsigned i = 0, e =
Op.getNumOperands(); i != e; ++i) {
3433 if (!DemandedElts[i])
3445 "Expected BUILD_VECTOR implicit truncation");
3453 if (
Known.isUnknown())
3458 if (
Known.hasConflict())
3466 if (
Known.isUnknown())
3473 assert(!
Op.getValueType().isScalableVector());
3476 APInt DemandedLHS, DemandedRHS;
3480 DemandedLHS, DemandedRHS))
3484 Known.setAllConflict();
3485 if (!!DemandedLHS) {
3491 if (
Known.isUnknown())
3493 if (!!DemandedRHS) {
3502 const APInt &Multiplier =
Op.getConstantOperandAPInt(0);
3507 if (
Op.getValueType().isScalableVector())
3510 Known.setAllConflict();
3511 EVT SubVectorVT =
Op.getOperand(0).getValueType();
3513 unsigned NumSubVectors =
Op.getNumOperands();
3514 for (
unsigned i = 0; i != NumSubVectors; ++i) {
3516 DemandedElts.
extractBits(NumSubVectorElts, i * NumSubVectorElts);
3517 if (!!DemandedSub) {
3523 if (
Known.isUnknown())
3529 if (
Op.getValueType().isScalableVector())
3535 uint64_t Idx =
Op.getConstantOperandVal(2);
3536 unsigned NumSubElts =
Sub.getValueType().getVectorNumElements();
3538 APInt DemandedSrcElts = DemandedElts;
3539 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
3541 Known.setAllConflict();
3542 if (!!DemandedSubElts) {
3544 if (
Known.isUnknown())
3547 if (!!DemandedSrcElts) {
3557 APInt DemandedSrcElts;
3558 if (Src.getValueType().isScalableVector())
3559 DemandedSrcElts =
APInt(1, 1);
3561 uint64_t Idx =
Op.getConstantOperandVal(1);
3562 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3563 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
3569 if (
Op.getValueType().isScalableVector())
3573 if (DemandedElts != 1)
3584 if (
Op.getValueType().isScalableVector())
3604 if ((
BitWidth % SubBitWidth) == 0) {
3611 unsigned SubScale =
BitWidth / SubBitWidth;
3612 APInt SubDemandedElts(NumElts * SubScale, 0);
3613 for (
unsigned i = 0; i != NumElts; ++i)
3614 if (DemandedElts[i])
3615 SubDemandedElts.
setBit(i * SubScale);
3617 for (
unsigned i = 0; i != SubScale; ++i) {
3620 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3621 Known.insertBits(Known2, SubBitWidth * Shifts);
3626 if ((SubBitWidth %
BitWidth) == 0) {
3627 assert(
Op.getValueType().isVector() &&
"Expected bitcast to vector");
3632 unsigned SubScale = SubBitWidth /
BitWidth;
3633 APInt SubDemandedElts =
3637 Known.setAllConflict();
3638 for (
unsigned i = 0; i != NumElts; ++i)
3639 if (DemandedElts[i]) {
3640 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3644 if (
Known.isUnknown())
3671 bool SelfMultiply =
Op.getOperand(0) ==
Op.getOperand(1);
3682 if (
Op->getFlags().hasNoSignedWrap() &&
3683 Op.getOperand(0) ==
Op.getOperand(1) &&
3684 !
Known.isNegative())
3685 Known.makeNonNegative();
3710 unsigned SignBits1 =
3714 unsigned SignBits0 =
3716 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3720 assert((
Op.getResNo() == 0 ||
Op.getResNo() == 1) &&
"Unknown result");
3723 bool SelfMultiply =
Op.getOperand(0) ==
Op.getOperand(1);
3724 if (
Op.getResNo() == 0)
3731 assert((
Op.getResNo() == 0 ||
Op.getResNo() == 1) &&
"Unknown result");
3734 bool SelfMultiply =
Op.getOperand(0) ==
Op.getOperand(1);
3735 if (
Op.getResNo() == 0)
3769 if (
Known.isUnknown())
3779 if (
Known.isUnknown())
3788 if (
Op.getResNo() != 1)
3794 if (TLI->getBooleanContents(
Op.getValueType().isVector(),
false) ==
3797 Known.Zero.setBitsFrom(1);
3803 unsigned OpNo =
Op->isStrictFPOpcode() ? 1 : 0;
3805 if (TLI->getBooleanContents(
Op.getOperand(OpNo).getValueType()) ==
3808 Known.Zero.setBitsFrom(1);
3815 bool NUW =
Op->getFlags().hasNoUnsignedWrap();
3816 bool NSW =
Op->getFlags().hasNoSignedWrap();
3823 if (std::optional<unsigned> ShMinAmt =
3825 Known.Zero.setLowBits(*ShMinAmt);
3832 Op->getFlags().hasExact());
3835 if (std::optional<unsigned> ShMinAmt =
3837 Known.Zero.setHighBits(*ShMinAmt);
3843 Op->getFlags().hasExact());
3849 unsigned Amt =
C->getAPIntValue().urem(
BitWidth);
3864 unsigned Amt =
C->getAPIntValue().urem(
BitWidth);
3870 DemandedElts,
Depth + 1);
3886 assert((
Op.getResNo() == 0 ||
Op.getResNo() == 1) &&
"Unknown result");
3889 unsigned LoBits =
Op.getOperand(0).getScalarValueSizeInBits();
3890 unsigned HiBits =
Op.getOperand(1).getScalarValueSizeInBits();
3907 if (
Op.getResNo() == 0)
3925 Known.Zero.setBitsFrom(LowBits);
3934 Known.Zero.setBitsFrom(LowBits);
3938 unsigned MinRedundantSignBits =
3954 Known.Zero.setBitsFrom(1);
3990 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3995 !
Op.getValueType().isScalableVector()) {
4007 Known.setAllConflict();
4008 for (
unsigned i = 0; i != NumElts; ++i) {
4009 if (!DemandedElts[i])
4019 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4025 Known.One.clearAllBits();
4026 Known.Zero.clearAllBits();
4038 }
else if (
Op.getResNo() == 0) {
4039 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4040 KnownBits KnownScalarMemory(ScalarMemorySize);
4041 if (
const MDNode *MD = LD->getRanges())
4052 Known = KnownScalarMemory;
4059 if (
Op.getValueType().isScalableVector())
4061 EVT InVT =
Op.getOperand(0).getValueType();
4073 if (
Op.getValueType().isScalableVector())
4075 EVT InVT =
Op.getOperand(0).getValueType();
4091 if (
Op.getValueType().isScalableVector())
4093 EVT InVT =
Op.getOperand(0).getValueType();
4128 Known.Zero |= (~InMask);
4139 Known.Zero.setLowBits(LogOfAlign);
4140 Known.One.clearLowBits(LogOfAlign);
4149 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4151 Known.makeNonNegative();
4155 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4157 Known.makeNegative();
4165 Known.makeNonNegative();
4169 Known.Zero.setBitsFrom(1);
4175 bool SelfAdd =
Op.getOperand(0) ==
Op.getOperand(1) &&
4177 Op.getOperand(0), DemandedElts,
4180 Flags.hasNoUnsignedWrap(), SelfAdd);
4188 Flags.hasNoUnsignedWrap());
4195 if (
Op.getResNo() == 1) {
4197 if (TLI->getBooleanContents(
Op.getOperand(0).getValueType()) ==
4200 Known.Zero.setBitsFrom(1);
4206 "We only compute knownbits for the difference here.");
4213 Borrow = Borrow.
trunc(1);
4227 if (
Op.getResNo() == 1) {
4229 if (TLI->getBooleanContents(
Op.getOperand(0).getValueType()) ==
4232 Known.Zero.setBitsFrom(1);
4238 assert(
Op.getResNo() == 0 &&
"We only compute knownbits for the sum here.");
4248 Carry = Carry.
trunc(1);
4284 const unsigned Index =
Op.getConstantOperandVal(1);
4285 const unsigned EltBitWidth =
Op.getValueSizeInBits();
4288 Known.Zero =
Known.Zero.getHiBits(
Known.getBitWidth() - Index * EltBitWidth);
4289 Known.One =
Known.One.getHiBits(
Known.getBitWidth() - Index * EltBitWidth);
4314 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4324 if (
Op.getValueType().isScalableVector())
4333 bool DemandedVal =
true;
4334 APInt DemandedVecElts = DemandedElts;
4336 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4337 unsigned EltIdx = CEltNo->getZExtValue();
4338 DemandedVal = !!DemandedElts[EltIdx];
4341 Known.setAllConflict();
4346 if (!!DemandedVecElts) {
4366 Known.Zero.setHighBits(
4398 if (CstLow && CstHigh) {
4403 const APInt &ValueHigh = CstHigh->getAPIntValue();
4404 if (ValueLow.
sle(ValueHigh)) {
4407 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4409 Known.One.setHighBits(MinSignBits);
4413 Known.Zero.setHighBits(MinSignBits);
4430 if (IsMax && CstLow) {
4441 Known.makeNonNegative();
4447 Known.makeNonNegative();
4449 Known.makeNegative();
4460 if (
Op.getResNo() == 0) {
4462 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4463 KnownBits KnownScalarMemory(ScalarMemorySize);
4464 if (
const MDNode *MD = AT->getRanges())
4467 switch (AT->getExtensionType()) {
4475 switch (TLI->getExtendForAtomicOps()) {
4488 Known = KnownScalarMemory;
4496 if (
Op.getResNo() == 1) {
4501 if (TLI->getBooleanContents(
Op.getValueType().isVector(),
false) ==
4504 Known.Zero.setBitsFrom(1);
4522 if (
Op.getResNo() == 0) {
4524 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4527 Known.Zero.setBitsFrom(MemBits);
4535 TLI->computeKnownBitsForStackObjectPointer(
4536 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4548 TLI->computeKnownBitsForTargetNode(
Op,
Known, DemandedElts, *
this,
Depth);
4906 unsigned Depth)
const {
4907 EVT VT =
Op.getValueType();
4912 unsigned FirstAnswer = 1;
4915 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4918 const APInt &Val =
C->getAPIntValue();
4928 unsigned Opcode =
Op.getOpcode();
4933 return VTBits-Tmp+1;
4947 unsigned NumSrcBits =
Op.getOperand(0).getValueSizeInBits();
4949 if (NumSrcSignBits > (NumSrcBits - VTBits))
4950 return NumSrcSignBits - (NumSrcBits - VTBits);
4956 for (
unsigned i = 0, e =
Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4957 if (!DemandedElts[i])
4964 APInt T =
C->getAPIntValue().trunc(VTBits);
4965 Tmp2 =
T.getNumSignBits();
4969 if (
SrcOp.getValueSizeInBits() != VTBits) {
4971 "Expected BUILD_VECTOR implicit truncation");
4972 unsigned ExtraBits =
SrcOp.getValueSizeInBits() - VTBits;
4973 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4976 Tmp = std::min(Tmp, Tmp2);
4987 Tmp = std::min(Tmp, Tmp2);
4994 APInt DemandedLHS, DemandedRHS;
4998 DemandedLHS, DemandedRHS))
5001 Tmp = std::numeric_limits<unsigned>::max();
5004 if (!!DemandedRHS) {
5006 Tmp = std::min(Tmp, Tmp2);
5011 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5027 if (VTBits == SrcBits)
5033 if ((SrcBits % VTBits) == 0) {
5036 unsigned Scale = SrcBits / VTBits;
5037 APInt SrcDemandedElts =
5047 for (
unsigned i = 0; i != NumElts; ++i)
5048 if (DemandedElts[i]) {
5049 unsigned SubOffset = i % Scale;
5050 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5051 SubOffset = SubOffset * VTBits;
5052 if (Tmp <= SubOffset)
5054 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5064 return VTBits - Tmp + 1;
5066 Tmp = VTBits -
Op.getOperand(0).getScalarValueSizeInBits();
5073 return std::max(Tmp, Tmp2);
5078 EVT SrcVT = Src.getValueType();
5086 if (std::optional<unsigned> ShAmt =
5088 Tmp = std::min(Tmp + *ShAmt, VTBits);
5091 if (std::optional<ConstantRange> ShAmtRange =
5093 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5094 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5105 unsigned SizeDifference =
5107 if (SizeDifference <= MinShAmt) {
5108 Tmp = SizeDifference +
5111 return Tmp - MaxShAmt;
5117 return Tmp - MaxShAmt;
5127 FirstAnswer = std::min(Tmp, Tmp2);
5137 if (Tmp == 1)
return 1;
5139 return std::min(Tmp, Tmp2);
5142 if (Tmp == 1)
return 1;
5144 return std::min(Tmp, Tmp2);
5156 if (CstLow && CstHigh) {
5161 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5162 return std::min(Tmp, Tmp2);
5171 return std::min(Tmp, Tmp2);
5179 return std::min(Tmp, Tmp2);
5183 if (
Op.getResNo() == 0 &&
Op.getOperand(0) ==
Op.getOperand(1))
5194 if (
Op.getResNo() != 1)
5200 if (TLI->getBooleanContents(VT.
isVector(),
false) ==
5208 unsigned OpNo =
Op->isStrictFPOpcode() ? 1 : 0;
5210 if (TLI->getBooleanContents(
Op.getOperand(OpNo).getValueType()) ==
5217 if (TLI->getBooleanContents(VT.
isVector(),
false) ==
5226 Tmp, VTBits,
C ? std::optional(
C->getAPIntValue()) : std::nullopt,
5234 if (Tmp == 1)
return 1;
5239 if (CRHS->isAllOnes()) {
5245 if ((
Known.Zero | 1).isAllOnes())
5250 if (
Known.isNonNegative())
5255 if (Tmp2 == 1)
return 1;
5259 return std::min(Tmp, Tmp2) - 1;
5262 if (Tmp2 == 1)
return 1;
5267 if (CLHS->isZero()) {
5272 if ((
Known.Zero | 1).isAllOnes())
5277 if (
Known.isNonNegative())
5286 if (Tmp == 1)
return 1;
5287 return std::min(Tmp, Tmp2) - 1;
5291 if (SignBitsOp0 == 1)
5294 if (SignBitsOp1 == 1)
5296 unsigned OutValidBits =
5297 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5298 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5306 return std::min(Tmp, Tmp2);
5315 unsigned NumSrcBits =
Op.getOperand(0).getScalarValueSizeInBits();
5317 if (NumSrcSignBits > (NumSrcBits - VTBits))
5318 return NumSrcSignBits - (NumSrcBits - VTBits);
5325 const int BitWidth =
Op.getValueSizeInBits();
5326 const int Items =
Op.getOperand(0).getValueSizeInBits() /
BitWidth;
5330 const int rIndex = Items - 1 -
Op.getConstantOperandVal(1);
5345 bool DemandedVal =
true;
5346 APInt DemandedVecElts = DemandedElts;
5348 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5349 unsigned EltIdx = CEltNo->getZExtValue();
5350 DemandedVal = !!DemandedElts[EltIdx];
5353 Tmp = std::numeric_limits<unsigned>::max();
5359 Tmp = std::min(Tmp, Tmp2);
5361 if (!!DemandedVecElts) {
5363 Tmp = std::min(Tmp, Tmp2);
5365 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5375 const unsigned BitWidth =
Op.getValueSizeInBits();
5376 const unsigned EltBitWidth =
Op.getOperand(0).getScalarValueSizeInBits();
5389 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5399 APInt DemandedSrcElts;
5400 if (Src.getValueType().isScalableVector())
5401 DemandedSrcElts =
APInt(1, 1);
5403 uint64_t Idx =
Op.getConstantOperandVal(1);
5404 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5405 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
5414 Tmp = std::numeric_limits<unsigned>::max();
5415 EVT SubVectorVT =
Op.getOperand(0).getValueType();
5417 unsigned NumSubVectors =
Op.getNumOperands();
5418 for (
unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5420 DemandedElts.
extractBits(NumSubVectorElts, i * NumSubVectorElts);
5424 Tmp = std::min(Tmp, Tmp2);
5426 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5436 uint64_t Idx =
Op.getConstantOperandVal(2);
5437 unsigned NumSubElts =
Sub.getValueType().getVectorNumElements();
5439 APInt DemandedSrcElts = DemandedElts;
5440 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
5442 Tmp = std::numeric_limits<unsigned>::max();
5443 if (!!DemandedSubElts) {
5448 if (!!DemandedSrcElts) {
5450 Tmp = std::min(Tmp, Tmp2);
5452 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5457 if (
Op.getResNo() != 0)
5461 if (
const MDNode *Ranges = LD->getRanges()) {
5462 if (DemandedElts != 1)
5467 switch (LD->getExtensionType()) {
5485 unsigned ExtType = LD->getExtensionType();
5490 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5491 return VTBits - Tmp + 1;
5493 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5494 return VTBits - Tmp;
5496 if (
const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5499 Type *CstTy = Cst->getType();
5504 for (
unsigned i = 0; i != NumElts; ++i) {
5505 if (!DemandedElts[i])
5510 Tmp = std::min(Tmp,
Value.getNumSignBits());
5514 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5515 Tmp = std::min(Tmp,
Value.getNumSignBits());
5547 if (
Op.getResNo() == 0) {
5548 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5554 switch (AT->getExtensionType()) {
5558 return VTBits - Tmp + 1;
5560 return VTBits - Tmp;
5565 return VTBits - Tmp + 1;
5567 return VTBits - Tmp;
5582 TLI->ComputeNumSignBitsForTargetNode(
Op, DemandedElts, *
this,
Depth);
5584 FirstAnswer = std::max(FirstAnswer, NumBits);
5591 return std::max(FirstAnswer,
Known.countMinSignBits());
6536 unsigned Depth)
const {
6540 EVT OpVT =
Op.getValueType();
6543 assert(!
Op.getValueType().isFloatingPoint() &&
6544 "Floating point types unsupported - use isKnownNeverLogicalZero");
6558 switch (
Op.getOpcode()) {
6577 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6594 if (
Op->getFlags().hasNoSignedWrap() ||
Op->getFlags().hasNoUnsignedWrap())
6599 if (ValKnown.
One[0])
6611 if (
Op.getValueType().isScalableVector())
6619 APInt DemandedLHS, DemandedRHS;
6621 assert(NumElts == SVN->getMask().size() &&
"Unexpected vector size");
6623 DemandedLHS, DemandedRHS))
6626 return (!DemandedLHS ||
6685 if (
Op->getFlags().hasExact())
6703 if (
Op->getFlags().hasExact())
6708 if (
Op->getFlags().hasNoUnsignedWrap())
6726 if (
Op->getFlags().hasNoSignedWrap() ||
Op->getFlags().hasNoUnsignedWrap())
6737 const APInt &Multiplier =
Op.getConstantOperandAPInt(0);
7638 const APInt &Val =
C->getAPIntValue();
7642 C->isTargetOpcode(),
C->isOpaque());
7649 C->isTargetOpcode(),
C->isOpaque());
7654 C->isTargetOpcode(),
C->isOpaque());
7656 C->isTargetOpcode(),
C->isOpaque());
7685 C->isTargetOpcode(),
C->isOpaque());
7711 if (VT == MVT::f16 &&
C->getValueType(0) == MVT::i16)
7713 if (VT == MVT::f32 &&
C->getValueType(0) == MVT::i32)
7715 if (VT == MVT::f64 &&
C->getValueType(0) == MVT::i64)
7717 if (VT == MVT::f128 &&
C->getValueType(0) == MVT::i128)
7778 return getConstant(V.bitcastToAPInt().getZExtValue(),
DL, VT);
7781 if (VT == MVT::i16 &&
C->getValueType(0) == MVT::f16)
7782 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(),
DL,
7784 if (VT == MVT::i16 &&
C->getValueType(0) == MVT::bf16)
7785 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(),
DL,
7787 if (VT == MVT::i32 &&
C->getValueType(0) == MVT::f32)
7790 if (VT == MVT::i64 &&
C->getValueType(0) == MVT::f64)
7791 return getConstant(V.bitcastToAPInt().getZExtValue(),
DL, VT);
7818 "Expected vector reduction base opcode to be foldable");
7833 if (C1->isOpaque() || C2->isOpaque())
7836 std::optional<APInt> FoldAttempt =
7837 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7843 "Can't fold vectors ops with scalar operands");
7851 if (TLI->isCommutativeBinOp(Opcode))
7867 const APInt &Val = C1->getAPIntValue();
7868 return SignExtendInReg(Val, VT);
7881 ScalarOps.
push_back(SignExtendInReg(Val, OpVT));
7889 SignExtendInReg(
Ops[0].getConstantOperandAPInt(0),
7900 if (C1 && C2 && C3) {
7901 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7903 const APInt &
V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7904 &
V3 = C3->getAPIntValue();
7920 if (C1 && C2 && C3) {
7952 unsigned InputEltBits =
Ops[1].getScalarValueSizeInBits();
7954 unsigned NumInputElts =
Ops[1].getValueType().getVectorNumElements();
7958 for (
unsigned I = 0;
I != NumAccElts; ++
I) {
7965 if (!
C ||
C->isOpaque())
7967 Results[
I] =
C->getAPIntValue().trunc(AccEltBits);
7972 for (
unsigned I = 0;
I != NumInputElts; ++
I) {
7973 const unsigned AccIdx =
I % NumAccElts;
7978 PoisonElts.
set(AccIdx);
7984 if (!LHS || !RHS || LHS->isOpaque() || RHS->isOpaque())
7987 APInt LHSVal = LHS->getAPIntValue().
trunc(InputEltBits);
7988 APInt RHSVal = RHS->getAPIntValue().
trunc(InputEltBits);
7989 LHSVal = IsLHSSigned ? LHSVal.
sext(AccEltBits) : LHSVal.
zext(AccEltBits);
7990 RHSVal = IsRHSSigned ? RHSVal.
sext(AccEltBits) : RHSVal.
zext(AccEltBits);
7991 Results[AccIdx] += LHSVal * RHSVal;
8000 EVT LegalSVT = AccEltVT;
8002 LegalSVT = TLI->getTypeToTransformTo(*
getContext(), LegalSVT);
8003 if (LegalSVT.
bitsLT(AccEltVT))
8008 for (
unsigned I = 0;
I != NumAccElts; ++
I)
8020 Ops[0].getValueType() == VT &&
Ops[1].getValueType() == VT &&
8033 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
8034 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
8038 Opcode, RawBits1[
I], UndefElts1[
I], RawBits2[
I], UndefElts2[
I]);
8049 BVEltVT = BV1->getOperand(0).getValueType();
8052 BVEltVT = BV2->getOperand(0).getValueType();
8058 DstBits, RawBits, DstUndefs,
8061 for (
unsigned I = 0, E = DstBits.
size();
I != E; ++
I) {
8086 ?
Ops[0].getConstantOperandAPInt(0) * RHSVal
8087 :
Ops[0].getConstantOperandAPInt(0) << RHSVal;
8092 auto IsScalarOrSameVectorSize = [NumElts](
const SDValue &
Op) {
8093 return !
Op.getValueType().isVector() ||
8094 Op.getValueType().getVectorElementCount() == NumElts;
8097 auto IsBuildVectorSplatVectorOrUndef = [](
const SDValue &
Op) {
8123 LegalSVT = TLI->getTypeToTransformTo(*
getContext(), LegalSVT);
8135 for (
unsigned I = 0;
I != NumVectorElts;
I++) {
8138 EVT InSVT =
Op.getValueType().getScalarType();
8181 if (LegalSVT != SVT)
8182 ScalarResult =
getNode(ExtendCode,
DL, LegalSVT, ScalarResult);