From 1096080a5dfbe088c635b0be6ee53230b2f60491 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Fri, 7 Apr 2017 00:29:47 +0000 Subject: [PATCH] [InstCombine] Add more commuted patterns to support folding ((~A & B) | A) -> (A | B). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299737 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 7 ++++--- test/Transforms/InstCombine/or.ll | 14 ++++---------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 56928b3dea4..6b6e362a34c 100644 --- a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -2092,9 +2092,10 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) { } // ((~A & B) | A) -> (A | B) - if (match(Op0, m_And(m_Not(m_Value(A)), m_Value(B))) && - match(Op1, m_Specific(A))) - return BinaryOperator::CreateOr(A, B); + if (match(Op0, m_c_And(m_Not(m_Specific(Op1)), m_Value(A)))) + return BinaryOperator::CreateOr(A, Op1); + if (match(Op1, m_c_And(m_Not(m_Specific(Op0)), m_Value(A)))) + return BinaryOperator::CreateOr(Op0, A); // ((A & B) | ~A) -> (~A | B) if (match(Op0, m_And(m_Value(A), m_Value(B))) && diff --git a/test/Transforms/InstCombine/or.ll b/test/Transforms/InstCombine/or.ll index 8536cbb1aa1..a83ee242b3f 100644 --- a/test/Transforms/InstCombine/or.ll +++ b/test/Transforms/InstCombine/or.ll @@ -521,7 +521,7 @@ define <2 x i132> @orsext_to_sel_vec_swap(<2 x i132> %x, <2 x i1> %y) { define i32 @test39(i32 %a, i32 %b) { ; CHECK-LABEL: @test39( -; CHECK-NEXT: [[OR:%.*]] = or i32 %a, %b +; CHECK-NEXT: [[OR:%.*]] = or i32 %b, %a ; CHECK-NEXT: ret i32 [[OR]] ; %xor = xor i32 %a, -1 @@ -801,9 +801,7 @@ final: define i8 @test51(i8 %a, i8 %b, i8 %c) { ; CHECK-LABEL: @test51( ; CHECK-NEXT: [[W:%.*]] = mul i8 [[B:%.*]], [[C:%.*]] -; CHECK-NEXT: [[Z:%.*]] = xor i8 [[A:%.*]], -1 -; CHECK-NEXT: [[Y:%.*]] = and i8 [[W]], [[Z]] -; CHECK-NEXT: [[X:%.*]] = or i8 [[Y]], [[A]] +; CHECK-NEXT: [[X:%.*]] = or i8 [[W]], [[A:%.*]] ; CHECK-NEXT: ret i8 [[X]] ; %w = mul i8 %b, %c @@ -816,9 +814,7 @@ define i8 @test51(i8 %a, i8 %b, i8 %c) { define i8 @test52(i8 %a, i8 %b, i8 %c) { ; CHECK-LABEL: @test52( ; CHECK-NEXT: [[W:%.*]] = mul i8 [[B:%.*]], [[C:%.*]] -; CHECK-NEXT: [[Z:%.*]] = xor i8 [[W]], -1 -; CHECK-NEXT: [[Y:%.*]] = and i8 [[Z]], [[A:%.*]] -; CHECK-NEXT: [[X:%.*]] = or i8 [[W]], [[Y]] +; CHECK-NEXT: [[X:%.*]] = or i8 [[W]], [[A:%.*]] ; CHECK-NEXT: ret i8 [[X]] ; %w = mul i8 %b, %c @@ -831,9 +827,7 @@ define i8 @test52(i8 %a, i8 %b, i8 %c) { define i8 @test53(i8 %a, i8 %b, i8 %c) { ; CHECK-LABEL: @test53( ; CHECK-NEXT: [[W:%.*]] = mul i8 [[B:%.*]], [[C:%.*]] -; CHECK-NEXT: [[Z:%.*]] = xor i8 [[W]], -1 -; CHECK-NEXT: [[Y:%.*]] = and i8 [[Z]], [[A:%.*]] -; CHECK-NEXT: [[X:%.*]] = or i8 [[W]], [[Y]] +; CHECK-NEXT: [[X:%.*]] = or i8 [[W]], [[A:%.*]] ; CHECK-NEXT: ret i8 [[X]] ; %w = mul i8 %b, %c -- 2.40.0