From 5e370cb311db2fcff8c95844bbe9d20920492a02 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Tue, 12 Jul 2016 17:05:04 +0000 Subject: [PATCH] add tests for missing DeMorgan's Law folds git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275192 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/InstCombine/demorgan-zext.ll | 55 ++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/test/Transforms/InstCombine/demorgan-zext.ll b/test/Transforms/InstCombine/demorgan-zext.ll index f57bd03a0fc..045c15c05d6 100644 --- a/test/Transforms/InstCombine/demorgan-zext.ll +++ b/test/Transforms/InstCombine/demorgan-zext.ll @@ -33,3 +33,58 @@ define i32 @demorgan_and(i1 %X, i1 %Y) { ret i32 %and } +; FIXME: Vectors should get the same transform. + +define <2 x i32> @demorgan_or_vec(<2 x i1> %X, <2 x i1> %Y) { +; CHECK-LABEL: @demorgan_or_vec( +; CHECK-NEXT: [[ZEXTX:%.*]] = zext <2 x i1> %X to <2 x i32> +; CHECK-NEXT: [[ZEXTY:%.*]] = zext <2 x i1> %Y to <2 x i32> +; CHECK-NEXT: [[NOTX:%.*]] = xor <2 x i32> [[ZEXTX]], +; CHECK-NEXT: [[NOTY:%.*]] = xor <2 x i32> [[ZEXTY]], +; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[NOTX]], [[NOTY]] +; CHECK-NEXT: ret <2 x i32> [[OR]] +; + %zextX = zext <2 x i1> %X to <2 x i32> + %zextY = zext <2 x i1> %Y to <2 x i32> + %notX = xor <2 x i32> %zextX, + %notY = xor <2 x i32> %zextY, + %or = or <2 x i32> %notX, %notY + ret <2 x i32> %or +} + +define <2 x i32> @demorgan_and_vec(<2 x i1> %X, <2 x i1> %Y) { +; CHECK-LABEL: @demorgan_and_vec( +; CHECK-NEXT: [[ZEXTX:%.*]] = zext <2 x i1> %X to <2 x i32> +; CHECK-NEXT: [[ZEXTY:%.*]] = zext <2 x i1> %Y to <2 x i32> +; CHECK-NEXT: [[NOTX:%.*]] = xor <2 x i32> [[ZEXTX]], +; CHECK-NEXT: [[NOTY:%.*]] = xor <2 x i32> [[ZEXTY]], +; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[NOTX]], [[NOTY]] +; CHECK-NEXT: ret <2 x i32> [[AND]] +; + %zextX = zext <2 x i1> %X to <2 x i32> + %zextY = zext <2 x i1> %Y to <2 x i32> + %notX = xor <2 x i32> %zextX, + %notY = xor <2 x i32> %zextY, + %and = and <2 x i32> %notX, %notY + ret <2 x i32> %and +} + +; FIXME: If the xor was canonicalized to a 'not', then this would simplify. + +define i32 @PR28476(i32 %x, i32 %y) { +; CHECK-LABEL: @PR28476( +; CHECK-NEXT: [[CMP0:%.*]] = icmp ne i32 %x, 0 +; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 %y, 0 +; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP0]], [[CMP1]] +; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[AND]] to i32 +; CHECK-NEXT: [[COND:%.*]] = xor i32 [[ZEXT]], 1 +; CHECK-NEXT: ret i32 [[COND]] +; + %cmp0 = icmp ne i32 %x, 0 + %cmp1 = icmp ne i32 %y, 0 + %and = and i1 %cmp0, %cmp1 + %zext = zext i1 %and to i32 + %cond = xor i32 %zext, 1 + ret i32 %cond +} + -- 2.50.0