@@ -1092,6 +1092,8 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
1092
1092
setOperationAction(ISD::UMAX, MVT::v2i64, Custom);
1093
1093
setOperationAction(ISD::UMIN, MVT::v1i64, Custom);
1094
1094
setOperationAction(ISD::UMIN, MVT::v2i64, Custom);
1095
+ setOperationAction(ISD::VECREDUCE_SMAX, MVT::v2i64, Custom);
1096
+ setOperationAction(ISD::VECREDUCE_SMIN, MVT::v2i64, Custom);
1095
1097
}
1096
1098
}
1097
1099
@@ -1219,6 +1221,10 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT) {
1219
1221
setOperationAction(ISD::UMAX, VT, Custom);
1220
1222
setOperationAction(ISD::UMIN, VT, Custom);
1221
1223
setOperationAction(ISD::VECREDUCE_ADD, VT, Custom);
1224
+ setOperationAction(ISD::VECREDUCE_SMAX, VT, Custom);
1225
+ setOperationAction(ISD::VECREDUCE_SMIN, VT, Custom);
1226
+ setOperationAction(ISD::VECREDUCE_UMAX, VT, Custom);
1227
+ setOperationAction(ISD::VECREDUCE_UMIN, VT, Custom);
1222
1228
setOperationAction(ISD::VSELECT, VT, Custom);
1223
1229
setOperationAction(ISD::XOR, VT, Custom);
1224
1230
setOperationAction(ISD::ZERO_EXTEND, VT, Custom);
@@ -9650,18 +9656,27 @@ static SDValue getReductionSDNode(unsigned Op, SDLoc DL, SDValue ScalarOp,
9650
9656
9651
9657
SDValue AArch64TargetLowering::LowerVECREDUCE(SDValue Op,
9652
9658
SelectionDAG &DAG) const {
9653
- SDValue VecOp = Op.getOperand(0);
9659
+ SDValue Src = Op.getOperand(0);
9660
+ EVT SrcVT = Src.getValueType();
9654
9661
9655
9662
SDLoc dl(Op);
9656
9663
switch (Op.getOpcode()) {
9657
9664
case ISD::VECREDUCE_ADD:
9658
- if (useSVEForFixedLengthVectorVT(VecOp.getValueType() ))
9665
+ if (useSVEForFixedLengthVectorVT(SrcVT ))
9659
9666
return LowerFixedLengthReductionToSVE(AArch64ISD::UADDV_PRED, Op, DAG);
9660
9667
return getReductionSDNode(AArch64ISD::UADDV, dl, Op, DAG);
9661
- case ISD::VECREDUCE_SMAX:
9668
+ case ISD::VECREDUCE_SMAX: {
9669
+ bool OverrideNEON = SrcVT.getVectorElementType() == MVT::i64;
9670
+ if (useSVEForFixedLengthVectorVT(SrcVT, OverrideNEON))
9671
+ return LowerFixedLengthReductionToSVE(AArch64ISD::SMAXV_PRED, Op, DAG);
9662
9672
return getReductionSDNode(AArch64ISD::SMAXV, dl, Op, DAG);
9663
- case ISD::VECREDUCE_SMIN:
9673
+ }
9674
+ case ISD::VECREDUCE_SMIN: {
9675
+ bool OverrideNEON = SrcVT.getVectorElementType() == MVT::i64;
9676
+ if (useSVEForFixedLengthVectorVT(SrcVT, OverrideNEON))
9677
+ return LowerFixedLengthReductionToSVE(AArch64ISD::SMINV_PRED, Op, DAG);
9664
9678
return getReductionSDNode(AArch64ISD::SMINV, dl, Op, DAG);
9679
+ }
9665
9680
case ISD::VECREDUCE_UMAX:
9666
9681
return getReductionSDNode(AArch64ISD::UMAXV, dl, Op, DAG);
9667
9682
case ISD::VECREDUCE_UMIN:
@@ -16001,10 +16016,9 @@ SDValue AArch64TargetLowering::LowerFixedLengthReductionToSVE(unsigned Opcode,
16001
16016
SDValue Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ResVT,
16002
16017
Rdx, DAG.getConstant(0, DL, MVT::i64));
16003
16018
16004
- // This is needed for UADDV, since it returns an i64 result. The VEC_REDUCE
16005
- // nodes expect an element size result.
16019
+ // The VEC_REDUCE nodes expect an element size result.
16006
16020
if (ResVT != ScalarOp.getValueType())
16007
- Res = DAG.getNode(ISD::TRUNCATE , DL, ScalarOp.getValueType(), Res );
16021
+ Res = DAG.getAnyExtOrTrunc(Res , DL, ScalarOp.getValueType());
16008
16022
16009
16023
return Res;
16010
16024
}
0 commit comments