diff options
Diffstat (limited to 'test/Transforms/InstCombine/or-xor.ll')
-rw-r--r-- | test/Transforms/InstCombine/or-xor.ll | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/test/Transforms/InstCombine/or-xor.ll b/test/Transforms/InstCombine/or-xor.ll index cec36f1..670e3e0 100644 --- a/test/Transforms/InstCombine/or-xor.ll +++ b/test/Transforms/InstCombine/or-xor.ll @@ -92,3 +92,92 @@ define i32 @test9(i32 %x, i32 %y) nounwind { ; CHECK-NEXT: %z = or i32 %y.not, %x ; CHECK-NEXT: ret i32 %z } + +define i32 @test10(i32 %A, i32 %B) { + %xor1 = xor i32 %B, %A + %not = xor i32 %A, -1 + %xor2 = xor i32 %not, %B + %or = or i32 %xor1, %xor2 + ret i32 %or +; CHECK-LABEL: @test10( +; CHECK-NEXT: ret i32 -1 +} + +define i32 @test11(i32 %A, i32 %B) { + %xor1 = xor i32 %B, %A + %not = xor i32 %A, -1 + %xor2 = xor i32 %not, %B + %or = or i32 %xor1, %xor2 + ret i32 %or +; CHECK-LABEL: @test11( +; CHECK-NEXT: ret i32 -1 +} + +; (x | y) & ((~x) ^ y) -> (x & y) +define i32 @test12(i32 %x, i32 %y) { + %or = or i32 %x, %y + %neg = xor i32 %x, -1 + %xor = xor i32 %neg, %y + %and = and i32 %or, %xor + ret i32 %and +; CHECK-LABEL: @test12( +; CHECK-NEXT: %and = and i32 %x, %y +; CHECK-NEXT: ret i32 %and +} + +; ((~x) ^ y) & (x | y) -> (x & y) +define i32 @test13(i32 %x, i32 %y) { + %neg = xor i32 %x, -1 + %xor = xor i32 %neg, %y + %or = or i32 %x, %y + %and = and i32 %xor, %or + ret i32 %and +; CHECK-LABEL: @test13( +; CHECK-NEXT: %and = and i32 %x, %y +; CHECK-NEXT: ret i32 %and +} + +; ((x | y) ^ (x ^ y)) -> (x & y) +define i32 @test15(i32 %x, i32 %y) { + %1 = xor i32 %y, %x + %2 = or i32 %y, %x + %3 = xor i32 %2, %1 + ret i32 %3 +; CHECK-LABEL: @test15( +; CHECK-NEXT: %1 = and i32 %y, %x +; CHECK-NEXT: ret i32 %1 +} + +; ((x | ~y) ^ (~x | y)) -> x ^ y +define i32 @test16(i32 %x, i32 %y) { + %noty = xor i32 %y, -1 + %notx = xor i32 %x, -1 + %or1 = or i32 %x, %noty + %or2 = or i32 %notx, %y + %xor = xor i32 %or1, %or2 + ret i32 %xor +; CHECK-LABEL: @test16( +; CHECK-NEXT: %xor = xor i32 %x, %y +; CHECK-NEXT: ret i32 %xor +} + +; ((x & ~y) ^ (~x & y)) -> x ^ y +define i32 @test17(i32 %x, i32 %y) { + %noty = xor i32 %y, -1 + %notx = xor i32 %x, -1 + %and1 = and i32 %x, %noty + %and2 = and i32 %notx, %y + %xor = xor i32 %and1, %and2 + ret i32 %xor +; CHECK-LABEL: @test17( +; CHECK-NEXT: %xor = xor i32 %x, %y +; CHECK-NEXT: ret i32 %xor +} + +define i32 @test18(i32 %a, i32 %b) { + %or = xor i32 %a, %b + %and1 = and i32 %or, 1 + %and2 = and i32 %b, -2 + %xor = or i32 %and1, %and2 + ret i32 %xor +} |