PR9998: ashr exact %x, 31 is not equivalent to sdiv exact %x, -2147483648.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132097 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman
2011-05-25 23:26:20 +00:00
parent 8a115d5bf4
commit a831a9b972
2 changed files with 20 additions and 4 deletions
@@ -919,11 +919,11 @@ Instruction *InstCombiner::FoldICmpShrCst(ICmpInst &ICI, BinaryOperator *Shr,
if (ICI.isSigned() != (Shr->getOpcode() == Instruction::AShr))
return 0;
// Otherwise, all lshr and all exact ashr's are equivalent to a udiv/sdiv by
// a power of 2. Since we already have logic to simplify these, transform
// to div and then simplify the resultant comparison.
// Otherwise, all lshr and most exact ashr's are equivalent to a udiv/sdiv
// by a power of 2. Since we already have logic to simplify these,
// transform to div and then simplify the resultant comparison.
if (Shr->getOpcode() == Instruction::AShr &&
!Shr->isExact())
(!Shr->isExact() || ShAmtVal == TypeBits - 1))
return 0;
// Revisit the shift (to delete it).