diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 13 | 
1 files changed, 11 insertions, 2 deletions
| diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 74a1b6803d4..ec1ed664961 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -681,10 +681,19 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,                                   LHSKnownZero, LHSKnownOne, Depth+1))            return I; +        // The low bits of LHS are unchanged by the srem. +        KnownZero |= LHSKnownZero & LowBits; +        KnownOne |= LHSKnownOne & LowBits; + +        // If LHS is non-negative or has all low bits zero, then the upper bits +        // are all zero.          if (LHSKnownZero[BitWidth-1] || ((LHSKnownZero & LowBits) == LowBits)) -          LHSKnownZero |= ~LowBits; +          KnownZero |= ~LowBits; -        KnownZero |= LHSKnownZero & DemandedMask; +        // If LHS is negative and not all low bits are zero, then the upper bits +        // are all one. +        if (LHSKnownOne[BitWidth-1] && ((LHSKnownOne & LowBits) != 0)) +          KnownOne |= ~LowBits;          assert(!(KnownZero & KnownOne) && "Bits known to be one AND zero?");         } | 

