25#define DEBUG_TYPE "instcombine"
29 cl::desc(
"Verify that computeKnownBits() and "
30 "SimplifyDemandedBits() are consistent"),
37 const APInt &Demanded) {
39 assert(OpNo < I->getNumOperands() &&
"Operand index too large");
48 if (
C->isSubsetOf(Demanded))
52 I->setOperand(OpNo, ConstantInt::get(
Op->getType(), *
C & Demanded));
63 return DL.getPointerTypeSizeInBits(Ty);
74 if (V == &Inst)
return true;
90 const APInt &DemandedMask,
93 Use &U =
I->getOperandUse(OpNo);
95 if (isa<Constant>(V)) {
101 if (DemandedMask.
isZero()) {
126 if (!NewVal)
return false;
127 if (
Instruction* OpInst = dyn_cast<Instruction>(U))
158 const APInt &DemandedMask,
162 assert(
I !=
nullptr &&
"Null pointer of Value???");
165 Type *VTy =
I->getType();
169 "Value *V, DemandedMask and Known must have same BitWidth");
175 auto disableWrapFlagsBasedOnUnusedHighBits = [](
Instruction *
I,
181 I->setHasNoSignedWrap(
false);
182 I->setHasNoUnsignedWrap(
false);
189 auto simplifyOperandsBasedOnUnusedHighBits = [&](
APInt &DemandedFromOps) {
198 disableWrapFlagsBasedOnUnusedHighBits(
I, NLZ);
204 switch (
I->getOpcode()) {
208 case Instruction::And: {
226 return I->getOperand(0);
228 return I->getOperand(1);
236 case Instruction::Or: {
242 I->dropPoisonGeneratingFlags();
257 return I->getOperand(0);
259 return I->getOperand(1);
266 if (!cast<PossiblyDisjointInst>(
I)->isDisjoint()) {
268 RHSCache(
I->getOperand(1), RHSKnown);
270 cast<PossiblyDisjointInst>(
I)->setIsDisjoint(
true);
277 case Instruction::Xor: {
282 if (DemandedMask == 1 &&
303 return I->getOperand(0);
305 return I->getOperand(1);
312 BinaryOperator::CreateOr(
I->getOperand(0),
I->getOperand(1));
314 cast<PossiblyDisjointInst>(
Or)->setIsDisjoint(
true);
326 ~RHSKnown.
One & DemandedMask);
336 if ((*
C | ~DemandedMask).isAllOnes()) {
350 if (
Instruction *LHSInst = dyn_cast<Instruction>(
I->getOperand(0))) {
352 if (LHSInst->getOpcode() == Instruction::And && LHSInst->hasOneUse() &&
355 (LHSKnown.One & RHSKnown.
One & DemandedMask) != 0) {
356 APInt NewMask = ~(LHSKnown.One & RHSKnown.
One & DemandedMask);
359 Instruction *NewAnd = BinaryOperator::CreateAnd(
I->getOperand(0), AndC);
363 Instruction *NewXor = BinaryOperator::CreateXor(NewAnd, XorC);
369 case Instruction::Select: {
379 auto CanonicalizeSelectConstant = [](
Instruction *
I,
unsigned OpNo,
380 const APInt &DemandedMask) {
400 if ((*CmpC & DemandedMask) == (*SelC & DemandedMask)) {
401 I->setOperand(OpNo, ConstantInt::get(
I->getType(), *CmpC));
406 if (CanonicalizeSelectConstant(
I, 1, DemandedMask) ||
407 CanonicalizeSelectConstant(
I, 2, DemandedMask))
418 case Instruction::Trunc: {
437 case Instruction::ZExt: {
438 unsigned SrcBitWidth =
I->getOperand(0)->getType()->getScalarSizeInBits();
446 I->dropPoisonGeneratingFlags();
450 if (
I->getOpcode() == Instruction::ZExt &&
I->hasNonNeg() &&
457 case Instruction::SExt: {
459 unsigned SrcBitWidth =
I->getOperand(0)->getType()->getScalarSizeInBits();
461 APInt InputDemandedBits = DemandedMask.
trunc(SrcBitWidth);
466 InputDemandedBits.
setBit(SrcBitWidth-1);
487 case Instruction::Add: {
488 if ((DemandedMask & 1) == 0) {
494 X->getType()->isIntOrIntVectorTy(1) &&
X->getType() ==
Y->getType()) {
509 X->getType()->isIntOrIntVectorTy(1) &&
X->getType() ==
Y->getType() &&
510 (
I->getOperand(0)->hasOneUse() ||
I->getOperand(1)->hasOneUse())) {
531 return disableWrapFlagsBasedOnUnusedHighBits(
I, NLZ);
537 APInt DemandedFromLHS = DemandedFromOps;
541 return disableWrapFlagsBasedOnUnusedHighBits(
I, NLZ);
546 return I->getOperand(0);
547 if (DemandedFromOps.
isSubsetOf(LHSKnown.Zero))
548 return I->getOperand(1);
562 bool NSW = cast<OverflowingBinaryOperator>(
I)->hasNoSignedWrap();
563 bool NUW = cast<OverflowingBinaryOperator>(
I)->hasNoUnsignedWrap();
567 case Instruction::Sub: {
574 return disableWrapFlagsBasedOnUnusedHighBits(
I, NLZ);
580 APInt DemandedFromLHS = DemandedFromOps;
584 return disableWrapFlagsBasedOnUnusedHighBits(
I, NLZ);
589 return I->getOperand(0);
592 if (DemandedFromOps.
isOne() && DemandedFromOps.
isSubsetOf(LHSKnown.Zero))
593 return I->getOperand(1);
596 bool NSW = cast<OverflowingBinaryOperator>(
I)->hasNoSignedWrap();
597 bool NUW = cast<OverflowingBinaryOperator>(
I)->hasNoUnsignedWrap();
601 case Instruction::Mul: {
602 APInt DemandedFromOps;
603 if (simplifyOperandsBasedOnUnusedHighBits(DemandedFromOps))
613 Constant *ShiftC = ConstantInt::get(VTy, CTZ);
614 Instruction *Shl = BinaryOperator::CreateShl(
I->getOperand(0), ShiftC);
621 if (
I->getOperand(0) ==
I->getOperand(1) && DemandedMask.
ult(4)) {
622 Constant *One = ConstantInt::get(VTy, 1);
623 Instruction *And1 = BinaryOperator::CreateAnd(
I->getOperand(0), One);
630 case Instruction::Shl: {
635 if (
Instruction *Shr = dyn_cast<Instruction>(
I->getOperand(0)))
637 DemandedMask, Known))
641 if (
I->hasOneUse()) {
642 auto *Inst = dyn_cast<Instruction>(
I->user_back());
643 if (Inst && Inst->getOpcode() == BinaryOperator::Or) {
645 auto [IID, FShiftArgs] = *Opt;
646 if ((IID == Intrinsic::fshl || IID == Intrinsic::fshr) &&
647 FShiftArgs[0] == FShiftArgs[1]) {
659 if (
I->hasNoSignedWrap()) {
663 if (SignBits > ShiftAmt && SignBits - ShiftAmt >= NumHiDemandedBits)
664 return I->getOperand(0);
674 Constant *LeftShiftAmtC = ConstantInt::get(VTy, ShiftAmt);
678 LeftShiftAmtC,
DL) ==
C) {
679 Instruction *Lshr = BinaryOperator::CreateLShr(NewC,
X);
685 APInt DemandedMaskIn(DemandedMask.
lshr(ShiftAmt));
709 I->dropPoisonGeneratingFlags();
717 case Instruction::LShr: {
723 if (
I->hasOneUse()) {
724 auto *Inst = dyn_cast<Instruction>(
I->user_back());
725 if (Inst && Inst->getOpcode() == BinaryOperator::Or) {
727 auto [IID, FShiftArgs] = *Opt;
728 if ((IID == Intrinsic::fshl || IID == Intrinsic::fshr) &&
729 FShiftArgs[0] == FShiftArgs[1]) {
745 if (SignBits >= NumHiDemandedBits)
746 return I->getOperand(0);
755 Constant *RightShiftAmtC = ConstantInt::get(VTy, ShiftAmt);
759 RightShiftAmtC,
DL) ==
C) {
767 APInt DemandedMaskIn(DemandedMask.
shl(ShiftAmt));
770 I->dropPoisonGeneratingFlags();
782 case Instruction::AShr: {
788 if (SignBits >= NumHiDemandedBits)
789 return I->getOperand(0);
795 if (DemandedMask.
isOne()) {
798 I->getOperand(0),
I->getOperand(1),
I->getName());
807 APInt DemandedMaskIn(DemandedMask.
shl(ShiftAmt));
810 bool ShiftedInBitsDemanded = DemandedMask.
countl_zero() < ShiftAmt;
811 if (ShiftedInBitsDemanded)
815 I->dropPoisonGeneratingFlags();
821 if (Known.
Zero[
BitWidth - 1] || !ShiftedInBitsDemanded) {
824 LShr->
setIsExact(cast<BinaryOperator>(
I)->isExact());
831 ShiftAmt != 0,
I->isExact());
837 case Instruction::UDiv: {
843 APInt DemandedMaskIn =
848 I->dropPoisonGeneratingFlags();
853 cast<BinaryOperator>(
I)->isExact());
859 case Instruction::SRem: {
867 if (
RA.isPowerOf2()) {
868 if (DemandedMask.
ult(
RA))
869 return I->getOperand(0);
877 Known.
Zero = LHSKnown.Zero & LowBits;
878 Known.
One = LHSKnown.One & LowBits;
882 if (LHSKnown.isNonNegative() || LowBits.
isSubsetOf(LHSKnown.Zero))
883 Known.
Zero |= ~LowBits;
887 if (LHSKnown.isNegative() && LowBits.
intersects(LHSKnown.One))
888 Known.
One |= ~LowBits;
897 case Instruction::Call: {
898 bool KnownBitsComputed =
false;
900 switch (
II->getIntrinsicID()) {
901 case Intrinsic::abs: {
902 if (DemandedMask == 1)
903 return II->getArgOperand(0);
906 case Intrinsic::ctpop: {
914 II->getModule(), Intrinsic::ctpop, VTy);
919 case Intrinsic::bswap: {
936 NewVal = BinaryOperator::CreateLShr(
937 II->getArgOperand(0), ConstantInt::get(VTy, NLZ - NTZ));
939 NewVal = BinaryOperator::CreateShl(
940 II->getArgOperand(0), ConstantInt::get(VTy, NTZ - NLZ));
946 case Intrinsic::ptrmask: {
947 unsigned MaskWidth =
I->getOperand(1)->getType()->getScalarSizeInBits();
952 I, 1, (DemandedMask & ~LHSKnown.Zero).zextOrTrunc(MaskWidth),
953 RHSKnown,
Depth + 1, Q))
959 Known = LHSKnown & RHSKnown;
960 KnownBitsComputed =
true;
975 if (DemandedMask.
isSubsetOf(RHSKnown.One | LHSKnown.Zero))
976 return I->getOperand(0);
980 I, 1, (DemandedMask & ~LHSKnown.Zero).zextOrTrunc(MaskWidth)))
990 if (
match(
I, m_Intrinsic<Intrinsic::ptrmask>(
995 if (!LHSKnown.isZero()) {
996 const unsigned trailingZeros = LHSKnown.countMinTrailingZeros();
999 uint64_t HighBitsGEPIndex = GEPIndex & ~PointerAlignBits;
1001 GEPIndex & PointerAlignBits & PtrMaskImmediate;
1003 uint64_t MaskedGEPIndex = HighBitsGEPIndex | MaskedLowBitsGEPIndex;
1005 if (MaskedGEPIndex != GEPIndex) {
1006 auto *
GEP = cast<GetElementPtrInst>(
II->getArgOperand(0));
1008 Type *GEPIndexType =
1011 GEP->getSourceElementType(), InnerPtr,
1012 ConstantInt::get(GEPIndexType, MaskedGEPIndex),
1013 GEP->getName(),
GEP->isInBounds());
1024 case Intrinsic::fshr:
1025 case Intrinsic::fshl: {
1033 if (
II->getIntrinsicID() == Intrinsic::fshr)
1036 APInt DemandedMaskLHS(DemandedMask.
lshr(ShiftAmt));
1038 if (
I->getOperand(0) !=
I->getOperand(1)) {
1048 if (DemandedMaskLHS.
isSubsetOf(LHSKnown.Zero | LHSKnown.One) &&
1062 Known.
Zero = LHSKnown.Zero.
shl(ShiftAmt) |
1064 Known.
One = LHSKnown.One.
shl(ShiftAmt) |
1066 KnownBitsComputed =
true;
1069 case Intrinsic::umax: {
1076 CTZ >=
C->getActiveBits())
1077 return II->getArgOperand(0);
1080 case Intrinsic::umin: {
1088 CTZ >=
C->getBitWidth() -
C->countl_one())
1089 return II->getArgOperand(0);
1095 *
II, DemandedMask, Known, KnownBitsComputed);
1103 if (!KnownBitsComputed)
1109 if (
I->getType()->isPointerTy()) {
1110 Align Alignment =
I->getPointerAlignment(
DL);
1118 if (!
I->getType()->isPointerTy() &&
1124 if (Known != ReferenceKnown) {
1125 errs() <<
"Mismatched known bits for " << *
I <<
" in "
1126 <<
I->getFunction()->getName() <<
"\n";
1127 errs() <<
"computeKnownBits(): " << ReferenceKnown <<
"\n";
1128 errs() <<
"SimplifyDemandedBits(): " << Known <<
"\n";
1143 Type *ITy =
I->getType();
1152 switch (
I->getOpcode()) {
1153 case Instruction::And: {
1168 return I->getOperand(0);
1170 return I->getOperand(1);
1174 case Instruction::Or: {
1191 return I->getOperand(0);
1193 return I->getOperand(1);
1197 case Instruction::Xor: {
1213 return I->getOperand(0);
1215 return I->getOperand(1);
1219 case Instruction::Add: {
1227 return I->getOperand(0);
1231 return I->getOperand(1);
1233 bool NSW = cast<OverflowingBinaryOperator>(
I)->hasNoSignedWrap();
1234 bool NUW = cast<OverflowingBinaryOperator>(
I)->hasNoUnsignedWrap();
1239 case Instruction::Sub: {
1247 return I->getOperand(0);
1249 bool NSW = cast<OverflowingBinaryOperator>(
I)->hasNoSignedWrap();
1250 bool NUW = cast<OverflowingBinaryOperator>(
I)->hasNoUnsignedWrap();
1256 case Instruction::AShr: {
1269 const APInt *ShiftRC;
1270 const APInt *ShiftLC;
1318 if (!ShlOp1 || !ShrOp1)
1332 Known.
Zero &= DemandedMask;
1337 bool isLshr = (Shr->
getOpcode() == Instruction::LShr);
1338 BitMask1 = isLshr ? (BitMask1.
lshr(ShrAmt) << ShlAmt) :
1339 (BitMask1.
ashr(ShrAmt) << ShlAmt);
1341 if (ShrAmt <= ShlAmt) {
1342 BitMask2 <<= (ShlAmt - ShrAmt);
1344 BitMask2 = isLshr ? BitMask2.
lshr(ShrAmt - ShlAmt):
1345 BitMask2.
ashr(ShrAmt - ShlAmt);
1349 if ((BitMask1 & DemandedMask) == (BitMask2 & DemandedMask)) {
1350 if (ShrAmt == ShlAmt)
1357 if (ShrAmt < ShlAmt) {
1359 New = BinaryOperator::CreateShl(VarX, Amt);
1365 New = isLshr ? BinaryOperator::CreateLShr(VarX, Amt) :
1366 BinaryOperator::CreateAShr(VarX, Amt);
1367 if (cast<BinaryOperator>(Shr)->isExact())
1368 New->setIsExact(
true);
1394 bool AllowMultipleUsers) {
1397 if (isa<ScalableVectorType>(V->getType()))
1400 unsigned VWidth = cast<FixedVectorType>(V->getType())->getNumElements();
1402 assert((DemandedElts & ~EltMask) == 0 &&
"Invalid DemandedElts!");
1406 PoisonElts = EltMask;
1410 if (DemandedElts.
isZero()) {
1411 PoisonElts = EltMask;
1417 if (
auto *
C = dyn_cast<Constant>(V)) {
1423 Type *EltTy = cast<VectorType>(V->getType())->getElementType();
1426 for (
unsigned i = 0; i != VWidth; ++i) {
1427 if (!DemandedElts[i]) {
1433 Constant *Elt =
C->getAggregateElement(i);
1434 if (!Elt)
return nullptr;
1437 if (isa<PoisonValue>(Elt))
1443 return NewCV !=
C ? NewCV :
nullptr;
1450 if (!AllowMultipleUsers) {
1454 if (!V->hasOneUse()) {
1463 DemandedElts = EltMask;
1468 if (!
I)
return nullptr;
1470 bool MadeChange =
false;
1471 auto simplifyAndSetOp = [&](
Instruction *Inst,
unsigned OpNum,
1473 auto *
II = dyn_cast<IntrinsicInst>(Inst);
1481 APInt PoisonElts2(VWidth, 0);
1482 APInt PoisonElts3(VWidth, 0);
1483 switch (
I->getOpcode()) {
1486 case Instruction::GetElementPtr: {
1496 if (mayIndexStructType(cast<GetElementPtrInst>(*
I)))
1504 for (
unsigned i = 0; i <
I->getNumOperands(); i++) {
1508 PoisonElts = EltMask;
1511 if (
I->getOperand(i)->getType()->isVectorTy()) {
1512 APInt PoisonEltsOp(VWidth, 0);
1513 simplifyAndSetOp(
I, i, DemandedElts, PoisonEltsOp);
1518 PoisonElts |= PoisonEltsOp;
1524 case Instruction::InsertElement: {
1531 simplifyAndSetOp(
I, 0, DemandedElts, PoisonElts2);
1537 unsigned IdxNo =
Idx->getZExtValue();
1538 APInt PreInsertDemandedElts = DemandedElts;
1540 PreInsertDemandedElts.
clearBit(IdxNo);
1548 if (PreInsertDemandedElts == 0 &&
1555 simplifyAndSetOp(
I, 0, PreInsertDemandedElts, PoisonElts);
1559 if (IdxNo >= VWidth || !DemandedElts[IdxNo]) {
1561 return I->getOperand(0);
1568 case Instruction::ShuffleVector: {
1569 auto *Shuffle = cast<ShuffleVectorInst>(
I);
1570 assert(Shuffle->getOperand(0)->getType() ==
1571 Shuffle->getOperand(1)->getType() &&
1572 "Expected shuffle operands to have same type");
1573 unsigned OpWidth = cast<FixedVectorType>(Shuffle->getOperand(0)->getType())
1577 if (
all_of(Shuffle->getShuffleMask(), [](
int Elt) { return Elt == 0; }) &&
1579 if (!isa<PoisonValue>(
I->getOperand(1))) {
1583 APInt LeftDemanded(OpWidth, 1);
1584 APInt LHSPoisonElts(OpWidth, 0);
1585 simplifyAndSetOp(
I, 0, LeftDemanded, LHSPoisonElts);
1586 if (LHSPoisonElts[0])
1587 PoisonElts = EltMask;
1593 APInt LeftDemanded(OpWidth, 0), RightDemanded(OpWidth, 0);
1594 for (
unsigned i = 0; i < VWidth; i++) {
1595 if (DemandedElts[i]) {
1596 unsigned MaskVal = Shuffle->getMaskValue(i);
1597 if (MaskVal != -1u) {
1598 assert(MaskVal < OpWidth * 2 &&
1599 "shufflevector mask index out of range!");
1600 if (MaskVal < OpWidth)
1601 LeftDemanded.setBit(MaskVal);
1603 RightDemanded.
setBit(MaskVal - OpWidth);
1608 APInt LHSPoisonElts(OpWidth, 0);
1609 simplifyAndSetOp(
I, 0, LeftDemanded, LHSPoisonElts);
1611 APInt RHSPoisonElts(OpWidth, 0);
1612 simplifyAndSetOp(
I, 1, RightDemanded, RHSPoisonElts);
1625 if (VWidth == OpWidth) {
1626 bool IsIdentityShuffle =
true;
1627 for (
unsigned i = 0; i < VWidth; i++) {
1628 unsigned MaskVal = Shuffle->getMaskValue(i);
1629 if (DemandedElts[i] && i != MaskVal) {
1630 IsIdentityShuffle =
false;
1634 if (IsIdentityShuffle)
1635 return Shuffle->getOperand(0);
1638 bool NewPoisonElts =
false;
1639 unsigned LHSIdx = -1u, LHSValIdx = -1u;
1640 unsigned RHSIdx = -1u, RHSValIdx = -1u;
1641 bool LHSUniform =
true;
1642 bool RHSUniform =
true;
1643 for (
unsigned i = 0; i < VWidth; i++) {
1644 unsigned MaskVal = Shuffle->getMaskValue(i);
1645 if (MaskVal == -1u) {
1647 }
else if (!DemandedElts[i]) {
1648 NewPoisonElts =
true;
1650 }
else if (MaskVal < OpWidth) {
1651 if (LHSPoisonElts[MaskVal]) {
1652 NewPoisonElts =
true;
1655 LHSIdx = LHSIdx == -1u ? i : OpWidth;
1656 LHSValIdx = LHSValIdx == -1u ? MaskVal : OpWidth;
1657 LHSUniform = LHSUniform && (MaskVal == i);
1660 if (RHSPoisonElts[MaskVal - OpWidth]) {
1661 NewPoisonElts =
true;
1664 RHSIdx = RHSIdx == -1u ? i : OpWidth;
1665 RHSValIdx = RHSValIdx == -1u ? MaskVal - OpWidth : OpWidth;
1666 RHSUniform = RHSUniform && (MaskVal - OpWidth == i);
1682 if (LHSIdx < OpWidth && RHSUniform) {
1683 if (
auto *CV = dyn_cast<ConstantVector>(Shuffle->getOperand(0))) {
1684 Op = Shuffle->getOperand(1);
1685 Value = CV->getOperand(LHSValIdx);
1689 if (RHSIdx < OpWidth && LHSUniform) {
1690 if (
auto *CV = dyn_cast<ConstantVector>(Shuffle->getOperand(1))) {
1691 Op = Shuffle->getOperand(0);
1692 Value = CV->getOperand(RHSValIdx);
1705 if (NewPoisonElts) {
1708 for (
unsigned i = 0; i < VWidth; ++i) {
1712 Elts.
push_back(Shuffle->getMaskValue(i));
1714 Shuffle->setShuffleMask(Elts);
1719 case Instruction::Select: {
1729 simplifyAndSetOp(
I, 0, DemandedElts, PoisonElts);
1733 APInt DemandedLHS(DemandedElts), DemandedRHS(DemandedElts);
1734 if (
auto *CV = dyn_cast<ConstantVector>(Sel->
getCondition())) {
1735 for (
unsigned i = 0; i < VWidth; i++) {
1740 DemandedLHS.clearBit(i);
1746 simplifyAndSetOp(
I, 1, DemandedLHS, PoisonElts2);
1747 simplifyAndSetOp(
I, 2, DemandedRHS, PoisonElts3);
1751 PoisonElts = PoisonElts2 & PoisonElts3;
1754 case Instruction::BitCast: {
1756 VectorType *VTy = dyn_cast<VectorType>(
I->getOperand(0)->getType());
1758 unsigned InVWidth = cast<FixedVectorType>(VTy)->getNumElements();
1759 APInt InputDemandedElts(InVWidth, 0);
1760 PoisonElts2 =
APInt(InVWidth, 0);
1763 if (VWidth == InVWidth) {
1767 InputDemandedElts = DemandedElts;
1768 }
else if ((VWidth % InVWidth) == 0) {
1772 Ratio = VWidth / InVWidth;
1773 for (
unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx)
1774 if (DemandedElts[OutIdx])
1775 InputDemandedElts.
setBit(OutIdx / Ratio);
1776 }
else if ((InVWidth % VWidth) == 0) {
1780 Ratio = InVWidth / VWidth;
1781 for (
unsigned InIdx = 0; InIdx != InVWidth; ++InIdx)
1782 if (DemandedElts[InIdx / Ratio])
1783 InputDemandedElts.
setBit(InIdx);
1789 simplifyAndSetOp(
I, 0, InputDemandedElts, PoisonElts2);
1791 if (VWidth == InVWidth) {
1792 PoisonElts = PoisonElts2;
1793 }
else if ((VWidth % InVWidth) == 0) {
1797 for (
unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx)
1798 if (PoisonElts2[OutIdx / Ratio])
1799 PoisonElts.
setBit(OutIdx);
1800 }
else if ((InVWidth % VWidth) == 0) {
1804 for (
unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx) {
1807 PoisonElts.
setBit(OutIdx);
1814 case Instruction::FPTrunc:
1815 case Instruction::FPExt:
1816 simplifyAndSetOp(
I, 0, DemandedElts, PoisonElts);
1819 case Instruction::Call: {
1822 switch (
II->getIntrinsicID()) {
1823 case Intrinsic::masked_gather:
1824 case Intrinsic::masked_load: {
1829 DemandedPassThrough(DemandedElts);
1830 if (
auto *CV = dyn_cast<ConstantVector>(
II->getOperand(2)))
1831 for (
unsigned i = 0; i < VWidth; i++) {
1834 DemandedPtrs.clearBit(i);
1838 if (
II->getIntrinsicID() == Intrinsic::masked_gather)
1839 simplifyAndSetOp(
II, 0, DemandedPtrs, PoisonElts2);
1840 simplifyAndSetOp(
II, 3, DemandedPassThrough, PoisonElts3);
1844 PoisonElts = PoisonElts2 & PoisonElts3;
1850 *
II, DemandedElts, PoisonElts, PoisonElts2, PoisonElts3,
1884 if (DemandedElts == 1 && !
X->hasOneUse() && !
Y->hasOneUse() &&
1887 auto findShufBO = [&](
bool MatchShufAsOp0) ->
User * {
1892 Value *ShufOp = MatchShufAsOp0 ?
X :
Y;
1893 Value *OtherOp = MatchShufAsOp0 ?
Y :
X;
1909 if (
User *ShufBO = findShufBO(
true))
1911 if (
User *ShufBO = findShufBO(
false))
1915 simplifyAndSetOp(
I, 0, DemandedElts, PoisonElts);
1916 simplifyAndSetOp(
I, 1, DemandedElts, PoisonElts2);
1920 PoisonElts &= PoisonElts2;
1928 return MadeChange ?
I :
nullptr;
1954 Type *VTy = V->getType();
1958 if (DemandedMask ==
fcNone)
1968 Value *FoldedToConst =
1970 return FoldedToConst == V ? nullptr : FoldedToConst;
1973 if (!
I->hasOneUse())
1977 switch (
I->getOpcode()) {
1978 case Instruction::FNeg: {
1985 case Instruction::Call: {
1988 case Intrinsic::fabs:
1994 case Intrinsic::arithmetic_fence:
1998 case Intrinsic::copysign: {
2006 I->setOperand(1, ConstantFP::get(VTy, -1.0));
2028 case Instruction::Select: {
2035 return I->getOperand(2);
2037 return I->getOperand(1);
2040 Known = KnownLHS | KnownRHS;
2055 Use &U =
I->getOperandUse(OpNo);
2060 if (
Instruction *OpInst = dyn_cast<Instruction>(U))
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file provides internal interfaces used to implement the InstCombine.
static Constant * getFPClassConstant(Type *Ty, FPClassTest Mask)
For floating-point classes that resolve to a single bit pattern, return that value.
static cl::opt< bool > VerifyKnownBits("instcombine-verify-known-bits", cl::desc("Verify that computeKnownBits() and " "SimplifyDemandedBits() are consistent"), cl::Hidden, cl::init(false))
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static bool ShrinkDemandedConstant(Instruction *I, unsigned OpNo, const APInt &Demanded)
Check to see if the specified operand of the specified instruction is a constant integer.
This file provides the interface for the instcombine pass implementation.
uint64_t IntrinsicInst * II
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
SI optimize exec mask operations pre RA
static unsigned getNumElements(Type *Ty)
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
Class for arbitrary precision integers.
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.
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
uint64_t getZExtValue() const
Get zero extended value.
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
unsigned popcount() const
Count the number of bits set.
APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
unsigned getActiveBits() const
Compute the number of active bits in the value.
APInt trunc(unsigned width) const
Truncate to new width.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
APInt abs() const
Get the absolute value.
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
APInt urem(const APInt &RHS) const
Unsigned remainder operation.
void setSignBit()
Set the sign bit to 1.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
void clearAllBits()
Set every bit to 0.
unsigned countr_zero() const
Count the number of trailing zero bits.
unsigned countl_zero() const
The APInt version of std::countl_zero.
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
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.
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
APInt shl(unsigned shiftAmt) const
Left-shift function.
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
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.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
bool isOne() const
Determine if this is a value of 1.
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
BinaryOps getOpcode() const
Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
static Constant * getInfinity(Type *Ty, bool Negative=false)
static Constant * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
const APInt & getValue() const
Return the constant as an APInt value reference.
static Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
static Constant * getAllOnesValue(Type *Ty)
bool isOneValue() const
Returns true if the value is one.
bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Value * CreateSExt(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Value * CreateNot(Value *V, const Twine &Name="")
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
KnownFPClass computeKnownFPClass(Value *Val, FastMathFlags FMF, FPClassTest Interested=fcAllFlags, const Instruction *CtxI=nullptr, unsigned Depth=0) const
Value * SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &PoisonElts, unsigned Depth=0, bool AllowMultipleUsers=false) override
The specified value produces a vector with any number of elements.
Value * SimplifyDemandedUseBits(Instruction *I, const APInt &DemandedMask, KnownBits &Known, unsigned Depth, const SimplifyQuery &Q)
Attempts to replace I with a simpler value based on the demanded bits.
std::optional< std::pair< Intrinsic::ID, SmallVector< Value *, 3 > > > convertOrOfShiftsToFunnelShift(Instruction &Or)
Value * SimplifyMultipleUseDemandedBits(Instruction *I, const APInt &DemandedMask, KnownBits &Known, unsigned Depth, const SimplifyQuery &Q)
Helper routine of SimplifyDemandedUseBits.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, unsigned Depth, const SimplifyQuery &Q) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Value * simplifyShrShlDemandedBits(Instruction *Shr, const APInt &ShrOp1, Instruction *Shl, const APInt &ShlOp1, const APInt &DemandedMask, KnownBits &Known)
Helper routine of SimplifyDemandedUseBits.
Value * SimplifyDemandedUseFPClass(Value *V, FPClassTest DemandedMask, KnownFPClass &Known, unsigned Depth, Instruction *CxtI)
Attempts to replace V with a simpler value based on the demanded floating-point classes.
bool SimplifyDemandedFPClass(Instruction *I, unsigned Op, FPClassTest DemandedMask, KnownFPClass &Known, unsigned Depth=0)
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
Instruction * InsertNewInstWith(Instruction *New, BasicBlock::iterator Old)
Same as InsertNewInstBefore, but also sets the debug loc.
unsigned ComputeNumSignBits(const Value *Op, unsigned Depth=0, const Instruction *CxtI=nullptr) const
std::optional< Value * > targetSimplifyDemandedVectorEltsIntrinsic(IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function< void(Instruction *, unsigned, APInt, APInt &)> SimplifyAndSetOp)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
std::optional< Value * > targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed)
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
void push(Instruction *I)
Push the instruction onto the worklist stack.
bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
A wrapper class for inspecting calls to intrinsic functions.
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents the LLVM 'select' instruction.
const Value * getCondition() const
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static IntegerType * getInt64Ty(LLVMContext &C)
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
iterator_range< user_iterator > users()
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
Base class of all SIMD vector types.
This class represents zero extension of integer types.
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
class_match< PoisonValue > m_Poison()
Match an arbitrary poison constant.
PtrAdd_match< PointerOpTy, OffsetOpTy > m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
Matches GEP with i8 source element type.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
CmpClass_match< LHS, RHS, ICmpInst, ICmpInst::Predicate > m_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R)
OneUse_match< T > m_OneUse(const T &SubPattern)
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
match_combine_and< class_match< Constant >, match_unless< constantexpr_match > > m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
bool haveNoCommonBitsSet(const WithCache< const Value * > &LHSCache, const WithCache< const Value * > &RHSCache, const SimplifyQuery &SQ)
Return true if LHS and RHS have no common bits set.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
gep_type_iterator gep_type_end(const User *GEP)
void computeKnownBitsFromContext(const Value *V, KnownBits &Known, unsigned Depth, const SimplifyQuery &Q)
Merge bits known from context-dependent facts into Known.
KnownBits analyzeKnownBitsFromAndXorOr(const Operator *I, const KnownBits &KnownLHS, const KnownBits &KnownRHS, unsigned Depth, const SimplifyQuery &SQ)
Using KnownBits LHS/RHS produce the known bits for logic op (and/xor/or).
constexpr unsigned MaxAnalysisRecursionDepth
FPClassTest fneg(FPClassTest Mask)
Return the test mask which returns true if the value's sign bit is flipped.
void adjustKnownBitsForSelectArm(KnownBits &Known, Value *Cond, Value *Arm, bool Invert, unsigned Depth, const SimplifyQuery &Q)
Adjust Known for the given select Arm to include information from the select Cond.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
FPClassTest inverse_fabs(FPClassTest Mask)
Return the test mask which returns true after fabs is applied to the value.
Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
constexpr int PoisonMaskElem
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Or
Bitwise or logical OR of integers.
@ Xor
Bitwise or logical XOR of integers.
@ And
Bitwise or logical AND of integers.
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
FPClassTest unknown_sign(FPClassTest Mask)
Return the test mask which returns true if the value could have the same set of classes,...
constexpr unsigned BitWidth
gep_type_iterator gep_type_begin(const User *GEP)
unsigned Log2(Align A)
Returns the log2 of the alignment.
This struct is a compact representation of a valid (non-zero power of two) alignment.
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.
bool isNonNegative() const
Returns true if this value is known to be non-negative.
void makeNonNegative()
Make this value non-negative.
static KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
unsigned getBitWidth() const
Get the bit width of this value.
void resetAll()
Resets the known state of all bits.
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.
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from addition of LHS and RHS.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
static KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isNegative() const
Returns true if this value is known to be negative.
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
static KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
void copysign(const KnownFPClass &Sign)
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
SimplifyQuery getWithInstruction(const Instruction *I) const