reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced

References

lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
  394   if (Value *V = SimplifyFMulInst(I.getOperand(0), I.getOperand(1),
  394   if (Value *V = SimplifyFMulInst(I.getOperand(0), I.getOperand(1),
  395                                   I.getFastMathFlags(),
  396                                   SQ.getWithInstruction(&I)))
  397     return replaceInstUsesWith(I, V);
  399   if (SimplifyAssociativeOrCommutative(I))
  400     return &I;
  402   if (Instruction *X = foldVectorBinop(I))
  405   if (Instruction *FoldedMul = foldBinOpIntoSelectOrPhi(I))
  408   if (Value *FoldedMul = foldMulSelectToNegate(I, Builder))
  409     return replaceInstUsesWith(I, FoldedMul);
  412   Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
  412   Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
  414     return BinaryOperator::CreateFNegFMF(Op0, &I);
  419     return BinaryOperator::CreateFMulFMF(X, Y, &I);
  424     return BinaryOperator::CreateFMulFMF(X, ConstantExpr::getFNeg(C), &I);
  428     return BinaryOperator::CreateFMulFMF(X, X, &I);
  431   if (Value *V = SimplifySelectsFeedingBinaryOp(I, Op0, Op1))
  432     return replaceInstUsesWith(I, V);
  434   if (I.hasAllowReassoc()) {
  443           return BinaryOperator::CreateFDivFMF(CC1, X, &I);
  449           return BinaryOperator::CreateFMulFMF(X, CDivC1, &I);
  455           return BinaryOperator::CreateFDivFMF(X, C1DivC, &I);
  464         Value *XC = Builder.CreateFMulFMF(X, C, &I);
  465         return BinaryOperator::CreateFAddFMF(XC, CC1, &I);
  470         Value *XC = Builder.CreateFMulFMF(X, C, &I);
  471         return BinaryOperator::CreateFSubFMF(CC1, XC, &I);
  476     if (match(&I, m_c_FMul(m_OneUse(m_FDiv(m_Value(X), m_Value(Y))),
  479       Value *NewFMul = Builder.CreateFMulFMF(X, Z, &I);
  480       return BinaryOperator::CreateFDivFMF(NewFMul, Y, &I);
  486     if (I.hasNoNaNs() &&
  489       Value *XY = Builder.CreateFMulFMF(X, Y, &I);
  490       Value *Sqrt = Builder.CreateUnaryIntrinsic(Intrinsic::sqrt, XY, &I);
  491       return replaceInstUsesWith(I, Sqrt);
  496     if (I.hasNoNaNs() && I.hasNoSignedZeros() && Op0 == Op1 &&
  496     if (I.hasNoNaNs() && I.hasNoSignedZeros() && Op0 == Op1 &&
  502         Value *XX = Builder.CreateFMulFMF(X, X, &I);
  503         return BinaryOperator::CreateFDivFMF(XX, Y, &I);
  508         Value *XX = Builder.CreateFMulFMF(X, X, &I);
  509         return BinaryOperator::CreateFDivFMF(Y, XX, &I);
  518       Value *XY = Builder.CreateFAddFMF(X, Y, &I);
  519       Value *Exp = Builder.CreateUnaryIntrinsic(Intrinsic::exp, XY, &I);
  520       return replaceInstUsesWith(I, Exp);
  528       Value *XY = Builder.CreateFAddFMF(X, Y, &I);
  529       Value *Exp2 = Builder.CreateUnaryIntrinsic(Intrinsic::exp2, XY, &I);
  530       return replaceInstUsesWith(I, Exp2);
  542       Value *XX = Builder.CreateFMulFMF(Op1, Op1, &I);
  543       return BinaryOperator::CreateFMulFMF(XX, Y, &I);
  547       Value *XX = Builder.CreateFMulFMF(Op0, Op0, &I);
  548       return BinaryOperator::CreateFMulFMF(XX, Y, &I);
  553   if (I.isFast()) {
  567       Log2->copyFastMathFlags(&I);
  568       Value *LogXTimesY = Builder.CreateFMulFMF(Log2, Y, &I);
  569       return BinaryOperator::CreateFSubFMF(LogXTimesY, Y, &I);