diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -21069,7 +21069,7 @@ default: return SDValue(); case ISD::VECREDUCE_OR: - if (isAllActivePredicate(DAG, Pg)) + if (isAllActivePredicate(DAG, Pg) && OpVT == MVT::nxv16i1) // The predicate can be 'Op' because // vecreduce_or(Op & ) <=> vecreduce_or(Op). return getPTest(DAG, VT, Op, Op, AArch64CC::ANY_ACTIVE); diff --git a/llvm/test/CodeGen/AArch64/sve-int-pred-reduce.ll b/llvm/test/CodeGen/AArch64/sve-int-pred-reduce.ll --- a/llvm/test/CodeGen/AArch64/sve-int-pred-reduce.ll +++ b/llvm/test/CodeGen/AArch64/sve-int-pred-reduce.ll @@ -79,7 +79,8 @@ define i1 @reduce_or_nxv8i1( %vec) { ; CHECK-LABEL: reduce_or_nxv8i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.h +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.or.i1.nxv8i1( %vec) @@ -89,7 +90,8 @@ define i1 @reduce_or_nxv4i1( %vec) { ; CHECK-LABEL: reduce_or_nxv4i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.s +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.or.i1.nxv4i1( %vec) @@ -99,7 +101,8 @@ define i1 @reduce_or_nxv2i1( %vec) { ; CHECK-LABEL: reduce_or_nxv2i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.or.i1.nxv2i1( %vec) @@ -109,7 +112,9 @@ define i1 @reduce_or_nxv1i1( %vec) { ; CHECK-LABEL: reduce_or_nxv1i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: punpklo p1.h, p1.b +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.or.i1.nxv1i1( %vec) @@ -252,7 +257,8 @@ define i1 @reduce_smin_nxv8i1( %vec) { ; CHECK-LABEL: reduce_smin_nxv8i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.h +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.smin.i1.nxv8i1( %vec) @@ -262,7 +268,8 @@ define i1 @reduce_smin_nxv4i1( %vec) { ; CHECK-LABEL: reduce_smin_nxv4i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.s +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.smin.i1.nxv4i1( %vec) @@ -272,7 +279,8 @@ define i1 @reduce_smin_nxv2i1( %vec) { ; CHECK-LABEL: reduce_smin_nxv2i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.smin.i1.nxv2i1( %vec) @@ -282,7 +290,9 @@ define i1 @reduce_smin_nxv1i1( %vec) { ; CHECK-LABEL: reduce_smin_nxv1i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: punpklo p1.h, p1.b +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.smin.i1.nxv1i1( %vec) @@ -304,7 +314,8 @@ define i1 @reduce_umax_nxv8i1( %vec) { ; CHECK-LABEL: reduce_umax_nxv8i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.h +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.umax.i1.nxv8i1( %vec) @@ -314,7 +325,8 @@ define i1 @reduce_umax_nxv4i1( %vec) { ; CHECK-LABEL: reduce_umax_nxv4i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.s +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.umax.i1.nxv4i1( %vec) @@ -324,7 +336,8 @@ define i1 @reduce_umax_nxv2i1( %vec) { ; CHECK-LABEL: reduce_umax_nxv2i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.umax.i1.nxv2i1( %vec) @@ -334,7 +347,9 @@ define i1 @reduce_umax_nxv1i1( %vec) { ; CHECK-LABEL: reduce_umax_nxv1i1: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.d +; CHECK-NEXT: punpklo p1.h, p1.b +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %res = call i1 @llvm.vector.reduce.umax.i1.nxv1i1( %vec) diff --git a/llvm/test/CodeGen/AArch64/sve-vecreduce-fold.ll b/llvm/test/CodeGen/AArch64/sve-vecreduce-fold.ll --- a/llvm/test/CodeGen/AArch64/sve-vecreduce-fold.ll +++ b/llvm/test/CodeGen/AArch64/sve-vecreduce-fold.ll @@ -8,7 +8,8 @@ define i1 @reduce_or_insert_subvec_into_zero( %in) { ; CHECK-LABEL: reduce_or_insert_subvec_into_zero: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.s +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %t = call @llvm.vector.insert.nxv16i1.nxv4i1( zeroinitializer, %in, i64 0) @@ -19,7 +20,8 @@ define i1 @reduce_or_insert_subvec_into_poison( %in) { ; CHECK-LABEL: reduce_or_insert_subvec_into_poison: ; CHECK: // %bb.0: -; CHECK-NEXT: ptest p0, p0.b +; CHECK-NEXT: ptrue p1.s +; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %t = call @llvm.vector.insert.nxv16i1.nxv4i1( poison, %in, i64 0)