[InstCombine] FoldICmpCstShrCst failed for ashr when comparing against -1

(icmp eq (ashr C1, %V) -1) may have multiple answers if C1 is not a
power of two and has the sign bit set.

This fixes PR24873.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248074 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer 2015-09-19 00:48:31 +00:00
parent 1e4af08410
commit bdf4ccfe9b
2 changed files with 10 additions and 1 deletions

View File

@ -1083,7 +1083,7 @@ Instruction *InstCombiner::FoldICmpCstShrCst(ICmpInst &I, Value *Op, Value *A,
if (Shift > 0) {
if (IsAShr && AP1 == AP2.ashr(Shift)) {
// There are multiple solutions if we are comparing against -1 and the LHS
// of the ashr is not a power of two..
// of the ashr is not a power of two.
if (AP1.isAllOnesValue() && !AP2.isPowerOf2())
return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));

View File

@ -376,3 +376,12 @@ define i1 @PR21222(i32 %B) {
%cmp = icmp eq i32 %shr, -2
ret i1 %cmp
}
; CHECK-LABEL: @PR24873(
; CHECK: %[[icmp:.*]] = icmp ugt i64 %V, 61
; CHECK-NEXT: ret i1 %[[icmp]]
define i1 @PR24873(i64 %V) {
%ashr = ashr i64 -4611686018427387904, %V
%icmp = icmp eq i64 %ashr, -1
ret i1 %icmp
}