[PATCH] D86395: InstCombine transform pattern "(~A & B) ^ A -> (A | B)" added

Jaydeep Chauhan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 24 12:22:11 PDT 2020


Jac1494 updated this revision to Diff 287465.
Jac1494 added a comment.

Added more test cases.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D86395/new/

https://reviews.llvm.org/D86395

Files:
  llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
  llvm/test/Transforms/InstCombine/xor-or.ll


Index: llvm/test/Transforms/InstCombine/xor-or.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InstCombine/xor-or.ll
@@ -0,0 +1,66 @@
+; RUN: opt -S -instcombine < %s | FileCheck %s
+
+; (~A & B) ^ A  -->   (A | B)
+define i32 @test1(i32 %0, i32 %1) {
+; CHECK-LABEL: @test1(
+; CHECK-NEXT: %3 = or i32 %0, %1
+; CHECK-NEXT: ret i32 %3
+  %3 = xor i32 %0, -1
+  %4 = and i32 %3, %1
+  %5 = xor i32 %4, %0
+  ret i32 %5
+}
+
+; A ^ (~A & B)  -->   (A | B)
+define i32 @test2(i32 %0, i32 %1) {
+; CHECK-LABEL: @test2(
+; CHECK-NEXT: %3 = or i32 %0, %1
+; CHECK-NEXT: ret i32 %3
+  %3 = xor i32 %0, -1
+  %4 = and i32 %3, %1
+  %5 = xor i32 %4, %0
+  ret i32 %5
+}
+
+; (~B & A) ^ B  -->   (B | A)
+define i32 @test3(i32 %0, i32 %1) {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: %3 = or i32 %1, %0
+; CHECK-NEXT: ret i32 %3
+  %3 = xor i32 %1, -1
+  %4 = and i32 %3, %0
+  %5 = xor i32 %4, %1
+  ret i32 %5
+}
+
+; B ^ (~B & A)  -->   (B | A)
+define i32 @test4(i32 %0, i32 %1) {
+; CHECK-LABEL: @test4(
+; CHECK-NEXT: %3 = or i32 %1, %0
+; CHECK-NEXT: ret i32 %3
+  %3 = xor i32 %1, -1
+  %4 = and i32 %3, %0
+  %5 = xor i32 %4, %1
+  ret i32 %5
+}
+
+
+define i32 @test5(i32 %0, i32 %1) {
+; CHECK-LABEL: @test5(
+; CHECK-NEXT: %3 = or i32 %0, %1
+; CHECK-NEXT: ret i32 %3
+%3 = xor i32 %0, -1
+%4 = and i32 %1, %3
+%5 = xor i32 %4, %0
+ret i32 %5
+}
+
+define i32 @test6(i32 %0, i32 %1) {
+; CHECK-LABEL: @test6(
+; CHECK-NEXT: %3 = or i32 %0, %1
+; CHECK-NEXT: ret i32 %3
+%3 = xor i32 %0, -1
+%4 = and i32 %3, %1
+%5 = xor i32 %0, %4
+ret i32 %5
+}
Index: llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -3353,6 +3353,11 @@
       match(Op1, m_Not(m_Specific(A))))
     return BinaryOperator::CreateNot(Builder.CreateAnd(A, B));
 
+  // (~A & B) ^ A  -->   (A | B)
+  if (match(Op0, m_c_And(m_Not(m_Value(A)), m_Value(B))) &&
+      match(Op1, m_Specific(A)))
+    return BinaryOperator::CreateOr(A, B);
+
   // (A | B) ^ (A | C) --> (B ^ C) & ~A -- There are 4 commuted variants.
   // TODO: Loosen one-use restriction if common operand is a constant.
   Value *D;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86395.287465.patch
Type: text/x-patch
Size: 2324 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200824/c88131a4/attachment.bin>


More information about the llvm-commits mailing list