diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2008-07-12 05:04:38 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2008-07-12 05:04:38 +0000 |
commit | 3ac9e109b24eaae482eb914d970ba7980f462925 (patch) | |
tree | a9bfc7d343de39ae7071ddb5aac65db7c7c0bab3 /lib/Transforms/Scalar | |
parent | 5330192ab59d65f285799ff5a9acd67d27417a56 (diff) | |
download | llvm-3ac9e109b24eaae482eb914d970ba7980f462925.tar.gz llvm-3ac9e109b24eaae482eb914d970ba7980f462925.tar.bz2 llvm-3ac9e109b24eaae482eb914d970ba7980f462925.tar.xz |
Enhance analysis of srem.
Remove dead code analyzing urem. 'urem' of power-of-2 is canonicalized to an
'and' instruction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53506 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 18 |
1 files changed, 3 insertions, 15 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 5864a62677..20580e30ab 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1254,6 +1254,9 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask, if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) { APInt RA = Rem->getValue(); if (RA.isPowerOf2() || (-RA).isPowerOf2()) { + if (DemandedMask.ule(RA)) // srem won't affect demanded bits + return UpdateValueUsesWith(I, I->getOperand(0)); + APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA; APInt Mask2 = LowBits | APInt::getSignBit(BitWidth); if (SimplifyDemandedBits(I->getOperand(0), Mask2, @@ -1273,21 +1276,6 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask, } break; case Instruction::URem: { - if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) { - APInt RA = Rem->getValue(); - if (RA.isPowerOf2()) { - APInt LowBits = (RA - 1); - APInt Mask2 = LowBits & DemandedMask; - KnownZero |= ~LowBits & DemandedMask; - if (SimplifyDemandedBits(I->getOperand(0), Mask2, - KnownZero, KnownOne, Depth+1)) - return true; - - assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?"); - break; - } - } - APInt KnownZero2(BitWidth, 0), KnownOne2(BitWidth, 0); APInt AllOnes = APInt::getAllOnesValue(BitWidth); if (SimplifyDemandedBits(I->getOperand(0), AllOnes, |