@@ -1094,6 +1094,8 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
10941094 setOperationAction(ISD::UMIN, MVT::v2i64, Custom);
10951095 setOperationAction(ISD::VECREDUCE_SMAX, MVT::v2i64, Custom);
10961096 setOperationAction(ISD::VECREDUCE_SMIN, MVT::v2i64, Custom);
1097+ setOperationAction(ISD::VECREDUCE_UMAX, MVT::v2i64, Custom);
1098+ setOperationAction(ISD::VECREDUCE_UMIN, MVT::v2i64, Custom);
10971099 }
10981100 }
10991101
@@ -1223,6 +1225,8 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT) {
12231225 setOperationAction(ISD::VECREDUCE_ADD, VT, Custom);
12241226 setOperationAction(ISD::VECREDUCE_SMAX, VT, Custom);
12251227 setOperationAction(ISD::VECREDUCE_SMIN, VT, Custom);
1228+ setOperationAction(ISD::VECREDUCE_UMAX, VT, Custom);
1229+ setOperationAction(ISD::VECREDUCE_UMIN, VT, Custom);
12261230 setOperationAction(ISD::VSELECT, VT, Custom);
12271231 setOperationAction(ISD::XOR, VT, Custom);
12281232 setOperationAction(ISD::ZERO_EXTEND, VT, Custom);
@@ -9655,26 +9659,37 @@ static SDValue getReductionSDNode(unsigned Op, SDLoc DL, SDValue ScalarOp,
96559659SDValue AArch64TargetLowering::LowerVECREDUCE(SDValue Op,
96569660 SelectionDAG &DAG) const {
96579661 SDValue Src = Op.getOperand(0);
9662+
9663+ // Try to lower fixed length reductions to SVE.
96589664 EVT SrcVT = Src.getValueType();
9665+ bool OverrideNEON = SrcVT.getVectorElementType() == MVT::i64 &&
9666+ Op.getOpcode() != ISD::VECREDUCE_ADD;
9667+ if (useSVEForFixedLengthVectorVT(SrcVT, OverrideNEON)) {
9668+ switch (Op.getOpcode()) {
9669+ case ISD::VECREDUCE_ADD:
9670+ return LowerFixedLengthReductionToSVE(AArch64ISD::UADDV_PRED, Op, DAG);
9671+ case ISD::VECREDUCE_SMAX:
9672+ return LowerFixedLengthReductionToSVE(AArch64ISD::SMAXV_PRED, Op, DAG);
9673+ case ISD::VECREDUCE_SMIN:
9674+ return LowerFixedLengthReductionToSVE(AArch64ISD::SMINV_PRED, Op, DAG);
9675+ case ISD::VECREDUCE_UMAX:
9676+ return LowerFixedLengthReductionToSVE(AArch64ISD::UMAXV_PRED, Op, DAG);
9677+ case ISD::VECREDUCE_UMIN:
9678+ return LowerFixedLengthReductionToSVE(AArch64ISD::UMINV_PRED, Op, DAG);
9679+ default:
9680+ llvm_unreachable("Unhandled fixed length reduction");
9681+ }
9682+ }
96599683
9684+ // Lower NEON reductions.
96609685 SDLoc dl(Op);
96619686 switch (Op.getOpcode()) {
96629687 case ISD::VECREDUCE_ADD:
9663- if (useSVEForFixedLengthVectorVT(SrcVT))
9664- return LowerFixedLengthReductionToSVE(AArch64ISD::UADDV_PRED, Op, DAG);
96659688 return getReductionSDNode(AArch64ISD::UADDV, dl, Op, DAG);
9666- case ISD::VECREDUCE_SMAX: {
9667- bool OverrideNEON = SrcVT.getVectorElementType() == MVT::i64;
9668- if (useSVEForFixedLengthVectorVT(SrcVT, OverrideNEON))
9669- return LowerFixedLengthReductionToSVE(AArch64ISD::SMAXV_PRED, Op, DAG);
9689+ case ISD::VECREDUCE_SMAX:
96709690 return getReductionSDNode(AArch64ISD::SMAXV, dl, Op, DAG);
9671- }
9672- case ISD::VECREDUCE_SMIN: {
9673- bool OverrideNEON = SrcVT.getVectorElementType() == MVT::i64;
9674- if (useSVEForFixedLengthVectorVT(SrcVT, OverrideNEON))
9675- return LowerFixedLengthReductionToSVE(AArch64ISD::SMINV_PRED, Op, DAG);
9691+ case ISD::VECREDUCE_SMIN:
96769692 return getReductionSDNode(AArch64ISD::SMINV, dl, Op, DAG);
9677- }
96789693 case ISD::VECREDUCE_UMAX:
96799694 return getReductionSDNode(AArch64ISD::UMAXV, dl, Op, DAG);
96809695 case ISD::VECREDUCE_UMIN:
@@ -9683,13 +9698,13 @@ SDValue AArch64TargetLowering::LowerVECREDUCE(SDValue Op,
96839698 return DAG.getNode(
96849699 ISD::INTRINSIC_WO_CHAIN, dl, Op.getValueType(),
96859700 DAG.getConstant(Intrinsic::aarch64_neon_fmaxnmv, dl, MVT::i32),
9686- Op.getOperand(0) );
9701+ Src );
96879702 }
96889703 case ISD::VECREDUCE_FMIN: {
96899704 return DAG.getNode(
96909705 ISD::INTRINSIC_WO_CHAIN, dl, Op.getValueType(),
96919706 DAG.getConstant(Intrinsic::aarch64_neon_fminnmv, dl, MVT::i32),
9692- Op.getOperand(0) );
9707+ Src );
96939708 }
96949709 default:
96959710 llvm_unreachable("Unhandled reduction");
0 commit comments