Lines Matching refs:I
66 BinaryOperator *I = dyn_cast<BinaryOperator>(V); in simplifyValueKnownNonZero() local
67 if (I && I->isLogicalShift() && in simplifyValueKnownNonZero()
68 IC.isKnownToBeAPowerOfTwo(I->getOperand(0), false, 0, &CxtI)) { in simplifyValueKnownNonZero()
71 if (Value *V2 = simplifyValueKnownNonZero(I->getOperand(0), IC, CxtI)) { in simplifyValueKnownNonZero()
72 IC.replaceOperand(*I, 0, V2); in simplifyValueKnownNonZero()
76 if (I->getOpcode() == Instruction::LShr && !I->isExact()) { in simplifyValueKnownNonZero()
77 I->setIsExact(); in simplifyValueKnownNonZero()
81 if (I->getOpcode() == Instruction::Shl && !I->hasNoUnsignedWrap()) { in simplifyValueKnownNonZero()
82 I->setHasNoUnsignedWrap(); in simplifyValueKnownNonZero()
99 static Value *foldMulSelectToNegate(BinaryOperator &I, in foldMulSelectToNegate() argument
105 if (match(&I, m_c_Mul(m_OneUse(m_Select(m_Value(Cond), m_One(), m_AllOnes())), in foldMulSelectToNegate()
107 bool HasAnyNoWrap = I.hasNoSignedWrap() || I.hasNoUnsignedWrap(); in foldMulSelectToNegate()
113 if (match(&I, m_c_Mul(m_OneUse(m_Select(m_Value(Cond), m_AllOnes(), m_One())), in foldMulSelectToNegate()
115 bool HasAnyNoWrap = I.hasNoSignedWrap() || I.hasNoUnsignedWrap(); in foldMulSelectToNegate()
122 if (match(&I, m_c_FMul(m_OneUse(m_Select(m_Value(Cond), m_SpecificFP(1.0), in foldMulSelectToNegate()
126 Builder.setFastMathFlags(I.getFastMathFlags()); in foldMulSelectToNegate()
132 if (match(&I, m_c_FMul(m_OneUse(m_Select(m_Value(Cond), m_SpecificFP(-1.0), in foldMulSelectToNegate()
136 Builder.setFastMathFlags(I.getFastMathFlags()); in foldMulSelectToNegate()
191 Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) { in visitMul() argument
192 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in visitMul()
194 simplifyMulInst(Op0, Op1, I.hasNoSignedWrap(), I.hasNoUnsignedWrap(), in visitMul()
195 SQ.getWithInstruction(&I))) in visitMul()
196 return replaceInstUsesWith(I, V); in visitMul()
198 if (SimplifyAssociativeOrCommutative(I)) in visitMul()
199 return &I; in visitMul()
201 if (Instruction *X = foldVectorBinop(I)) in visitMul()
204 if (Instruction *Phi = foldBinopWithPhiOperands(I)) in visitMul()
207 if (Value *V = foldUsingDistributiveLaws(I)) in visitMul()
208 return replaceInstUsesWith(I, V); in visitMul()
210 Type *Ty = I.getType(); in visitMul()
212 const bool HasNSW = I.hasNoSignedWrap(); in visitMul()
213 const bool HasNUW = I.hasNoUnsignedWrap(); in visitMul()
226 if (match(&I, m_Mul(m_Shl(m_Value(NewOp), m_Constant(C2)), in visitMul()
231 BinaryOperator *Mul = cast<BinaryOperator>(I.getOperand(0)); in visitMul()
240 if (match(&I, m_Mul(m_Value(NewOp), m_Constant(C1)))) { in visitMul()
265 I, Builder.CreateMul(NegOp0, ConstantExpr::getNeg(Op1C), "", in visitMul()
290 if (Instruction *FoldedMul = foldBinOpIntoSelectOrPhi(I)) in visitMul()
293 if (Value *FoldedMul = foldMulSelectToNegate(I, Builder)) in visitMul()
294 return replaceInstUsesWith(I, FoldedMul); in visitMul()
336 if (I.hasNoSignedWrap() && in visitMul()
341 I, Builder.CreateBinaryIntrinsic(Intrinsic::abs, in visitMul()
363 if (match(&I, m_c_Mul(m_OneUse(m_Neg(m_Value(X))), m_Value(Y)))) in visitMul()
393 return replaceInstUsesWith(I, X); in visitMul()
418 if (Value *R = foldMulShl1(I, /* CommuteOperands */ false, Builder)) in visitMul()
419 return replaceInstUsesWith(I, R); in visitMul()
420 if (Value *R = foldMulShl1(I, /* CommuteOperands */ true, Builder)) in visitMul()
421 return replaceInstUsesWith(I, R); in visitMul()
473 if (match(&I, m_c_BinOp(m_LShr(m_Value(X), m_APInt(C)), m_Value(Y))) && in visitMul()
480 if (match(&I, m_c_BinOp(m_OneUse(m_And(m_Value(X), m_One())), m_Value(Y)))) { in visitMul()
487 if (match(&I, m_c_BinOp(m_Or(m_AShr(m_Value(X), in visitMul()
492 Intrinsic::abs, X, ConstantInt::getBool(I.getContext(), HasNSW)); in visitMul()
493 Abs->takeName(&I); in visitMul()
494 return replaceInstUsesWith(I, Abs); in visitMul()
497 if (Instruction *Ext = narrowMathIfNoOverflow(I)) in visitMul()
500 if (Instruction *Res = foldBinOpOfSelectAndCastOfSelectCondition(I)) in visitMul()
528 if (!HasNSW && willNotOverflowSignedMul(Op0, Op1, I)) { in visitMul()
530 I.setHasNoSignedWrap(true); in visitMul()
533 if (!HasNUW && willNotOverflowUnsignedMul(Op0, Op1, I)) { in visitMul()
535 I.setHasNoUnsignedWrap(true); in visitMul()
538 return Changed ? &I : nullptr; in visitMul()
541 Instruction *InstCombinerImpl::foldFPSignBitOps(BinaryOperator &I) { in foldFPSignBitOps() argument
542 BinaryOperator::BinaryOps Opcode = I.getOpcode(); in foldFPSignBitOps()
546 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in foldFPSignBitOps()
552 return BinaryOperator::CreateWithCopiedFlags(Opcode, X, Y, &I); in foldFPSignBitOps()
557 return BinaryOperator::CreateWithCopiedFlags(Opcode, X, X, &I); in foldFPSignBitOps()
564 Builder.setFastMathFlags(I.getFastMathFlags()); in foldFPSignBitOps()
567 Fabs->takeName(&I); in foldFPSignBitOps()
568 return replaceInstUsesWith(I, Fabs); in foldFPSignBitOps()
574 Instruction *InstCombinerImpl::foldFMulReassoc(BinaryOperator &I) { in foldFMulReassoc() argument
575 Value *Op0 = I.getOperand(0); in foldFMulReassoc()
576 Value *Op1 = I.getOperand(1); in foldFMulReassoc()
589 return BinaryOperator::CreateFDivFMF(CC1, X, &I); in foldFMulReassoc()
596 return BinaryOperator::CreateFMulFMF(X, CDivC1, &I); in foldFMulReassoc()
603 return BinaryOperator::CreateFDivFMF(X, C1DivC, &I); in foldFMulReassoc()
613 Value *XC = Builder.CreateFMulFMF(X, C, &I); in foldFMulReassoc()
614 return BinaryOperator::CreateFAddFMF(XC, CC1, &I); in foldFMulReassoc()
621 Value *XC = Builder.CreateFMulFMF(X, C, &I); in foldFMulReassoc()
622 return BinaryOperator::CreateFSubFMF(CC1, XC, &I); in foldFMulReassoc()
628 if (match(&I, in foldFMulReassoc()
631 Value *NewFMul = Builder.CreateFMulFMF(X, Z, &I); in foldFMulReassoc()
632 return BinaryOperator::CreateFDivFMF(NewFMul, Y, &I); in foldFMulReassoc()
638 if (I.hasNoNaNs() && match(Op0, m_OneUse(m_Sqrt(m_Value(X)))) && in foldFMulReassoc()
640 Value *XY = Builder.CreateFMulFMF(X, Y, &I); in foldFMulReassoc()
641 Value *Sqrt = Builder.CreateUnaryIntrinsic(Intrinsic::sqrt, XY, &I); in foldFMulReassoc()
642 return replaceInstUsesWith(I, Sqrt); in foldFMulReassoc()
651 if (I.hasNoSignedZeros() && in foldFMulReassoc()
654 return BinaryOperator::CreateFDivFMF(X, Y, &I); in foldFMulReassoc()
655 if (I.hasNoSignedZeros() && in foldFMulReassoc()
658 return BinaryOperator::CreateFDivFMF(X, Y, &I); in foldFMulReassoc()
662 if (I.hasNoNaNs() && I.hasNoSignedZeros() && Op0 == Op1 && Op0->hasNUses(2)) { in foldFMulReassoc()
666 Value *XX = Builder.CreateFMulFMF(X, X, &I); in foldFMulReassoc()
667 return BinaryOperator::CreateFDivFMF(XX, Y, &I); in foldFMulReassoc()
671 Value *XX = Builder.CreateFMulFMF(X, X, &I); in foldFMulReassoc()
672 return BinaryOperator::CreateFDivFMF(Y, XX, &I); in foldFMulReassoc()
678 if (match(&I, m_c_FMul(m_OneUse(m_Intrinsic<Intrinsic::pow>(m_Value(X), in foldFMulReassoc()
681 Value *Y1 = Builder.CreateFAddFMF(Y, ConstantFP::get(I.getType(), 1.0), &I); in foldFMulReassoc()
682 Value *Pow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, X, Y1, &I); in foldFMulReassoc()
683 return replaceInstUsesWith(I, Pow); in foldFMulReassoc()
686 if (I.isOnlyUserOfAnyOperand()) { in foldFMulReassoc()
690 auto *YZ = Builder.CreateFAddFMF(Y, Z, &I); in foldFMulReassoc()
691 auto *NewPow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, X, YZ, &I); in foldFMulReassoc()
692 return replaceInstUsesWith(I, NewPow); in foldFMulReassoc()
697 auto *XZ = Builder.CreateFMulFMF(X, Z, &I); in foldFMulReassoc()
698 auto *NewPow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, XZ, Y, &I); in foldFMulReassoc()
699 return replaceInstUsesWith(I, NewPow); in foldFMulReassoc()
708 Intrinsic::powi, {X->getType(), YZ->getType()}, {X, YZ}, &I); in foldFMulReassoc()
709 return replaceInstUsesWith(I, NewPow); in foldFMulReassoc()
715 Value *XY = Builder.CreateFAddFMF(X, Y, &I); in foldFMulReassoc()
716 Value *Exp = Builder.CreateUnaryIntrinsic(Intrinsic::exp, XY, &I); in foldFMulReassoc()
717 return replaceInstUsesWith(I, Exp); in foldFMulReassoc()
723 Value *XY = Builder.CreateFAddFMF(X, Y, &I); in foldFMulReassoc()
724 Value *Exp2 = Builder.CreateUnaryIntrinsic(Intrinsic::exp2, XY, &I); in foldFMulReassoc()
725 return replaceInstUsesWith(I, Exp2); in foldFMulReassoc()
737 Value *XX = Builder.CreateFMulFMF(Op1, Op1, &I); in foldFMulReassoc()
738 return BinaryOperator::CreateFMulFMF(XX, Y, &I); in foldFMulReassoc()
741 Value *XX = Builder.CreateFMulFMF(Op0, Op0, &I); in foldFMulReassoc()
742 return BinaryOperator::CreateFMulFMF(XX, Y, &I); in foldFMulReassoc()
748 Instruction *InstCombinerImpl::visitFMul(BinaryOperator &I) { in visitFMul() argument
749 if (Value *V = simplifyFMulInst(I.getOperand(0), I.getOperand(1), in visitFMul()
750 I.getFastMathFlags(), in visitFMul()
751 SQ.getWithInstruction(&I))) in visitFMul()
752 return replaceInstUsesWith(I, V); in visitFMul()
754 if (SimplifyAssociativeOrCommutative(I)) in visitFMul()
755 return &I; in visitFMul()
757 if (Instruction *X = foldVectorBinop(I)) in visitFMul()
760 if (Instruction *Phi = foldBinopWithPhiOperands(I)) in visitFMul()
763 if (Instruction *FoldedMul = foldBinOpIntoSelectOrPhi(I)) in visitFMul()
766 if (Value *FoldedMul = foldMulSelectToNegate(I, Builder)) in visitFMul()
767 return replaceInstUsesWith(I, FoldedMul); in visitFMul()
769 if (Instruction *R = foldFPSignBitOps(I)) in visitFMul()
773 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in visitFMul()
775 return UnaryOperator::CreateFNegFMF(Op0, &I); in visitFMul()
778 if (I.hasNoNaNs() && match(Op1, m_PosZeroFP())) { in visitFMul()
780 {I.getType()}, {Op1, Op0}, &I); in visitFMul()
781 return replaceInstUsesWith(I, CopySign); in visitFMul()
789 return BinaryOperator::CreateFMulFMF(X, NegC, &I); in visitFMul()
792 if (Value *V = SimplifySelectsFeedingBinaryOp(I, Op0, Op1)) in visitFMul()
793 return replaceInstUsesWith(I, V); in visitFMul()
795 if (I.hasAllowReassoc()) in visitFMul()
796 if (Instruction *FoldedMul = foldFMulReassoc(I)) in visitFMul()
800 if (I.isFast()) { in visitFMul()
813 Value *Log2 = Builder.CreateUnaryIntrinsic(Intrinsic::log2, X, &I); in visitFMul()
814 Value *LogXTimesY = Builder.CreateFMulFMF(Log2, Y, &I); in visitFMul()
815 return BinaryOperator::CreateFSubFMF(LogXTimesY, Y, &I); in visitFMul()
824 if (matchSimpleRecurrence(&I, PN, Start, Step) && I.hasNoNaNs() && in visitFMul()
825 I.hasNoSignedZeros() && match(Start, m_Zero())) in visitFMul()
826 return replaceInstUsesWith(I, Start); in visitFMul()
829 if (match(&I, in visitFMul()
833 BinaryOperator *Result = BinaryOperator::CreateFMulFMF(X, Y, &I); in visitFMul()
848 bool InstCombinerImpl::simplifyDivRemOfSelectWithZeroOp(BinaryOperator &I) { in simplifyDivRemOfSelectWithZeroOp() argument
849 SelectInst *SI = dyn_cast<SelectInst>(I.getOperand(1)); in simplifyDivRemOfSelectWithZeroOp()
864 replaceOperand(I, 1, SI->getOperand(NonNullOperand)); in simplifyDivRemOfSelectWithZeroOp()
879 BasicBlock::iterator BBI = I.getIterator(), BBFront = I.getParent()->begin(); in simplifyDivRemOfSelectWithZeroOp()
944 static Value *foldIDivShl(BinaryOperator &I, InstCombiner::BuilderTy &Builder) { in foldIDivShl() argument
945 assert((I.getOpcode() == Instruction::SDiv || in foldIDivShl()
946 I.getOpcode() == Instruction::UDiv) && in foldIDivShl()
949 bool IsSigned = I.getOpcode() == Instruction::SDiv; in foldIDivShl()
950 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in foldIDivShl()
951 Type *Ty = I.getType(); in foldIDivShl()
967 return Builder.CreateLShr(Y, Z, "", I.isExact()); in foldIDivShl()
972 return Builder.CreateSDiv(Y, Shl, "", I.isExact()); in foldIDivShl()
990 return Builder.CreateUDiv(X, Y, "", I.isExact()); in foldIDivShl()
996 return Builder.CreateSDiv(X, Y, "", I.isExact()); in foldIDivShl()
1017 return Builder.CreateLShr(Dividend, Z, "", I.isExact()); in foldIDivShl()
1028 Instruction *InstCombinerImpl::commonIDivTransforms(BinaryOperator &I) { in commonIDivTransforms() argument
1029 if (Instruction *Phi = foldBinopWithPhiOperands(I)) in commonIDivTransforms()
1032 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in commonIDivTransforms()
1033 bool IsSigned = I.getOpcode() == Instruction::SDiv; in commonIDivTransforms()
1034 Type *Ty = I.getType(); in commonIDivTransforms()
1037 if (Value *V = simplifyValueKnownNonZero(I.getOperand(1), *this, I)) in commonIDivTransforms()
1038 return replaceOperand(I, 1, V); in commonIDivTransforms()
1042 if (simplifyDivRemOfSelectWithZeroOp(I)) in commonIDivTransforms()
1043 return &I; in commonIDivTransforms()
1050 if (Instruction *R = FoldOpIntoSelect(I, cast<SelectInst>(Op1), in commonIDivTransforms()
1065 return BinaryOperator::Create(I.getOpcode(), X, in commonIDivTransforms()
1075 auto *NewDiv = BinaryOperator::Create(I.getOpcode(), X, in commonIDivTransforms()
1077 NewDiv->setIsExact(I.isExact()); in commonIDivTransforms()
1101 auto *BO = BinaryOperator::Create(I.getOpcode(), X, in commonIDivTransforms()
1103 BO->setIsExact(I.isExact()); in commonIDivTransforms()
1136 if (Instruction *FoldedDiv = foldBinOpIntoSelectOrPhi(I)) in commonIDivTransforms()
1158 if (SimplifyDemandedInstructionBits(I)) in commonIDivTransforms()
1159 return &I; in commonIDivTransforms()
1166 return BinaryOperator::Create(I.getOpcode(), X, Op1); in commonIDivTransforms()
1180 replaceOperand(I, 0, ConstantInt::get(Ty, 1)); in commonIDivTransforms()
1181 replaceOperand(I, 1, Y); in commonIDivTransforms()
1182 return &I; in commonIDivTransforms()
1194 NewDiv->setIsExact(I.isExact()); in commonIDivTransforms()
1198 if (Value *R = foldIDivShl(I, Builder)) in commonIDivTransforms()
1199 return replaceInstUsesWith(I, R); in commonIDivTransforms()
1204 if (match(Op0, m_BinOp(I.getOpcode(), m_c_Mul(m_Specific(Op1), m_Value(X)), in commonIDivTransforms()
1216 NewDiv->setIsExact(I.isExact() && InnerDiv->isExact()); in commonIDivTransforms()
1336 static Instruction *narrowUDivURem(BinaryOperator &I, in narrowUDivURem() argument
1338 Instruction::BinaryOps Opcode = I.getOpcode(); in narrowUDivURem()
1339 Value *N = I.getOperand(0); in narrowUDivURem()
1340 Value *D = I.getOperand(1); in narrowUDivURem()
1341 Type *Ty = I.getType(); in narrowUDivURem()
1378 Instruction *InstCombinerImpl::visitUDiv(BinaryOperator &I) { in visitUDiv() argument
1379 if (Value *V = simplifyUDivInst(I.getOperand(0), I.getOperand(1), I.isExact(), in visitUDiv()
1380 SQ.getWithInstruction(&I))) in visitUDiv()
1381 return replaceInstUsesWith(I, V); in visitUDiv()
1383 if (Instruction *X = foldVectorBinop(I)) in visitUDiv()
1387 if (Instruction *Common = commonIDivTransforms(I)) in visitUDiv()
1390 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in visitUDiv()
1398 bool IsExact = I.isExact() && match(Op0, m_Exact(m_Value())); in visitUDiv()
1409 Type *Ty = I.getType(); in visitUDiv()
1420 if (Instruction *NarrowDiv = narrowUDivURem(I, *this)) in visitUDiv()
1430 if (I.isExact() && cast<PossiblyExactOperator>(Op0)->isExact()) in visitUDiv()
1441 I, Builder.CreateLShr(Op0, Res, I.getName(), I.isExact())); in visitUDiv()
1447 Instruction *InstCombinerImpl::visitSDiv(BinaryOperator &I) { in visitSDiv() argument
1448 if (Value *V = simplifySDivInst(I.getOperand(0), I.getOperand(1), I.isExact(), in visitSDiv()
1449 SQ.getWithInstruction(&I))) in visitSDiv()
1450 return replaceInstUsesWith(I, V); in visitSDiv()
1452 if (Instruction *X = foldVectorBinop(I)) in visitSDiv()
1456 if (Instruction *Common = commonIDivTransforms(I)) in visitSDiv()
1459 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in visitSDiv()
1460 Type *Ty = I.getType(); in visitSDiv()
1472 if (I.isExact()) { in visitSDiv()
1488 Value *Ashr = Builder.CreateAShr(Op0, C, I.getName() + ".neg", true); in visitSDiv()
1520 BO->setIsExact(I.isExact()); in visitSDiv()
1527 if (match(&I, m_SDiv(m_OneUse(m_NSWSub(m_Zero(), m_Value(X))), m_Value(Y)))) in visitSDiv()
1529 Builder.CreateSDiv(X, Y, I.getName(), I.isExact())); in visitSDiv()
1533 if (match(&I, m_c_BinOp( in visitSDiv()
1541 KnownBits KnownDividend = computeKnownBits(Op0, 0, &I); in visitSDiv()
1542 if (!I.isExact() && in visitSDiv()
1545 I.setIsExact(); in visitSDiv()
1546 return &I; in visitSDiv()
1551 if (isKnownNonNegative(Op1, SQ.getWithInstruction(&I))) { in visitSDiv()
1552 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1, I.getName()); in visitSDiv()
1553 BO->setIsExact(I.isExact()); in visitSDiv()
1562 Value *Shr = Builder.CreateLShr(Op0, CNegLog2, I.getName(), I.isExact()); in visitSDiv()
1566 if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/ true, 0, &I)) { in visitSDiv()
1571 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1, I.getName()); in visitSDiv()
1572 BO->setIsExact(I.isExact()); in visitSDiv()
1588 Instruction *InstCombinerImpl::foldFDivConstantDivisor(BinaryOperator &I) { in foldFDivConstantDivisor() argument
1590 if (!match(I.getOperand(1), m_Constant(C))) in foldFDivConstantDivisor()
1595 const DataLayout &DL = I.getModule()->getDataLayout(); in foldFDivConstantDivisor()
1596 if (match(I.getOperand(0), m_FNeg(m_Value(X)))) in foldFDivConstantDivisor()
1598 return BinaryOperator::CreateFDivFMF(X, NegC, &I); in foldFDivConstantDivisor()
1601 if (I.hasNoNaNs() && match(I.getOperand(1), m_Zero())) { in foldFDivConstantDivisor()
1602 IRBuilder<> B(&I); in foldFDivConstantDivisor()
1606 {ConstantFP::getInfinity(I.getType()), I.getOperand(0)}, &I); in foldFDivConstantDivisor()
1607 CopySign->takeName(&I); in foldFDivConstantDivisor()
1608 return replaceInstUsesWith(I, CopySign); in foldFDivConstantDivisor()
1614 if (!(C->hasExactInverseFP() || (I.hasAllowReciprocal() && C->isNormalFP()))) in foldFDivConstantDivisor()
1622 Instruction::FDiv, ConstantFP::get(I.getType(), 1.0), C, DL); in foldFDivConstantDivisor()
1627 return BinaryOperator::CreateFMulFMF(I.getOperand(0), RecipC, &I); in foldFDivConstantDivisor()
1631 static Instruction *foldFDivConstantDividend(BinaryOperator &I) { in foldFDivConstantDividend() argument
1633 if (!match(I.getOperand(0), m_Constant(C))) in foldFDivConstantDividend()
1638 const DataLayout &DL = I.getModule()->getDataLayout(); in foldFDivConstantDividend()
1639 if (match(I.getOperand(1), m_FNeg(m_Value(X)))) in foldFDivConstantDividend()
1641 return BinaryOperator::CreateFDivFMF(NegC, X, &I); in foldFDivConstantDividend()
1643 if (!I.hasAllowReassoc() || !I.hasAllowReciprocal()) in foldFDivConstantDividend()
1648 if (match(I.getOperand(1), m_FMul(m_Value(X), m_Constant(C2)))) { in foldFDivConstantDividend()
1651 } else if (match(I.getOperand(1), m_FDiv(m_Value(X), m_Constant(C2)))) { in foldFDivConstantDividend()
1662 return BinaryOperator::CreateFDivFMF(NewC, X, &I); in foldFDivConstantDividend()
1666 static Instruction *foldFDivPowDivisor(BinaryOperator &I, in foldFDivPowDivisor() argument
1668 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in foldFDivPowDivisor()
1670 if (!II || !II->hasOneUse() || !I.hasAllowReassoc() || in foldFDivPowDivisor()
1671 !I.hasAllowReciprocal()) in foldFDivPowDivisor()
1683 Args.push_back(Builder.CreateFNegFMF(II->getArgOperand(1), &I)); in foldFDivPowDivisor()
1691 if (!I.hasNoInfs()) in foldFDivPowDivisor()
1695 Type *Tys[] = {I.getType(), II->getArgOperand(1)->getType()}; in foldFDivPowDivisor()
1696 Value *Pow = Builder.CreateIntrinsic(IID, Tys, Args, &I); in foldFDivPowDivisor()
1697 return BinaryOperator::CreateFMulFMF(Op0, Pow, &I); in foldFDivPowDivisor()
1701 Args.push_back(Builder.CreateFNegFMF(II->getArgOperand(0), &I)); in foldFDivPowDivisor()
1706 Value *Pow = Builder.CreateIntrinsic(IID, I.getType(), Args, &I); in foldFDivPowDivisor()
1707 return BinaryOperator::CreateFMulFMF(Op0, Pow, &I); in foldFDivPowDivisor()
1710 Instruction *InstCombinerImpl::visitFDiv(BinaryOperator &I) { in visitFDiv() argument
1711 Module *M = I.getModule(); in visitFDiv()
1713 if (Value *V = simplifyFDivInst(I.getOperand(0), I.getOperand(1), in visitFDiv()
1714 I.getFastMathFlags(), in visitFDiv()
1715 SQ.getWithInstruction(&I))) in visitFDiv()
1716 return replaceInstUsesWith(I, V); in visitFDiv()
1718 if (Instruction *X = foldVectorBinop(I)) in visitFDiv()
1721 if (Instruction *Phi = foldBinopWithPhiOperands(I)) in visitFDiv()
1724 if (Instruction *R = foldFDivConstantDivisor(I)) in visitFDiv()
1727 if (Instruction *R = foldFDivConstantDividend(I)) in visitFDiv()
1730 if (Instruction *R = foldFPSignBitOps(I)) in visitFDiv()
1733 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in visitFDiv()
1736 if (Instruction *R = FoldOpIntoSelect(I, SI)) in visitFDiv()
1741 if (Instruction *R = FoldOpIntoSelect(I, SI)) in visitFDiv()
1744 if (I.hasAllowReassoc() && I.hasAllowReciprocal()) { in visitFDiv()
1749 Value *YZ = Builder.CreateFMulFMF(Y, Op1, &I); in visitFDiv()
1750 return BinaryOperator::CreateFDivFMF(X, YZ, &I); in visitFDiv()
1755 Value *YZ = Builder.CreateFMulFMF(Y, Op0, &I); in visitFDiv()
1756 return BinaryOperator::CreateFDivFMF(YZ, X, &I); in visitFDiv()
1765 return BinaryOperator::CreateFMulFMF(Y, Op0, &I); in visitFDiv()
1768 if (I.hasAllowReassoc() && Op0->hasOneUse() && Op1->hasOneUse()) { in visitFDiv()
1778 if ((IsTan || IsCot) && hasFloatFn(M, &TLI, I.getType(), LibFunc_tan, in visitFDiv()
1780 IRBuilder<> B(&I); in visitFDiv()
1782 B.setFastMathFlags(I.getFastMathFlags()); in visitFDiv()
1788 Res = B.CreateFDiv(ConstantFP::get(I.getType(), 1.0), Res); in visitFDiv()
1789 return replaceInstUsesWith(I, Res); in visitFDiv()
1797 if (I.hasNoNaNs() && I.hasAllowReassoc() && in visitFDiv()
1799 replaceOperand(I, 0, ConstantFP::get(I.getType(), 1.0)); in visitFDiv()
1800 replaceOperand(I, 1, Y); in visitFDiv()
1801 return &I; in visitFDiv()
1806 if (I.hasNoNaNs() && I.hasNoInfs() && in visitFDiv()
1807 (match(&I, m_FDiv(m_Value(X), m_FAbs(m_Deferred(X)))) || in visitFDiv()
1808 match(&I, m_FDiv(m_FAbs(m_Value(X)), m_Deferred(X))))) { in visitFDiv()
1810 Intrinsic::copysign, ConstantFP::get(I.getType(), 1.0), X, &I); in visitFDiv()
1811 return replaceInstUsesWith(I, V); in visitFDiv()
1814 if (Instruction *Mul = foldFDivPowDivisor(I, Builder)) in visitFDiv()
1818 if (I.hasAllowReassoc() && in visitFDiv()
1822 Builder.CreateFAddFMF(Y, ConstantFP::get(I.getType(), -1.0), &I); in visitFDiv()
1823 Value *Pow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, Op1, Y1, &I); in visitFDiv()
1824 return replaceInstUsesWith(I, Pow); in visitFDiv()
1831 if (I.hasAllowReassoc() && I.hasNoNaNs() && in visitFDiv()
1834 willNotOverflowSignedSub(Y, ConstantInt::get(Y->getType(), 1), I)) { in visitFDiv()
1838 Value *Pow = Builder.CreateIntrinsic(Intrinsic::powi, Types, {Op1, Y1}, &I); in visitFDiv()
1839 return replaceInstUsesWith(I, Pow); in visitFDiv()
1851 static Instruction *simplifyIRemMulShl(BinaryOperator &I, in simplifyIRemMulShl() argument
1853 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *X = nullptr; in simplifyIRemMulShl()
1895 bool IsSRem = I.getOpcode() == Instruction::SRem; in simplifyIRemMulShl()
1909 return IC.replaceInstUsesWith(I, ConstantInt::getNullValue(I.getType())); in simplifyIRemMulShl()
1917 ConstantInt::get(I.getType(), RemSimplificationC); in simplifyIRemMulShl()
1954 Instruction *InstCombinerImpl::commonIRemTransforms(BinaryOperator &I) { in commonIRemTransforms() argument
1955 if (Instruction *Phi = foldBinopWithPhiOperands(I)) in commonIRemTransforms()
1958 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in commonIRemTransforms()
1961 if (Value *V = simplifyValueKnownNonZero(I.getOperand(1), *this, I)) in commonIRemTransforms()
1962 return replaceOperand(I, 1, V); in commonIRemTransforms()
1965 if (simplifyDivRemOfSelectWithZeroOp(I)) in commonIRemTransforms()
1966 return &I; in commonIRemTransforms()
1973 if (Instruction *R = FoldOpIntoSelect(I, cast<SelectInst>(Op1), in commonIRemTransforms()
1981 if (Instruction *R = FoldOpIntoSelect(I, SI)) in commonIRemTransforms()
1986 (I.getOpcode() == Instruction::URem || in commonIRemTransforms()
1991 if (Instruction *NV = foldOpIntoPhi(I, PN)) in commonIRemTransforms()
1997 if (SimplifyDemandedInstructionBits(I)) in commonIRemTransforms()
1998 return &I; in commonIRemTransforms()
2002 if (Instruction *R = simplifyIRemMulShl(I, *this)) in commonIRemTransforms()
2008 Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) { in visitURem() argument
2009 if (Value *V = simplifyURemInst(I.getOperand(0), I.getOperand(1), in visitURem()
2010 SQ.getWithInstruction(&I))) in visitURem()
2011 return replaceInstUsesWith(I, V); in visitURem()
2013 if (Instruction *X = foldVectorBinop(I)) in visitURem()
2016 if (Instruction *common = commonIRemTransforms(I)) in visitURem()
2019 if (Instruction *NarrowRem = narrowUDivURem(I, *this)) in visitURem()
2023 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in visitURem()
2024 Type *Ty = I.getType(); in visitURem()
2025 if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/ true, 0, &I)) { in visitURem()
2063 simplifyICmpInst(ICmpInst::ICMP_ULT, X, Op1, SQ.getWithInstruction(&I)); in visitURem()
2074 Instruction *InstCombinerImpl::visitSRem(BinaryOperator &I) { in visitSRem() argument
2075 if (Value *V = simplifySRemInst(I.getOperand(0), I.getOperand(1), in visitSRem()
2076 SQ.getWithInstruction(&I))) in visitSRem()
2077 return replaceInstUsesWith(I, V); in visitSRem()
2079 if (Instruction *X = foldVectorBinop(I)) in visitSRem()
2083 if (Instruction *Common = commonIRemTransforms(I)) in visitSRem()
2086 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); in visitSRem()
2091 return replaceOperand(I, 1, ConstantInt::get(I.getType(), -*Y)); in visitSRem()
2096 if (match(&I, m_SRem(m_OneUse(m_NSWSub(m_Zero(), m_Value(X))), m_Value(Y)))) in visitSRem()
2101 APInt Mask(APInt::getSignMask(I.getType()->getScalarSizeInBits())); in visitSRem()
2102 if (MaskedValueIsZero(Op1, Mask, 0, &I) && in visitSRem()
2103 MaskedValueIsZero(Op0, Mask, 0, &I)) { in visitSRem()
2105 return BinaryOperator::CreateURem(Op0, Op1, I.getName()); in visitSRem()
2139 return replaceOperand(I, 1, NewRHSV); in visitSRem()
2146 Instruction *InstCombinerImpl::visitFRem(BinaryOperator &I) { in visitFRem() argument
2147 if (Value *V = simplifyFRemInst(I.getOperand(0), I.getOperand(1), in visitFRem()
2148 I.getFastMathFlags(), in visitFRem()
2149 SQ.getWithInstruction(&I))) in visitFRem()
2150 return replaceInstUsesWith(I, V); in visitFRem()
2152 if (Instruction *X = foldVectorBinop(I)) in visitFRem()
2155 if (Instruction *Phi = foldBinopWithPhiOperands(I)) in visitFRem()