<div dir="ltr"><div><div>The other bit manipulation intrinsics (cttz, ctlz, ctpop) don't have this property.<br><br>I think some FP intrinsics will work here, but we would need to be careful with NANs, signed zero, overflow, underflow, exactness, etc.<br></div><br></div>sin(x) == sin(y) does not work though: y = x + 2*PI --> sin(x) == sin(x + 2*PI) is probably true, but x == y is probably false?<br><div><br></div><div>For f(x) == f(x), early-cse should catch those? But again, we might need relaxed FP for FP intrinsics.<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jul 2, 2017 at 12:54 PM, Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Nothing wrong with this change, but any chance we could generalize here?  Are there other intrinsics whose input/output preserve equality?  I think any intrinsic which is a 1-to-1 total function preserves this property right?  What about sin/cost/tan, sqrt, etc..?<br>
<br>
There's also a larger category where equality of inputs implies equality of outputs.  That is: f(a) == f(a) is always true for certain functions f.  Do we exploit that anywhere?  log, signbit, fabs, etc... all have that property.  (I suspect we get this one, but have not checked.)<span class="HOEnZb"><font color="#888888"><br>
<br>
Philip</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
On 07/02/2017 07:34 AM, Sanjay Patel via llvm-commits wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: spatel<br>
Date: Sun Jul  2 07:34:50 2017<br>
New Revision: 306980<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=306980&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=306980&view=rev</a><br>
Log:<br>
[InstCombine] look through bswap/bitreverse for equality comparisons<br>
<br>
I noticed this missed bswap optimization in the CGP memcmp() expansion,<br>
and then I saw that we don't have the fold in InstCombine.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D34763" rel="noreferrer" target="_blank">https://reviews.llvm.org/D3476<wbr>3</a><br>
<br>
Modified:<br>
     llvm/trunk/lib/Transforms/Ins<wbr>tCombine/InstCombineCompares.<wbr>cpp<br>
     llvm/trunk/test/Transforms/In<wbr>stCombine/icmp.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Inst<wbr>Combine/InstCombineCompares.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=306980&r1=306979&r2=306980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/InstCombine/InstCombineCompa<wbr>res.cpp?rev=306980&r1=306979&<wbr>r2=306980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/Inst<wbr>Combine/InstCombineCompares.<wbr>cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Inst<wbr>Combine/InstCombineCompares.<wbr>cpp Sun Jul  2 07:34:50 2017<br>
@@ -3438,6 +3438,15 @@ Instruction *InstCombiner::foldICmpEqual<br>
      }<br>
    }<br>
  +  // If both operands are byte-swapped or bit-reversed, just compare the<br>
+  // original values.<br>
+  // TODO: Move this to a function similar to foldICmpIntrinsicWithConstant(<wbr>)<br>
+  // and handle more intrinsics.<br>
+  if ((match(Op0, m_BSwap(m_Value(A))) && match(Op1, m_BSwap(m_Value(B)))) ||<br>
+      (match(Op0, m_Intrinsic<Intrinsic::bitreve<wbr>rse>(m_Value(A))) &&<br>
+       match(Op1, m_Intrinsic<Intrinsic::bitreve<wbr>rse>(m_Value(B)))))<br>
+    return new ICmpInst(Pred, A, B);<br>
+<br>
    return nullptr;<br>
  }<br>
  <br>
Modified: llvm/trunk/test/Transforms/Ins<wbr>tCombine/icmp.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=306980&r1=306979&r2=306980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/Transfor<wbr>ms/InstCombine/icmp.ll?rev=<wbr>306980&r1=306979&r2=306980&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/Ins<wbr>tCombine/icmp.ll (original)<br>
+++ llvm/trunk/test/Transforms/Ins<wbr>tCombine/icmp.ll Sun Jul  2 07:34:50 2017<br>
@@ -2979,9 +2979,7 @@ declare i32 @llvm.bswap.i32(i32)<br>
    define i1 @bswap_ne(i32 %x, i32 %y) {<br>
  ; CHECK-LABEL: @bswap_ne(<br>
-; CHECK-NEXT:    [[SWAPX:%.*]] = call i32 @llvm.bswap.i32(i32 %x)<br>
-; CHECK-NEXT:    [[SWAPY:%.*]] = call i32 @llvm.bswap.i32(i32 %y)<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[SWAPX]], [[SWAPY]]<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 %x, %y<br>
  ; CHECK-NEXT:    ret i1 [[CMP]]<br>
  ;<br>
    %swapx = call i32 @llvm.bswap.i32(i32 %x)<br>
@@ -2994,9 +2992,7 @@ declare <8 x i16> @llvm.bswap.v8i16(<8 x<br>
    define <8 x i1> @bswap_vec_eq(<8 x i16> %x, <8 x i16> %y) {<br>
  ; CHECK-LABEL: @bswap_vec_eq(<br>
-; CHECK-NEXT:    [[SWAPX:%.*]] = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %x)<br>
-; CHECK-NEXT:    [[SWAPY:%.*]] = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %y)<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <8 x i16> [[SWAPX]], [[SWAPY]]<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <8 x i16> %x, %y<br>
  ; CHECK-NEXT:    ret <8 x i1> [[CMP]]<br>
  ;<br>
    %swapx = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %x)<br>
@@ -3009,9 +3005,7 @@ declare i64 @llvm.bitreverse.i64(i64)<br>
    define i1 @bitreverse_eq(i64 %x, i64 %y) {<br>
  ; CHECK-LABEL: @bitreverse_eq(<br>
-; CHECK-NEXT:    [[REVX:%.*]] = call i64 @llvm.bitreverse.i64(i64 %x)<br>
-; CHECK-NEXT:    [[REVY:%.*]] = call i64 @llvm.bitreverse.i64(i64 %y)<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[REVX]], [[REVY]]<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 %x, %y<br>
  ; CHECK-NEXT:    ret i1 [[CMP]]<br>
  ;<br>
    %revx = call i64 @llvm.bitreverse.i64(i64 %x)<br>
@@ -3024,9 +3018,7 @@ declare <8 x i16> @llvm.bitreverse.v8i16<br>
    define <8 x i1> @bitreverse_vec_ne(<8 x i16> %x, <8 x i16> %y) {<br>
  ; CHECK-LABEL: @bitreverse_vec_ne(<br>
-; CHECK-NEXT:    [[REVX:%.*]] = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %x)<br>
-; CHECK-NEXT:    [[REVY:%.*]] = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %y)<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <8 x i16> [[REVX]], [[REVY]]<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <8 x i16> %x, %y<br>
  ; CHECK-NEXT:    ret <8 x i1> [[CMP]]<br>
  ;<br>
    %revx = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %x)<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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>
<br>
<br>
</div></div></blockquote></div><br></div>