add tests for De Morgan instcombines based on PR22723
authorSanjay Patel <spatel@rotateright.com>
Tue, 8 Sep 2015 18:13:03 +0000 (18:13 +0000)
committerSanjay Patel <spatel@rotateright.com>
Tue, 8 Sep 2015 18:13:03 +0000 (18:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247040 91177308-0d34-0410-b5e6-96231b3b80d8

test/Transforms/InstCombine/demorgan-zext.ll [new file with mode: 0644]

diff --git a/test/Transforms/InstCombine/demorgan-zext.ll b/test/Transforms/InstCombine/demorgan-zext.ll
new file mode 100644 (file)
index 0000000..0587ca7
--- /dev/null
@@ -0,0 +1,38 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+; PR22723: Recognize De Morgan's Laws when obfuscated by zexts.
+
+define i32 @demorgan_or(i1 %X, i1 %Y) {
+  %zextX = zext i1 %X to i32
+  %zextY = zext i1 %Y to i32
+  %notX  = xor i32 %zextX, 1
+  %notY  = xor i32 %zextY, 1
+  %or    = or i32 %notX, %notY
+  ret i32 %or
+
+; CHECK-LABEL: demorgan_or(
+; CHECK-NEXT:  = zext
+; CHECK-NEXT:  = zext
+; CHECK-NEXT:  = xor
+; CHECK-NEXT:  = xor
+; CHECK-NEXT:  = or
+; CHECK-NEXT:  ret
+}
+
+define i32 @demorgan_and(i1 %X, i1 %Y) {
+  %zextX = zext i1 %X to i32
+  %zextY = zext i1 %Y to i32
+  %notX  = xor i32 %zextX, 1
+  %notY  = xor i32 %zextY, 1
+  %and   = and i32 %notX, %notY
+  ret i32 %and
+
+; CHECK-LABEL: demorgan_and(
+; CHECK-NEXT:  = zext
+; CHECK-NEXT:  = zext
+; CHECK-NEXT:  = xor
+; CHECK-NEXT:  = xor
+; CHECK-NEXT:  = and
+; CHECK-NEXT:  ret
+}
+