mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 23:48:56 +00:00
[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:
parent
1e4af08410
commit
bdf4ccfe9b
@ -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));
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user