diff --git a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll index edfa19c2d564f..7054ff8222317 100644 --- a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll +++ b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll @@ -128,3 +128,63 @@ define <2 x i1> @xor_or3(<2 x i1> %c, <2 x i32> %X, <2 x i32> %Y) { %res = xor <2 x i1> %sel, ret <2 x i1> %res } + +define i1 @and_orn_cmp_1_logical(i32 %a, i32 %b, i1 %y) { +; CHECK-LABEL: @and_orn_cmp_1_logical( +; CHECK-NEXT: [[X:%.*]] = icmp sgt i32 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[X_INV:%.*]] = icmp sle i32 [[A]], [[B]] +; CHECK-NEXT: [[OR:%.*]] = select i1 [[Y:%.*]], i1 true, i1 [[X_INV]] +; CHECK-NEXT: [[AND:%.*]] = select i1 [[X]], i1 [[OR]], i1 false +; CHECK-NEXT: ret i1 [[AND]] +; + %x = icmp sgt i32 %a, %b + %x_inv = icmp sle i32 %a, %b + %or = select i1 %y, i1 true, i1 %x_inv + %and = select i1 %x, i1 %or, i1 false + ret i1 %and +} + +define i1 @andn_or_cmp_2_logical(i16 %a, i16 %b, i1 %y) { +; CHECK-LABEL: @andn_or_cmp_2_logical( +; CHECK-NEXT: [[X:%.*]] = icmp sge i16 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A]], [[B]] +; CHECK-NEXT: [[OR:%.*]] = select i1 [[Y:%.*]], i1 true, i1 [[X]] +; CHECK-NEXT: [[AND:%.*]] = select i1 [[OR]], i1 [[X_INV]], i1 false +; CHECK-NEXT: ret i1 [[AND]] +; + %x = icmp sge i16 %a, %b + %x_inv = icmp slt i16 %a, %b + %or = select i1 %y, i1 true, i1 %x + %and = select i1 %or, i1 %x_inv, i1 false + ret i1 %and +} + +define i1 @bools_logical(i1 %a, i1 %b, i1 %c) { +; CHECK-LABEL: @bools_logical( +; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[C:%.*]], true +; CHECK-NEXT: [[AND1:%.*]] = select i1 [[NOT]], i1 [[A:%.*]], i1 false +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C]], i1 [[B:%.*]], i1 false +; CHECK-NEXT: [[OR:%.*]] = select i1 [[AND1]], i1 true, i1 [[AND2]] +; CHECK-NEXT: ret i1 [[OR]] +; + %not = xor i1 %c, -1 + %and1 = select i1 %not, i1 %a, i1 false + %and2 = select i1 %c, i1 %b, i1 false + %or = select i1 %and1, i1 true, i1 %and2 + ret i1 %or +} + +define i1 @bools2_logical(i1 %a, i1 %b, i1 %c) { +; CHECK-LABEL: @bools2_logical( +; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[C:%.*]], true +; CHECK-NEXT: [[AND1:%.*]] = select i1 [[C]], i1 [[A:%.*]], i1 false +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[NOT]], i1 [[B:%.*]], i1 false +; CHECK-NEXT: [[OR:%.*]] = select i1 [[AND1]], i1 true, i1 [[AND2]] +; CHECK-NEXT: ret i1 [[OR]] +; + %not = xor i1 %c, -1 + %and1 = select i1 %c, i1 %a, i1 false + %and2 = select i1 %not, i1 %b, i1 false + %or = select i1 %and1, i1 true, i1 %and2 + ret i1 %or +}