• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/contrib/llvm-project/llvm/lib/Transforms/InstCombine/

Lines Matching refs:Op0

189   Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
191 BinaryOperator *BO = BinaryOperator::CreateNeg(Op0, I.getName());
248 if (Op0->hasOneUse()) {
251 if (match(Op0, m_Sub(m_Value(Y), m_Value(X))))
253 else if (match(Op0, m_Add(m_Value(Y), m_ConstantInt(C1))))
275 if (match(Op0, m_OneUse(m_Add(m_Value(X), m_Constant(C1))))) {
286 if (Op0 == Op1) {
288 SelectPatternFlavor SPF = matchSelectPattern(Op0, X, Y).Flavor;
296 if (match(Op0, m_Neg(m_Value(X))) && match(Op1, m_Constant(Op1C)))
300 if (match(Op0, m_Neg(m_Value(X))) && match(Op1, m_Neg(m_Value(Y)))) {
303 cast<OverflowingBinaryOperator>(Op0)->hasNoSignedWrap() &&
318 BinaryOperator *Div = dyn_cast<BinaryOperator>(Op0);
321 Y = Op0;
349 return BinaryOperator::CreateAnd(Op0, Op1);
357 if (match(Op0, m_Shl(m_One(), m_Value(Y)))) {
359 ShlNSW = cast<ShlOperator>(Op0)->hasNoSignedWrap();
361 BO = BinaryOperator::CreateShl(Op0, Y);
376 if (((match(Op0, m_ZExt(m_Value(X))) && match(Op1, m_ZExt(m_Value(Y)))) ||
377 (match(Op0, m_SExt(m_Value(X))) && match(Op1, m_SExt(m_Value(Y))))) &&
379 (Op0->hasOneUse() || Op1->hasOneUse())) {
386 if (((match(Op0, m_SExt(m_Value(X))) && match(Op1, m_ZExt(m_Value(Y)))) ||
387 (match(Op0, m_ZExt(m_Value(X))) && match(Op1, m_SExt(m_Value(Y))))) &&
389 (Op0->hasOneUse() || Op1->hasOneUse())) {
396 if (match(Op0, m_ZExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1))
399 return SelectInst::Create(X, Op0, ConstantInt::get(I.getType(), 0));
408 if (match(Op0, m_LShr(m_Value(X), m_APInt(C))) && *C == C->getBitWidth() - 1)
411 return BinaryOperator::CreateAnd(Builder.CreateAShr(X, *C), Op0);
417 if (!I.hasNoSignedWrap() && willNotOverflowSignedMul(Op0, Op1, I)) {
422 if (!I.hasNoUnsignedWrap() && willNotOverflowUnsignedMul(Op0, Op1, I)) {
435 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
440 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
445 if (Op0 == Op1 && match(Op0, m_Intrinsic<Intrinsic::fabs>(m_Value(X))))
450 if (match(Op0, m_Intrinsic<Intrinsic::fabs>(m_Value(X))) &&
452 (Op0->hasOneUse() || Op1->hasOneUse())) {
486 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
488 return UnaryOperator::CreateFNegFMF(Op0, &I);
493 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_Constant(C)))
497 if (Value *V = SimplifySelectsFeedingBinaryOp(I, Op0, Op1))
505 if (match(Op0, m_OneUse(m_FDiv(m_Constant(C1), m_Value(X))))) {
511 if (match(Op0, m_FDiv(m_Value(X), m_Constant(C1)))) {
520 if (Op0->hasOneUse() && C1DivC->isNormalFP())
527 if (match(Op0, m_OneUse(m_FAdd(m_Value(X), m_Constant(C1))))) {
533 if (match(Op0, m_OneUse(m_FSub(m_Constant(C1), m_Value(X))))) {
553 match(Op0, m_OneUse(m_Intrinsic<Intrinsic::sqrt>(m_Value(X)))) &&
562 if (I.hasNoNaNs() && I.hasNoSignedZeros() && Op0 == Op1 &&
563 Op0->hasNUses(2)) {
566 if (match(Op0, m_FDiv(m_Value(X),
572 if (match(Op0, m_FDiv(m_Intrinsic<Intrinsic::sqrt>(m_Value(Y)),
581 if (match(Op0, m_Intrinsic<Intrinsic::exp>(m_Value(X))) &&
583 (Op0->hasOneUse() || Op1->hasOneUse())) {
591 if (match(Op0, m_Intrinsic<Intrinsic::exp2>(m_Value(X))) &&
593 (Op0->hasOneUse() || Op1->hasOneUse())) {
606 if (match(Op0, m_OneUse(m_c_FMul(m_Specific(Op1), m_Value(Y)))) &&
611 if (match(Op1, m_OneUse(m_c_FMul(m_Specific(Op0), m_Value(Y)))) &&
612 Op0 != Y) {
613 Value *XX = Builder.CreateFMulFMF(Op0, Op0, &I);
621 if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::log2>(
623 Log2 = cast<IntrinsicInst>(Op0);
629 Y = Op0;
746 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
765 if ((IsSigned && match(Op0, m_SDiv(m_Value(X), m_APInt(C1)))) ||
766 (!IsSigned && match(Op0, m_UDiv(m_Value(X), m_APInt(C1))))) {
773 if ((IsSigned && match(Op0, m_NSWMul(m_Value(X), m_APInt(C1)))) ||
774 (!IsSigned && match(Op0, m_NUWMul(m_Value(X), m_APInt(C1))))) {
789 auto *OBO = cast<OverflowingBinaryOperator>(Op0);
796 if ((IsSigned && match(Op0, m_NSWShl(m_Value(X), m_APInt(C1))) &&
798 (!IsSigned && match(Op0, m_NUWShl(m_Value(X), m_APInt(C1))))) {
815 auto *OBO = cast<OverflowingBinaryOperator>(Op0);
827 if (match(Op0, m_One())) {
833 Value *Inc = Builder.CreateAdd(Op1, Op0);
839 return new ZExtInst(Builder.CreateICmpEQ(Op1, Op0), Ty);
849 if (match(Op0, m_Sub(m_Value(X), m_Value(Z)))) // (X - Z) / Y; Y = Op1
856 if (IsSigned && match(Op0, m_NSWShl(m_Specific(Op1), m_Value(Y))))
858 if (!IsSigned && match(Op0, m_NUWShl(m_Specific(Op1), m_Value(Y))))
862 if (match(Op1, m_c_Mul(m_Specific(Op0), m_Value(Y)))) {
879 using FoldUDivOperandCb = Instruction *(*)(Value *Op0, Value *Op1,
909 static Instruction *foldUDivPow2Cst(Value *Op0, Value *Op1,
911 Constant *C1 = getLogBase2(Op0->getType(), cast<Constant>(Op1));
914 BinaryOperator *LShr = BinaryOperator::CreateLShr(Op0, C1);
922 static Instruction *foldUDivShl(Value *Op0, Value *Op1, const BinaryOperator &I,
938 BinaryOperator *LShr = BinaryOperator::CreateLShr(Op0, N);
948 static size_t visitUDivOperand(Value *Op0, Value *Op1, const BinaryOperator &I,
971 visitUDivOperand(Op0, SI->getOperand(1), I, Actions, Depth))
972 if (visitUDivOperand(Op0, SI->getOperand(2), I, Actions, Depth)) {
1029 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1032 if (match(Op0, m_LShr(m_Value(X), m_APInt(C1))) && match(Op1, m_APInt(C2))) {
1037 bool IsExact = I.isExact() && match(Op0, m_Exact(m_Value()));
1046 // Op0 / C where C is large (negative) --> zext (Op0 >= C)
1050 Value *Cmp = Builder.CreateICmpUGE(Op0, Op1);
1053 // Op0 / (sext i1 X) --> zext (Op0 == -1) (if X is 0, the div is undefined)
1055 Value *Cmp = Builder.CreateICmpEQ(Op0, ConstantInt::getAllOnesValue(Ty));
1068 if (match(Op0, m_NUWMul(m_Value(A), m_Value(B)))) {
1079 if (visitUDivOperand(Op0, Op1, I, UDivActions))
1085 Inst = Action(Op0, ActionOp1, I, *this);
1123 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1125 // sdiv Op0, -1 --> -Op0
1126 // sdiv Op0, (sext i1 X) --> -Op0 (because if X is 0, the op is undefined)
1129 return BinaryOperator::CreateNeg(Op0);
1133 return new ZExtInst(Builder.CreateICmpEQ(Op0, Op1), I.getType());
1140 return BinaryOperator::CreateExactAShr(Op0, ShAmt, I.getName());
1147 if (match(Op0, m_OneUse(m_SExt(m_Value(Op0Src)))) &&
1157 return new SExtInst(NarrowOp, Op0->getType());
1164 match(Op0, m_NSWSub(m_Zero(), m_Value(X)))) {
1181 if (MaskedValueIsZero(Op0, Mask, 0, &I)) {
1184 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1, I.getName());
1194 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1, I.getName());
1283 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1284 if (isa<Constant>(Op0))
1290 if (SelectInst *SI = dyn_cast<SelectInst>(Op0))
1296 if (match(Op0, m_OneUse(m_FDiv(m_Value(X), m_Value(Y)))) &&
1303 (!isa<Constant>(Y) || !isa<Constant>(Op0))) {
1305 Value *YZ = Builder.CreateFMulFMF(Y, Op0, &I);
1315 return BinaryOperator::CreateFMulFMF(Y, Op0, &I);
1318 if (I.hasAllowReassoc() && Op0->hasOneUse() && Op1->hasOneUse()) {
1322 bool IsTan = match(Op0, m_Intrinsic<Intrinsic::sin>(m_Value(X))) &&
1325 !IsTan && match(Op0, m_Intrinsic<Intrinsic::cos>(m_Value(X))) &&
1334 cast<CallBase>(Op0)->getCalledFunction()->getAttributes();
1348 match(Op1, m_c_FMul(m_Specific(Op0), m_Value(Y)))) {
1373 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1384 if (Instruction *Op0I = dyn_cast<Instruction>(Op0)) {
1425 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1432 return BinaryOperator::CreateAnd(Op0, Add);
1436 if (match(Op0, m_One())) {
1443 Value *Cmp = Builder.CreateICmpULT(Op0, Op1);
1444 Value *Sub = Builder.CreateSub(Op0, Op1);
1445 return SelectInst::Create(Cmp, Op0, Sub);
1449 // unsigned value (-1). Therefore, the remainder is Op0 unless Op0 is also
1451 // urem Op0, (sext i1 X) --> (Op0 == -1) ? 0 : Op0
1454 Value *Cmp = Builder.CreateICmpEQ(Op0, ConstantInt::getAllOnesValue(Ty));
1455 return SelectInst::Create(Cmp, ConstantInt::getNullValue(Ty), Op0);
1473 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1490 MaskedValueIsZero(Op0, Mask, 0, &I)) {
1492 return BinaryOperator::CreateURem(Op0, Op1, I.getName());