diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll --- a/llvm/test/Transforms/InstCombine/icmp.ll +++ b/llvm/test/Transforms/InstCombine/icmp.ll @@ -4627,3 +4627,161 @@ %r = icmp ne i8 %a, 0 ret i1 %r } + +define i1 @mul_or_positive_sgt_zero(i8 %a, i8 %b) { +; CHECK-LABEL: @mul_or_positive_sgt_zero( +; CHECK-NEXT: [[MUL1:%.*]] = mul i8 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or i8 [[MUL1]], 24 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[ADD]], 0 +; CHECK-NEXT: ret i1 [[CMP]] +; + %mul1 = mul i8 %a, %b + %add = or i8 %mul1, 24 + %cmp = icmp sgt i8 %add, 0 + ret i1 %cmp +} + +define <2 x i1> @mul_or_postive_sgt_zero_vec(<2 x i8> %a, <2 x i8> %b) { +; CHECK-LABEL: @mul_or_postive_sgt_zero_vec( +; CHECK-NEXT: [[MUL1:%.*]] = mul <2 x i8> [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or <2 x i8> [[MUL1]], +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[ADD]], zeroinitializer +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + + %mul1 = mul <2 x i8> %a, %b + %add = or <2 x i8> %mul1, + %cmp = icmp sgt <2 x i8> %add, + ret <2 x i1> %cmp +} + +define i1 @mul_or_positive_sge_zero(i8 %a, i8 %b) { +; CHECK-LABEL: @mul_or_positive_sge_zero( +; CHECK-NEXT: [[MUL1:%.*]] = mul i8 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[MUL1]], -1 +; CHECK-NEXT: ret i1 [[CMP]] +; + %mul1 = mul i8 %a, %b + %add = or i8 %mul1, 24 + %cmp = icmp sge i8 %add, 0 + ret i1 %cmp +} + +define <2 x i1> @mul_or_postive_sge_zero_vec(<2 x i8> %a, <2 x i8> %b) { +; CHECK-LABEL: @mul_or_postive_sge_zero_vec( +; CHECK-NEXT: [[MUL1:%.*]] = mul <2 x i8> [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[MUL1]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + + %mul1 = mul <2 x i8> %a, %b + %add = or <2 x i8> %mul1, + %cmp = icmp sge <2 x i8> %add, + ret <2 x i1> %cmp +} + +define i1 @mul_or_positive_sge_postive(i8 %a, i8 %b) { +; CHECK-LABEL: @mul_or_positive_sge_postive( +; CHECK-NEXT: [[MUL1:%.*]] = mul i8 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or i8 [[MUL1]], 24 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[ADD]], 23 +; CHECK-NEXT: ret i1 [[CMP]] +; + %mul1 = mul i8 %a, %b + %add = or i8 %mul1, 24 + %cmp = icmp sge i8 %add, 24 + ret i1 %cmp +} + +define <2 x i1> @mul_or_postive_sge_positive_vec(<2 x i8> %a, <2 x i8> %b) { +; CHECK-LABEL: @mul_or_postive_sge_positive_vec( +; CHECK-NEXT: [[MUL1:%.*]] = mul <2 x i8> [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or <2 x i8> [[MUL1]], +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[ADD]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + + %mul1 = mul <2 x i8> %a, %b + %add = or <2 x i8> %mul1, + %cmp = icmp sge <2 x i8> %add, + ret <2 x i1> %cmp +} + +define i1 @mul_or_positive_sle_zero(i8 %a, i8 %b) { +; CHECK-LABEL: @mul_or_positive_sle_zero( +; CHECK-NEXT: [[MUL1:%.*]] = mul i8 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or i8 [[MUL1]], 24 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[ADD]], 1 +; CHECK-NEXT: ret i1 [[CMP]] +; + %mul1 = mul i8 %a, %b + %add = or i8 %mul1, 24 + %cmp = icmp sle i8 %add, 0 + ret i1 %cmp +} + +define <2 x i1> @mul_or_postive_sle_zero_vec(<2 x i8> %a, <2 x i8> %b) { +; CHECK-LABEL: @mul_or_postive_sle_zero_vec( +; CHECK-NEXT: [[MUL1:%.*]] = mul <2 x i8> [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or <2 x i8> [[MUL1]], +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[ADD]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + + %mul1 = mul <2 x i8> %a, %b + %add = or <2 x i8> %mul1, + %cmp = icmp sle <2 x i8> %add, + ret <2 x i1> %cmp +} + +define i1 @mul_or_positive_slt_zero(i8 %a, i8 %b) { +; CHECK-LABEL: @mul_or_positive_slt_zero( +; CHECK-NEXT: [[MUL1:%.*]] = mul i8 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[MUL1]], 0 +; CHECK-NEXT: ret i1 [[CMP]] +; + %mul1 = mul i8 %a, %b + %add = or i8 %mul1, 24 + %cmp = icmp slt i8 %add, 0 + ret i1 %cmp +} + +define <2 x i1> @mul_or_postive_slt_zero_vec(<2 x i8> %a, <2 x i8> %b) { +; CHECK-LABEL: @mul_or_postive_slt_zero_vec( +; CHECK-NEXT: [[MUL1:%.*]] = mul <2 x i8> [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[MUL1]], zeroinitializer +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + + %mul1 = mul <2 x i8> %a, %b + %add = or <2 x i8> %mul1, + %cmp = icmp slt <2 x i8> %add, + ret <2 x i1> %cmp +} + +define i1 @mul_or_positive_slt_postive(i8 %a, i8 %b) { +; CHECK-LABEL: @mul_or_positive_slt_postive( +; CHECK-NEXT: [[MUL1:%.*]] = mul i8 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or i8 [[MUL1]], 24 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[ADD]], 24 +; CHECK-NEXT: ret i1 [[CMP]] +; + %mul1 = mul i8 %a, %b + %add = or i8 %mul1, 24 + %cmp = icmp slt i8 %add, 24 + ret i1 %cmp +} + +define <2 x i1> @mul_or_postive_slt_positive_vec(<2 x i8> %a, <2 x i8> %b) { +; CHECK-LABEL: @mul_or_postive_slt_positive_vec( +; CHECK-NEXT: [[MUL1:%.*]] = mul <2 x i8> [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = or <2 x i8> [[MUL1]], +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[ADD]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + + %mul1 = mul <2 x i8> %a, %b + %add = or <2 x i8> %mul1, + %cmp = icmp slt <2 x i8> %add, + ret <2 x i1> %cmp +}