diff options
Diffstat (limited to 'llvm/test/Transforms/InstSimplify/AndOrXor.ll')
| -rw-r--r-- | llvm/test/Transforms/InstSimplify/AndOrXor.ll | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstSimplify/AndOrXor.ll b/llvm/test/Transforms/InstSimplify/AndOrXor.ll index 5292732842b..c5108217056 100644 --- a/llvm/test/Transforms/InstSimplify/AndOrXor.ll +++ b/llvm/test/Transforms/InstSimplify/AndOrXor.ll @@ -521,3 +521,65 @@ define i32 @test44_commuted_and(i32 %a, i32 %b) { ret i32 %or } +; (~A & ~B) | (~A ^ B) -> ~A ^ B + +define i32 @test45(i32 %a, i32 %b) { +; CHECK-LABEL: @test45( +; CHECK-NEXT: [[NEGB:%.*]] = xor i32 [[B:%.*]], -1 +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A:%.*]], [[NEGB]] +; CHECK-NEXT: ret i32 [[XOR]] +; + %nega = xor i32 %a, -1 + %negb = xor i32 %b, -1 + %and = and i32 %nega, %negb + %xor = xor i32 %a, %negb + %or = or i32 %and, %xor + ret i32 %or +} + +define i32 @test45_commuted_and(i32 %a, i32 %b) { +; CHECK-LABEL: @test45( +; CHECK-NEXT: [[NEGB:%.*]] = xor i32 [[B:%.*]], -1 +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A:%.*]], [[NEGB]] +; CHECK-NEXT: ret i32 [[XOR]] +; + %nega = xor i32 %a, -1 + %negb = xor i32 %b, -1 + %and = and i32 %negb, %nega + %xor = xor i32 %a, %negb + %or = or i32 %and, %xor + ret i32 %or +} + +; Commute operands of the 'or'. +; (~A ^ B) | (~A & ~B) -> ~A ^ B + +define i32 @test46(i32 %a, i32 %b) { +; CHECK-LABEL: @test46( +; CHECK-NEXT: [[NEGB:%.*]] = xor i32 [[B:%.*]], -1 +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A:%.*]], [[NEGB]] +; CHECK-NEXT: ret i32 [[XOR]] +; + %nega = xor i32 %a, -1 + %negb = xor i32 %b, -1 + %and = and i32 %nega, %negb + %xor = xor i32 %a, %negb + %or = or i32 %xor, %and + ret i32 %or +} + +; (~A & ~B) | (~A ^ B) -> ~A ^ B + +define i32 @test46_commuted_and(i32 %a, i32 %b) { +; CHECK-LABEL: @test45( +; CHECK-NEXT: [[NEGB:%.*]] = xor i32 [[B:%.*]], -1 +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A:%.*]], [[NEGB]] +; CHECK-NEXT: ret i32 [[XOR]] +; + %nega = xor i32 %a, -1 + %negb = xor i32 %b, -1 + %and = and i32 %negb, %nega + %xor = xor i32 %a, %negb + %or = or i32 %xor, %and + ret i32 %or +} |

