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

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 18 17:48:31 PDT 2015


Author: majnemer
Date: Fri Sep 18 19:48:31 2015
New Revision: 248074

URL: http://llvm.org/viewvc/llvm-project?rev=248074&view=rev
Log:
[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.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
    llvm/trunk/test/Transforms/InstCombine/icmp-shr.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=248074&r1=248073&r2=248074&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Fri Sep 18 19:48:31 2015
@@ -1083,7 +1083,7 @@ Instruction *InstCombiner::FoldICmpCstSh
   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));

Modified: llvm/trunk/test/Transforms/InstCombine/icmp-shr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp-shr.ll?rev=248074&r1=248073&r2=248074&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/icmp-shr.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/icmp-shr.ll Fri Sep 18 19:48:31 2015
@@ -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
+}




More information about the llvm-commits mailing list