<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Aug 12, 2014 at 10:13 PM, Karthik Bhat <span dir="ltr"><<a href="mailto:kv.bhat@samsung.com" target="_blank">kv.bhat@samsung.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: karthik<br>
Date: Wed Aug 13 00:13:14 2014<br>
New Revision: 215524<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=215524&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=215524&view=rev</a><br>
Log:<br>
InstCombine: Combine (xor (or %a, %b) (xor %a, %b)) to (add %a, %b)<br>
<br>
Correctness proof of the transform using CVC3-<br>
<br>
$ cat t.cvc<br>
A, B : BITVECTOR(32);<br>
QUERY BVXOR(A | B, BVXOR(A,B) ) = A & B;<br>
<br>
$ cvc3 t.cvc<br>
Valid.<br>
<br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp<br>
    llvm/trunk/test/Transforms/InstCombine/or-xor.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp?rev=215524&r1=215523&r2=215524&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp?rev=215524&r1=215523&r2=215524&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp Wed Aug 13 00:13:14 2014<br>
@@ -2508,6 +2508,18 @@ Instruction *InstCombiner::visitXor(Bina<br>
       if ((A == C && B == D) || (A == D && B == C))<br>
         return BinaryOperator::CreateXor(A, B);<br>
     }<br>
+    // (A ^ B)^(A | B) -> A & B<br>
+    if (match(Op0I, m_Xor(m_Value(A), m_Value(B))) &&<br>
+        match(Op1I, m_Or(m_Value(C), m_Value(D)))) {<br>
+      if ((A == C && B == D) || (A == D && B == C))<br>
+        return BinaryOperator::CreateAnd(A, B);<br>
+    }<br>
+    // (A | B)^(A ^ B) -> A & B<br>
+    if (match(Op0I, m_Or(m_Value(A), m_Value(B))) &&<br>
+        match(Op1I, m_Xor(m_Value(C), m_Value(D)))) {<br>
+      if ((A == C && B == D) || (A == D && B == C))<br>
+        return BinaryOperator::CreateAnd(A, B);<br>
+    }<br>
     // (A & B) ^ (A ^ B) -> (A | B)<br>
     if (match(Op0I, m_And(m_Value(A), m_Value(B))) &&<br>
         match(Op1I, m_Xor(m_Specific(A), m_Specific(B))))<br>
<br>
Modified: llvm/trunk/test/Transforms/InstCombine/or-xor.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/or-xor.ll?rev=215524&r1=215523&r2=215524&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/or-xor.ll?rev=215524&r1=215523&r2=215524&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/or-xor.ll (original)<br>
+++ llvm/trunk/test/Transforms/InstCombine/or-xor.ll Wed Aug 13 00:13:14 2014<br>
@@ -136,3 +136,14 @@ define i32 @test13(i32 %x, i32 %y) {<br>
 ; CHECK-NEXT: %and = and i32 %x, %y<br>
 ; CHECK-NEXT: ret i32 %and<br>
 }<br>
+<br>
+; ((x | y) ^ (x ^ y)) -> (x & y)<br>
+define i32 @test15(i32 %x, i32 %y) {<br>
+  %1 = xor i32 %y, %x<br>
+  %2 = or i32 %y, %x<br>
+  %3 = xor i32 %2, %1<br>
+  ret i32 %3<br>
+; CHECK-LABEL: @test15(<br>
+; CHECK-NEXT: %1 = and i32 %y, %x<br>
+; CHECK-NEXT: ret i32 %1<br></blockquote><div><br></div><div>I LGTM'd this differential under the understanding that you would clean up the variable names used: <a href="http://reviews.llvm.org/D4866#inline-40056">http://reviews.llvm.org/D4866#inline-40056</a></div>
<div><br></div><div>Please fix test15.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>