From bdf4ccfe9b488e5413647774e7181f20d37ae238 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 19 Sep 2015 00:48:31 +0000 Subject: [PATCH] [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 --- lib/Transforms/InstCombine/InstCombineCompares.cpp | 2 +- test/Transforms/InstCombine/icmp-shr.ll | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index ac94cdb93b0..06c5b3a88c7 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -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)); diff --git a/test/Transforms/InstCombine/icmp-shr.ll b/test/Transforms/InstCombine/icmp-shr.ll index 52414b99cca..4fa85a72baf 100644 --- a/test/Transforms/InstCombine/icmp-shr.ll +++ b/test/Transforms/InstCombine/icmp-shr.ll @@ -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 +} -- 2.34.1