diff options
Diffstat (limited to 'contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp')
| -rw-r--r-- | contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 48 | 
1 files changed, 27 insertions, 21 deletions
diff --git a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 6492eaedae9c..2c2b7317a1c0 100644 --- a/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -1402,9 +1402,9 @@ Instruction *InstCombiner::foldICmpWithConstant(ICmpInst &Cmp) {    if (*C == 0 && Pred == ICmpInst::ICMP_SGT) {      SelectPatternResult SPR = matchSelectPattern(X, A, B);      if (SPR.Flavor == SPF_SMIN) { -      if (isKnownPositive(A, DL)) +      if (isKnownPositive(A, DL, 0, &AC, &Cmp, &DT))          return new ICmpInst(Pred, B, Cmp.getOperand(1)); -      if (isKnownPositive(B, DL)) +      if (isKnownPositive(B, DL, 0, &AC, &Cmp, &DT))          return new ICmpInst(Pred, A, Cmp.getOperand(1));      }    } @@ -1478,8 +1478,7 @@ Instruction *InstCombiner::foldICmpTruncConstant(ICmpInst &Cmp,      // of the high bits truncated out of x are known.      unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),               SrcBits = X->getType()->getScalarSizeInBits(); -    KnownBits Known(SrcBits); -    computeKnownBits(X, Known, 0, &Cmp); +    KnownBits Known = computeKnownBits(X, 0, &Cmp);      // If all the high bits are known, we can do this xform.      if ((Known.Zero | Known.One).countLeadingOnes() >= SrcBits - DstBits) { @@ -3030,18 +3029,21 @@ Instruction *InstCombiner::foldICmpBinOp(ICmpInst &I) {        break;      case Instruction::Add:      case Instruction::Sub: -    case Instruction::Xor: +    case Instruction::Xor: {        if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b          return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0)); -      // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b -      if (ConstantInt *CI = dyn_cast<ConstantInt>(BO0->getOperand(1))) { -        if (CI->getValue().isSignMask()) { + +      const APInt *C; +      if (match(BO0->getOperand(1), m_APInt(C))) { +        // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b +        if (C->isSignMask()) {            ICmpInst::Predicate NewPred =                I.isSigned() ? I.getUnsignedPredicate() : I.getSignedPredicate();            return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));          } -        if (BO0->getOpcode() == Instruction::Xor && CI->isMaxValue(true)) { +        // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b +        if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {            ICmpInst::Predicate NewPred =                I.isSigned() ? I.getUnsignedPredicate() : I.getSignedPredicate();            NewPred = I.getSwappedPredicate(NewPred); @@ -3049,26 +3051,30 @@ Instruction *InstCombiner::foldICmpBinOp(ICmpInst &I) {          }        }        break; -    case Instruction::Mul: +    } +    case Instruction::Mul: {        if (!I.isEquality())          break; -      if (ConstantInt *CI = dyn_cast<ConstantInt>(BO0->getOperand(1))) { -        // a * Cst icmp eq/ne b * Cst --> a & Mask icmp b & Mask -        // Mask = -1 >> count-trailing-zeros(Cst). -        if (!CI->isZero() && !CI->isOne()) { -          const APInt &AP = CI->getValue(); -          ConstantInt *Mask = ConstantInt::get( -              I.getContext(), -              APInt::getLowBitsSet(AP.getBitWidth(), -                                   AP.getBitWidth() - AP.countTrailingZeros())); +      const APInt *C; +      if (match(BO0->getOperand(1), m_APInt(C)) && *C != 0 && *C != 1) { +        // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask) +        // Mask = -1 >> count-trailing-zeros(C). +        if (unsigned TZs = C->countTrailingZeros()) { +          Constant *Mask = ConstantInt::get( +              BO0->getType(), +              APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));            Value *And1 = Builder->CreateAnd(BO0->getOperand(0), Mask);            Value *And2 = Builder->CreateAnd(BO1->getOperand(0), Mask);            return new ICmpInst(Pred, And1, And2);          } +        // If there are no trailing zeros in the multiplier, just eliminate +        // the multiplies (no masking is needed): +        // icmp eq/ne (X * C), (Y * C) --> icmp eq/ne X, Y +        return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));        }        break; - +    }      case Instruction::UDiv:      case Instruction::LShr:        if (I.isSigned() || !BO0->isExact() || !BO1->isExact()) @@ -4497,7 +4503,7 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {      // if A is a power of 2.      if (match(Op0, m_And(m_Value(A), m_Not(m_Value(B)))) &&          match(Op1, m_Zero()) && -        isKnownToBeAPowerOfTwo(A, DL, false, 0, &AC, &I, &DT) && I.isEquality()) +        isKnownToBeAPowerOfTwo(A, false, 0, &I) && I.isEquality())        return new ICmpInst(I.getInversePredicate(),                            Builder->CreateAnd(A, B),                            Op1);  | 
