Lines Matching refs:BinaryOperator
1445 Instruction *InstCombinerImpl::foldLogicOfIsFPClass(BinaryOperator &BO, in foldLogicOfIsFPClass()
1512 BinaryOperator &I) { in canonicalizeConditionalNegationViaMathToSelect()
1513 assert(I.getOpcode() == BinaryOperator::Xor && "Only for xor!"); in canonicalizeConditionalNegationViaMathToSelect()
1529 static Instruction *reassociateFCmps(BinaryOperator &BO, in reassociateFCmps()
1568 return BinaryOperator::Create(Opcode, NewFCmp, BO11); in reassociateFCmps()
1574 static Instruction *matchDeMorgansLaws(BinaryOperator &I, in matchDeMorgansLaws()
1592 return BinaryOperator::CreateNot(AndOr); in matchDeMorgansLaws()
1604 return BinaryOperator::Create(Opcode, A, IC.Builder.CreateNot(FlippedBO)); in matchDeMorgansLaws()
1627 static Instruction *foldLogicCastConstant(BinaryOperator &Logic, CastInst *Cast, in foldLogicCastConstant()
1662 Instruction *InstCombinerImpl::foldCastedBitwiseLogic(BinaryOperator &I) { in foldCastedBitwiseLogic()
1760 static Instruction *foldAndToXor(BinaryOperator &I, in foldAndToXor()
1772 return BinaryOperator::CreateXor(A, B); in foldAndToXor()
1781 return BinaryOperator::CreateNot(Builder.CreateXor(A, B)); in foldAndToXor()
1786 static Instruction *foldOrToXor(BinaryOperator &I, in foldOrToXor()
1799 return BinaryOperator::CreateNot(Builder.CreateXor(A, B)); in foldOrToXor()
1807 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B)); in foldOrToXor()
1815 return BinaryOperator::CreateXor(A, B); in foldOrToXor()
1829 Instruction *InstCombinerImpl::narrowMaskedBinOp(BinaryOperator &And) { in narrowMaskedBinOp()
1855 Instruction::BinaryOps Opc = cast<BinaryOperator>(Op0)->getOpcode(); in narrowMaskedBinOp()
1870 static Instruction *foldComplexAndOrPatterns(BinaryOperator &I, in foldComplexAndOrPatterns()
1913 ? BinaryOperator::CreateAnd(Xor, Builder.CreateNot(A)) in foldComplexAndOrPatterns()
1914 : BinaryOperator::CreateNot(Builder.CreateAnd(Xor, A)); in foldComplexAndOrPatterns()
1923 ? BinaryOperator::CreateAnd(Xor, Builder.CreateNot(B)) in foldComplexAndOrPatterns()
1924 : BinaryOperator::CreateNot(Builder.CreateAnd(Xor, B)); in foldComplexAndOrPatterns()
1931 return BinaryOperator::CreateNot(Builder.CreateBinOp( in foldComplexAndOrPatterns()
1938 return BinaryOperator::CreateNot(Builder.CreateBinOp( in foldComplexAndOrPatterns()
1952 Value *Or = cast<BinaryOperator>(X)->getOperand(0); in foldComplexAndOrPatterns()
1953 return BinaryOperator::CreateNot(Builder.CreateAnd(Or, Y)); in foldComplexAndOrPatterns()
1985 ? BinaryOperator::CreateNot(Builder.CreateOr(Xor, A)) in foldComplexAndOrPatterns()
1986 : BinaryOperator::CreateOr(Xor, X); in foldComplexAndOrPatterns()
1993 return BinaryOperator::Create( in foldComplexAndOrPatterns()
2001 return BinaryOperator::Create( in foldComplexAndOrPatterns()
2013 static Instruction *reassociateForUses(BinaryOperator &BO, in reassociateForUses()
2024 return BinaryOperator::Create(Opcode, YZ, X); in reassociateForUses()
2029 return BinaryOperator::Create(Opcode, XZ, Y); in reassociateForUses()
2046 static Instruction *canonicalizeLogicFirst(BinaryOperator &I, in canonicalizeLogicFirst()
2077 return BinaryOperator::CreateWithCopiedFlags(Instruction::Add, NewBinOp, in canonicalizeLogicFirst()
2084 Instruction *InstCombinerImpl::foldBinOpOfDisplacedShifts(BinaryOperator &I) { in foldBinOpOfDisplacedShifts()
2121 return BinaryOperator::Create(ShiftOp, NewC, ShAmt); in foldBinOpOfDisplacedShifts()
2134 foldBitwiseLogicWithIntrinsics(BinaryOperator &I, in foldBitwiseLogicWithIntrinsics()
2185 Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) { in visitAnd()
2247 return BinaryOperator::CreateAnd(Builder.CreateNot(X), Y); in visitAnd()
2257 return BinaryOperator::CreateXor(And, NewC); in visitAnd()
2271 return BinaryOperator::CreateOr(And, ConstantInt::get(Ty, Together)); in visitAnd()
2283 return BinaryOperator::CreateLShr(Sext, ShAmtC); in visitAnd()
2291 return BinaryOperator::CreateLShr(X, ConstantInt::get(Ty, *ShiftC)); in visitAnd()
2302 return BinaryOperator::CreateXor(NewAnd, Op1); in visitAnd()
2308 auto isNarrowableBinOpcode = [](BinaryOperator *B) { in visitAnd()
2320 BinaryOperator *BO; in visitAnd()
2371 BinaryOperator::BinaryOps BinOp = cast<BinaryOperator>(Op0)->getOpcode(); in visitAnd()
2376 return BinaryOperator::Create(BinOp, X, NewRHS); in visitAnd()
2382 return BinaryOperator::Create(BinOp, NewLHS, Y); in visitAnd()
2395 cast<BinaryOperator>(Op0)->getOpcode() == Instruction::Shl; in visitAnd()
2481 return BinaryOperator::CreateAnd(SExt, SanitizedSignMask); in visitAnd()
2510 return BinaryOperator::CreateAnd(Op0, Builder.CreateNot(B)); in visitAnd()
2513 return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(B)); in visitAnd()
2517 return BinaryOperator::CreateAnd(Op0, B); in visitAnd()
2520 return BinaryOperator::CreateAnd(Op1, B); in visitAnd()
2529 return BinaryOperator::CreateAnd(Op0, NotC); in visitAnd()
2539 return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(C)); in visitAnd()
2548 return BinaryOperator::CreateAnd(A, B); in visitAnd()
2556 return BinaryOperator::CreateAnd(A, B); in visitAnd()
2564 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B); in visitAnd()
2572 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B); in visitAnd()
2746 if (isa<BinaryOperator>(Or0) && isa<BinaryOperator>(Or1)) { in matchFunnelShift()
2756 if (Or0->getOpcode() == BinaryOperator::LShr) { in matchFunnelShift()
2761 assert(Or0->getOpcode() == BinaryOperator::Shl && in matchFunnelShift()
2762 Or1->getOpcode() == BinaryOperator::LShr && in matchFunnelShift()
3344 Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) { in visitOr()
3415 return BinaryOperator::CreateXor(Or, ConstantInt::get(Ty, *CV)); in visitOr()
3423 return BinaryOperator::CreateMul(X, IncrementY); in visitOr()
3428 return BinaryOperator::CreateOr(X, Y); in visitOr()
3442 return BinaryOperator::CreateOr(Builder.CreateAnd(X, *C0), B); in visitOr()
3445 return BinaryOperator::CreateOr(Builder.CreateAnd(X, *C1), A); in visitOr()
3449 return BinaryOperator::CreateXor(Builder.CreateAnd(X, *C0), B); in visitOr()
3452 return BinaryOperator::CreateXor(Builder.CreateAnd(X, *C1), A); in visitOr()
3461 return BinaryOperator::CreateAnd(A, C01); in visitOr()
3468 return BinaryOperator::CreateAnd(B, C01); in visitOr()
3478 return BinaryOperator::CreateAnd(Or, C01); in visitOr()
3524 return BinaryOperator::CreateOr(Op0, C); in visitOr()
3529 return BinaryOperator::CreateOr(Op1, C); in visitOr()
3533 return BinaryOperator::CreateOr(C, Op1); in visitOr()
3537 return BinaryOperator::CreateOr(Op0, C); in visitOr()
3541 return BinaryOperator::CreateOr(Op1, Builder.CreateAnd(A, C)); in visitOr()
3545 return BinaryOperator::CreateOr(Op0, Builder.CreateAnd(A, C)); in visitOr()
3561 return BinaryOperator::CreateOr(Op0, B); in visitOr()
3563 return BinaryOperator::CreateOr(Op0, A); in visitOr()
3569 return BinaryOperator::CreateOr(A, B); in visitOr()
3576 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B)); in visitOr()
3585 return BinaryOperator::CreateNot(Builder.CreateAnd(And, B)); in visitOr()
3589 return BinaryOperator::CreateNot(Builder.CreateAnd(And, A)); in visitOr()
3597 return BinaryOperator::CreateOr(Nand, C); in visitOr()
3604 return BinaryOperator::CreateOr(NotB, Op0); in visitOr()
3608 return BinaryOperator::CreateOr(NotA, Op0); in visitOr()
3615 if (BinaryOperator *B = dyn_cast<BinaryOperator>(A)) in visitOr()
3622 return BinaryOperator::CreateOr(Not, Op0); in visitOr()
3707 return BinaryOperator::CreateOr(Inner, CI); in visitOr()
3746 return BinaryOperator::CreateXor(A, B); in visitOr()
3783 return BinaryOperator::CreateAnd(NotNullA, NotNullB); in visitOr()
3812 return BinaryOperator::CreateOr(Ov, NewCmp); in visitOr()
3827 return BinaryOperator::CreateLShr(Constant::getAllOnesValue(Ty), Sub); in visitOr()
3850 return BinaryOperator::CreateOr( in visitOr()
3862 return BinaryOperator::CreateOr( in visitOr()
3908 return BinaryOperator::CreateAnd(X, ConstantInt::get(Ty, *C1 | *C2)); in visitOr()
3919 static Instruction *foldXorToXor(BinaryOperator &I, in foldXorToXor()
3934 return BinaryOperator::CreateXor(A, B); in foldXorToXor()
3942 return BinaryOperator::CreateXor(A, B); in foldXorToXor()
3950 return BinaryOperator::CreateXor(A, B); in foldXorToXor()
3965 return BinaryOperator::CreateNot(Builder.CreateXor(A, B)); in foldXorToXor()
3971 BinaryOperator &I) { in foldXorOfICmps()
4107 static Instruction *visitMaskedMerge(BinaryOperator &I, in visitMaskedMerge()
4122 return BinaryOperator::CreateXor(NewA, X); in visitMaskedMerge()
4134 return BinaryOperator::CreateOr(LHS, RHS); in visitMaskedMerge()
4140 static Instruction *foldNotXor(BinaryOperator &I, in foldNotXor()
4158 return BinaryOperator::CreateOr(X, NotY); in foldNotXor()
4166 return BinaryOperator::CreateOr(Y, NotX); in foldNotXor()
4174 static Instruction *canonicalizeAbs(BinaryOperator &Xor, in canonicalizeAbs()
4197 auto *Add = cast<BinaryOperator>(Op0); in canonicalizeAbs()
4240 bool IsBinaryOp = isa<BinaryOperator>(I); in sinkNotIntoLogicalOp()
4280 bool IsBinaryOp = isa<BinaryOperator>(I); in sinkNotIntoOtherHandOfLogicalOp()
4315 Instruction *InstCombinerImpl::foldNot(BinaryOperator &I) { in foldNot()
4333 return BinaryOperator::CreateOr(X, NotY); in foldNot()
4344 return BinaryOperator::CreateAnd(X, NotY); in foldNot()
4352 BinaryOperator *NotVal; in foldNot()
4359 return BinaryOperator::CreateAnd(DecX, NotY); in foldNot()
4364 return BinaryOperator::CreateAShr(X, Y); in foldNot()
4370 return BinaryOperator::CreateAShr(X, Y); in foldNot()
4393 return BinaryOperator::CreateLShr(ConstantExpr::getNot(C), Y); in foldNot()
4403 return BinaryOperator::CreateAShr(ConstantExpr::getNot(C), Y); in foldNot()
4408 return BinaryOperator::CreateSub(ConstantExpr::getNot(C), X); in foldNot()
4414 return BinaryOperator::CreateAdd(Builder.CreateNot(X), Y); in foldNot()
4418 return BinaryOperator::CreateWithCopiedFlags(Instruction::Sub, X, Y, in foldNot()
4511 Instruction *InstCombinerImpl::visitXor(BinaryOperator &I) { in visitXor()
4551 return BinaryOperator::CreateDisjointOr(Op0, Op1); in visitXor()
4568 return BinaryOperator::CreateXor( in visitXor()
4576 return BinaryOperator::CreateXor(And, ConstantExpr::getNot(C1)); in visitXor()
4581 return BinaryOperator::CreateXor(Or, ConstantExpr::getNot(C1)); in visitXor()
4607 return BinaryOperator::CreateSub(ConstantInt::get(Ty, *C + *RHSC), X); in visitXor()
4611 return BinaryOperator::CreateAdd(X, ConstantInt::get(Ty, *C + *RHSC)); in visitXor()
4616 return BinaryOperator::CreateXor(X, ConstantInt::get(Ty, *C ^ *RHSC)); in visitXor()
4639 return BinaryOperator::CreateShl(NotX, ConstantInt::get(Ty, *C)); in visitXor()
4645 return BinaryOperator::CreateLShr(NotX, ConstantInt::get(Ty, *C)); in visitXor()
4689 return BinaryOperator::CreateXor(Opnd0, ConstantInt::get(Ty, FoldConst)); in visitXor()
4699 return BinaryOperator::CreateAnd(X, Builder.CreateNot(Op0)); in visitXor()
4703 return BinaryOperator::CreateAnd(X, Builder.CreateNot(Op1)); in visitXor()
4708 return BinaryOperator::CreateAnd(Op0, Builder.CreateNot(X)); in visitXor()
4716 return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(X)); in visitXor()
4722 return BinaryOperator::CreateXor( in visitXor()
4728 return BinaryOperator::CreateXor( in visitXor()
4734 return BinaryOperator::CreateOr(A, B); in visitXor()
4738 return BinaryOperator::CreateOr(A, B); in visitXor()
4744 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B)); in visitXor()
4748 return BinaryOperator::CreateOr(A, B); in visitXor()
4752 return BinaryOperator::CreateNot(Builder.CreateAnd(Op1, B)); in visitXor()
4756 return BinaryOperator::CreateNot(Builder.CreateAnd(Op0, B)); in visitXor()
4769 return BinaryOperator::CreateAnd(Builder.CreateXor(B, C), NotA); in visitXor()
4809 return BinaryOperator::CreateXor(Builder.CreateXor(X, Y), C1); in visitXor()