diff options
-rw-r--r-- | llvm/test/Transforms/InstCombine/and-not-or.ll | 34 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/and.ll | 48 |
2 files changed, 48 insertions, 34 deletions
diff --git a/llvm/test/Transforms/InstCombine/and-not-or.ll b/llvm/test/Transforms/InstCombine/and-not-or.ll deleted file mode 100644 index a42140be280..00000000000 --- a/llvm/test/Transforms/InstCombine/and-not-or.ll +++ /dev/null @@ -1,34 +0,0 @@ -; RUN: opt < %s -instcombine -S | grep "and i32 %x, %y" | count 4 -; RUN: opt < %s -instcombine -S | not grep "or" - -define i32 @func1(i32 %x, i32 %y) nounwind { -entry: - %n = xor i32 %y, -1 - %o = or i32 %n, %x - %a = and i32 %o, %y - ret i32 %a -} - -define i32 @func2(i32 %x, i32 %y) nounwind { -entry: - %n = xor i32 %y, -1 - %o = or i32 %x, %n - %a = and i32 %o, %y - ret i32 %a -} - -define i32 @func3(i32 %x, i32 %y) nounwind { -entry: - %n = xor i32 %y, -1 - %o = or i32 %n, %x - %a = and i32 %y, %o - ret i32 %a -} - -define i32 @func4(i32 %x, i32 %y) nounwind { -entry: - %n = xor i32 %y, -1 - %o = or i32 %x, %n - %a = and i32 %y, %o - ret i32 %a -} diff --git a/llvm/test/Transforms/InstCombine/and.ll b/llvm/test/Transforms/InstCombine/and.ll index 7bb9b95b317..61d03b9ddb6 100644 --- a/llvm/test/Transforms/InstCombine/and.ll +++ b/llvm/test/Transforms/InstCombine/and.ll @@ -628,3 +628,51 @@ define i32 @test43(i32 %a, i32 %c, i32 %d) { %and = and i32 %or, %xor ret i32 %and } + +; (~y | x) & y -> x & y +define i32 @test44(i32 %x, i32 %y) nounwind { +; CHECK-LABEL: @test44( +; CHECK-NEXT: [[A:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: ret i32 [[A]] +; + %n = xor i32 %y, -1 + %o = or i32 %n, %x + %a = and i32 %o, %y + ret i32 %a +} + +; (x | ~y) & y -> x & y +define i32 @test45(i32 %x, i32 %y) nounwind { +; CHECK-LABEL: @test45( +; CHECK-NEXT: [[A:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: ret i32 [[A]] +; + %n = xor i32 %y, -1 + %o = or i32 %x, %n + %a = and i32 %o, %y + ret i32 %a +} + +; y & (~y | x) -> y | x +define i32 @test46(i32 %x, i32 %y) nounwind { +; CHECK-LABEL: @test46( +; CHECK-NEXT: [[A:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: ret i32 [[A]] +; + %n = xor i32 %y, -1 + %o = or i32 %n, %x + %a = and i32 %y, %o + ret i32 %a +} + +; y & (x | ~y) -> y | x +define i32 @test47(i32 %x, i32 %y) nounwind { +; CHECK-LABEL: @test47( +; CHECK-NEXT: [[A:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: ret i32 [[A]] +; + %n = xor i32 %y, -1 + %o = or i32 %x, %n + %a = and i32 %y, %o + ret i32 %a +} |