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 @@ -20950,7 +20950,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) @@ -252,7 +255,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 +266,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 +277,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) @@ -304,7 +310,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 +321,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 +332,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) 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)