diff --git a/llvm/test/Transforms/InstCombine/icmp-logical.ll b/llvm/test/Transforms/InstCombine/icmp-logical.ll --- a/llvm/test/Transforms/InstCombine/icmp-logical.ll +++ b/llvm/test/Transforms/InstCombine/icmp-logical.ll @@ -1743,3 +1743,151 @@ %t5 = select i1 %t4, i1 true, i1 %t2 ret i1 %t5 } + + +define i1 @masked_icmps_bmask_notmixed_or(i32 %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_or( +; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15 +; CHECK-NEXT: [[TST1:%.*]] = icmp eq i32 [[MASK1]], 3 +; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255 +; CHECK-NEXT: [[TST2:%.*]] = icmp eq i32 [[MASK2]], 243 +; CHECK-NEXT: [[RES:%.*]] = or i1 [[TST1]], [[TST2]] +; CHECK-NEXT: ret i1 [[RES]] +; + %mask1 = and i32 %A, 15 ; 0x0f + %tst1 = icmp eq i32 %mask1, 3 ; 0x03 + %mask2 = and i32 %A, 255 ; 0xff + %tst2 = icmp eq i32 %mask2, 243; 0xf3 + %res = or i1 %tst1, %tst2 + ret i1 %res +} + +define <2 x i1> @masked_icmps_bmask_notmixed_or_vec(<2 x i8> %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_vec( +; CHECK-NEXT: [[MASK1:%.*]] = and <2 x i8> [[A:%.*]], +; CHECK-NEXT: [[TST1:%.*]] = icmp eq <2 x i8> [[MASK1]], +; CHECK-NEXT: [[TST2:%.*]] = icmp eq <2 x i8> [[A]], +; CHECK-NEXT: [[RES:%.*]] = or <2 x i1> [[TST1]], [[TST2]] +; CHECK-NEXT: ret <2 x i1> [[RES]] +; + %mask1 = and <2 x i8> %A, ; 0x0f + %tst1 = icmp eq <2 x i8> %mask1, ; 0x03 + %mask2 = and <2 x i8> %A, ; 0xff + %tst2 = icmp eq <2 x i8> %mask2, ; 0xf3 + %res = or <2 x i1> %tst1, %tst2 + ret <2 x i1> %res +} + +define <2 x i1> @masked_icmps_bmask_notmixed_or_vec_poison1(<2 x i8> %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_vec_poison1( +; CHECK-NEXT: [[MASK1:%.*]] = and <2 x i8> [[A:%.*]], +; CHECK-NEXT: [[TST1:%.*]] = icmp eq <2 x i8> [[MASK1]], +; CHECK-NEXT: [[TST2:%.*]] = icmp eq <2 x i8> [[A]], +; CHECK-NEXT: [[RES:%.*]] = or <2 x i1> [[TST1]], [[TST2]] +; CHECK-NEXT: ret <2 x i1> [[RES]] +; + %mask1 = and <2 x i8> %A, ; 0x0f + %tst1 = icmp eq <2 x i8> %mask1, ; 0x03 + %mask2 = and <2 x i8> %A, ; 0xff + %tst2 = icmp eq <2 x i8> %mask2, ; 0xf3 + %res = or <2 x i1> %tst1, %tst2 + ret <2 x i1> %res +} + +define <2 x i1> @masked_icmps_bmask_notmixed_or_vec_poison2(<2 x i8> %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_vec_poison2( +; CHECK-NEXT: [[MASK1:%.*]] = and <2 x i8> [[A:%.*]], +; CHECK-NEXT: [[TST1:%.*]] = icmp eq <2 x i8> [[MASK1]], +; CHECK-NEXT: [[TST2:%.*]] = icmp eq <2 x i8> [[A]], +; CHECK-NEXT: [[RES:%.*]] = or <2 x i1> [[TST1]], [[TST2]] +; CHECK-NEXT: ret <2 x i1> [[RES]] +; + %mask1 = and <2 x i8> %A, ; 0x0f + %tst1 = icmp eq <2 x i8> %mask1, ; 0x03 + %mask2 = and <2 x i8> %A, ; 0xff + %tst2 = icmp eq <2 x i8> %mask2, ; 0xf3 + %res = or <2 x i1> %tst1, %tst2 + ret <2 x i1> %res +} + +define i1 @masked_icmps_bmask_notmixed_or_contradict_notoptimized(i32 %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_contradict_notoptimized( +; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15 +; CHECK-NEXT: [[TST1:%.*]] = icmp eq i32 [[MASK1]], 3 +; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255 +; CHECK-NEXT: [[TST2:%.*]] = icmp eq i32 [[MASK2]], 242 +; CHECK-NEXT: [[RES:%.*]] = or i1 [[TST1]], [[TST2]] +; CHECK-NEXT: ret i1 [[RES]] +; + %mask1 = and i32 %A, 15 ; 0x0f + %tst1 = icmp eq i32 %mask1, 3 ; 0x03 + %mask2 = and i32 %A, 255 ; 0xff + %tst2 = icmp eq i32 %mask2, 242; 0xf2 + %res = or i1 %tst1, %tst2 + ret i1 %res +} + +define i1 @masked_icmps_bmask_notmixed_and(i32 %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_and( +; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15 +; CHECK-NEXT: [[TST1:%.*]] = icmp ne i32 [[MASK1]], 3 +; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255 +; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 243 +; CHECK-NEXT: [[RES:%.*]] = and i1 [[TST1]], [[TST2]] +; CHECK-NEXT: ret i1 [[RES]] +; + %mask1 = and i32 %A, 15 ; 0x0f + %tst1 = icmp ne i32 %mask1, 3 ; 0x03 + %mask2 = and i32 %A, 255 ; 0xff + %tst2 = icmp ne i32 %mask2, 243 ; 0xf3 + %res = and i1 %tst1, %tst2 + ret i1 %res +} + +define i1 @masked_icmps_bmask_notmixed_and_contradict_notoptimized(i32 %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_and_contradict_notoptimized( +; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15 +; CHECK-NEXT: [[TST1:%.*]] = icmp ne i32 [[MASK1]], 3 +; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255 +; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 242 +; CHECK-NEXT: [[RES:%.*]] = and i1 [[TST1]], [[TST2]] +; CHECK-NEXT: ret i1 [[RES]] +; + %mask1 = and i32 %A, 15 ; 0x0f + %tst1 = icmp ne i32 %mask1, 3 ; 0x03 + %mask2 = and i32 %A, 255 ; 0xff + %tst2 = icmp ne i32 %mask2, 242 ; 0xf2 + %res = and i1 %tst1, %tst2 + ret i1 %res +} + +define i1 @masked_icmps_bmask_notmixed_and_expected_false(i32 %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_and_expected_false( +; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A:%.*]], 255 +; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 242 +; CHECK-NEXT: ret i1 [[TST2]] +; + %mask1 = and i32 %A, 3 ; 0x0f + %tst1 = icmp ne i32 %mask1, 15 ; 0x03 + %mask2 = and i32 %A, 255 ; 0xff + %tst2 = icmp ne i32 %mask2, 242 ; 0xf2 + %res = and i1 %tst1, %tst2 + ret i1 %res +} + +define i1 @masked_icmps_bmask_notmixed_not_subset_notoptimized(i32 %A) { +; CHECK-LABEL: @masked_icmps_bmask_notmixed_not_subset_notoptimized( +; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 254 +; CHECK-NEXT: [[TST1:%.*]] = icmp ne i32 [[MASK1]], 252 +; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 253 +; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 252 +; CHECK-NEXT: [[RES:%.*]] = and i1 [[TST1]], [[TST2]] +; CHECK-NEXT: ret i1 [[RES]] +; + %mask1 = and i32 %A, 254 ; 0xfe + %tst1 = icmp ne i32 %mask1, 252 ; 0xfc + %mask2 = and i32 %A, 253 ; 0xfd + %tst2 = icmp ne i32 %mask2, 252 ; 0xfc + %res = and i1 %tst1, %tst2 + ret i1 %res +}