diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index c66db9285c799a..dd31bfa7e65f50 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -858,35 +858,16 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Instruction *I, } case Instruction::SRem: { const APInt *Rem; - // X % -1 demands all the bits because we don't want to introduce - // INT_MIN % -1 (== undef) by accident. - if (match(I->getOperand(1), m_APInt(Rem)) && !Rem->isAllOnes()) { - APInt RA = Rem->abs(); - if (RA.isPowerOf2()) { - if (DemandedMask.ult(RA)) // srem won't affect demanded bits - return I->getOperand(0); - - APInt LowBits = RA - 1; - APInt Mask2 = LowBits | APInt::getSignMask(BitWidth); - if (SimplifyDemandedBits(I, 0, Mask2, LHSKnown, Depth + 1, Q)) - return I; - - // The low bits of LHS are unchanged by the srem. - Known.Zero = LHSKnown.Zero & LowBits; - Known.One = LHSKnown.One & LowBits; - - // If LHS is non-negative or has all low bits zero, then the upper bits - // are all zero. - if (LHSKnown.isNonNegative() || LowBits.isSubsetOf(LHSKnown.Zero)) - Known.Zero |= ~LowBits; + if (match(I->getOperand(1), m_APInt(Rem)) && Rem->isPowerOf2()) { + if (DemandedMask.ult(*Rem)) // srem won't affect demanded bits + return I->getOperand(0); - // If LHS is negative and not all low bits are zero, then the upper bits - // are all one. - if (LHSKnown.isNegative() && LowBits.intersects(LHSKnown.One)) - Known.One |= ~LowBits; - - break; - } + APInt LowBits = *Rem - 1; + APInt Mask2 = LowBits | APInt::getSignMask(BitWidth); + if (SimplifyDemandedBits(I, 0, Mask2, LHSKnown, Depth + 1, Q)) + return I; + Known = KnownBits::srem(LHSKnown, KnownBits::makeConstant(*Rem)); + break; } llvm::computeKnownBits(I, Known, Depth, Q);