diff options
Diffstat (limited to 'contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
| -rw-r--r-- | contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 362 | 
1 files changed, 226 insertions, 136 deletions
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index a7595482eedb..6c6e7d815163 100644 --- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -15,10 +15,12 @@  #include "InstCombine.h"  #include "llvm/Analysis/InstructionSimplify.h"  #include "llvm/IR/IntrinsicInst.h" -#include "llvm/Support/PatternMatch.h" +#include "llvm/IR/PatternMatch.h"  using namespace llvm;  using namespace PatternMatch; +#define DEBUG_TYPE "instcombine" +  /// simplifyValueKnownNonZero - The specific integer value is used in a context  /// where it is known to be non-zero.  If this allows us to simplify the @@ -27,13 +29,13 @@ static Value *simplifyValueKnownNonZero(Value *V, InstCombiner &IC) {    // If V has multiple uses, then we would have to do more analysis to determine    // if this is safe.  For example, the use could be in dynamically unreached    // code. -  if (!V->hasOneUse()) return 0; +  if (!V->hasOneUse()) return nullptr;    bool MadeChange = false;    // ((1 << A) >>u B) --> (1 << (A-B))    // Because V cannot be zero, we know that B is less than A. -  Value *A = 0, *B = 0, *PowerOf2 = 0; +  Value *A = nullptr, *B = nullptr, *PowerOf2 = nullptr;    if (match(V, m_LShr(m_OneUse(m_Shl(m_Value(PowerOf2), m_Value(A))),                        m_Value(B))) &&        // The "1" can be any value known to be a power of 2. @@ -68,7 +70,7 @@ static Value *simplifyValueKnownNonZero(Value *V, InstCombiner &IC) {    //    If V is a phi node, we can call this on each of its operands.    //    "select cond, X, 0" can simplify to "X". -  return MadeChange ? V : 0; +  return MadeChange ? V : nullptr;  } @@ -107,7 +109,7 @@ static Constant *getLogBase2Vector(ConstantDataVector *CV) {    for (unsigned I = 0, E = CV->getNumElements(); I != E; ++I) {      Constant *Elt = CV->getElementAsConstant(I);      if (!match(Elt, m_APInt(IVal)) || !IVal->isPowerOf2()) -      return 0; +      return nullptr;      Elts.push_back(ConstantInt::get(Elt->getType(), IVal->logBase2()));    } @@ -118,7 +120,10 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {    bool Changed = SimplifyAssociativeOrCommutative(I);    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -  if (Value *V = SimplifyMulInst(Op0, Op1, TD)) +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); + +  if (Value *V = SimplifyMulInst(Op0, Op1, DL))      return ReplaceInstUsesWith(I, V);    if (Value *V = SimplifyUsingDistributiveLaws(I)) @@ -139,7 +144,7 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {        return BinaryOperator::CreateMul(NewOp, ConstantExpr::getShl(C1, C2));      if (match(&I, m_Mul(m_Value(NewOp), m_Constant(C1)))) { -      Constant *NewCst = 0; +      Constant *NewCst = nullptr;        if (match(C1, m_APInt(IVal)) && IVal->isPowerOf2())          // Replace X*(2^C) with X << C, where C is either a scalar or a splat.          NewCst = ConstantInt::get(NewOp->getType(), IVal->logBase2()); @@ -158,15 +163,6 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {    }    if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) { -    // Canonicalize (X+C1)*CI -> X*CI+C1*CI. -    { Value *X; ConstantInt *C1; -      if (Op0->hasOneUse() && -          match(Op0, m_Add(m_Value(X), m_ConstantInt(C1)))) { -        Value *Add = Builder->CreateMul(X, CI); -        return BinaryOperator::CreateAdd(Add, Builder->CreateMul(C1, CI)); -      } -    } -      // (Y - X) * (-(2**n)) -> (X - Y) * (2**n), for positive nonzero n      // (Y + const) * (-(2**n)) -> (-constY) * (2**n), for positive nonzero n      // The "* (2**n)" thus becomes a potential shifting opportunity. @@ -174,10 +170,10 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {        const APInt &   Val = CI->getValue();        const APInt &PosVal = Val.abs();        if (Val.isNegative() && PosVal.isPowerOf2()) { -        Value *X = 0, *Y = 0; +        Value *X = nullptr, *Y = nullptr;          if (Op0->hasOneUse()) {            ConstantInt *C1; -          Value *Sub = 0; +          Value *Sub = nullptr;            if (match(Op0, m_Sub(m_Value(Y), m_Value(X))))              Sub = Builder->CreateSub(X, Y, "suba");            else if (match(Op0, m_Add(m_Value(Y), m_ConstantInt(C1)))) @@ -201,6 +197,19 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {      if (isa<PHINode>(Op0))        if (Instruction *NV = FoldOpIntoPhi(I))          return NV; + +    // Canonicalize (X+C1)*CI -> X*CI+C1*CI. +    { +      Value *X; +      Constant *C1; +      if (match(Op0, m_OneUse(m_Add(m_Value(X), m_Constant(C1))))) { +        Value *Mul = Builder->CreateMul(C1, Op1); +        // Only go forward with the transform if C1*CI simplifies to a tidier +        // constant. +        if (!match(Mul, m_Mul(m_Value(), m_Value()))) +          return BinaryOperator::CreateAdd(Builder->CreateMul(X, Op1), Mul); +      } +    }    }    if (Value *Op0v = dyn_castNegVal(Op0))     // -X * -Y = X*Y @@ -247,7 +256,7 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {    }    /// i1 mul -> i1 and. -  if (I.getType()->isIntegerTy(1)) +  if (I.getType()->getScalarType()->isIntegerTy(1))      return BinaryOperator::CreateAnd(Op0, Op1);    // X*(1 << Y) --> X << Y @@ -267,7 +276,7 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {      // -2 is "-1 << 1" so it is all bits set except the low one.      APInt Negative2(I.getType()->getPrimitiveSizeInBits(), (uint64_t)-2, true); -    Value *BoolCast = 0, *OtherOp = 0; +    Value *BoolCast = nullptr, *OtherOp = nullptr;      if (MaskedValueIsZero(Op0, Negative2))        BoolCast = Op0, OtherOp = Op1;      else if (MaskedValueIsZero(Op1, Negative2)) @@ -280,7 +289,7 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {      }    } -  return Changed ? &I : 0; +  return Changed ? &I : nullptr;  }  // @@ -313,16 +322,41 @@ static void detectLog2OfHalf(Value *&Op, Value *&Y, IntrinsicInst *&Log2) {     if (I->getOpcode() != Instruction::FMul || !I->hasUnsafeAlgebra())       return; -   ConstantFP *CFP = dyn_cast<ConstantFP>(I->getOperand(0)); -   if (CFP && CFP->isExactlyValue(0.5)) { +   if (match(I->getOperand(0), m_SpecificFP(0.5)))       Y = I->getOperand(1); -     return; -   } -   CFP = dyn_cast<ConstantFP>(I->getOperand(1)); -   if (CFP && CFP->isExactlyValue(0.5)) +   else if (match(I->getOperand(1), m_SpecificFP(0.5)))       Y = I->getOperand(0);  } +static bool isFiniteNonZeroFp(Constant *C) { +  if (C->getType()->isVectorTy()) { +    for (unsigned I = 0, E = C->getType()->getVectorNumElements(); I != E; +         ++I) { +      ConstantFP *CFP = dyn_cast<ConstantFP>(C->getAggregateElement(I)); +      if (!CFP || !CFP->getValueAPF().isFiniteNonZero()) +        return false; +    } +    return true; +  } + +  return isa<ConstantFP>(C) && +         cast<ConstantFP>(C)->getValueAPF().isFiniteNonZero(); +} + +static bool isNormalFp(Constant *C) { +  if (C->getType()->isVectorTy()) { +    for (unsigned I = 0, E = C->getType()->getVectorNumElements(); I != E; +         ++I) { +      ConstantFP *CFP = dyn_cast<ConstantFP>(C->getAggregateElement(I)); +      if (!CFP || !CFP->getValueAPF().isNormal()) +        return false; +    } +    return true; +  } + +  return isa<ConstantFP>(C) && cast<ConstantFP>(C)->getValueAPF().isNormal(); +} +  /// Helper function of InstCombiner::visitFMul(BinaryOperator(). It returns  /// true iff the given value is FMul or FDiv with one and only one operand  /// being a normal constant (i.e. not Zero/NaN/Infinity). @@ -332,19 +366,13 @@ static bool isFMulOrFDivWithConstant(Value *V) {               I->getOpcode() != Instruction::FDiv))      return false; -  ConstantFP *C0 = dyn_cast<ConstantFP>(I->getOperand(0)); -  ConstantFP *C1 = dyn_cast<ConstantFP>(I->getOperand(1)); +  Constant *C0 = dyn_cast<Constant>(I->getOperand(0)); +  Constant *C1 = dyn_cast<Constant>(I->getOperand(1));    if (C0 && C1)      return false; -  return (C0 && C0->getValueAPF().isFiniteNonZero()) || -         (C1 && C1->getValueAPF().isFiniteNonZero()); -} - -static bool isNormalFp(const ConstantFP *C) { -  const APFloat &Flt = C->getValueAPF(); -  return Flt.isNormal(); +  return (C0 && isFiniteNonZeroFp(C0)) || (C1 && isFiniteNonZeroFp(C1));  }  /// foldFMulConst() is a helper routine of InstCombiner::visitFMul(). @@ -354,41 +382,41 @@ static bool isNormalFp(const ConstantFP *C) {  /// resulting expression. Note that this function could return NULL in  /// case the constants cannot be folded into a normal floating-point.  /// -Value *InstCombiner::foldFMulConst(Instruction *FMulOrDiv, ConstantFP *C, +Value *InstCombiner::foldFMulConst(Instruction *FMulOrDiv, Constant *C,                                     Instruction *InsertBefore) {    assert(isFMulOrFDivWithConstant(FMulOrDiv) && "V is invalid");    Value *Opnd0 = FMulOrDiv->getOperand(0);    Value *Opnd1 = FMulOrDiv->getOperand(1); -  ConstantFP *C0 = dyn_cast<ConstantFP>(Opnd0); -  ConstantFP *C1 = dyn_cast<ConstantFP>(Opnd1); +  Constant *C0 = dyn_cast<Constant>(Opnd0); +  Constant *C1 = dyn_cast<Constant>(Opnd1); -  BinaryOperator *R = 0; +  BinaryOperator *R = nullptr;    // (X * C0) * C => X * (C0*C)    if (FMulOrDiv->getOpcode() == Instruction::FMul) {      Constant *F = ConstantExpr::getFMul(C1 ? C1 : C0, C); -    if (isNormalFp(cast<ConstantFP>(F))) +    if (isNormalFp(F))        R = BinaryOperator::CreateFMul(C1 ? Opnd0 : Opnd1, F);    } else {      if (C0) {        // (C0 / X) * C => (C0 * C) / X        if (FMulOrDiv->hasOneUse()) {          // It would otherwise introduce another div. -        ConstantFP *F = cast<ConstantFP>(ConstantExpr::getFMul(C0, C)); +        Constant *F = ConstantExpr::getFMul(C0, C);          if (isNormalFp(F))            R = BinaryOperator::CreateFDiv(F, Opnd1);        }      } else {        // (X / C1) * C => X * (C/C1) if C/C1 is not a denormal -      ConstantFP *F = cast<ConstantFP>(ConstantExpr::getFDiv(C, C1)); +      Constant *F = ConstantExpr::getFDiv(C, C1);        if (isNormalFp(F)) {          R = BinaryOperator::CreateFMul(Opnd0, F);        } else {          // (X / C1) * C => X / (C1/C)          Constant *F = ConstantExpr::getFDiv(C1, C); -        if (isNormalFp(cast<ConstantFP>(F))) +        if (isNormalFp(F))            R = BinaryOperator::CreateFDiv(Opnd0, F);        }      } @@ -406,10 +434,13 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {    bool Changed = SimplifyAssociativeOrCommutative(I);    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); +    if (isa<Constant>(Op0))      std::swap(Op0, Op1); -  if (Value *V = SimplifyFMulInst(Op0, Op1, I.getFastMathFlags(), TD)) +  if (Value *V = SimplifyFMulInst(Op0, Op1, I.getFastMathFlags(), DL))      return ReplaceInstUsesWith(I, V);    bool AllowReassociate = I.hasUnsafeAlgebra(); @@ -425,17 +456,23 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {        if (Instruction *NV = FoldOpIntoPhi(I))          return NV; -    ConstantFP *C = dyn_cast<ConstantFP>(Op1); -    if (C && AllowReassociate && C->getValueAPF().isFiniteNonZero()) { +    // (fmul X, -1.0) --> (fsub -0.0, X) +    if (match(Op1, m_SpecificFP(-1.0))) { +      Constant *NegZero = ConstantFP::getNegativeZero(Op1->getType()); +      Instruction *RI = BinaryOperator::CreateFSub(NegZero, Op0); +      RI->copyFastMathFlags(&I); +      return RI; +    } + +    Constant *C = cast<Constant>(Op1); +    if (AllowReassociate && isFiniteNonZeroFp(C)) {        // Let MDC denote an expression in one of these forms:        // X * C, C/X, X/C, where C is a constant.        //        // Try to simplify "MDC * Constant" -      if (isFMulOrFDivWithConstant(Op0)) { -        Value *V = foldFMulConst(cast<Instruction>(Op0), C, &I); -        if (V) +      if (isFMulOrFDivWithConstant(Op0)) +        if (Value *V = foldFMulConst(cast<Instruction>(Op0), C, &I))            return ReplaceInstUsesWith(I, V); -      }        // (MDC +/- C1) * C => (MDC * C) +/- (C1 * C)        Instruction *FAddSub = dyn_cast<Instruction>(Op0); @@ -444,8 +481,8 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {             FAddSub->getOpcode() == Instruction::FSub)) {          Value *Opnd0 = FAddSub->getOperand(0);          Value *Opnd1 = FAddSub->getOperand(1); -        ConstantFP *C0 = dyn_cast<ConstantFP>(Opnd0); -        ConstantFP *C1 = dyn_cast<ConstantFP>(Opnd1); +        Constant *C0 = dyn_cast<Constant>(Opnd0); +        Constant *C1 = dyn_cast<Constant>(Opnd1);          bool Swap = false;          if (C0) {            std::swap(C0, C1); @@ -453,12 +490,11 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {            Swap = true;          } -        if (C1 && C1->getValueAPF().isFiniteNonZero() && -            isFMulOrFDivWithConstant(Opnd0)) { +        if (C1 && isFiniteNonZeroFp(C1) && isFMulOrFDivWithConstant(Opnd0)) {            Value *M1 = ConstantExpr::getFMul(C1, C); -          Value *M0 = isNormalFp(cast<ConstantFP>(M1)) ? +          Value *M0 = isNormalFp(cast<Constant>(M1)) ?                        foldFMulConst(cast<Instruction>(Opnd0), C, &I) : -                      0; +                      nullptr;            if (M0 && M1) {              if (Swap && FAddSub->getOpcode() == Instruction::FSub)                std::swap(M0, M1); @@ -478,8 +514,8 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {    // Under unsafe algebra do:    // X * log2(0.5*Y) = X*log2(Y) - X    if (I.hasUnsafeAlgebra()) { -    Value *OpX = NULL; -    Value *OpY = NULL; +    Value *OpX = nullptr; +    Value *OpY = nullptr;      IntrinsicInst *Log2;      detectLog2OfHalf(Op0, OpY, Log2);      if (OpY) { @@ -515,8 +551,11 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {        Value *N1 = dyn_castFNegVal(Opnd1, IgnoreZeroSign);        // -X * -Y => X*Y -      if (N1) -        return BinaryOperator::CreateFMul(N0, N1); +      if (N1) { +        Value *FMul = Builder->CreateFMul(N0, N1); +        FMul->takeName(&I); +        return ReplaceInstUsesWith(I, FMul); +      }        if (Opnd0->hasOneUse()) {          // -X * Y => -(X*Y) (Promote negation as high as possible) @@ -539,7 +578,7 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {        Value *Opnd0_0, *Opnd0_1;        if (Opnd0->hasOneUse() &&            match(Opnd0, m_FMul(m_Value(Opnd0_0), m_Value(Opnd0_1)))) { -        Value *Y = 0; +        Value *Y = nullptr;          if (Opnd0_0 == Opnd1 && Opnd0_1 != Opnd1)            Y = Opnd0_1;          else if (Opnd0_1 == Opnd1 && Opnd0_0 != Opnd1) @@ -564,7 +603,8 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {        if (!match(RHS, m_UIToFP(m_Value(C))))          std::swap(LHS, RHS); -      if (match(RHS, m_UIToFP(m_Value(C))) && C->getType()->isIntegerTy(1)) { +      if (match(RHS, m_UIToFP(m_Value(C))) && +          C->getType()->getScalarType()->isIntegerTy(1)) {          B = LHS;          Value *Zero = ConstantFP::getNegativeZero(B->getType());          return SelectInst::Create(C, B, Zero); @@ -579,7 +619,7 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {          std::swap(LHS, RHS);        if (match(RHS, m_FSub(m_FPOne(), m_UIToFP(m_Value(C)))) && -          C->getType()->isIntegerTy(1)) { +          C->getType()->getScalarType()->isIntegerTy(1)) {          A = LHS;          Value *Zero = ConstantFP::getNegativeZero(A->getType());          return SelectInst::Create(C, Zero, A); @@ -592,7 +632,7 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {        break;    } -  return Changed ? &I : 0; +  return Changed ? &I : nullptr;  }  /// SimplifyDivRemOfSelect - Try to fold a divide or remainder of a select @@ -653,12 +693,12 @@ bool InstCombiner::SimplifyDivRemOfSelect(BinaryOperator &I) {      // If we past the instruction, quit looking for it.      if (&*BBI == SI) -      SI = 0; +      SI = nullptr;      if (&*BBI == SelectCond) -      SelectCond = 0; +      SelectCond = nullptr;      // If we ran out of things to eliminate, break out of the loop. -    if (SelectCond == 0 && SI == 0) +    if (!SelectCond && !SI)        break;    } @@ -690,7 +730,7 @@ Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) {        if (Instruction::BinaryOps(LHS->getOpcode()) == I.getOpcode())          if (ConstantInt *LHSRHS = dyn_cast<ConstantInt>(LHS->getOperand(1))) {            if (MultiplyOverflows(RHS, LHSRHS, -                                I.getOpcode()==Instruction::SDiv)) +                                I.getOpcode() == Instruction::SDiv))              return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));            return BinaryOperator::Create(I.getOpcode(), LHS->getOperand(0),                                          ConstantExpr::getMul(RHS, LHSRHS)); @@ -706,12 +746,31 @@ Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) {      }    } +  if (ConstantInt *One = dyn_cast<ConstantInt>(Op0)) { +    if (One->isOne() && !I.getType()->isIntegerTy(1)) { +      bool isSigned = I.getOpcode() == Instruction::SDiv; +      if (isSigned) { +        // If Op1 is 0 then it's undefined behaviour, if Op1 is 1 then the +        // result is one, if Op1 is -1 then the result is minus one, otherwise +        // it's zero. +        Value *Inc = Builder->CreateAdd(Op1, One); +        Value *Cmp = Builder->CreateICmpULT( +                         Inc, ConstantInt::get(I.getType(), 3)); +        return SelectInst::Create(Cmp, Op1, ConstantInt::get(I.getType(), 0)); +      } else { +        // If Op1 is 0 then it's undefined behaviour. If Op1 is 1 then the +        // result is one, otherwise it's zero. +        return new ZExtInst(Builder->CreateICmpEQ(Op1, One), I.getType()); +      } +    } +  } +    // See if we can fold away this div instruction.    if (SimplifyDemandedInstructionBits(I))      return &I;    // (X - (X rem Y)) / Y -> X / Y; usually originates as ((X / Y) * Y) / Y -  Value *X = 0, *Z = 0; +  Value *X = nullptr, *Z = nullptr;    if (match(Op0, m_Sub(m_Value(X), m_Value(Z)))) { // (X - Z) / Y; Y = Op1      bool isSigned = I.getOpcode() == Instruction::SDiv;      if ((isSigned && match(Z, m_SRem(m_Specific(X), m_Specific(Op1)))) || @@ -719,7 +778,7 @@ Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) {        return BinaryOperator::Create(I.getOpcode(), X, Op1);    } -  return 0; +  return nullptr;  }  /// dyn_castZExtVal - Checks if V is a zext or constant that can @@ -732,7 +791,7 @@ static Value *dyn_castZExtVal(Value *V, Type *Ty) {      if (C->getValue().getActiveBits() <= cast<IntegerType>(Ty)->getBitWidth())        return ConstantExpr::getTrunc(C, Ty);    } -  return 0; +  return nullptr;  }  namespace { @@ -757,7 +816,7 @@ struct UDivFoldAction {    };    UDivFoldAction(FoldUDivOperandCb FA, Value *InputOperand) -      : FoldAction(FA), OperandToFold(InputOperand), FoldResult(0) {} +      : FoldAction(FA), OperandToFold(InputOperand), FoldResult(nullptr) {}    UDivFoldAction(FoldUDivOperandCb FA, Value *InputOperand, size_t SLHS)        : FoldAction(FA), OperandToFold(InputOperand), SelectLHSIdx(SLHS) {}  }; @@ -836,7 +895,8 @@ static size_t visitUDivOperand(Value *Op0, Value *Op1, const BinaryOperator &I,    if (SelectInst *SI = dyn_cast<SelectInst>(Op1))      if (size_t LHSIdx = visitUDivOperand(Op0, SI->getOperand(1), I, Actions))        if (visitUDivOperand(Op0, SI->getOperand(2), I, Actions)) { -        Actions.push_back(UDivFoldAction((FoldUDivOperandCb)0, Op1, LHSIdx-1)); +        Actions.push_back(UDivFoldAction((FoldUDivOperandCb)nullptr, Op1, +                                         LHSIdx-1));          return Actions.size();        } @@ -846,7 +906,10 @@ static size_t visitUDivOperand(Value *Op0, Value *Op1, const BinaryOperator &I,  Instruction *InstCombiner::visitUDiv(BinaryOperator &I) {    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -  if (Value *V = SimplifyUDivInst(Op0, Op1, TD)) +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); + +  if (Value *V = SimplifyUDivInst(Op0, Op1, DL))      return ReplaceInstUsesWith(I, V);    // Handle the integer div common cases @@ -854,13 +917,11 @@ Instruction *InstCombiner::visitUDiv(BinaryOperator &I) {      return Common;    // (x lshr C1) udiv C2 --> x udiv (C2 << C1) -  if (ConstantInt *C2 = dyn_cast<ConstantInt>(Op1)) { +  if (Constant *C2 = dyn_cast<Constant>(Op1)) {      Value *X; -    ConstantInt *C1; -    if (match(Op0, m_LShr(m_Value(X), m_ConstantInt(C1)))) { -      APInt NC = C2->getValue().shl(C1->getLimitedValue(C1->getBitWidth()-1)); -      return BinaryOperator::CreateUDiv(X, Builder->getInt(NC)); -    } +    Constant *C1; +    if (match(Op0, m_LShr(m_Value(X), m_Constant(C1)))) +      return BinaryOperator::CreateUDiv(X, ConstantExpr::getShl(C2, C1));    }    // (zext A) udiv (zext B) --> zext (A udiv B) @@ -901,24 +962,27 @@ Instruction *InstCombiner::visitUDiv(BinaryOperator &I) {          return Inst;      } -  return 0; +  return nullptr;  }  Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -  if (Value *V = SimplifySDivInst(Op0, Op1, TD)) +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); + +  if (Value *V = SimplifySDivInst(Op0, Op1, DL))      return ReplaceInstUsesWith(I, V);    // Handle the integer div common cases    if (Instruction *Common = commonIDivTransforms(I))      return Common; -  if (ConstantInt *RHS = dyn_cast<ConstantInt>(Op1)) { -    // sdiv X, -1 == -X -    if (RHS->isAllOnesValue()) -      return BinaryOperator::CreateNeg(Op0); +  // sdiv X, -1 == -X +  if (match(Op1, m_AllOnes())) +    return BinaryOperator::CreateNeg(Op0); +  if (ConstantInt *RHS = dyn_cast<ConstantInt>(Op1)) {      // sdiv X, C  -->  ashr exact X, log2(C)      if (I.isExact() && RHS->getValue().isNonNegative() &&          RHS->getValue().isPowerOf2()) { @@ -926,6 +990,12 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {                                              RHS->getValue().exactLogBase2());        return BinaryOperator::CreateExactAShr(Op0, ShAmt, I.getName());      } +  } + +  if (Constant *RHS = dyn_cast<Constant>(Op1)) { +    // X/INT_MIN -> X == INT_MIN +    if (RHS->isMinSignedValue()) +      return new ZExtInst(Builder->CreateICmpEQ(Op0, Op1), I.getType());      // -X/C  -->  X/-C  provided the negation doesn't overflow.      if (SubOperator *Sub = dyn_cast<SubOperator>(Op0)) @@ -954,7 +1024,7 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {      }    } -  return 0; +  return nullptr;  }  /// CvtFDivConstToReciprocal tries to convert X/C into X*1/C if C not a special @@ -965,9 +1035,12 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {  /// returned; otherwise, NULL is returned.  ///  static Instruction *CvtFDivConstToReciprocal(Value *Dividend, -                                             ConstantFP *Divisor, +                                             Constant *Divisor,                                               bool AllowReciprocal) { -  const APFloat &FpVal = Divisor->getValueAPF(); +  if (!isa<ConstantFP>(Divisor)) // TODO: handle vectors. +    return nullptr; + +  const APFloat &FpVal = cast<ConstantFP>(Divisor)->getValueAPF();    APFloat Reciprocal(FpVal.getSemantics());    bool Cvt = FpVal.getExactInverse(&Reciprocal); @@ -978,7 +1051,7 @@ static Instruction *CvtFDivConstToReciprocal(Value *Dividend,    }    if (!Cvt) -    return 0; +    return nullptr;    ConstantFP *R;    R = ConstantFP::get(Dividend->getType()->getContext(), Reciprocal); @@ -988,7 +1061,10 @@ static Instruction *CvtFDivConstToReciprocal(Value *Dividend,  Instruction *InstCombiner::visitFDiv(BinaryOperator &I) {    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -  if (Value *V = SimplifyFDivInst(Op0, Op1, TD)) +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); + +  if (Value *V = SimplifyFDivInst(Op0, Op1, DL))      return ReplaceInstUsesWith(I, V);    if (isa<Constant>(Op0)) @@ -999,32 +1075,29 @@ Instruction *InstCombiner::visitFDiv(BinaryOperator &I) {    bool AllowReassociate = I.hasUnsafeAlgebra();    bool AllowReciprocal = I.hasAllowReciprocal(); -  if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) { +  if (Constant *Op1C = dyn_cast<Constant>(Op1)) {      if (SelectInst *SI = dyn_cast<SelectInst>(Op0))        if (Instruction *R = FoldOpIntoSelect(I, SI))          return R;      if (AllowReassociate) { -      ConstantFP *C1 = 0; -      ConstantFP *C2 = Op1C; +      Constant *C1 = nullptr; +      Constant *C2 = Op1C;        Value *X; -      Instruction *Res = 0; +      Instruction *Res = nullptr; -      if (match(Op0, m_FMul(m_Value(X), m_ConstantFP(C1)))) { +      if (match(Op0, m_FMul(m_Value(X), m_Constant(C1)))) {          // (X*C1)/C2 => X * (C1/C2)          //          Constant *C = ConstantExpr::getFDiv(C1, C2); -        const APFloat &F = cast<ConstantFP>(C)->getValueAPF(); -        if (F.isNormal()) +        if (isNormalFp(C))            Res = BinaryOperator::CreateFMul(X, C); -      } else if (match(Op0, m_FDiv(m_Value(X), m_ConstantFP(C1)))) { +      } else if (match(Op0, m_FDiv(m_Value(X), m_Constant(C1)))) {          // (X/C1)/C2 => X /(C2*C1) [=> X * 1/(C2*C1) if reciprocal is allowed]          //          Constant *C = ConstantExpr::getFMul(C1, C2); -        const APFloat &F = cast<ConstantFP>(C)->getValueAPF(); -        if (F.isNormal()) { -          Res = CvtFDivConstToReciprocal(X, cast<ConstantFP>(C), -                                         AllowReciprocal); +        if (isNormalFp(C)) { +          Res = CvtFDivConstToReciprocal(X, C, AllowReciprocal);            if (!Res)              Res = BinaryOperator::CreateFDiv(X, C);          } @@ -1037,60 +1110,68 @@ Instruction *InstCombiner::visitFDiv(BinaryOperator &I) {      }      // X / C => X * 1/C -    if (Instruction *T = CvtFDivConstToReciprocal(Op0, Op1C, AllowReciprocal)) +    if (Instruction *T = CvtFDivConstToReciprocal(Op0, Op1C, AllowReciprocal)) { +      T->copyFastMathFlags(&I);        return T; +    } -    return 0; +    return nullptr;    } -  if (AllowReassociate && isa<ConstantFP>(Op0)) { -    ConstantFP *C1 = cast<ConstantFP>(Op0), *C2; -    Constant *Fold = 0; +  if (AllowReassociate && isa<Constant>(Op0)) { +    Constant *C1 = cast<Constant>(Op0), *C2; +    Constant *Fold = nullptr;      Value *X;      bool CreateDiv = true;      // C1 / (X*C2) => (C1/C2) / X -    if (match(Op1, m_FMul(m_Value(X), m_ConstantFP(C2)))) +    if (match(Op1, m_FMul(m_Value(X), m_Constant(C2))))        Fold = ConstantExpr::getFDiv(C1, C2); -    else if (match(Op1, m_FDiv(m_Value(X), m_ConstantFP(C2)))) { +    else if (match(Op1, m_FDiv(m_Value(X), m_Constant(C2)))) {        // C1 / (X/C2) => (C1*C2) / X        Fold = ConstantExpr::getFMul(C1, C2); -    } else if (match(Op1, m_FDiv(m_ConstantFP(C2), m_Value(X)))) { +    } else if (match(Op1, m_FDiv(m_Constant(C2), m_Value(X)))) {        // C1 / (C2/X) => (C1/C2) * X        Fold = ConstantExpr::getFDiv(C1, C2);        CreateDiv = false;      } -    if (Fold) { -      const APFloat &FoldC = cast<ConstantFP>(Fold)->getValueAPF(); -      if (FoldC.isNormal()) { -        Instruction *R = CreateDiv ? -                         BinaryOperator::CreateFDiv(Fold, X) : -                         BinaryOperator::CreateFMul(X, Fold); -        R->setFastMathFlags(I.getFastMathFlags()); -        return R; -      } +    if (Fold && isNormalFp(Fold)) { +      Instruction *R = CreateDiv ? BinaryOperator::CreateFDiv(Fold, X) +                                 : BinaryOperator::CreateFMul(X, Fold); +      R->setFastMathFlags(I.getFastMathFlags()); +      return R;      } -    return 0; +    return nullptr;    }    if (AllowReassociate) {      Value *X, *Y; -    Value *NewInst = 0; -    Instruction *SimpR = 0; +    Value *NewInst = nullptr; +    Instruction *SimpR = nullptr;      if (Op0->hasOneUse() && match(Op0, m_FDiv(m_Value(X), m_Value(Y)))) {        // (X/Y) / Z => X / (Y*Z)        // -      if (!isa<ConstantFP>(Y) || !isa<ConstantFP>(Op1)) { +      if (!isa<Constant>(Y) || !isa<Constant>(Op1)) {          NewInst = Builder->CreateFMul(Y, Op1); +        if (Instruction *RI = dyn_cast<Instruction>(NewInst)) { +          FastMathFlags Flags = I.getFastMathFlags(); +          Flags &= cast<Instruction>(Op0)->getFastMathFlags(); +          RI->setFastMathFlags(Flags); +        }          SimpR = BinaryOperator::CreateFDiv(X, NewInst);        }      } else if (Op1->hasOneUse() && match(Op1, m_FDiv(m_Value(X), m_Value(Y)))) {        // Z / (X/Y) => Z*Y / X        // -      if (!isa<ConstantFP>(Y) || !isa<ConstantFP>(Op0)) { +      if (!isa<Constant>(Y) || !isa<Constant>(Op0)) {          NewInst = Builder->CreateFMul(Op0, Y); +        if (Instruction *RI = dyn_cast<Instruction>(NewInst)) { +          FastMathFlags Flags = I.getFastMathFlags(); +          Flags &= cast<Instruction>(Op1)->getFastMathFlags(); +          RI->setFastMathFlags(Flags); +        }          SimpR = BinaryOperator::CreateFDiv(NewInst, X);        }      } @@ -1103,7 +1184,7 @@ Instruction *InstCombiner::visitFDiv(BinaryOperator &I) {      }    } -  return 0; +  return nullptr;  }  /// This function implements the transforms common to both integer remainder @@ -1123,7 +1204,7 @@ Instruction *InstCombiner::commonIRemTransforms(BinaryOperator &I) {    if (isa<SelectInst>(Op1) && SimplifyDivRemOfSelect(I))      return &I; -  if (isa<ConstantInt>(Op1)) { +  if (isa<Constant>(Op1)) {      if (Instruction *Op0I = dyn_cast<Instruction>(Op0)) {        if (SelectInst *SI = dyn_cast<SelectInst>(Op0I)) {          if (Instruction *R = FoldOpIntoSelect(I, SI)) @@ -1139,13 +1220,16 @@ Instruction *InstCombiner::commonIRemTransforms(BinaryOperator &I) {      }    } -  return 0; +  return nullptr;  }  Instruction *InstCombiner::visitURem(BinaryOperator &I) {    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -  if (Value *V = SimplifyURemInst(Op0, Op1, TD)) +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); + +  if (Value *V = SimplifyURemInst(Op0, Op1, DL))      return ReplaceInstUsesWith(I, V);    if (Instruction *common = commonIRemTransforms(I)) @@ -1171,13 +1255,16 @@ Instruction *InstCombiner::visitURem(BinaryOperator &I) {      return ReplaceInstUsesWith(I, Ext);    } -  return 0; +  return nullptr;  }  Instruction *InstCombiner::visitSRem(BinaryOperator &I) {    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -  if (Value *V = SimplifySRemInst(Op0, Op1, TD)) +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); + +  if (Value *V = SimplifySRemInst(Op0, Op1, DL))      return ReplaceInstUsesWith(I, V);    // Handle the integer rem common cases @@ -1213,7 +1300,7 @@ Instruction *InstCombiner::visitSRem(BinaryOperator &I) {      bool hasMissing = false;      for (unsigned i = 0; i != VWidth; ++i) {        Constant *Elt = C->getAggregateElement(i); -      if (Elt == 0) { +      if (!Elt) {          hasMissing = true;          break;        } @@ -1242,18 +1329,21 @@ Instruction *InstCombiner::visitSRem(BinaryOperator &I) {      }    } -  return 0; +  return nullptr;  }  Instruction *InstCombiner::visitFRem(BinaryOperator &I) {    Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -  if (Value *V = SimplifyFRemInst(Op0, Op1, TD)) +  if (Value *V = SimplifyVectorOp(I)) +    return ReplaceInstUsesWith(I, V); + +  if (Value *V = SimplifyFRemInst(Op0, Op1, DL))      return ReplaceInstUsesWith(I, V);    // Handle cases involving: rem X, (select Cond, Y, Z)    if (isa<SelectInst>(Op1) && SimplifyDivRemOfSelect(I))      return &I; -  return 0; +  return nullptr;  }  | 
