From 578c74e35da692fe0435491e1acb245f37bf6930 Mon Sep 17 00:00:00 2001 From: Suyog Sarda Date: Tue, 22 Jul 2014 15:37:39 +0000 Subject: [PATCH] This patch implements transform for pattern "(A | B) ^ (~A) -> (A | ~B)". Patch Credit to Ankit Jain !! Differential Revision: http://reviews.llvm.org/D4588 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213662 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 6 ++++++ test/Transforms/InstCombine/xor2.ll | 23 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index b23a606e088..431f7323511 100644 --- a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -2446,6 +2446,12 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { } } + // (A | B)^(~A) -> (A | ~B) + Value *A = nullptr, *B = nullptr; + if (match(Op0, m_Or(m_Value(A), m_Value(B))) && + match(Op1, m_Not(m_Specific(A)))) + return BinaryOperator::CreateOr(A, Builder->CreateNot(B)); + // (icmp1 A, B) ^ (icmp2 A, B) --> (icmp3 A, B) if (ICmpInst *RHS = dyn_cast(I.getOperand(1))) if (ICmpInst *LHS = dyn_cast(I.getOperand(0))) diff --git a/test/Transforms/InstCombine/xor2.ll b/test/Transforms/InstCombine/xor2.ll index d153e035c89..e7b1b1bbda8 100644 --- a/test/Transforms/InstCombine/xor2.ll +++ b/test/Transforms/InstCombine/xor2.ll @@ -82,3 +82,26 @@ define i32 @test6(i32 %x) { ; CHECK: lshr i32 %x, 16 ; CHECK: ret } + + +; (A | B) ^ (~A) -> (A | ~B) +define i32 @test7(i32 %a, i32 %b) #0 { + %or = or i32 %a, %b + %neg = xor i32 %a, -1 + %xor = xor i32 %or, %neg + ret i32 %xor +; CHECK-LABEL: @test7( +; CHECK-NEXT: %1 = xor i32 %b, -1 +; CHECK-NEXT: %xor = or i32 %a, %1 +} + +; (~A) ^ (A | B) -> (A | ~B) +define i32 @test8(i32 %a, i32 %b) #0 { + %neg = xor i32 %a, -1 + %or = or i32 %a, %b + %xor = xor i32 %neg, %or + ret i32 %xor +; CHECK-LABEL: @test8( +; CHECK-NEXT: %1 = xor i32 %b, -1 +; CHECK-NEXT: %xor = or i32 %a, %1 +} -- 2.11.0