[llvm] 093f0a4 - [instcombine] Improve coverage for reductions of i1 types
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 17 11:11:23 PDT 2024
Author: Philip Reames
Date: 2024-07-17T11:11:02-07:00
New Revision: 093f0a4770ec9bde9f7a21cfe9c5ec5b20a923a8
URL: https://github.com/llvm/llvm-project/commit/093f0a4770ec9bde9f7a21cfe9c5ec5b20a923a8
DIFF: https://github.com/llvm/llvm-project/commit/093f0a4770ec9bde9f7a21cfe9c5ec5b20a923a8.diff
LOG: [instcombine] Improve coverage for reductions of i1 types
In advance of an upcoming change to generalize some of this to scalable
vector types.
Added:
Modified:
llvm/test/Transforms/InstCombine/vector-logical-reductions.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/vector-logical-reductions.ll b/llvm/test/Transforms/InstCombine/vector-logical-reductions.ll
index da4a0ca754680..74f4ed01085f8 100644
--- a/llvm/test/Transforms/InstCombine/vector-logical-reductions.ll
+++ b/llvm/test/Transforms/InstCombine/vector-logical-reductions.ll
@@ -11,6 +11,15 @@ define i1 @reduction_logical_or(<4 x i1> %x) {
ret i1 %r
}
+define i1 @reduction_logical_or_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_or_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
define i1 @reduction_logical_and(<4 x i1> %x) {
; CHECK-LABEL: @reduction_logical_and(
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[X:%.*]] to i4
@@ -21,6 +30,131 @@ define i1 @reduction_logical_and(<4 x i1> %x) {
ret i1 %r
}
+define i1 @reduction_logical_and_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_and_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_mul(<2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_mul(
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
+; CHECK-NEXT: [[R:%.*]] = icmp eq i2 [[TMP1]], -1
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.mul.v4i1(<2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_mul_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_mul_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.mul.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.mul.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_xor(<2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_xor(
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
+; CHECK-NEXT: [[TMP2:%.*]] = call range(i2 0, -1) i2 @llvm.ctpop.i2(i2 [[TMP1]])
+; CHECK-NEXT: [[R:%.*]] = trunc i2 [[TMP2]] to i1
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.xor.v4i1(<2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_xor_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_xor_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_smin(<2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_smin(
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
+; CHECK-NEXT: [[R:%.*]] = icmp ne i2 [[TMP1]], 0
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.smin.v4i1(<2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_smin_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_smin_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_smax(<2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_smax(
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
+; CHECK-NEXT: [[R:%.*]] = icmp eq i2 [[TMP1]], -1
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.smax.v4i1(<2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_smax_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_smax_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_umin(<2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_umin(
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
+; CHECK-NEXT: [[R:%.*]] = icmp eq i2 [[TMP1]], -1
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.umin.v4i1(<2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_umin_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_umin_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_umax(<2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_umax(
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
+; CHECK-NEXT: [[R:%.*]] = icmp ne i2 [[TMP1]], 0
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.umax.v4i1(<2 x i1> %x)
+ ret i1 %r
+}
+
+define i1 @reduction_logical_umax_nxv2i1(<vscale x 2 x i1> %x) {
+; CHECK-LABEL: @reduction_logical_umax_nxv2i1(
+; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %r = call i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1> %x)
+ ret i1 %r
+}
+
+
define i1 @reduction_logical_or_reverse_nxv2i1(<vscale x 2 x i1> %p) {
; CHECK-LABEL: @reduction_logical_or_reverse_nxv2i1(
; CHECK-NEXT: [[RED:%.*]] = call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[P:%.*]])
@@ -93,5 +227,15 @@ declare i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1>)
declare i1 @llvm.vector.reduce.and.v2i1(<2 x i1>)
declare i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1>)
declare i1 @llvm.vector.reduce.xor.v2i1(<2 x i1>)
+declare i1 @llvm.vector.reduce.mul.nxv2i1(<vscale x 2 x i1>)
+declare i1 @llvm.vector.reduce.mul.v2i1(<2 x i1>)
+declare i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1>)
+declare i1 @llvm.vector.reduce.smin.v2i1(<2 x i1>)
+declare i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1>)
+declare i1 @llvm.vector.reduce.smax.v2i1(<2 x i1>)
+declare i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1>)
+declare i1 @llvm.vector.reduce.umin.v2i1(<2 x i1>)
+declare i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1>)
+declare i1 @llvm.vector.reduce.umax.v2i1(<2 x i1>)
declare <vscale x 2 x i1> @llvm.vector.reverse.nxv2i1(<vscale x 2 x i1>)
declare <2 x i1> @llvm.vector.reverse.v2i1(<2 x i1>)
More information about the llvm-commits
mailing list