summaryrefslogtreecommitdiff
path: root/test/Transforms/InstSimplify
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-05-22 19:43:28 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-05-22 19:43:28 +0000
commitb5630dbadf9a2a06754194387d6b0fd9962a67f1 (patch)
tree3fe1e2bc0dc2823ab21f06959fbb3eaca317ea29 /test/Transforms/InstSimplify
parent7af96fb3afd6725a2824a0a5ca5dad34e5e0b056 (diff)
Diffstat (limited to 'test/Transforms/InstSimplify')
-rw-r--r--test/Transforms/InstSimplify/AndOrXor.ll76
-rw-r--r--test/Transforms/InstSimplify/icmp-bool-constant.ll171
2 files changed, 247 insertions, 0 deletions
diff --git a/test/Transforms/InstSimplify/AndOrXor.ll b/test/Transforms/InstSimplify/AndOrXor.ll
index a9b4e4e5cfcc..a027c7e18280 100644
--- a/test/Transforms/InstSimplify/AndOrXor.ll
+++ b/test/Transforms/InstSimplify/AndOrXor.ll
@@ -735,6 +735,74 @@ define i32 @test54(i32 %a, i32 %b) {
ret i32 %or
}
+; (A & B) | ~(A ^ B) -> ~(A ^ B)
+
+define i32 @test55(i32 %a, i32 %b) {
+; CHECK-LABEL: @test55(
+; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A]], [[B]]
+; CHECK-NEXT: [[XNOR:%.*]] = xor i32 [[XOR]], -1
+; CHECK-NEXT: [[OR:%.*]] = or i32 [[AND]], [[XNOR]]
+; CHECK-NEXT: ret i32 [[OR]]
+;
+ %and = and i32 %a, %b
+ %xor = xor i32 %a, %b
+ %xnor = xor i32 %xor, -1
+ %or = or i32 %and, %xnor
+ ret i32 %or
+}
+
+; ~(A ^ B) | (A & B) -> ~(A ^ B)
+
+define i32 @test56(i32 %a, i32 %b) {
+; CHECK-LABEL: @test56(
+; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A]], [[B]]
+; CHECK-NEXT: [[XNOR:%.*]] = xor i32 [[XOR]], -1
+; CHECK-NEXT: [[OR:%.*]] = or i32 [[XNOR]], [[AND]]
+; CHECK-NEXT: ret i32 [[OR]]
+;
+ %and = and i32 %a, %b
+ %xor = xor i32 %a, %b
+ %xnor = xor i32 %xor, -1
+ %or = or i32 %xnor, %and
+ ret i32 %or
+}
+
+; (B & A) | ~(A ^ B) -> ~(A ^ B)
+
+define i32 @test57(i32 %a, i32 %b) {
+; CHECK-LABEL: @test57(
+; CHECK-NEXT: [[AND:%.*]] = and i32 [[B:%.*]], [[A:%.*]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A]], [[B]]
+; CHECK-NEXT: [[XNOR:%.*]] = xor i32 [[XOR]], -1
+; CHECK-NEXT: [[OR:%.*]] = or i32 [[AND]], [[XNOR]]
+; CHECK-NEXT: ret i32 [[OR]]
+;
+ %and = and i32 %b, %a
+ %xor = xor i32 %a, %b
+ %xnor = xor i32 %xor, -1
+ %or = or i32 %and, %xnor
+ ret i32 %or
+}
+
+; ~(A ^ B) | (A & B) -> ~(A ^ B)
+
+define i32 @test58(i32 %a, i32 %b) {
+; CHECK-LABEL: @test58(
+; CHECK-NEXT: [[AND:%.*]] = and i32 [[B:%.*]], [[A:%.*]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A]], [[B]]
+; CHECK-NEXT: [[XNOR:%.*]] = xor i32 [[XOR]], -1
+; CHECK-NEXT: [[OR:%.*]] = or i32 [[XNOR]], [[AND]]
+; CHECK-NEXT: ret i32 [[OR]]
+;
+ %and = and i32 %b, %a
+ %xor = xor i32 %a, %b
+ %xnor = xor i32 %xor, -1
+ %or = or i32 %xnor, %and
+ ret i32 %or
+}
+
define i8 @lshr_perfect_mask(i8 %x) {
; CHECK-LABEL: @lshr_perfect_mask(
; CHECK-NEXT: [[SH:%.*]] = lshr i8 %x, 5
@@ -797,3 +865,11 @@ define <2 x i8> @shl_undersized_mask_splat(<2 x i8> %x) {
ret <2 x i8> %mask
}
+define i32 @reversed_not(i32 %a) {
+; CHECK-LABEL: @reversed_not(
+; CHECK-NEXT: ret i32 -1
+;
+ %nega = xor i32 -1, %a
+ %or = or i32 %a, %nega
+ ret i32 %or
+}
diff --git a/test/Transforms/InstSimplify/icmp-bool-constant.ll b/test/Transforms/InstSimplify/icmp-bool-constant.ll
new file mode 100644
index 000000000000..f711fae0a857
--- /dev/null
+++ b/test/Transforms/InstSimplify/icmp-bool-constant.ll
@@ -0,0 +1,171 @@
+; RUN: opt < %s -instsimplify -S | FileCheck %s
+
+; Test all integer predicates with bool types and true/false constants.
+; Use vectors to provide test coverage that is not duplicated in other folds.
+
+define <2 x i1> @eq_t(<2 x i1> %a) {
+; CHECK-LABEL: @eq_t(
+; CHECK-NEXT: ret <2 x i1> %a
+;
+ %r = icmp eq <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @eq_f(<2 x i1> %a) {
+; CHECK-LABEL: @eq_f(
+; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i1> %a, zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[R]]
+;
+ %r = icmp eq <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ne_t(<2 x i1> %a) {
+; CHECK-LABEL: @ne_t(
+; CHECK-NEXT: [[R:%.*]] = icmp ne <2 x i1> %a, <i1 true, i1 true>
+; CHECK-NEXT: ret <2 x i1> [[R]]
+;
+ %r = icmp ne <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ne_f(<2 x i1> %a) {
+; CHECK-LABEL: @ne_f(
+; CHECK-NEXT: ret <2 x i1> %a
+;
+ %r = icmp ne <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ugt_t(<2 x i1> %a) {
+; CHECK-LABEL: @ugt_t(
+; CHECK-NEXT: ret <2 x i1> zeroinitializer
+;
+ %r = icmp ugt <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ugt_f(<2 x i1> %a) {
+; CHECK-LABEL: @ugt_f(
+; CHECK-NEXT: ret <2 x i1> %a
+;
+ %r = icmp ugt <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ult_t(<2 x i1> %a) {
+; CHECK-LABEL: @ult_t(
+; CHECK-NEXT: [[R:%.*]] = icmp ult <2 x i1> %a, <i1 true, i1 true>
+; CHECK-NEXT: ret <2 x i1> [[R]]
+;
+ %r = icmp ult <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ult_f(<2 x i1> %a) {
+; CHECK-LABEL: @ult_f(
+; CHECK-NEXT: ret <2 x i1> zeroinitializer
+;
+ %r = icmp ult <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @sgt_t(<2 x i1> %a) {
+; CHECK-LABEL: @sgt_t(
+; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i1> %a, <i1 true, i1 true>
+; CHECK-NEXT: ret <2 x i1> [[R]]
+;
+ %r = icmp sgt <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @sgt_f(<2 x i1> %a) {
+; CHECK-LABEL: @sgt_f(
+; CHECK-NEXT: ret <2 x i1> zeroinitializer
+;
+ %r = icmp sgt <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @slt_t(<2 x i1> %a) {
+; CHECK-LABEL: @slt_t(
+; CHECK-NEXT: ret <2 x i1> zeroinitializer
+;
+ %r = icmp slt <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @slt_f(<2 x i1> %a) {
+; CHECK-LABEL: @slt_f(
+; CHECK-NEXT: ret <2 x i1> %a
+;
+ %r = icmp slt <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @uge_t(<2 x i1> %a) {
+; CHECK-LABEL: @uge_t(
+; CHECK-NEXT: ret <2 x i1> %a
+;
+ %r = icmp uge <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @uge_f(<2 x i1> %a) {
+; CHECK-LABEL: @uge_f(
+; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
+;
+ %r = icmp uge <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ule_t(<2 x i1> %a) {
+; CHECK-LABEL: @ule_t(
+; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
+;
+ %r = icmp ule <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @ule_f(<2 x i1> %a) {
+; CHECK-LABEL: @ule_f(
+; CHECK-NEXT: [[R:%.*]] = icmp ule <2 x i1> %a, zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[R]]
+;
+ %r = icmp ule <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @sge_t(<2 x i1> %a) {
+; CHECK-LABEL: @sge_t(
+; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
+;
+ %r = icmp sge <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @sge_f(<2 x i1> %a) {
+; CHECK-LABEL: @sge_f(
+; CHECK-NEXT: [[R:%.*]] = icmp sge <2 x i1> %a, zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[R]]
+;
+ %r = icmp sge <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @sle_t(<2 x i1> %a) {
+; CHECK-LABEL: @sle_t(
+; CHECK-NEXT: ret <2 x i1> %a
+;
+ %r = icmp sle <2 x i1> %a, <i1 true, i1 true>
+ ret <2 x i1> %r
+}
+
+define <2 x i1> @sle_f(<2 x i1> %a) {
+; CHECK-LABEL: @sle_f(
+; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
+;
+ %r = icmp sle <2 x i1> %a, <i1 false, i1 false>
+ ret <2 x i1> %r
+}
+