<div dir="ltr">I typo'd the bug number in the title. That should be "PR32524". The link in the text should be right.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 5, 2017 at 11:57 AM, Sanjay Patel via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: spatel<br>
Date: Wed Apr  5 12:57:05 2017<br>
New Revision: 299570<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=299570&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=299570&view=rev</a><br>
Log:<br>
[InstCombine] add fold for icmp with or mask of low bits (PR32542)<br>
<br>
We already have these 'and' folds:<br>
<br>
// X & -C == -C -> X >  u ~C<br>
// X & -C != -C -> X <= u ~C<br>
//   iff C is a power of 2<br>
<br>
...but we were missing the 'or' siblings.<br>
<br>
<a href="http://rise4fun.com/Alive/n6" rel="noreferrer" target="_blank">http://rise4fun.com/Alive/n6</a><br>
<br>
This should improve:<br>
<a href="https://bugs.llvm.org/show_bug.cgi?id=32524" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=32524</a><br>
...but there are 2 or more other pieces to fix still.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D31712" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D31712</a><br>
<br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineCompares.cpp<br>
    llvm/trunk/test/Transforms/<wbr>InstCombine/icmp.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineCompares.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=299570&r1=299569&r2=299570&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/InstCombine/<wbr>InstCombineCompares.cpp?rev=<wbr>299570&r1=299569&r2=299570&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineCompares.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineCompares.cpp Wed Apr  5 12:57:05 2017<br>
@@ -1794,6 +1794,15 @@ Instruction *InstCombiner::foldICmpOrCon<br>
                           ConstantInt::get(V->getType(), 1));<br>
   }<br>
<br>
+  // X | C == C --> X <=u C<br>
+  // X | C != C --> X  >u C<br>
+  //   iff C+1 is a power of 2 (C is a bitmask of the low bits)<br>
+  if (Cmp.isEquality() && Cmp.getOperand(1) == Or->getOperand(1) &&<br>
+      (*C + 1).isPowerOf2()) {<br>
+    Pred = (Pred == CmpInst::ICMP_EQ) ? CmpInst::ICMP_ULE : CmpInst::ICMP_UGT;<br>
+    return new ICmpInst(Pred, Or->getOperand(0), Or->getOperand(1));<br>
+  }<br>
+<br>
   if (!Cmp.isEquality() || *C != 0 || !Or->hasOneUse())<br>
     return nullptr;<br>
<br>
<br>
Modified: llvm/trunk/test/Transforms/<wbr>InstCombine/icmp.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=299570&r1=299569&r2=299570&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/InstCombine/icmp.<wbr>ll?rev=299570&r1=299569&r2=<wbr>299570&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/<wbr>InstCombine/icmp.ll (original)<br>
+++ llvm/trunk/test/Transforms/<wbr>InstCombine/icmp.ll Wed Apr  5 12:57:05 2017<br>
@@ -1876,12 +1876,12 @@ define <2 x i1> @icmp_and_X_-16_ne-16_ve<br>
   ret <2 x i1> %cmp<br>
 }<br>
<br>
+; PR32524: <a href="https://bugs.llvm.org/show_bug.cgi?id=32524" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=32524</a><br>
 ; X | C == C --> X <=u C (when C+1 is PowerOf2).<br>
<br>
 define i1 @or1_eq1(i32 %x) {<br>
 ; CHECK-LABEL: @or1_eq1(<br>
-; CHECK-NEXT:    [[T0:%.*]] = or i32 %x, 1<br>
-; CHECK-NEXT:    [[T1:%.*]] = icmp eq i32 [[T0]], 1<br>
+; CHECK-NEXT:    [[T1:%.*]] = icmp ult i32 %x, 2<br>
 ; CHECK-NEXT:    ret i1 [[T1]]<br>
 ;<br>
   %t0 = or i32 %x, 1<br>
@@ -1893,8 +1893,7 @@ define i1 @or1_eq1(i32 %x) {<br>
<br>
 define <2 x i1> @or3_eq3_vec(<2 x i8> %x) {<br>
 ; CHECK-LABEL: @or3_eq3_vec(<br>
-; CHECK-NEXT:    [[T0:%.*]] = or <2 x i8> %x, <i8 3, i8 3><br>
-; CHECK-NEXT:    [[T1:%.*]] = icmp eq <2 x i8> [[T0]], <i8 3, i8 3><br>
+; CHECK-NEXT:    [[T1:%.*]] = icmp ult <2 x i8> %x, <i8 4, i8 4><br>
 ; CHECK-NEXT:    ret <2 x i1> [[T1]]<br>
 ;<br>
   %t0 = or <2 x i8> %x, <i8 3, i8 3><br>
@@ -1906,8 +1905,7 @@ define <2 x i1> @or3_eq3_vec(<2 x i8> %x<br>
<br>
 define i1 @or7_ne7(i32 %x) {<br>
 ; CHECK-LABEL: @or7_ne7(<br>
-; CHECK-NEXT:    [[T0:%.*]] = or i32 %x, 7<br>
-; CHECK-NEXT:    [[T1:%.*]] = icmp ne i32 [[T0]], 7<br>
+; CHECK-NEXT:    [[T1:%.*]] = icmp ugt i32 %x, 7<br>
 ; CHECK-NEXT:    ret i1 [[T1]]<br>
 ;<br>
   %t0 = or i32 %x, 7<br>
@@ -1919,8 +1917,7 @@ define i1 @or7_ne7(i32 %x) {<br>
<br>
 define <2 x i1> @or63_ne63_vec(<2 x i8> %x) {<br>
 ; CHECK-LABEL: @or63_ne63_vec(<br>
-; CHECK-NEXT:    [[T0:%.*]] = or <2 x i8> %x, <i8 63, i8 63><br>
-; CHECK-NEXT:    [[T1:%.*]] = icmp ne <2 x i8> [[T0]], <i8 63, i8 63><br>
+; CHECK-NEXT:    [[T1:%.*]] = icmp ugt <2 x i8> %x, <i8 63, i8 63><br>
 ; CHECK-NEXT:    ret <2 x i1> [[T1]]<br>
 ;<br>
   %t0 = or <2 x i8> %x, <i8 63, i8 63><br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>