21#define DEBUG_TYPE "instcombine"
43 unsigned MaximalPossibleTotalShiftAmount =
46 APInt MaximalRepresentableShiftAmount =
48 return MaximalRepresentableShiftAmount.
uge(MaximalPossibleTotalShiftAmount);
64 bool AnalyzeForSignBitExtraction) {
76 Value *Trunc =
nullptr;
95 if (AnalyzeForSignBitExtraction && !HadTwoRightShifts)
102 if (!IdenticalShOpcodes && !AnalyzeForSignBitExtraction)
108 if (Trunc && !AnalyzeForSignBitExtraction &&
115 SQ.getWithInstruction(Sh0)));
118 unsigned NewShAmtBitWidth = NewShAmt->getType()->getScalarSizeInBits();
119 unsigned XBitWidth =
X->getType()->getScalarSizeInBits();
122 APInt(NewShAmtBitWidth, XBitWidth))))
130 if (HadTwoRightShifts && (Trunc || AnalyzeForSignBitExtraction)) {
134 APInt(NewShAmtBitWidth, XBitWidth - 1))))
137 if (AnalyzeForSignBitExtraction)
141 assert(IdenticalShOpcodes &&
"Should not get here with different shifts.");
143 if (NewShAmt->getType() !=
X->getType()) {
145 X->getType(),
SQ.DL);
157 if (ShiftOpcode == Instruction::BinaryOps::Shl) {
197 "The input must be 'shl'!");
212 bool HadTrunc = WidestTy != NarrowestTy;
248 MaskShAmt, ShiftShAmt,
false,
false, Q));
259 SumOfShAmts, ConstantInt::get(SumOfShAmts->getType()->getScalarType(),
262 Instruction::ZExt, SumOfShAmts, ExtendedTy, Q.
DL);
263 if (!ExtendedSumOfShAmts)
269 Instruction::Shl, ExtendedAllOnes, ExtendedSumOfShAmts, Q.
DL);
270 if (!ExtendedInvertedMask)
287 ShiftShAmt, MaskShAmt,
false,
false, Q));
301 -(
int)WidestTyBitWidth));
309 if (!ExtendedNumHighBitsToClear)
315 ExtendedNumHighBitsToClear, Q.
DL);
339 X = Builder.CreateTrunc(
X, NarrowestTy);
348 Builder.Insert(NewShift);
359 assert(
I.isShift() &&
"Expected a shift as input");
362 (!BinInst->isBitwiseLogicOp() &&
363 BinInst->getOpcode() != Instruction::Add &&
364 BinInst->getOpcode() != Instruction::Sub) ||
365 !BinInst->hasOneUse())
374 if ((BinInst->getOpcode() == Instruction::Add ||
375 BinInst->getOpcode() == Instruction::Sub) &&
376 ShiftOpcode != Instruction::Shl)
379 Type *Ty =
I.getType();
384 auto matchFirstShift = [&](
Value *V,
Value *W) {
385 unsigned Size = Ty->getScalarSizeInBits();
396 bool FirstShiftIsOp1 =
false;
397 if (matchFirstShift(BinInst->getOperand(0), BinInst->getOperand(1)))
398 Y = BinInst->getOperand(1);
399 else if (matchFirstShift(BinInst->getOperand(1), BinInst->getOperand(0))) {
400 Y = BinInst->getOperand(0);
401 FirstShiftIsOp1 = BinInst->getOpcode() == Instruction::Sub;
407 Value *NewShift1 = Builder.CreateBinOp(ShiftOpcode,
X, ShiftSumC);
408 Value *NewShift2 = Builder.CreateBinOp(ShiftOpcode,
Y, C1);
409 Value *Op1 = FirstShiftIsOp1 ? NewShift2 : NewShift1;
410 Value *Op2 = FirstShiftIsOp1 ? NewShift1 : NewShift2;
418 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
420 Type *Ty =
I.getType();
456 if (
I.getOpcode() == Instruction::Shl) {
465 unsigned BitWidth = Ty->getScalarSizeInBits();
469 assert(!
AC->isZero() &&
"Expected simplify of shifted zero");
479 unsigned PosOffset = (-*AddC).getZExtValue();
481 auto isSuitableForPreShift = [PosOffset, &
I,
AC]() {
482 switch (
I.getOpcode()) {
485 case Instruction::Shl:
486 return (
I.hasNoSignedWrap() ||
I.hasNoUnsignedWrap()) &&
487 AC->eq(
AC->lshr(PosOffset).shl(PosOffset));
488 case Instruction::LShr:
489 return I.isExact() &&
AC->eq(
AC->shl(PosOffset).lshr(PosOffset));
490 case Instruction::AShr:
491 return I.isExact() &&
AC->eq(
AC->shl(PosOffset).ashr(PosOffset));
494 if (isSuitableForPreShift()) {
495 Constant *NewC = ConstantInt::get(Ty,
I.getOpcode() == Instruction::Shl
496 ?
AC->lshr(PosOffset)
497 :
AC->shl(PosOffset));
500 if (
I.getOpcode() == Instruction::Shl) {
518 if (
I.getOpcode() == Instruction::Shl) {
519 if (
AC->countl_zero() >= C2)
520 return BinaryOperator::CreateExactLShr(
521 ConstantInt::get(Ty,
AC->shl(C2)),
X);
522 if (
AC->countl_one() > C2)
523 return BinaryOperator::CreateExactAShr(
524 ConstantInt::get(Ty,
AC->shl(C2)),
X);
525 }
else if (
AC->countr_zero() >= C2) {
526 if (
AC->isSignBitClear()) {
527 auto *Shl = BinaryOperator::CreateNUWShl(
528 ConstantInt::get(Ty,
AC->lshr(C2)),
X);
529 Shl->setHasNoSignedWrap();
532 if (
I.getOpcode() == Instruction::LShr)
533 return BinaryOperator::CreateNUWShl(
534 ConstantInt::get(Ty,
AC->lshr(C2)),
X);
535 return BinaryOperator::CreateNSWShl(ConstantInt::get(Ty,
AC->ashr(C2)),
560 if ((
I.getOpcode() == Instruction::LShr ||
561 I.getOpcode() == Instruction::AShr) &&
586 const APInt *InnerShiftConst;
593 bool IsInnerShl = InnerShift->
getOpcode() == Instruction::Shl;
597 *InnerShiftConst == OuterShAmt;
598 if (IsInnerShl == IsOuterShl)
604 if (*InnerShiftConst == OuterShAmt)
614 if (InnerShiftConst->
ugt(OuterShAmt) && InnerShiftConst->
ult(TypeWidth)) {
617 IsInnerShl ? TypeWidth - InnerShAmt : InnerShAmt - OuterShAmt;
637bool InstCombinerImpl::canEvaluateShifted(
Value *V,
unsigned NumBits,
648 return C->countr_zero() >= NumBits;
653 if (!
I)
return false;
657 if (!
I->hasOneUse())
return false;
659 switch (
I->getOpcode()) {
660 default:
return false;
661 case Instruction::And:
662 case Instruction::Or:
663 case Instruction::Xor:
665 return canEvaluateShifted(
I->getOperand(0), NumBits, IsLeftShift, Semantics,
667 canEvaluateShifted(
I->getOperand(1), NumBits, IsLeftShift, Semantics,
670 case Instruction::Shl:
671 case Instruction::LShr:
675 case Instruction::Select: {
679 return canEvaluateShifted(TrueVal, NumBits, IsLeftShift, Semantics, SI) &&
680 canEvaluateShifted(FalseVal, NumBits, IsLeftShift, Semantics, SI);
682 case Instruction::PHI: {
688 if (!canEvaluateShifted(IncValue, NumBits, IsLeftShift, Semantics, PN))
692 case Instruction::Mul: {
693 const APInt *MulConst;
699 case Instruction::Add: {
704 return canEvaluateShifted(
I->getOperand(0), NumBits, IsLeftShift,
706 canEvaluateShifted(
I->getOperand(1), NumBits, IsLeftShift,
717 return WrapRequired &&
718 canEvaluateShifted(
I->getOperand(0), NumBits, IsLeftShift, Semantics,
720 canEvaluateShifted(
I->getOperand(1), NumBits, IsLeftShift, Semantics,
731 bool IsInnerShl = InnerShift->
getOpcode() == Instruction::Shl;
741 auto NewInnerShift = [&](
unsigned ShAmt) {
742 InnerShift->
setOperand(1, ConstantInt::get(ShType, ShAmt));
755 if (IsInnerShl == IsOuterShl) {
757 if (InnerShAmt + OuterShAmt >= TypeWidth)
760 return NewInnerShift(InnerShAmt + OuterShAmt);
766 if (InnerShAmt == OuterShAmt) {
769 "Signed Semantics should have nsw and inner shl per "
770 "canEvaluateShiftedShift");
777 APInt Mask = IsInnerShl
781 ConstantInt::get(ShType, Mask));
784 AndI->takeName(InnerShift);
789 assert(InnerShAmt > OuterShAmt &&
790 "Unexpected opposite direction logical shift pair");
796 return NewInnerShift(InnerShAmt - OuterShAmt);
801Value *InstCombinerImpl::getShiftedValue(
Value *V,
unsigned NumBits,
807 IsLeftShift ? Instruction::Shl
809 : Instruction::LShr);
810 return Builder.CreateBinOp(ShiftOp,
C,
811 ConstantInt::get(
C->getType(), NumBits));
817 switch (
I->getOpcode()) {
819 case Instruction::And:
820 case Instruction::Or:
821 case Instruction::Xor:
824 0, getShiftedValue(
I->getOperand(0), NumBits, IsLeftShift, Semantics));
826 1, getShiftedValue(
I->getOperand(1), NumBits, IsLeftShift, Semantics));
829 case Instruction::Shl:
830 case Instruction::LShr:
834 case Instruction::Select:
836 1, getShiftedValue(
I->getOperand(1), NumBits, IsLeftShift, Semantics));
838 2, getShiftedValue(
I->getOperand(2), NumBits, IsLeftShift, Semantics));
840 case Instruction::PHI: {
847 IsLeftShift, Semantics));
850 case Instruction::Mul: {
851 assert(!IsLeftShift &&
"Unexpected shift direction!");
854 unsigned TypeWidth =
I->getType()->getScalarSizeInBits();
856 auto *
And = BinaryOperator::CreateAnd(Neg,
857 ConstantInt::get(
I->getType(), Mask));
861 case Instruction::Add: {
863 I->dropPoisonGeneratingFlags();
865 0, getShiftedValue(
I->getOperand(0), NumBits, IsLeftShift, Semantics));
867 1, getShiftedValue(
I->getOperand(1), NumBits, IsLeftShift, Semantics));
880 case Instruction::Add:
881 return Shift.
getOpcode() == Instruction::Shl;
882 case Instruction::Or:
883 case Instruction::And:
885 case Instruction::Xor:
898 bool IsLeftShift =
I.getOpcode() == Instruction::Shl;
901 I.getOpcode(),
Builder.CreateBinOp(
I.getOpcode(), C2, C1),
X);
904 R->setHasNoUnsignedWrap(
I.hasNoUnsignedWrap() &&
908 R->setIsExact(
I.isExact() && BO0->
isExact());
912 Type *Ty =
I.getType();
913 unsigned TypeBits = Ty->getScalarSizeInBits();
921 Constant *NegDivC = ConstantInt::get(Ty, -(*DivC));
925 auto ExtOpcode = (
I.getOpcode() == Instruction::AShr) ? Instruction::SExt
935 "Shift over the type width should have been removed already");
939 if (
I.getOpcode() != Instruction::AShr) {
940 bool IsLeftShift =
I.getOpcode() == Instruction::Shl;
943 if (canEvaluateShifted(Op0, Op1C->
getZExtValue(), IsLeftShift, Semantics,
946 dbgs() <<
"ICE: GetShiftedValue propagating shift through expression"
947 " to eliminate shift:\n IN: "
948 << *Op0 <<
"\n SH: " <<
I <<
"\n");
951 IsLeftShift, Semantics));
968 Builder.CreateBinOp(
I.getOpcode(), Op0BO->getOperand(1), C1);
971 Builder.CreateBinOp(
I.getOpcode(), Op0BO->getOperand(0), C1);
999 Value *NewShift =
Builder.CreateBinOp(
I.getOpcode(), FalseVal, C1);
1002 Cond, NewOp, NewShift,
"",
nullptr,
1018 Value *NewShift =
Builder.CreateBinOp(
I.getOpcode(), TrueVal, C1);
1021 Cond, NewShift, NewOp,
"",
nullptr,
1041 assert(
I.getOpcode() == Instruction::LShr);
1044 Value *ShiftAmt =
I.getOperand(1);
1045 Type *Ty =
I.getType();
1047 if (Ty->getScalarSizeInBits() < 3)
1050 const APInt *ShAmtAPInt =
nullptr;
1051 Value *
X =
nullptr, *
Y =
nullptr;
1062 if (
X->getType()->getScalarSizeInBits() != ShAmt ||
1063 Y->getType()->getScalarSizeInBits() != ShAmt)
1067 if (!
Add->hasOneUse()) {
1068 for (
User *U :
Add->users()) {
1081 Builder.SetInsertPoint(AddInst);
1085 Builder.CreateICmpULT(NarrowAdd,
X,
"add.narrowed.overflow");
1090 if (!
Add->hasOneUse()) {
1096 return new ZExtInst(Overflow, Ty);
1101 assert(
I.isShift() &&
"Expected a shift as input");
1103 if (
I.getOpcode() == Instruction::Shl) {
1104 if (
I.hasNoUnsignedWrap() &&
I.hasNoSignedWrap())
1116 if (
match(
I.getOperand(1),
1133 if (
I.getOpcode() == Instruction::Shl) {
1136 I.setHasNoUnsignedWrap();
1140 if (!
I.hasNoSignedWrap()) {
1144 I.setHasNoSignedWrap();
1163 I.hasNoSignedWrap(),
I.hasNoUnsignedWrap(), Q))
1175 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1176 Type *Ty =
I.getType();
1177 unsigned BitWidth = Ty->getScalarSizeInBits();
1181 unsigned ShAmtC =
C->getZExtValue();
1187 unsigned SrcWidth =
X->getType()->getScalarSizeInBits();
1188 if (ShAmtC < SrcWidth &&
1196 return BinaryOperator::CreateAnd(
X, ConstantInt::get(Ty, Mask));
1203 if (ShrAmt < ShAmtC) {
1205 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmtC - ShrAmt);
1206 auto *NewShl = BinaryOperator::CreateShl(
X, ShiftDiff);
1207 NewShl->setHasNoUnsignedWrap(
1208 I.hasNoUnsignedWrap() ||
1211 I.hasNoSignedWrap()));
1212 NewShl->setHasNoSignedWrap(
I.hasNoSignedWrap());
1215 if (ShrAmt > ShAmtC) {
1217 Constant *ShiftDiff = ConstantInt::get(Ty, ShrAmt - ShAmtC);
1220 NewShr->setIsExact(
true);
1228 if (ShrAmt < ShAmtC) {
1230 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmtC - ShrAmt);
1231 auto *NewShl = BinaryOperator::CreateShl(
X, ShiftDiff);
1232 NewShl->setHasNoUnsignedWrap(
1233 I.hasNoUnsignedWrap() ||
1236 I.hasNoSignedWrap()));
1237 NewShl->setHasNoSignedWrap(
I.hasNoSignedWrap());
1240 return BinaryOperator::CreateAnd(NewShl, ConstantInt::get(Ty, Mask));
1242 if (ShrAmt > ShAmtC) {
1244 Constant *ShiftDiff = ConstantInt::get(Ty, ShrAmt - ShAmtC);
1248 NewShr->setIsExact(OldShr->isExact());
1251 return BinaryOperator::CreateAnd(NewShr, ConstantInt::get(Ty, Mask));
1261 unsigned ShDiff = ShrAmtC > ShAmtC ? ShrAmtC - ShAmtC : ShAmtC - ShrAmtC;
1262 Constant *ShiftDiffC = ConstantInt::get(
X->getType(), ShDiff);
1263 auto ShiftOpc = ShrAmtC > ShAmtC ? Shr->
getOpcode() : Instruction::Shl;
1269 Value *NewShift =
Builder.CreateBinOp(ShiftOpc,
X, ShiftDiffC,
"sh.diff");
1270 Value *Trunc =
Builder.CreateTrunc(NewShift, Ty,
"tr.sh.diff");
1272 return BinaryOperator::CreateAnd(Trunc, ConstantInt::get(Ty, Mask));
1278 switch (BinOpcode) {
1281 case Instruction::Add:
1282 case Instruction::And:
1283 case Instruction::Or:
1284 case Instruction::Xor:
1285 case Instruction::Sub:
1293 isSuitableBinOpcode(Op0BO->
getOpcode())) {
1314 unsigned Op1Val =
C->getLimitedValue(
BitWidth);
1316 Constant *Mask = ConstantInt::get(Ty, Bits);
1317 return BinaryOperator::CreateAnd(
B, Mask);
1328 X->getName() +
".mask");
1331 Disjoint && Disjoint->isDisjoint())
1341 return BinaryOperator::CreateSub(NewLHS, NewShift);
1354 return BinaryOperator::CreateAnd(Mask,
X);
1360 return BinaryOperator::CreateShl(
AllOnes, Op1);
1369 return BinaryOperator::CreateMul(
X,
Builder.CreateShl(C2, C1));
1373 auto *NewC =
Builder.CreateShl(ConstantInt::get(Ty, 1), C1);
1374 return createSelectInstWithUnknownProfile(
X, NewC,
1382 return BinaryOperator::CreateLShr(
1389 return BinaryOperator::CreateAnd(NegX,
X);
1397 auto *
Mul = BinaryOperator::CreateMul(LowBit, Op0);
1399 if (
I.hasNoUnsignedWrap())
1400 Mul->setHasNoUnsignedWrap();
1409 SQ.getWithInstruction(&
I)))
1418 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1419 Type *Ty =
I.getType();
1422 unsigned BitWidth = Ty->getScalarSizeInBits();
1439 auto *NewSub = BinaryOperator::CreateNUWSub(
X, NewLshr);
1440 NewSub->setHasNoSignedWrap(
1449 return BinaryOperator::CreateAnd(
X,
Y);
1456 auto *NewSub = BinaryOperator::CreateNUWSub(NewLshr,
Y);
1457 NewSub->setHasNoSignedWrap(
1463 switch (BinOpcode) {
1466 case Instruction::Add:
1467 case Instruction::And:
1468 case Instruction::Or:
1469 case Instruction::Xor:
1480 if (isSuitableBinOpcode(Op0OB->
getOpcode())) {
1482 !OBO || OBO->hasNoUnsignedWrap()) {
1484 Y, Op1,
"",
I.isExact() && Op0OB->
getOpcode() != Instruction::And);
1487 NewBinOp->setHasNoUnsignedWrap(
true);
1488 NewBinOp->setHasNoSignedWrap(OBO->hasNoSignedWrap());
1491 Disjoint->isDisjoint());
1499 unsigned ShAmtC =
C->getZExtValue();
1502 (
II->getIntrinsicID() == Intrinsic::ctlz ||
1503 II->getIntrinsicID() == Intrinsic::cttz ||
1504 II->getIntrinsicID() == Intrinsic::ctpop)) {
1508 bool IsPop =
II->getIntrinsicID() == Intrinsic::ctpop;
1516 if (C1->
ult(ShAmtC)) {
1518 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmtC - ShlAmtC);
1521 auto *NewLShr = BinaryOperator::CreateLShr(
X, ShiftDiff);
1522 NewLShr->setIsExact(
I.isExact());
1527 Value *NewLShr =
Builder.CreateLShr(
X, ShiftDiff,
"",
I.isExact());
1529 return BinaryOperator::CreateAnd(NewLShr, ConstantInt::get(Ty, Mask));
1531 }
else if (C1->
ugt(ShAmtC)) {
1533 Constant *ShiftDiff = ConstantInt::get(Ty, ShlAmtC - ShAmtC);
1536 auto *NewShl = BinaryOperator::CreateShl(
X, ShiftDiff);
1537 NewShl->setHasNoUnsignedWrap(
true);
1538 NewShl->setHasNoSignedWrap(ShAmtC > 0);
1545 return BinaryOperator::CreateAnd(NewShl, ConstantInt::get(Ty, Mask));
1551 return BinaryOperator::CreateAnd(
X, ConstantInt::get(Ty, Mask));
1563 unsigned Op1Val =
C->getLimitedValue(
BitWidth);
1565 Constant *Mask = ConstantInt::get(Ty, Bits);
1566 return BinaryOperator::CreateAnd(NewAdd, Mask);
1570 (!Ty->isIntegerTy() || shouldChangeType(Ty,
X->getType()))) {
1572 "Big shift not simplified to zero?");
1579 unsigned SrcTyBitWidth =
X->getType()->getScalarSizeInBits();
1581 if (SrcTyBitWidth == 1) {
1582 auto *NewC = ConstantInt::get(
1587 if ((!Ty->isIntegerTy() || shouldChangeType(Ty,
X->getType())) &&
1597 if (ShAmtC ==
BitWidth - SrcTyBitWidth) {
1599 unsigned NewShAmt = std::min(ShAmtC, SrcTyBitWidth - 1);
1619 return BinaryOperator::CreateAnd(Signbit,
X);
1631 unsigned SrcWidth =
X->getType()->getScalarSizeInBits();
1639 if (AmtSum < SrcWidth &&
1641 Value *SumShift =
Builder.CreateLShr(
X, AmtSum,
"sum.shift");
1642 Value *Trunc =
Builder.CreateTrunc(SumShift, Ty,
I.getName());
1647 return BinaryOperator::CreateAnd(Trunc, ConstantInt::get(Ty, MaskC));
1653 if (
BitWidth > 2 && (*MulC - 1).isPowerOf2() &&
1663 auto *NewAdd = BinaryOperator::CreateNUWAdd(
1664 X,
Builder.CreateLShr(
X, ConstantInt::get(Ty, ShAmtC),
"",
1666 NewAdd->setHasNoSignedWrap(
1679 if (MulC->
eq(NewMulC.
shl(ShAmtC))) {
1681 BinaryOperator::CreateNUWMul(
X, ConstantInt::get(Ty, NewMulC));
1683 "lshr X, 0 should be handled by simplifyLShrInst.");
1684 NewMul->setHasNoSignedWrap(
true);
1692 if (
BitWidth > 2 && (*MulC - 1).isPowerOf2() &&
1694 return BinaryOperator::CreateNSWAdd(
1695 X,
Builder.CreateLShr(
X, ConstantInt::get(Ty, ShAmtC),
"",
1705 unsigned SrcWidth =
X->getType()->getScalarSizeInBits();
1706 unsigned WidthDiff =
BitWidth - SrcWidth;
1707 if (SrcWidth % 16 == 0) {
1708 Value *NarrowSwap =
Builder.CreateUnaryIntrinsic(Intrinsic::bswap,
X);
1709 if (ShAmtC >= WidthDiff) {
1711 Value *NewShift =
Builder.CreateLShr(NarrowSwap, ShAmtC - WidthDiff);
1716 Constant *ShiftDiff = ConstantInt::get(Ty, WidthDiff - ShAmtC);
1717 return BinaryOperator::CreateShl(NewZExt, ShiftDiff);
1724 Value *BoolX, *BoolY;
1729 (
X->hasOneUse() ||
Y->hasOneUse() || Op0->
hasOneUse())) {
1743 return BinaryOperator::CreateAnd(Mask,
X);
1749 return BinaryOperator::CreateLShr(
AllOnes, Op1);
1756 Value *Shl0_Op0, *Shl0_Op1, *Shl1_Op1;
1765 if (HasNUW || HasNSW) {
1767 Shl0_Op1,
"", HasNUW, HasNSW);
1768 return BinaryOperator::CreateLShr(NewShl, Shl1_Op1);
1778 "Must be called with arithmetic right-shift instruction only.");
1791 if (!
match(&OldAShr,
1797 !BitWidthSplat(C1, &OldAShr) || !BitWidthSplat(C2, &OldAShr))
1803 bool HadTrunc = MaybeTrunc != HighBitExtract;
1806 Value *
X, *NumLowBitsToSkip;
1812 if (!
match(NumLowBitsToSkip,
1815 !BitWidthSplat(C0, HighBitExtract))
1843 SQ.getWithInstruction(&
I)))
1852 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1853 Type *Ty =
I.getType();
1854 unsigned BitWidth = Ty->getScalarSizeInBits();
1855 const APInt *ShAmtAPInt;
1864 ShAmt ==
BitWidth -
X->getType()->getScalarSizeInBits())
1873 if (ShlAmt < ShAmt) {
1875 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmt - ShlAmt);
1876 auto *NewAShr = BinaryOperator::CreateAShr(
X, ShiftDiff);
1877 NewAShr->setIsExact(
I.isExact());
1880 if (ShlAmt > ShAmt) {
1882 Constant *ShiftDiff = ConstantInt::get(Ty, ShlAmt - ShAmt);
1884 NewShl->setHasNoSignedWrap(
true);
1893 AmtSum = std::min(AmtSum,
BitWidth - 1);
1895 return BinaryOperator::CreateAShr(
X, ConstantInt::get(Ty, AmtSum));
1899 (Ty->isVectorTy() || shouldChangeType(Ty,
X->getType()))) {
1901 Type *SrcTy =
X->getType();
1902 ShAmt = std::min(ShAmt, SrcTy->getScalarSizeInBits() - 1);
1903 Value *NewSh =
Builder.CreateAShr(
X, ConstantInt::get(SrcTy, ShAmt));
1925 (
BitWidth > 2 && (*MulC - 1).isPowerOf2() &&
1930 auto *NewAdd = BinaryOperator::CreateNSWAdd(
1932 Builder.CreateAShr(
X, ConstantInt::get(Ty, ShAmt),
"",
I.isExact()));
1933 NewAdd->setHasNoUnsignedWrap(
1950 Constant *Mask = ConstantInt::get(Ty, 1);
1964 Instruction *Lshr = BinaryOperator::CreateLShr(Op0, Op1);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file provides internal interfaces used to implement the InstCombine.
static bool setShiftFlags(BinaryOperator &I, const SimplifyQuery &Q)
static bool canEvaluateShiftedShift(unsigned OuterShAmt, bool IsOuterShl, ShiftSemantics Semantics, Instruction *InnerShift, InstCombinerImpl &IC, Instruction *CtxI)
Return true if we can simplify two logical (either left or right) shifts that have constant shift amo...
static Instruction * dropRedundantMaskingOfLeftShiftInput(BinaryOperator *OuterShift, const SimplifyQuery &Q, InstCombiner::BuilderTy &Builder)
bool canTryToConstantAddTwoShiftAmounts(Value *Sh0, Value *ShAmt0, Value *Sh1, Value *ShAmt1)
static Instruction * foldShiftOfShiftedBinOp(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
If we have a shift-by-constant of a bin op (bitwise logic op or add/sub w/ shl) that itself has a shi...
static Value * foldShiftedShift(BinaryOperator *InnerShift, unsigned OuterShAmt, bool IsOuterShl, ShiftSemantics Semantics, InstCombiner::BuilderTy &Builder)
Fold OuterShift (InnerShift X, C1), C2.
static bool canShiftBinOpWithConstantRHS(BinaryOperator &Shift, BinaryOperator *BO)
This file provides the interface for the instcombine pass implementation.
static bool hasNoSignedWrap(BinaryOperator &I)
static bool hasNoUnsignedWrap(BinaryOperator &I)
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > & Cond
static const MCExpr * MaskShift(const MCExpr *Val, uint32_t Mask, uint32_t Shift, MCContext &Ctx)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
bool isMinSignedValue() const
Determine if this is the smallest signed value.
uint64_t getZExtValue() const
Get zero extended value.
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
bool isNegative() const
Determine sign of this APInt.
bool eq(const APInt &RHS) const
Equality comparison.
unsigned countr_zero() const
Count the number of trailing zero bits.
unsigned logBase2() const
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
APInt shl(unsigned shiftAmt) const
Left-shift function.
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.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
static LLVM_ABI BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
BinaryOps getOpcode() const
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static LLVM_ABI CastInst * CreateTruncOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a Trunc or BitCast cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLE
signed less or equal
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
This is an important base class in LLVM.
static LLVM_ABI Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
static LLVM_ABI Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Instruction * visitLShr(BinaryOperator &I)
Instruction * foldBinOpIntoSelectOrPhi(BinaryOperator &I)
This is a convenience wrapper function for the above two functions.
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * visitAShr(BinaryOperator &I)
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * visitShl(BinaryOperator &I)
Instruction * foldBinopWithPhiOperands(BinaryOperator &BO)
For a binary operator with 2 phi operands, try to hoist the binary operation before the phi.
Instruction * foldVariableSignZeroExtensionOfVariableHighBitExtract(BinaryOperator &OldAShr)
Instruction * commonShiftTransforms(BinaryOperator &I)
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
Instruction * foldVectorBinop(BinaryOperator &Inst)
Canonicalize the position of binops relative to shufflevector.
Instruction * FoldShiftByConstant(Value *Op0, Constant *Op1, BinaryOperator &I)
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CtxI=nullptr, unsigned Depth=0)
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
Instruction * InsertNewInstWith(Instruction *New, BasicBlock::iterator Old)
Same as InsertNewInstBefore, but also sets the debug loc.
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CtxI=nullptr, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, unsigned Depth=0) const
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
bool isLogicalShift() const
Return true if this is a logical shift left or a logical shift right.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
op_range incoming_values()
void setIncomingValue(unsigned i, Value *V)
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
This class represents a truncation of integer types.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
LLVM_ABI Type * getExtendedType() const
Given scalar/vector integer type, returns a type with elements twice as wide as in the original type.
void setOperand(unsigned i, Value *Val)
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.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
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.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
AllOnesConstantMatch m_AllOnes()
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(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.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
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.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_Constant()
Match an arbitrary Constant and ignore it.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoSignedWrap > m_NSWShl(const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
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.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWSub(const LHS &L, const RHS &R)
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)
Exact_match< T > m_Exact(const T &SubPattern)
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap >, DisjointOr_match< LHS, RHS > > m_NUWAddLike(const LHS &L, const RHS &R)
Match either "add nuw" or "or disjoint".
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoSignedWrap > m_NSWMul(const LHS &L, const RHS &R)
auto m_Cttz(const Opnd0 &Op0, const Opnd1 &Op1)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI Value * simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q)
Given operands for a AShr, fold the result or return nulll.
ShiftSemantics
Enum to specify how shift operations should be evaluated in canEvaluateShifted.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
auto cast_or_null(const Y &Val)
LLVM_ABI unsigned ComputeNumSignBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return the number of times the sign bit of the register is replicated into the other bits.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Value * simplifySubInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Sub, fold the result or return null.
LLVM_ABI Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
auto dyn_cast_or_null(const Y &Val)
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
LLVM_ABI Value * simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Shl, fold the result or return null.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI Value * simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q)
Given operands for a LShr, fold the result or return null.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
unsigned getBitWidth() const
Get the bit width of this value.
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.