Skip to content

Commit 9b0b096

Browse files
author
Cameron McInally
committed
[SVE] Lower fixed length VECREDUCE_[UMAX|UMIN] to Scalable
Essentially the same as the signed variants from D88259. Also includes a clean up of the lowering function. Differential Revision: https://reviews.llvm.org/D88317
1 parent ba8911d commit 9b0b096

File tree

2 files changed

+625
-14
lines changed

2 files changed

+625
-14
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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,
96559659
SDValue 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

Comments
 (0)