3349 unsigned Depth)
const {
3350 unsigned BitWidth =
Op.getScalarValueSizeInBits();
3354 if (
auto OptAPInt =
Op->bitcastToAPInt()) {
3364 assert((!
Op.getValueType().isScalableVector() || NumElts == 1) &&
3365 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3366 assert((!
Op.getValueType().isFixedLengthVector() ||
3367 NumElts ==
Op.getValueType().getVectorNumElements()) &&
3368 "Unexpected vector size");
3373 unsigned Opcode =
Op.getOpcode();
3387 "Expected SPLAT_VECTOR implicit truncation");
3394 unsigned ScalarSize =
Op.getOperand(0).getScalarValueSizeInBits();
3396 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3403 const APInt &Step =
Op.getConstantOperandAPInt(0);
3412 const APInt MinNumElts =
3418 .
umul_ov(MinNumElts, Overflow);
3422 const APInt MaxValue = (MaxNumElts - 1).
umul_ov(Step, Overflow);
3430 assert(!
Op.getValueType().isScalableVector());
3432 Known.setAllConflict();
3433 for (
unsigned i = 0, e =
Op.getNumOperands(); i != e; ++i) {
3434 if (!DemandedElts[i])
3446 "Expected BUILD_VECTOR implicit truncation");
3454 if (
Known.isUnknown())
3459 if (
Known.hasConflict())
3467 if (
Known.isUnknown())
3474 assert(!
Op.getValueType().isScalableVector());
3477 APInt DemandedLHS, DemandedRHS;
3481 DemandedLHS, DemandedRHS))
3485 Known.setAllConflict();
3486 if (!!DemandedLHS) {
3492 if (
Known.isUnknown())
3494 if (!!DemandedRHS) {
3503 const APInt &Multiplier =
Op.getConstantOperandAPInt(0);
3508 if (
Op.getValueType().isScalableVector())
3511 Known.setAllConflict();
3512 EVT SubVectorVT =
Op.getOperand(0).getValueType();
3514 unsigned NumSubVectors =
Op.getNumOperands();
3515 for (
unsigned i = 0; i != NumSubVectors; ++i) {
3517 DemandedElts.
extractBits(NumSubVectorElts, i * NumSubVectorElts);
3518 if (!!DemandedSub) {
3524 if (
Known.isUnknown())
3530 if (
Op.getValueType().isScalableVector())
3536 uint64_t Idx =
Op.getConstantOperandVal(2);
3537 unsigned NumSubElts =
Sub.getValueType().getVectorNumElements();
3539 APInt DemandedSrcElts = DemandedElts;
3540 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
3542 Known.setAllConflict();
3543 if (!!DemandedSubElts) {
3545 if (
Known.isUnknown())
3548 if (!!DemandedSrcElts) {
3558 APInt DemandedSrcElts;
3559 if (Src.getValueType().isScalableVector())
3560 DemandedSrcElts =
APInt(1, 1);
3562 uint64_t Idx =
Op.getConstantOperandVal(1);
3563 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3564 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
3570 if (
Op.getValueType().isScalableVector())
3574 if (DemandedElts != 1)
3585 if (
Op.getValueType().isScalableVector())
3605 if ((
BitWidth % SubBitWidth) == 0) {
3612 unsigned SubScale =
BitWidth / SubBitWidth;
3613 APInt SubDemandedElts(NumElts * SubScale, 0);
3614 for (
unsigned i = 0; i != NumElts; ++i)
3615 if (DemandedElts[i])
3616 SubDemandedElts.
setBit(i * SubScale);
3618 for (
unsigned i = 0; i != SubScale; ++i) {
3621 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3622 Known.insertBits(Known2, SubBitWidth * Shifts);
3627 if ((SubBitWidth %
BitWidth) == 0) {
3628 assert(
Op.getValueType().isVector() &&
"Expected bitcast to vector");
3633 unsigned SubScale = SubBitWidth /
BitWidth;
3634 APInt SubDemandedElts =
3638 Known.setAllConflict();
3639 for (
unsigned i = 0; i != NumElts; ++i)
3640 if (DemandedElts[i]) {
3641 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3645 if (
Known.isUnknown())
3672 bool SelfMultiply =
Op.getOperand(0) ==
Op.getOperand(1);
3683 if (
Op->getFlags().hasNoSignedWrap() &&
3684 Op.getOperand(0) ==
Op.getOperand(1) &&
3685 !
Known.isNegative())
3686 Known.makeNonNegative();
3711 unsigned SignBits1 =
3715 unsigned SignBits0 =
3717 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3721 assert((
Op.getResNo() == 0 ||
Op.getResNo() == 1) &&
"Unknown result");
3724 bool SelfMultiply =
Op.getOperand(0) ==
Op.getOperand(1);
3725 if (
Op.getResNo() == 0)
3732 assert((
Op.getResNo() == 0 ||
Op.getResNo() == 1) &&
"Unknown result");
3735 bool SelfMultiply =
Op.getOperand(0) ==
Op.getOperand(1);
3736 if (
Op.getResNo() == 0)
3770 if (
Known.isUnknown())
3780 if (
Known.isUnknown())
3789 if (
Op.getResNo() != 1)
3795 if (TLI->getBooleanContents(
Op.getValueType().isVector(),
false) ==
3798 Known.Zero.setBitsFrom(1);
3804 unsigned OpNo =
Op->isStrictFPOpcode() ? 1 : 0;
3806 if (TLI->getBooleanContents(
Op.getOperand(OpNo).getValueType()) ==
3809 Known.Zero.setBitsFrom(1);
3816 bool NUW =
Op->getFlags().hasNoUnsignedWrap();
3817 bool NSW =
Op->getFlags().hasNoSignedWrap();
3824 if (std::optional<unsigned> ShMinAmt =
3826 Known.Zero.setLowBits(*ShMinAmt);
3833 Op->getFlags().hasExact());
3836 if (std::optional<unsigned> ShMinAmt =
3838 Known.Zero.setHighBits(*ShMinAmt);
3844 Op->getFlags().hasExact());
3850 unsigned Amt =
C->getAPIntValue().urem(
BitWidth);
3865 unsigned Amt =
C->getAPIntValue().urem(
BitWidth);
3871 DemandedElts,
Depth + 1);
3887 assert((
Op.getResNo() == 0 ||
Op.getResNo() == 1) &&
"Unknown result");
3890 unsigned LoBits =
Op.getOperand(0).getScalarValueSizeInBits();
3891 unsigned HiBits =
Op.getOperand(1).getScalarValueSizeInBits();
3908 if (
Op.getResNo() == 0)
3926 Known.Zero.setBitsFrom(LowBits);
3935 Known.Zero.setBitsFrom(LowBits);
3939 unsigned MinRedundantSignBits =
3955 Known.Zero.setBitsFrom(1);
3991 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3996 !
Op.getValueType().isScalableVector()) {
4008 Known.setAllConflict();
4009 for (
unsigned i = 0; i != NumElts; ++i) {
4010 if (!DemandedElts[i])
4020 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4026 Known.One.clearAllBits();
4027 Known.Zero.clearAllBits();
4039 }
else if (
Op.getResNo() == 0) {
4040 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4041 KnownBits KnownScalarMemory(ScalarMemorySize);
4042 if (
const MDNode *MD = LD->getRanges())
4053 Known = KnownScalarMemory;
4060 if (
Op.getValueType().isScalableVector())
4062 EVT InVT =
Op.getOperand(0).getValueType();
4074 if (
Op.getValueType().isScalableVector())
4076 EVT InVT =
Op.getOperand(0).getValueType();
4092 if (
Op.getValueType().isScalableVector())
4094 EVT InVT =
Op.getOperand(0).getValueType();
4129 Known.Zero |= (~InMask);
4140 Known.Zero.setLowBits(LogOfAlign);
4141 Known.One.clearLowBits(LogOfAlign);
4150 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4152 Known.makeNonNegative();
4156 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4158 Known.makeNegative();
4166 Known.makeNonNegative();
4170 Known.Zero.setBitsFrom(1);
4176 bool SelfAdd =
Op.getOperand(0) ==
Op.getOperand(1) &&
4178 Op.getOperand(0), DemandedElts,
4181 Flags.hasNoUnsignedWrap(), SelfAdd);
4189 Flags.hasNoUnsignedWrap());
4196 if (
Op.getResNo() == 1) {
4198 if (TLI->getBooleanContents(
Op.getOperand(0).getValueType()) ==
4201 Known.Zero.setBitsFrom(1);
4207 "We only compute knownbits for the difference here.");
4214 Borrow = Borrow.
trunc(1);
4228 if (
Op.getResNo() == 1) {
4230 if (TLI->getBooleanContents(
Op.getOperand(0).getValueType()) ==
4233 Known.Zero.setBitsFrom(1);
4239 assert(
Op.getResNo() == 0 &&
"We only compute knownbits for the sum here.");
4249 Carry = Carry.
trunc(1);
4285 const unsigned Index =
Op.getConstantOperandVal(1);
4286 const unsigned EltBitWidth =
Op.getValueSizeInBits();
4289 Known.Zero =
Known.Zero.getHiBits(
Known.getBitWidth() - Index * EltBitWidth);
4290 Known.One =
Known.One.getHiBits(
Known.getBitWidth() - Index * EltBitWidth);
4315 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4325 if (
Op.getValueType().isScalableVector())
4334 bool DemandedVal =
true;
4335 APInt DemandedVecElts = DemandedElts;
4337 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4338 unsigned EltIdx = CEltNo->getZExtValue();
4339 DemandedVal = !!DemandedElts[EltIdx];
4342 Known.setAllConflict();
4347 if (!!DemandedVecElts) {
4367 Known.Zero.setHighBits(
4399 if (CstLow && CstHigh) {
4404 const APInt &ValueHigh = CstHigh->getAPIntValue();
4405 if (ValueLow.
sle(ValueHigh)) {
4408 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4410 Known.One.setHighBits(MinSignBits);
4414 Known.Zero.setHighBits(MinSignBits);
4431 if (IsMax && CstLow) {
4442 Known.makeNonNegative();
4448 Known.makeNonNegative();
4450 Known.makeNegative();
4461 if (
Op.getResNo() == 0) {
4463 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4464 KnownBits KnownScalarMemory(ScalarMemorySize);
4465 if (
const MDNode *MD = AT->getRanges())
4468 switch (AT->getExtensionType()) {
4476 switch (TLI->getExtendForAtomicOps()) {
4489 Known = KnownScalarMemory;
4497 if (
Op.getResNo() == 1) {
4502 if (TLI->getBooleanContents(
Op.getValueType().isVector(),
false) ==
4505 Known.Zero.setBitsFrom(1);
4523 if (
Op.getResNo() == 0) {
4525 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4528 Known.Zero.setBitsFrom(MemBits);
4536 TLI->computeKnownBitsForStackObjectPointer(
4537 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4549 TLI->computeKnownBitsForTargetNode(
Op,
Known, DemandedElts, *
this,
Depth);
4907 unsigned Depth)
const {
4908 EVT VT =
Op.getValueType();
4913 unsigned FirstAnswer = 1;
4916 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4919 const APInt &Val =
C->getAPIntValue();
4929 unsigned Opcode =
Op.getOpcode();
4934 return VTBits-Tmp+1;
4948 unsigned NumSrcBits =
Op.getOperand(0).getValueSizeInBits();
4950 if (NumSrcSignBits > (NumSrcBits - VTBits))
4951 return NumSrcSignBits - (NumSrcBits - VTBits);
4957 for (
unsigned i = 0, e =
Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4958 if (!DemandedElts[i])
4965 APInt T =
C->getAPIntValue().trunc(VTBits);
4966 Tmp2 =
T.getNumSignBits();
4970 if (
SrcOp.getValueSizeInBits() != VTBits) {
4972 "Expected BUILD_VECTOR implicit truncation");
4973 unsigned ExtraBits =
SrcOp.getValueSizeInBits() - VTBits;
4974 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4977 Tmp = std::min(Tmp, Tmp2);
4988 Tmp = std::min(Tmp, Tmp2);
4995 APInt DemandedLHS, DemandedRHS;
4999 DemandedLHS, DemandedRHS))
5002 Tmp = std::numeric_limits<unsigned>::max();
5005 if (!!DemandedRHS) {
5007 Tmp = std::min(Tmp, Tmp2);
5012 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5028 if (VTBits == SrcBits)
5034 if ((SrcBits % VTBits) == 0) {
5037 unsigned Scale = SrcBits / VTBits;
5038 APInt SrcDemandedElts =
5048 for (
unsigned i = 0; i != NumElts; ++i)
5049 if (DemandedElts[i]) {
5050 unsigned SubOffset = i % Scale;
5051 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5052 SubOffset = SubOffset * VTBits;
5053 if (Tmp <= SubOffset)
5055 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5065 return VTBits - Tmp + 1;
5067 Tmp = VTBits -
Op.getOperand(0).getScalarValueSizeInBits();
5074 return std::max(Tmp, Tmp2);
5079 EVT SrcVT = Src.getValueType();
5087 if (std::optional<unsigned> ShAmt =
5089 Tmp = std::min(Tmp + *ShAmt, VTBits);
5092 if (std::optional<ConstantRange> ShAmtRange =
5094 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5095 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5106 unsigned SizeDifference =
5108 if (SizeDifference <= MinShAmt) {
5109 Tmp = SizeDifference +
5112 return Tmp - MaxShAmt;
5118 return Tmp - MaxShAmt;
5128 FirstAnswer = std::min(Tmp, Tmp2);
5138 if (Tmp == 1)
return 1;
5140 return std::min(Tmp, Tmp2);
5143 if (Tmp == 1)
return 1;
5145 return std::min(Tmp, Tmp2);
5157 if (CstLow && CstHigh) {
5162 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5163 return std::min(Tmp, Tmp2);
5172 return std::min(Tmp, Tmp2);
5180 return std::min(Tmp, Tmp2);
5184 if (
Op.getResNo() == 0 &&
Op.getOperand(0) ==
Op.getOperand(1))
5195 if (
Op.getResNo() != 1)
5201 if (TLI->getBooleanContents(VT.
isVector(),
false) ==
5209 unsigned OpNo =
Op->isStrictFPOpcode() ? 1 : 0;
5211 if (TLI->getBooleanContents(
Op.getOperand(OpNo).getValueType()) ==
5218 if (TLI->getBooleanContents(VT.
isVector(),
false) ==
5227 Tmp, VTBits,
C ? std::optional(
C->getAPIntValue()) : std::nullopt,
5235 if (Tmp == 1)
return 1;
5240 if (CRHS->isAllOnes()) {
5246 if ((
Known.Zero | 1).isAllOnes())
5251 if (
Known.isNonNegative())
5256 if (Tmp2 == 1)
return 1;
5260 return std::min(Tmp, Tmp2) - 1;
5263 if (Tmp2 == 1)
return 1;
5268 if (CLHS->isZero()) {
5273 if ((
Known.Zero | 1).isAllOnes())
5278 if (
Known.isNonNegative())
5287 if (Tmp == 1)
return 1;
5288 return std::min(Tmp, Tmp2) - 1;
5292 if (SignBitsOp0 == 1)
5295 if (SignBitsOp1 == 1)
5297 unsigned OutValidBits =
5298 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5299 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5307 return std::min(Tmp, Tmp2);
5316 unsigned NumSrcBits =
Op.getOperand(0).getScalarValueSizeInBits();
5318 if (NumSrcSignBits > (NumSrcBits - VTBits))
5319 return NumSrcSignBits - (NumSrcBits - VTBits);
5326 const int BitWidth =
Op.getValueSizeInBits();
5327 const int Items =
Op.getOperand(0).getValueSizeInBits() /
BitWidth;
5331 const int rIndex = Items - 1 -
Op.getConstantOperandVal(1);
5346 bool DemandedVal =
true;
5347 APInt DemandedVecElts = DemandedElts;
5349 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5350 unsigned EltIdx = CEltNo->getZExtValue();
5351 DemandedVal = !!DemandedElts[EltIdx];
5354 Tmp = std::numeric_limits<unsigned>::max();
5360 Tmp = std::min(Tmp, Tmp2);
5362 if (!!DemandedVecElts) {
5364 Tmp = std::min(Tmp, Tmp2);
5366 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5376 const unsigned BitWidth =
Op.getValueSizeInBits();
5377 const unsigned EltBitWidth =
Op.getOperand(0).getScalarValueSizeInBits();
5390 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5400 APInt DemandedSrcElts;
5401 if (Src.getValueType().isScalableVector())
5402 DemandedSrcElts =
APInt(1, 1);
5404 uint64_t Idx =
Op.getConstantOperandVal(1);
5405 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5406 DemandedSrcElts = DemandedElts.
zext(NumSrcElts).
shl(Idx);
5415 Tmp = std::numeric_limits<unsigned>::max();
5416 EVT SubVectorVT =
Op.getOperand(0).getValueType();
5418 unsigned NumSubVectors =
Op.getNumOperands();
5419 for (
unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5421 DemandedElts.
extractBits(NumSubVectorElts, i * NumSubVectorElts);
5425 Tmp = std::min(Tmp, Tmp2);
5427 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5437 uint64_t Idx =
Op.getConstantOperandVal(2);
5438 unsigned NumSubElts =
Sub.getValueType().getVectorNumElements();
5440 APInt DemandedSrcElts = DemandedElts;
5441 DemandedSrcElts.
clearBits(Idx, Idx + NumSubElts);
5443 Tmp = std::numeric_limits<unsigned>::max();
5444 if (!!DemandedSubElts) {
5449 if (!!DemandedSrcElts) {
5451 Tmp = std::min(Tmp, Tmp2);
5453 assert(Tmp <= VTBits &&
"Failed to determine minimum sign bits");
5458 if (
Op.getResNo() != 0)
5462 if (
const MDNode *Ranges = LD->getRanges()) {
5463 if (DemandedElts != 1)
5468 switch (LD->getExtensionType()) {
5486 unsigned ExtType = LD->getExtensionType();
5491 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5492 return VTBits - Tmp + 1;
5494 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5495 return VTBits - Tmp;
5497 if (
const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5500 Type *CstTy = Cst->getType();
5505 for (
unsigned i = 0; i != NumElts; ++i) {
5506 if (!DemandedElts[i])
5511 Tmp = std::min(Tmp,
Value.getNumSignBits());
5515 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5516 Tmp = std::min(Tmp,
Value.getNumSignBits());
5548 if (
Op.getResNo() == 0) {
5549 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5555 switch (AT->getExtensionType()) {
5559 return VTBits - Tmp + 1;
5561 return VTBits - Tmp;
5566 return VTBits - Tmp + 1;
5568 return VTBits - Tmp;
5583 TLI->ComputeNumSignBitsForTargetNode(
Op, DemandedElts, *
this,
Depth);
5585 FirstAnswer = std::max(FirstAnswer, NumBits);
5592 return std::max(FirstAnswer,
Known.countMinSignBits());
6537 unsigned Depth)
const {
6541 EVT OpVT =
Op.getValueType();
6544 assert(!
Op.getValueType().isFloatingPoint() &&
6545 "Floating point types unsupported - use isKnownNeverLogicalZero");
6559 switch (
Op.getOpcode()) {
6578 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6595 if (
Op->getFlags().hasNoSignedWrap() ||
Op->getFlags().hasNoUnsignedWrap())
6600 if (ValKnown.
One[0])
6612 if (
Op.getValueType().isScalableVector())
6620 APInt DemandedLHS, DemandedRHS;
6622 assert(NumElts == SVN->getMask().size() &&
"Unexpected vector size");
6624 DemandedLHS, DemandedRHS))
6627 return (!DemandedLHS ||
6686 if (
Op->getFlags().hasExact())
6704 if (
Op->getFlags().hasExact())
6709 if (
Op->getFlags().hasNoUnsignedWrap())
6727 if (
Op->getFlags().hasNoSignedWrap() ||
Op->getFlags().hasNoUnsignedWrap())
6738 const APInt &Multiplier =
Op.getConstantOperandAPInt(0);
7639 const APInt &Val =
C->getAPIntValue();
7643 C->isTargetOpcode(),
C->isOpaque());
7650 C->isTargetOpcode(),
C->isOpaque());
7655 C->isTargetOpcode(),
C->isOpaque());
7657 C->isTargetOpcode(),
C->isOpaque());
7686 C->isTargetOpcode(),
C->isOpaque());
7712 if (VT == MVT::f16 &&
C->getValueType(0) == MVT::i16)
7714 if (VT == MVT::f32 &&
C->getValueType(0) == MVT::i32)
7716 if (VT == MVT::f64 &&
C->getValueType(0) == MVT::i64)
7718 if (VT == MVT::f128 &&
C->getValueType(0) == MVT::i128)
7779 return getConstant(V.bitcastToAPInt().getZExtValue(),
DL, VT);
7782 if (VT == MVT::i16 &&
C->getValueType(0) == MVT::f16)
7785 if (VT == MVT::i16 &&
C->getValueType(0) == MVT::bf16)
7788 if (VT == MVT::i32 &&
C->getValueType(0) == MVT::f32)
7791 if (VT == MVT::i64 &&
C->getValueType(0) == MVT::f64)
7792 return getConstant(V.bitcastToAPInt().getZExtValue(),
DL, VT);
7819 "Expected vector reduction base opcode to be foldable");
7834 if (C1->isOpaque() || C2->isOpaque())
7837 std::optional<APInt> FoldAttempt =
7838 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7844 "Can't fold vectors ops with scalar operands");
7852 if (TLI->isCommutativeBinOp(Opcode))
7868 const APInt &Val = C1->getAPIntValue();
7869 return SignExtendInReg(Val, VT);
7882 ScalarOps.
push_back(SignExtendInReg(Val, OpVT));
7890 SignExtendInReg(
Ops[0].getConstantOperandAPInt(0),
7901 if (C1 && C2 && C3) {
7902 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7904 const APInt &
V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7905 &
V3 = C3->getAPIntValue();
7921 if (C1 && C2 && C3) {
7953 unsigned InputEltBits =
Ops[1].getScalarValueSizeInBits();
7955 unsigned NumInputElts =
Ops[1].getValueType().getVectorNumElements();
7959 for (
unsigned I = 0;
I != NumAccElts; ++
I) {
7966 if (!
C ||
C->isOpaque())
7968 Results[
I] =
C->getAPIntValue().trunc(AccEltBits);
7973 for (
unsigned I = 0;
I != NumInputElts; ++
I) {
7974 const unsigned AccIdx =
I % NumAccElts;
7979 PoisonElts.
set(AccIdx);
7985 if (!LHS || !RHS || LHS->isOpaque() || RHS->isOpaque())
7988 APInt LHSVal = LHS->getAPIntValue().
trunc(InputEltBits);
7989 APInt RHSVal = RHS->getAPIntValue().
trunc(InputEltBits);
7990 LHSVal = IsLHSSigned ? LHSVal.
sext(AccEltBits) : LHSVal.
zext(AccEltBits);
7991 RHSVal = IsRHSSigned ? RHSVal.
sext(AccEltBits) : RHSVal.
zext(AccEltBits);
7992 Results[AccIdx] += LHSVal * RHSVal;
8001 EVT LegalSVT = AccEltVT;
8003 LegalSVT = TLI->getTypeToTransformTo(*
getContext(), LegalSVT);
8004 if (LegalSVT.
bitsLT(AccEltVT))
8009 for (
unsigned I = 0;
I != NumAccElts; ++
I)
8021 Ops[0].getValueType() == VT &&
Ops[1].getValueType() == VT &&
8034 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
8035 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
8039 Opcode, RawBits1[
I], UndefElts1[
I], RawBits2[
I], UndefElts2[
I]);
8050 BVEltVT = BV1->getOperand(0).getValueType();
8053 BVEltVT = BV2->getOperand(0).getValueType();
8059 DstBits, RawBits, DstUndefs,
8062 for (
unsigned I = 0, E = DstBits.
size();
I != E; ++
I) {
8087 ?
Ops[0].getConstantOperandAPInt(0) * RHSVal
8088 :
Ops[0].getConstantOperandAPInt(0) << RHSVal;
8093 auto IsScalarOrSameVectorSize = [NumElts](
const SDValue &
Op) {
8094 return !
Op.getValueType().isVector() ||
8095 Op.getValueType().getVectorElementCount() == NumElts;
8098 auto IsBuildVectorSplatVectorOrUndef = [](
const SDValue &
Op) {
8124 LegalSVT = TLI->getTypeToTransformTo(*
getContext(), LegalSVT);
8136 for (
unsigned I = 0;
I != NumVectorElts;
I++) {
8139 EVT InSVT =
Op.getValueType().getScalarType();
8182 if (LegalSVT != SVT)
8183 ScalarResult =
getNode(ExtendCode,
DL, LegalSVT, ScalarResult);