diff --git a/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll b/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll --- a/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll +++ b/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll @@ -13,6 +13,8 @@ declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1) declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1) declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>) +declare i8 @llvm.bitreverse.i8(i8) +declare <2 x i8> @llvm.bitreverse.v2i8(<2 x i8>) declare void @use6(i6) define i1 @bswap_eq_i16(i16 %x) { @@ -762,3 +764,48 @@ %cmp = icmp ult i4 %trunc, 7 ret i1 %cmp } + +define i1 @bitreverse_ne_22(i8 %x) { +; CHECK-LABEL: @bitreverse_ne_22( +; CHECK-NEXT: [[Y:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[X:%.*]]) +; CHECK-NEXT: [[Z:%.*]] = icmp ne i8 [[Y]], 22 +; CHECK-NEXT: ret i1 [[Z]] +; + %y = call i8 @llvm.bitreverse.i8(i8 %x) + %z = icmp ne i8 %y, 22 + ret i1 %z +} + +define i1 @bitreverse_ult_22_fail_not_equality_pred(i8 %x) { +; CHECK-LABEL: @bitreverse_ult_22_fail_not_equality_pred( +; CHECK-NEXT: [[Y:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[X:%.*]]) +; CHECK-NEXT: [[Z:%.*]] = icmp ult i8 [[Y]], 22 +; CHECK-NEXT: ret i1 [[Z]] +; + %y = call i8 @llvm.bitreverse.i8(i8 %x) + %z = icmp ult i8 %y, 22 + ret i1 %z +} + + +define <2 x i1> @bitreverse_vec_eq_2_2(<2 x i8> %x) { +; CHECK-LABEL: @bitreverse_vec_eq_2_2( +; CHECK-NEXT: [[Y:%.*]] = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> [[X:%.*]]) +; CHECK-NEXT: [[Z:%.*]] = icmp eq <2 x i8> [[Y]], +; CHECK-NEXT: ret <2 x i1> [[Z]] +; + %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x) + %z = icmp eq <2 x i8> %y, + ret <2 x i1> %z +} + +define <2 x i1> @bitreverse_vec_eq_1_2_todo_no_splat(<2 x i8> %x) { +; CHECK-LABEL: @bitreverse_vec_eq_1_2_todo_no_splat( +; CHECK-NEXT: [[Y:%.*]] = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> [[X:%.*]]) +; CHECK-NEXT: [[Z:%.*]] = icmp eq <2 x i8> [[Y]], +; CHECK-NEXT: ret <2 x i1> [[Z]] +; + %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x) + %z = icmp eq <2 x i8> %y, + ret <2 x i1> %z +}