[llvm] 9e885d9 - [InstSimplify] Add tests for (~A & B) | ~(A | B) --> ~A with logical And. NFC

David Green via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 7 01:04:11 PST 2022


Author: David Green
Date: 2022-11-07T09:04:06Z
New Revision: 9e885d9aaba140a583f3bd2f38db73c123b60ef9

URL: https://github.com/llvm/llvm-project/commit/9e885d9aaba140a583f3bd2f38db73c123b60ef9
DIFF: https://github.com/llvm/llvm-project/commit/9e885d9aaba140a583f3bd2f38db73c123b60ef9.diff

LOG: [InstSimplify] Add tests for (~A & B) | ~(A | B) --> ~A with logical And. NFC

Added: 
    

Modified: 
    llvm/test/Transforms/InstCombine/or.ll
    llvm/test/Transforms/InstSimplify/or.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/or.ll b/llvm/test/Transforms/InstCombine/or.ll
index 38409394654f4..fa10eefb87987 100644
--- a/llvm/test/Transforms/InstCombine/or.ll
+++ b/llvm/test/Transforms/InstCombine/or.ll
@@ -1561,3 +1561,24 @@ define i32 @mul_common_bits(i32 %p) {
   %r = or i32 %m, %x
   ret i32 %r
 }
+
+define <4 x i1> @and_or_not_or_logical_vec(<4 x i32> %ap, <4 x i32> %bp) {
+; CHECK-LABEL: @and_or_not_or_logical_vec(
+; CHECK-NEXT:    [[A:%.*]] = icmp eq <4 x i32> [[AP:%.*]], zeroinitializer
+; CHECK-NEXT:    [[B:%.*]] = icmp eq <4 x i32> [[BP:%.*]], zeroinitializer
+; CHECK-NEXT:    [[V:%.*]] = xor <4 x i1> [[A]], <i1 true, i1 true, i1 true, i1 true>
+; CHECK-NEXT:    [[X:%.*]] = select <4 x i1> [[B]], <4 x i1> [[V]], <4 x i1> zeroinitializer
+; CHECK-NEXT:    [[W:%.*]] = or <4 x i1> [[B]], [[A]]
+; CHECK-NEXT:    [[Y:%.*]] = xor <4 x i1> [[W]], <i1 true, i1 true, i1 true, i1 true>
+; CHECK-NEXT:    [[Z:%.*]] = or <4 x i1> [[X]], [[Y]]
+; CHECK-NEXT:    ret <4 x i1> [[Z]]
+;
+  %A = icmp eq <4 x i32> %ap, zeroinitializer
+  %B = icmp eq <4 x i32> %bp, zeroinitializer
+  %V = xor <4 x i1> %A, <i1 true, i1 true, i1 true, i1 true>
+  %X = select <4 x i1> %B, <4 x i1> %V, <4 x i1> zeroinitializer
+  %W = or <4 x i1> %B, %A
+  %Y = xor <4 x i1> %W, <i1 true, i1 true, i1 true, i1 true>
+  %Z = or <4 x i1> %X, %Y
+  ret <4 x i1> %Z
+}

diff  --git a/llvm/test/Transforms/InstSimplify/or.ll b/llvm/test/Transforms/InstSimplify/or.ll
index a279cab582d93..ddfa85cc4b642 100644
--- a/llvm/test/Transforms/InstSimplify/or.ll
+++ b/llvm/test/Transforms/InstSimplify/or.ll
@@ -454,6 +454,60 @@ define <2 x i4> @and_or_not_or_commute7(<2 x i4> %A, <2 x i4> %B) {
   ret <2 x i4> %r
 }
 
+; (~A & B) | ~(A | B) --> ~A with logical and
+define i1 @and_or_not_or_logical(i1 %A, i1 %B) {
+; CHECK-LABEL: @and_or_not_or_logical(
+; CHECK-NEXT:    [[V:%.*]] = xor i1 [[A:%.*]], true
+; CHECK-NEXT:    [[X:%.*]] = select i1 [[V]], i1 [[B:%.*]], i1 false
+; CHECK-NEXT:    [[W:%.*]] = or i1 [[B]], [[A]]
+; CHECK-NEXT:    [[Y:%.*]] = xor i1 [[W]], true
+; CHECK-NEXT:    [[Z:%.*]] = or i1 [[X]], [[Y]]
+; CHECK-NEXT:    ret i1 [[Z]]
+;
+  %V = xor i1 %A, true
+  %X = select i1 %V, i1 %B, i1 false
+  %W = or i1 %B, %A
+  %Y = xor i1 %W, true
+  %Z = or i1 %X, %Y
+  ret i1 %Z
+}
+
+; (~B & A) | ~(A | B) --> ~A with logical and
+define i1 @and_or_not_or_logical_rev(i1 %A, i1 %B) {
+; CHECK-LABEL: @and_or_not_or_logical_rev(
+; CHECK-NEXT:    [[V:%.*]] = xor i1 [[A:%.*]], true
+; CHECK-NEXT:    [[X:%.*]] = select i1 [[B:%.*]], i1 [[V]], i1 false
+; CHECK-NEXT:    [[W:%.*]] = or i1 [[B]], [[A]]
+; CHECK-NEXT:    [[Y:%.*]] = xor i1 [[W]], true
+; CHECK-NEXT:    [[Z:%.*]] = or i1 [[X]], [[Y]]
+; CHECK-NEXT:    ret i1 [[Z]]
+;
+  %V = xor i1 %A, true
+  %X = select i1 %B, i1 %V, i1 false
+  %W = or i1 %B, %A
+  %Y = xor i1 %W, true
+  %Z = or i1 %X, %Y
+  ret i1 %Z
+}
+
+; (~A & B) | ~(A | B) --> ~A with logical And and logical Or
+define i1 @and_or_not_logical_or_logical_rev(i1 %A, i1 %B) {
+; CHECK-LABEL: @and_or_not_logical_or_logical_rev(
+; CHECK-NEXT:    [[V:%.*]] = xor i1 [[A:%.*]], true
+; CHECK-NEXT:    [[X:%.*]] = select i1 [[B:%.*]], i1 [[V]], i1 false
+; CHECK-NEXT:    [[W:%.*]] = select i1 [[B]], i1 true, i1 [[A]]
+; CHECK-NEXT:    [[Y:%.*]] = xor i1 [[W]], true
+; CHECK-NEXT:    [[Z:%.*]] = or i1 [[X]], [[Y]]
+; CHECK-NEXT:    ret i1 [[Z]]
+;
+  %V = xor i1 %A, true
+  %X = select i1 %B, i1 %V, i1 false
+  %W = select i1 %B, i1 true, i1 %A
+  %Y = xor i1 %W, true
+  %Z = or i1 %X, %Y
+  ret i1 %Z
+}
+
 ; negative test - It is not safe to propagate an undef element from the 'not' op.
 
 define <2 x i4> @and_or_not_or_commute7_undef_elt(<2 x i4> %A, <2 x i4> %B) {


        


More information about the llvm-commits mailing list